如何在运行的Python Flask实例中获取k8s Deployment的labels标签信息
实现方案
该需求完全可以实现,根据你的场景可以选择以下两种方案:
方案1:使用Downward API直接注入(最推荐,无额外依赖)
你当前配置中Deployment的metadata.labels.app和Pod模板的labels.app值完全一致,直接通过Kubernetes内置的Downward API把标签注入为容器环境变量即可,不需要调用K8s API。
修改你的Deployment配置的containers段,新增env配置:
containers: - image: gcr.io/github.com/my-company/my-app imagePullPolicy: IfNotPresent name: my-app-1 # 新增环境变量注入配置 env: - name: APP_NAME valueFrom: fieldRef: fieldPath: metadata.labels['app'] resources: limits: cpu: 100m memory: 200Mi requests: cpu: 10m memory: 100Mi
重新apply配置后,Flask应用直接调用os.getenv("APP_NAME")就能拿到对应值,实现成本最低。
方案2:调用Kubernetes API查询(适用Pod标签与Deployment标签不一致的场景)
你之前用Python客户端查询失败,是因为没有给Pod配置API访问权限,也没有做Pod到所属Deployment的关联,按以下步骤配置即可:
- 先通过Downward API注入当前Pod的基础信息到环境变量
env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
- 配置RBAC权限,允许Pod查询相关资源
创建对应的ServiceAccount、Role、RoleBinding:
apiVersion: v1 kind: ServiceAccount metadata: name: app-reader namespace: production --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: production name: deployment-reader rules: - apiGroups: ["apps"] resources: ["replicasets", "deployments"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-deployments namespace: production subjects: - kind: ServiceAccount name: app-reader namespace: production roleRef: kind: Role name: deployment-reader apiGroup: rbac.authorization.k8s.io
然后在Deployment的spec.template.spec段新增serviceAccountName: app-reader,给Pod绑定该权限身份。
3. 代码查询逻辑
- 读取环境变量拿到当前Pod的名称和命名空间
- 查询当前Pod的
metadata.ownerReferences字段,找到所属的ReplicaSet - 查询ReplicaSet的
metadata.ownerReferences字段,找到所属的Deployment - 直接读取Deployment的
metadata.labels.app值即可
内容的提问来源于stack exchange,提问作者FairPluto
相关产品推荐
相关产品推荐

