如何使用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
相关产品推荐
相关产品推荐

