首页 > 解决方案 > 从 C# 中的 pod 访问 Kubernetes API

问题描述

我正在寻找一种轻量级的方法来从 C# 应用程序中的 Pod 访问 Kubernetes API。

Kubernetes 文档提到了两种从 Pod 访问 API 的方法:

  1. 在 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"));
        }
    }
}

然而,现在有一个正在运行的kubectl proxy过程来监控、维护等——这对于生产来说似乎并不理想。

  1. 使用 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"

...并WebClient通过所需的服务帐户凭据?如果是,如何?

标签: c#.netkuberneteskubernetes-apiserver

解决方案


理想情况下,我只想使用 WebClient

Kubernetes 是一个 REST API,所以这可以工作。如使用 kubectl 代理直接访问 REST API所示,使用例如curl.

curl带有和的示例kubectl proxy- 响应为 json 格式。

curl http://localhost:8080/api/v1/pods

复杂的因素是您可能需要一个私有证书包,并且出于安全原因正确验证它是一种很好的做法。从Pod访问/var/run/secrets/kubernetes.io/serviceaccount/ca.crtAPI 时,客户端证书位于/var/run/secrets/kubernetes.io/serviceaccount/token

但是,我真的必须为了一个简单的 GET 到单个端点而引入整个客户端库吗?

您从客户端库中获得的是:

  • 使用证书和令牌实现身份验证
  • 键入的客户端访问 - 而不是手动代码 url 和请求

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);
}

推荐阅读