K8S 深入理解 Pod 对象( 四 )


# volume-pod.yamlapiVersion: v1kind: Podmetadata:name: volume-podnamespace: kube-systemlabels:k8s-app: test-volumenode-env: testannotations:own: youdianzhishibuild: testspec:volumes:- name: podinfodownwardAPI:items:- path: labelsfieldRef:fieldPath: metadata.labels- path: annotationsfieldRef:fieldPath: metadata.annotationscontainers:- name: volume-podimage: busyboxargs:- sleep- "3600"volumeMounts:- name: podinfomountPath: /etc/podinfo我们将元数据 labels 和 annotaions 以文件的形式挂载到了 /etc/podinfo 目录下,创建上面的 Pod:
?~ kubectl create -f volume-pod.yamlpod "volume-pod" created创建成功后,我们可以进入到容器中查看元信息是不是已经存入到文件中了:
?~ kubectl exec -it volume-pod /bin/sh -n kube-system/ # ls /etc/podinfo/..2019_11_13_09_57_15.990445016/annotations..data/labels/ # cat /etc/podinfo/labelsk8s-app="test-volume"/ # cat /etc/podinfo/annotationsbuild="test"kubectl.kubernetes.io/last-applied-configuration="{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"build":"test","own":"youdianzhishi"},"labels":{"k8s-app":"test-volume","node-env":"test"},"name":"volume-pod","namespace":"kube-system"},"spec":{"containers":[{"args":["sleep","3600"],"image":"busybox","name":"volume-pod","volumeMounts":[{"mountPath":"/etc/podinfo","name":"podinfo"}]}],"volumes":[{"downwardAPI":{"items":[{"fieldRef":{"fieldPath":"metadata.labels"},"path":"labels"},{"fieldRef":{"fieldPath":"metadata.annotations"},"path":"annotations"}]},"name":"podinfo"}]}}n"kubernetes.io/config.seen="2019-11-13T17:57:15.320894744+08:00"kubernetes.io/config.source="api"我们可以看到 Pod 的 Labels 和 Annotations 信息都被挂载到 /etc/podinfo 目录下面的 lables 和 annotations 文件了 。
目前,Downward API 支持的字段已经非常丰富了,比如:
1. 使用 fieldRef 可以声明使用:spec.nodeName - 宿主机名字status.hostIP - 宿主机IPmetadata.name - Pod的名字metadata.namespace - Pod的Namespacestatus.podIP - Pod的IPspec.serviceAccountName - Pod的Service Account的名字metadata.uid - Pod的UIDmetadata.labels['<KEY>'] - 指定<KEY>的Label值metadata.annotations['<KEY>'] - 指定<KEY>的Annotation值metadata.labels - Pod的所有Labelmetadata.annotations - Pod的所有Annotation2. 使用 resourceFieldRef 可以声明使用:容器的 CPU limit容器的 CPU request容器的 memory limit容器的 memory request注意
需要注意的是,Downward API 能够获取到的信息,一定是 Pod 里的容器进程启动之前就能够确定下来的信息 。而如果你想要获取 Pod 容器运行后才会出现的信息,比如,容器进程的 PID,那就肯定不能使用 Downward API 了,而应该考虑在 Pod 里定义一个 sidecar 容器来获取了 。
在实际应用中,如果你的应用有获取 Pod 的基本信息的需求,一般我们就可以利用Downward API来获取基本信息,然后编写一个启动脚本或者利用initContainer将 Pod 的信息注入到我们容器中去,然后在我们自己的应用中就可以正常的处理相关逻辑了 。
除了通过 Downward API 可以获取到 Pod 本身的信息之外,其实我们还可以通过映射其他资源对象来获取对应的信息,比如 Secret、ConfigMap 资源对象,同样我们可以通过环境变量和挂载 Volume 的方式来获取他们的信息,但是,通过环境变量获取这些信息的方式,不具备自动更新的能力 。所以,一般情况下,都建议使用 Volume 文件的方式获取这些信息,因为通过 Volume 的方式挂载的文件在 Pod 中会进行热更新 。




推荐阅读