本章节展示了Pod如何使用DownwardAPIVolumeFile公开信息到自己运行的容器。DownwardAPIVolumeFile可以公开Pod字段和容器字段。
存储Pod字段
在本次实验中,创建一个包含一个容器的Pod,下面是这个Pod的配置文件:
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-downwardapi-volume-example
labels:
zone: us-est-coast
cluster: test-cluster1
rack: rack-22
annotations:
build: two
builder: john-doe
spec:
containers:
- name: client-container
image: gcr.io/google_containers/busybox
command: ["sh", "-c"]
args:
- while true; do
if [[ -e /etc/labels ]]; then
echo -en '\n\n'; cat /etc/labels; fi;
if [[ -e /etc/annotations ]]; then
echo -en '\n\n'; cat /etc/annotations; fi;
sleep 5;
done;
volumeMounts:
- name: podinfo
mountPath: /etc
readOnly: false
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations
在配置文件中,可以看到Pod有一个downwardAPI卷,并且容器挂载卷到/etc。
观察downwardAPI下面的items的数组。数组的每一个元素都是DownwardAPIVolumeFile。第一个元素指定了值是Pod的metadata.labels字段存储进一个名字为labels的文件里面。第二个元素指定了值是Pod的annotations字段存储进了名字为annotation文件。
注意:在这个例子里面这些字段都是Pod的字段,不是运行在Pod里面容器的字段。
创建Pod:
kubectl create -f test.yaml
验证Pod中的容器是否运行:
kubectl get pods
查看容器日志:
kubectl logs kubernetes-downwardapi-volume-example
输出展示了labels和annotations文件的内容:
cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"
build="two"
builder="john-doe"
用shell进入这个Pod的容器里面
kubectl exec -it kubernetes-downwardapi-volume-example -- sh
在shell里查看labels文件:
/# cat /etc/labels
输出展示了Pod所有的标签已经写入到labels文件里面:
cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"
同样的查看annotations文件:
/# cat /etc/annotations
查看 /etc目录下面的文件:
/# ls -laR /etc
在输出里面看一看到labels和annotations文件在临时文件子目录里面:
在这个例子里面,..2982_06_02_21_47_53.299460680在/etc目录里,..data是一个软连接到临时子目录里面。同样的在/etc目录里面labels和annotations是软连接。
drwxr-xr-x ... Feb 6 21:47 ..2982_06_02_21_47_53.299460680
lrwxrwxrwx ... Feb 6 21:47 ..data -> ..2982_06_02_21_47_53.299460680
lrwxrwxrwx ... Feb 6 21:47 annotations -> ..data/annotations
lrwxrwxrwx ... Feb 6 21:47 labels -> ..data/labels
/etc/..2982_06_02_21_47_53.299460680:
total 8
-rw-r--r-- ... Feb 6 21:47 annotations
-rw-r--r-- ... Feb 6 21:47 labels
使用软连接可以实现元数据动态原子更新;更新将写入临时目录,..data软连接使用rename(2)原子更新。
存储容器字段
在上面的实验,存储Pod字段在DownwardAPIVolumeFile里面。在下面的实验可以存储容器字段。下面是Pod的配置文件运行了一个容器:
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-downwardapi-volume-example-2
spec:
containers:
- name: client-container
image: gcr.io/google_containers/busybox:1.24
command: ["sh", "-c"]
args:
- while true; do
echo -en '\n';
if [[ -e /etc/cpu_limit ]]; then
echo -en '\n'; cat /etc/cpu_limit; fi;
if [[ -e /etc/cpu_request ]]; then
echo -en '\n'; cat /etc/cpu_request; fi;
if [[ -e /etc/mem_limit ]]; then
echo -en '\n'; cat /etc/mem_limit; fi;
if [[ -e /etc/mem_request ]]; then
echo -en '\n'; cat /etc/mem_request; fi;
sleep 5;
done;
resources:
requests:
memory: "32Mi"
cpu: "125m"
limits:
memory: "64Mi"
cpu: "250m"
volumeMounts:
- name: podinfo
mountPath: /etc
readOnly: false
volumes:
- name: podinfo
downwardAPI:
items:
- path: "cpu_limit"
resourceFieldRef:
containerName: client-container
resource: limits.cpu
- path: "cpu_request"
resourceFieldRef:
containerName: client-container
resource: requests.cpu
- path: "mem_limit"
resourceFieldRef:
containerName: client-container
resource: limits.memory
- path: "mem_request"
resourceFieldRef:
containerName: client-container
resource: requests.memory
在这个配置文件里面,可以看到Pod有一个downwardAPI卷,并且挂载到/etc里面。
观察downwardAPI下面的items。数组的每个元素是一个DownwardAPIVolumeFile。
第一个元素指定了名字为client-container的容器,值是limits.cpu的字段存进名字为cpu_limit的文件里面。
创建Pod:
kubectl create -f test.yaml
用shell进入到运行的Pod的容器里面:
kubectl exec -it kubernetes-downwardapi-volume-example-2 -- sh
在shell里面查看cpu_limit文件:
/# cat /etc/cpu_limit
可以用类似的命令查看cpu_request,mem_limit和mem_request文件。
Downward API功能
容器可以通过环境变量和DownwardAPIVolumeFiles获得下面的信息:
- 节点的名字
- Pod的名字
- Pod的namespace
- Pod的IP地址
- Pod服务的账号名字
- 容器的CPU限制
- 容器的CPU请求
- 容器的内存限制
- 容器的内存请求
额外的可以通过DownwardAPIVolumeFiles获得下面的信息:
- Pod的标签
- Pod的注解
注意:如果容器没有指定CPU和内存限制,Downward API默认的值是节点可分配的CPU和内存。