我们知道,每个pod在被成功创建出来之后,都会被系统分配一个唯一的名字,IP地址,并且处于某个Namespace中,
那么我们如何在pod的容器内获取pod的这些重要信息呢? 答案就是使用-Downward API
Downward API 可以使用通过以下两种方式将Pod信息注入容器内部。
1:(环境变量) 用于单个变量,可以将pod信息和container信息注入容器内部
2: (volume 挂载) 将数组类信息生成为文件并挂载到容器内部
环境变量方式:将pod信息注入为环境变量
下面的例子通过Downward API将Pod的IP ,名称和所在Namespace注入容器的环境变量中,容器应用使用env命令将全部环境变量打印到标准输出中:
[root@k8s-master ~]# kubectl explain pod.spec.containers.env.valueFrom.fieldRef.fieldPath
KIND: Pod
VERSION: v1
FIELD: fieldPath <string>
DESCRIPTION:
Path of the field to select in the specified API version.
vim dapi-test.yaml
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: busybox
command: ["/bin/sh","-c","env"]
env:
- 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
restartPolicy: Never
目前Downward API 提供了以下变量:
metadata.name:pod的名称
metadata.namespace: pod所在的namespace
status.PodIP:pod的ip地址
运行kubectl create 命令创建pod
[root@k8s-master ~]# kubectl create -f dapi-test-pod.yaml pod/dapi-test-pod created
查看dapi-test-pod的日志
[root@k8s-master ~]# kubectl logs dapi-test-pod KUBERNETES_SERVICE_PORT=443 KUBERNETES_PORT=tcp://10.96.0.1:443 HOSTNAME=dapi-test-pod SHLVL=1 HOME=/root MY_POD_NAMESPACE=default MY_POD_IP=10.240.0.48 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 MYSQL_PORT_3306_TCP_ADDR=10.96.251.103 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MYSQL_PORT_3306_TCP_PORT=3306 KUBERNETES_PORT_443_TCP_PORT=443 MYSQL_PORT_3306_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP_PROTO=tcp MYSQL_SERVICE_HOST=10.96.251.103 MYSQL_SERVICE_PORT=3306 MYSQL_PORT=tcp://10.96.251.103:3306 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 MYSQL_PORT_3306_TCP=tcp://10.96.251.103:3306 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_SERVICE_HOST=10.96.0.1 PWD=/ MY_POD_NAME=dapi-test-pod
从日志中我们可以看到pod的ip,name及namespace等信息 都被 正确保存到了pod的环境变量中