C# 从C中的pod访问Kubernetes API#
我正在寻找一种轻量级的方法,从C#app中的Pod访问Kubernetes API Kubernetes文件提到了两种方法:C# 从C中的pod访问Kubernetes API#,c#,.net,kubernetes,kubernetes-apiserver,C#,.net,Kubernetes,Kubernetes Apiserver,我正在寻找一种轻量级的方法,从C#app中的Pod访问Kubernetes API Kubernetes文件提到了两种方法: 在pod中的sidecar容器中运行kubectl代理,或作为容器中的后台进程运行 这通常是可行的,只需一两行代码就可以轻松地命中API端点-例如: using System; using System.Net; namespace GetIngresses { class Program { static void Main(strin
using System;
using System.Net;
namespace GetIngresses
{
class Program
{
static void Main(string[] args)
{
var apiBaseUrl = "http://127.0.0.1:8001"; // requires kubectl proxy
Console.WriteLine((new WebClient()).
DownloadString($"{apiBaseUrl}/apis/networking.k8s.io/v1/ingresses"));
}
}
}
然而,现在有一个运行中的kubectl proxy
过程来监视、维护等-这似乎不适合生产
WebClient
,就像上面的例子一样。文件中提到
建议使用kubernetes.default.svc DNS名称在pod中定位apiserver,该名称解析为服务IP,服务IP将被路由到apiserver
那么,在上面的例子中,我可以这样做吗
var apiBaseUrl = "http://kubernetes.default.svc"
。。。并获取WebClient
以传递所需的服务帐户凭据?如果是,如何进行
理想情况下,我只想使用WebClient
Kubernetes是一个REST API,因此它可以工作。如图所示,使用例如curl
可以轻松浏览API
带有curl
和kubectl代理的示例-响应为json格式
curl http://localhost:8080/api/v1/pods
复杂的因素是,您可能需要一个私有证书捆绑包,出于安全原因,正确验证这一点是一个很好的做法。当API从Pod启动时,客户端证书位于/var/run/secrets/kubernetes.io/servicecomport/ca.crt
上,此外,您需要使用位于/var/run/secrets/kubernetes.io/servicecomport/token
上的令牌进行身份验证
但我真的需要带上一个完整的客户端库,只为了简单地到达一个端点吗
您从客户端库中获得的是:
- 使用证书和令牌实现身份验证
- 类型化客户端访问-而不是手工编码URL和请求
该示例显示了“在默认名称空间中列出POD”的“类型化客户端访问”的外观(请参阅):
Kubernetes库提供了一个示例,说明了您的目标(使用HttpClient)。您需要清除一些DI内容并过滤掉windows与Linux的逻辑。但它可以归结为两个小类(加上用于反序列化响应的实体类)。虽然它确实依赖于用户具有适当的角色绑定,并且可能是特定于AKS的,但它可能是一个start@pinkfloydx33对吧??非常有帮助,谢谢!是的。事实上,在去掉了所有DI和Windows的东西之后,我把它变成了一个Serilog enricher,这就是我对它的了解,因为他们有使用默认路径处理crt和令牌的逻辑,但不幸的是,这使得它很难在本地运行(尽管他们在测试中确实管理了),非常有用,谢谢!我在这里了解到,auth部分并不是很琐碎,因此,正如您所指出的,客户机库是有益的。是的,我们曾经遇到过这个问题。客户机库可以配置为使用本地kubectl配置或从Pod使用配置。我通常在我的代码中实现这两个功能,并使用一个标志进行选择——这样我就可以在本地和从Pod运行。
var config = KubernetesClientConfiguration.InClusterConfig() // auth from Pod
IKubernetes client = new Kubernetes(config);
Console.WriteLine("Starting Request!");
var list = client.ListNamespacedPod("default");
foreach (var item in list.Items)
{
Console.WriteLine(item.Metadata.Name);
}