如何使用Kubernetes Python API读取Pod内运行程序的annotations配置值
实现步骤
1. 配置RBAC权限(必须操作)
Pod默认的服务账号没有读取集群资源的权限,你需要先创建对应权限的Role并绑定到Pod使用的ServiceAccount:
# 定义允许读取Pod资源的Role apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: <你的Pod所在命名空间> name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get"] --- # 绑定Role到目标ServiceAccount apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods namespace: <你的Pod所在命名空间> subjects: - kind: ServiceAccount name: <你的Pod使用的ServiceAccount名称,默认是default> roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
2. 向Pod注入自身标识信息
你需要让运行在Pod内的程序知道自己所属的Pod名称和所在命名空间,推荐通过Downward API直接注入为环境变量,修改你的Deployment template配置:
template: metadata: annotations: foo: "var" spec: containers: - name: <你的容器名> image: <你的Python应用镜像> env: # 注入当前Pod名称 - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name # 注入当前Pod所在命名空间 - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
3. 安装Kubernetes Python客户端
在你的Python应用的依赖中添加官方客户端:pip install kubernetes
4. 编写读取annotations的代码
直接调用客户端API拉取当前Pod的元数据即可:
import os from kubernetes import client, config def get_pod_annotation(key: str): # 集群内加载Kubernetes配置 config.load_incluster_config() v1 = client.CoreV1Api() # 从环境变量读取Pod标识 pod_name = os.getenv("POD_NAME") pod_namespace = os.getenv("POD_NAMESPACE") # 读取Pod详情 pod = v1.read_namespaced_pod(name=pod_name, namespace=pod_namespace) # 从annotations字段取值,不存在返回None return pod.metadata.annotations.get(key) if __name__ == "__main__": foo_value = get_pod_annotation("foo") print(f"annotation foo的值是: {foo_value}")
注:如果你不想用Downward API注入环境变量,也可以直接从Pod内的默认路径读取命名空间:/var/run/secrets/kubernetes.io/serviceaccount/namespace,Pod名称可以直接取当前主机hostname(Pod默认hostname就是Pod名称,只要你没有手动修改hostname配置)
内容的提问来源于stack exchange,提问作者juan carlos Jj
相关产品推荐
相关产品推荐

