Max*_*Max 4 .net c# kubernetes kubernetes-apiserver
我正在寻找一种轻量级的方法来从 C# 应用程序中的 Pod 访问 Kubernetes API。
Kubernetes 文档提到了从 Pod 访问 API的两种方法:
- 在 pod 中的 sidecar 容器中运行 kubectl proxy,或者作为容器内的后台进程
这通常是有效的,并且只需一两行代码即可轻松访问 API 端点 - 例如:
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"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
然而,现在有一个正在运行的kubectl proxy流程来监视、维护等——这对于生产来说似乎并不理想。
- 使用Go客户端库,并使用rest.InClusterConfig()和kubernetes.NewForConfig()函数创建客户端。它们处理 apiserver 的定位和身份验证。
我的应用程序是用 C# 编写的,而不是 Go。有一个C# 客户端库可能能够实现相同的目标。但是,我真的需要将整个客户端库引入到单个端点上,以便进行简单的 GET 操作吗?
理想情况下,我想只使用WebClient,如上面的示例所示。文档提到
在 Pod 中定位 apiserver 的推荐方法是使用 kubernetes.default.svc DNS 名称,该名称解析为服务 IP,而该服务 IP 又将路由到 apiserver。
那么,在上面的例子中,我可以这样做吗...
var apiBaseUrl = "http://kubernetes.default.svc"
Run Code Online (Sandbox Code Playgroud)
...并获得WebClient所需的服务帐户凭据?如果是,怎么办?
理想情况下,我想只使用 WebClient
Kubernetes 是一个 REST API,所以这可以工作。如使用 kubectl 代理直接访问 REST API所示,可以使用例如 轻松探索 API curl。
curl带有and的示例kubectl proxy- 响应采用 json 格式。
curl http://localhost:8080/api/v1/pods
Run Code Online (Sandbox Code Playgroud)
复杂的因素是您可能需要一个私有证书捆绑包,出于安全原因,最好正确验证它。从Pod访问API时,客户端证书位于/var/run/secrets/kubernetes.io/serviceaccount/ca.crt,此外,您需要使用位于的令牌进行身份验证/var/run/secrets/kubernetes.io/serviceaccount/token
但是,我真的需要将整个客户端库引入到单个端点上,以便进行简单的 GET 操作吗?
您从客户端库得到的是:
dotnet -client示例显示了“在默认命名空间中列出 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);
}
Run Code Online (Sandbox Code Playgroud)