kubectl explain pod.spec.volumes.downwardAPI

不是为了存放容器的数据也不是用来进行容器和宿主机的数据交换的,而是让 Pod 里的容器能够直接获取到这个 Pod 对象本身的一些信息

Downward API 能够获取到的信息,一定是 Pod 里的容器进程启动之前就能够确定下来的信息。如果想要获取 Pod 容器运行后才会出现的信息,比如,容器进程的 PID,那就肯定不能使用 Downward API 了,而应该考虑在 Pod 里定义一个 sidecar 容器来获取了

目前 Downward API 提供了两种方式用于将 Pod 的信息注入到容器内部:

  • 环境变量:用于单个变量,可以将 Pod 信息和容器信息直接注入容器内部
  • Volume 挂载:将 Pod 信息生成为文件,直接挂载到容器内部中去

通过环境变量获取这些信息的方式,不具备自动更新的能力
一般情况下,建议使用 Volume 文件的方式获取这些信息,因为通过 Volume 的方式挂载的文件在 Pod 中会进行热更新

pod env

  1. kind: Pod
  2. metadata:
  3. name: env-pod
  4. spec:
  5. containers:
  6. - name: env-pod
  7. image: busybox
  8. command: ["/bin/sh", "-c", "env | grep pod"]
  9. env:
  10. - name: pod_NAME
  11. valueFrom:
  12. fieldRef:
  13. fieldPath: metadata.name
  14. - name: pod_NAMESPACE
  15. valueFrom:
  16. fieldRef:
  17. fieldPath: metadata.namespace
  18. - name: pod_IP
  19. valueFrom:
  20. fieldRef:
  21. fieldPath: status.podIP

Volume 挂载

支持的值
metadata.annotations
metadata.labels
metadata.name
metadata.namespace
metadata.uid

volume-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-pod
namespace: kube-system
spec:
volumes:
- name: podinfo
downwardAPI:
items:
- path: pod_name
fieldRef:
fieldPath: metadata.name
- path: pod_ns
fieldRef:
fieldPath: metadata.namespace
containers:
- name: volume-pod-c1
image: busybox
args:
- sleep
- “3600”
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo