容器编排之战(十八)连载

tech2026-02-23  2

Downward API

Downward API 用于在容器中获取 POD 的基本信息,kubernetes原生支持 ​ Downward API提供了两种方式用于将 POD 的信息注入到容器内部: 1.环境变量:用于单个变量,可以将 POD 信息和容器信息直接注入容器内部。 2.Volume挂载:将 POD 信息生成为文件,直接挂载到容器内部中去。 ​ 环境变量的方式: 通过Downward API来将 POD 的 IP、名称以及所对应的 namespace 注入到容器的环境变量中去,然后在容器中打印全部的环境变量来进行验证

使用fieldRef获取 POD 的基本信息:

[root@kub-k8s-master prome]# vim test-env-pod.yml --- apiVersion: v1 kind: Pod metadata: name: test-env-pod namespace: kube-system spec: containers: - name: test-env-pod image: daocloud.io/library/nginx env: - name: POD_NAME #第一个环境变量的名字 valueFrom: #使用valueFrom方式设置 fieldRef: #关联一个字段metadata.name fieldPath: metadata.name #这个字段从当前运行的pod详细信息查看 - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP 注意: POD 的 name 和 namespace 属于元数据,是在 POD 创建之前就已经定下来了的,所以使用 metata 获取就可以了,但是对于 POD 的 IP 则不一样,因为POD IP 是不固定的,POD 重建了就变了,它属于状态数据,所以使用 status 去获取: 所有基本信息可以使用下面的方式去查看(describe方式看不出来): # kubectl get pod first-pod -o yaml

创建上面的 POD:

[root@kub-k8s-master prome]# kubectl apply -f test-env-pod.yml pod/test-env-pod created

POD 创建成功后,查看:

[root@kub-k8s-master prome]# kubectl exec -it test-env-pod /bin/bash -n kube-system root@test-env-pod:/# env | grep POD POD_NAME=test-env-pod POD_NAMESPACE=kube-system POD_IP=10.244.1.35 root@test-env-pod:/#

Volume挂载

通过Downward API将 POD 的 Label、Annotation 等信息通过 Volume 挂载到容器的某个文件中去,然后在容器中打印出该文件的值来验证。

[root@kub-k8s-master prome]# vim test-volume-pod.yaml --- apiVersion: v1 kind: Pod metadata: name: test-volume-pod namespace: kube-system labels: k8s-app: test-volume node-env: test spec: containers: - name: test-volume-pod-container image: daocloud.io/library/nginx volumeMounts: - name: podinfo mountPath: /etc/podinfo volumes: - name: podinfo downwardAPI: items: - path: "labels" fieldRef: fieldPath: metadata.labels

将元数据 labels 和 annotaions 以文件的形式挂载到了/etc/podinfo目录下,创建上面的 POD :

[root@kub-k8s-master prome]# kubectl apply -f test-volume-pod.yaml pod/test-volume-pod created [root@kub-k8s-master prome]# kubectl get pod -n kube-system [root@k8s-master prome]# kubectl exec -it test-volume-pod /bin/bash -n kube-system

在实际应用中,如果你的应用有获取 POD 的基本信息的需求,就可以利用Downward API来获取基本信息,然后编写一个启动脚本或者利用initContainer将 POD 的信息注入到容器中去,然后在自己的应用中就可以正常的处理相关逻辑了。

目前 Downward API 支持的字段: 1. 使用 fieldRef 可以声明使用: spec.nodeName - 宿主机名字 status.hostIP - 宿主机 IP metadata.name - Pod 的名字 metadata.namespace - Pod 的 Namespace status.podIP - Pod 的 IP spec.serviceAccountName - Pod 的 Service Account 的名字 metadata.uid - Pod 的 UID metadata.labels['<KEY>'] - 指定 <KEY> 的 Label 值 metadata.annotations['<KEY>'] - 指定 <KEY> 的 Annotation 值 metadata.labels - Pod 的所有 Label metadata.annotations - Pod 的所有 Annotation ​ ​ 上面这个列表的内容,随着 Kubernetes 项目的发展肯定还会不断增加。所以这里列出来的信息仅供参考,在使用 Downward API 时,还是要记得去查阅一下官方文档。 ​ Secret、ConfigMap,以及 Downward API 这三种 Projected Volume 定义的信息,大多还可以通过环境变量的方式出现在容器里。但是,通过环境变量获取这些信息的方式,不具备自动更新的能力。一般情况下,建议使用 Volume 文件的方式获取这些信息。

 

 

最新回复(0)