我们都知道,Pod的逻辑概念在容器之上,K8s 在成功创建Pod之后,会为Pod和容器设置一些额外的信息,例如Pod级别的Pod 名称,Pod IP ,Label,Annotation,容器级别的资源限制等。
在很多应用场景中,这些信息对容器内的应用来说都很有用,例如使用Pod名称作为日志记录的一个字段用于标识日志来源,为了在容器内获取Pod级别的这些信息,k8s 提供了Downward API 机制来将Pod 和容器的某些元数据信息注入容器环境内,供容器应用方便地使用。
Downward API 可以通过以下两种方式将Pod 和容器的元数据信息注入容器内部。
(1)环境变量:将Pod或Container信息设置为容器内的环境变量。
(2)Volume挂载:将Pod或Container信息以文件的形式挂载到容器内部。
下面通过例子对Downward API 的用法进行说明。
一. 环境变量方式
通过环境变量的方式可以将Pod 信息或Container 信息注入容器运行环境中,下面通过两个例子进行说明。
- 将Pod 信息设置为容器内的环境变量
下面的例子通过Downward API 将Pod 的IP,名称和所在命名空间注入容器的环境变量中,Pod 的yaml 文件如下:
# dapi-envars-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-fieldref
spec:
containers:
- name: test-container
image: busybox
command: ["sh","-c"]
args:
- while true; do
echo -en '\n';
printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;
sleep 10;
done;
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: MY_POD_SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
restartPolicy: Never
注意,环境变量不直接设置value,而是设置valueFrom 对Pod 的元数据进行引用。
在本例中通过会Downward API 的设置使用了以下Pod 的元数据信息设置环境变量。
(1) spec.nodeName: Pod 所在Node 的名称。
(2)metadata.name: Pod 名称。
(3)metadata.namespace:Pod所在命名空间的名称。
(4)status.podIP:Pod的IP地址。
(5)spec.serviceAccountName:Pod 使用的ServiceAccount名称。
运行kubectl create 命令创建这个Pod:
[root@k8s-master ~]# kubectl create -f dapi-envars-pod.yaml
pod/dapi-envars-fieldref created
查看Pod的日志,可以看到容器启动命令将环境变量的值打印出来:
[root@k8s-master ~]# kubectl logs dapi-envars-fieldref
k8s-node-1
dapi-envars-fieldref
default
10.244.109.86
default
.......
我们从日志中可以看到Pod 的Node IP ,Pod名称,命名空间名称,Pod IP ServiceAccount 名称等信息都被正确设置到了容器的环境变量中。
也可以通过kubectl exec 命令登陆容器查看环境变量的设置:
[root@k8s-master ~]# kubectl exec -it dapi-envars-fieldref -- sh
/ # printenv | grep MY
MY_POD_SERVICE_ACCOUNT=default
MY_POD_NAMESPACE=default
MY_POD_IP=10.244.109.