C# 从C中的pod访问Kubernetes API#

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

我正在寻找一种轻量级的方法,从C#app中的Pod访问Kubernetes API

Kubernetes文件提到了两种方法:

  • 在pod中的sidecar容器中运行kubectl代理,或作为容器中的后台进程运行
  • 这通常是可行的,只需一两行代码就可以轻松地命中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"));
            }
        }
    }
    
    然而,现在有一个运行中的
    kubectl proxy
    过程来监视、维护等-这似乎不适合生产

  • 使用Go客户端库,并使用rest.InClusterConfig()和kubernetes.NewForConfig()函数创建客户端。它们处理对apiserver的定位和身份验证
  • 我的应用程序是用C#编写的,不是Go。有一种可能实现同样目标的方法。但我真的需要带上一个完整的客户端库,只为了简单地到达一个端点吗

    理想情况下,我只想使用
    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);
    }