You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Golang获取Kubernetes集群中当前运行Pod的annotation?

在Kubernetes中运行的Golang应用获取自身Pod annotation的方案

推荐工具库

直接使用Kubernetes官方维护的Go客户端 client-go 即可实现,这是目前生产环境最常用的方案,稳定性和兼容性都有保障。

实现步骤

  • 第一步:获取当前Pod的名称和所在命名空间
    可以通过Kubernetes的Downward API在部署时将这两个参数注入为应用的环境变量,Deployment配置示例如下:
    env:
    - name: MY_POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: MY_POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    
  • 第二步:初始化集群内客户端并查询Pod元数据
    参考代码片段如下:
    import (
      "context"
      "os"
    
      metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
      "k8s.io/client-go/kubernetes"
      "k8s.io/client-go/rest"
    )
    
    func GetPodAnnotations() (map[string]string, error) {
      // 初始化集群内配置
      config, err := rest.InClusterConfig()
      if err != nil {
        return nil, err
      }
      // 创建客户端
      clientset, err := kubernetes.NewForConfig(config)
      if err != nil {
        return nil, err
      }
      // 读取环境变量中的Pod信息
      podName := os.Getenv("MY_POD_NAME")
      podNs := os.Getenv("MY_POD_NAMESPACE")
      // 查询Pod详情
      pod, err := clientset.CoreV1().Pods(podNs).Get(context.TODO(), podName, metav1.GetOptions{})
      if err != nil {
        return nil, err
      }
      // 返回annotation
      return pod.Annotations, nil
    }
    
  • 第三步:配置RBAC权限
    你需要为应用绑定的ServiceAccount授予读取Pod资源的权限,RBAC配置示例如下:
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: 你的应用所在命名空间
      name: pod-meta-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      namespace: 你的应用所在命名空间
      name: pod-meta-reader-binding
    subjects:
    - kind: ServiceAccount
      name: 你的应用绑定的ServiceAccount名称
      namespace: 你的应用所在命名空间
    roleRef:
      kind: Role
      name: pod-meta-reader
      apiGroup: rbac.authorization.k8s.io
    

轻量替代方案

如果不想引入client-go的重依赖,也可以直接调用Kubernetes APIServer的原生接口实现:
Pod内默认会挂载ServiceAccount的CA证书、Token,命名空间也可以直接从/var/run/secrets/kubernetes.io/serviceaccount/namespace文件读取,你只需要构造HTTPS请求访问https://kubernetes.default.svc/api/v1/namespaces/{命名空间}/pods/{Pod名称},解析返回的JSON数据即可取到annotation字段。

注意:轻量方案同样需要配置上述的RBAC权限

内容的提问来源于stack exchange,提问作者user16907752

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:57:03