前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >获取当前 Kubernetes namespace

获取当前 Kubernetes namespace

作者头像
JusterZhu
发布于 2025-01-23 12:35:22
发布于 2025-01-23 12:35:22
19300
代码可运行
举报
文章被收录于专栏:JusterZhuJusterZhu
运行总次数:0
代码可运行

在应用中获取当前所在 kubernetes 的 namespace

Intro

最近看到一篇文章获取在 Kuberbetes 中的 namespace 通过 kubectl 来获取,并且还要配置 token,觉得太复杂了,我们也有在应用中获取当前所在的 Kubernetes 的 namespace,在 kubernetes 中会有一个默认 in cluster 的配置,不过没有那么多的权限,如果要获取更多 kubernetes 中的信息需要配置 service account 配置 rbac 角色以及权限呢,但是获取当前 namespace 信息默认的权限就完全足够了

Sample

这里我先在 k8s 里跑一个 pod 来做一个测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl run dotnet-exec-playground --image=weihanli/dotnet-exec:0.23.0-web -- "WebApplication.Create().Run();"

借助 dotnet-exec 的容器镜像来在 k8s 里跑一个 pod,执行之后可以通过 kubectl logs/kubectl describe 来查看 pod 状态,这里直接查看 pod log kubectl logs dotnet-exec-playground

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> kubectl logs dotnet-exec-playground
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://[::]:8080
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app

看到这样的 log 就证明我们的 pod 跑起来了,接着可以进入到 pod 里执行命令来测试了

这里展示两种实现方式,一种是使用 k8s 的 C# SDK KubernetesClient 可以比较方便地直接获取 InCluster 的 config

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Console.WriteLine(KubernetesClientConfiguration.InClusterConfig().Namespace);

可以在 pod 里执行命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet-exec 'Console.WriteLine(KubernetesClientConfiguration.InClusterConfig().Namespace);'     -r "nuget:KubernetesClient" -u k8s

这里代表引用 KubernetesClient nuget 包并添加 k8s 命名空间的引用,执行上面的代码,打印 k8s in-clusterf 默认配置的 namespace

KubernetesClient-output

可以看到此时已经打印出来了当前的 namespace,我们执行的时候没有指定 namespace 所以是默认的命名空间 default,你也可以指定一个 namespace 来测试

如果不想引用 KubernetesClient 这个包的依赖也是可以的,如果查看下 KubernetesClient 的实现会发现其实 namespace 就是读了一个文件的内容,我们也可以直接读取这个文件,如果想加上前面的判断也是可以的,看自己需要

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
internal static string ServiceAccountPath =
    Path.Combine(new string[]
    {
        $"{Path.DirectorySeparatorChar}var", "run", "secrets", "kubernetes.io", "serviceaccount",
    });
internal const string ServiceAccountTokenKeyFileName = "token";
internal const string ServiceAccountRootCAKeyFileName = "ca.crt";
internal const string ServiceAccountNamespaceFileName = "namespace";

public static KubernetesClientConfiguration InClusterConfig()
{
    if (!IsInCluster())
    {
        throw new KubeConfigException(
            "Unable to load in-cluster configuration. Missing environment variables KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT or service account token. Hint: consider using option \"automountServiceAccountToken: true\" in deployment declaration.");
    }

    var rootCAFile = Path.Combine(ServiceAccountPath, ServiceAccountRootCAKeyFileName);
    var host = Environment.GetEnvironmentVariable("KUBERNETES_SERVICE_HOST");
    var port = Environment.GetEnvironmentVariable("KUBERNETES_SERVICE_PORT");
    if (string.IsNullOrEmpty(host))
    {
        host = "kubernetes.default.svc";
    }

    if (string.IsNullOrEmpty(port))
    {
        port = "443";
    }

    var result = new KubernetesClientConfiguration
    {
        Host = new UriBuilder("https", host, Convert.ToInt32(port)).ToString(),
        TokenProvider = new TokenFileAuth(Path.Combine(ServiceAccountPath, ServiceAccountTokenKeyFileName)),
        SslCaCerts = CertUtils.LoadPemFileCert(rootCAFile),
    };

    var namespaceFile = Path.Combine(ServiceAccountPath, ServiceAccountNamespaceFileName);
    if (FileSystem.Current.Exists(namespaceFile))
    {
        result.Namespace = FileSystem.Current.ReadAllText(namespaceFile);
    }

    return result;
}

可以看到 namespace 就是读了 namespaceFile 文件的内容,所以我们也可以直接读取这个文件的内容来获取 namespace 就不需要引用依赖了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Console.WriteLine(File.ReadAllText("/var/run/secrets/kubernetes.io/serviceaccount/namespace"));

更新下 dotnet-exec 命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dotnet-exec 'Console.WriteLine(File.ReadAllText("/var/run/secrets/kubernetes.io/serviceaccount/namespace"));'

output

从结果可以看出两次的结果是一样的

More

顺便打个广告 dotnet-exec0.23.0 开始也支持了打印当前 kubernetes namespace

可以通过 dotnet-exec info/dotnet --info 来查看

dotnet-exec info

References

  • https://github.com/kubernetes-client/csharp/blob/36a02046439d01f1256aed4e5071cb7f1b57d6eb/src/KubernetesClient/KubernetesClientConfiguration.InCluster.cs#L41
  • https://www.nuget.org/packages/KubernetesClient/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JusterZhu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在应用中获取当前所在 kubernetes 的 namespace
    • Intro
    • Sample
    • More
    • References
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档