downwardAPI - 让容器了解自己的情况
Howard Yin 2020-08-08 11:35:02 Kubernetes概念实操存储Kubernetes对象
downwardAPI
用于让程序在容器中获取 Pod 的基本信息。
使用downwardAPI
让程序在容器中获取 Pod 基本信息的方法有两种:
- 把 Pod 基本信息放到环境变量中
- 把 Pod 基本信息生成文件挂载到容器内部(DownwardAPIVolumeFiles)
下面这些信息可以通过环境变量和DownwardAPIVolumeFiles提供给容器:
能通过
fieldRef
获得的:
metadata.name
- Pod名称metadata.namespace
- Pod名字空间metadata.uid
- Pod的UID, 版本要求 v1.8.0-alpha.2metadata.labels['<KEY>']
- 单个 pod 标签值<KEY>
(例如,metadata.labels['mylabel']
); 版本要求 Kubernetes 1.9+metadata.annotations['<KEY>']
- 单个 pod 的标注值<KEY>
(例如,metadata.annotations['myannotation']
); 版本要求 Kubernetes 1.9+能通过
resourceFieldRef
获得的:
- 容器的CPU约束值
- 容器的CPU请求值
- 容器的内存约束值
- 容器的内存请求值
- 容器的临时存储约束值, 版本要求 v1.8.0-beta.0
- 容器的临时存储请求值, 版本要求 v1.8.0-beta.0
此外,以下信息可通过DownwardAPIVolumeFiles从
fieldRef
获得:
metadata.labels
- all of the pod’s labels, formatted aslabel-key="escaped-label-value"
with one label per linemetadata.annotations
- all of the pod’s annotations, formatted asannotation-key="escaped-annotation-value"
with one annotation per linemetadata.labels
- 所有Pod的标签,以label-key="escaped-label-value"
格式显示,每行显示一个labelmetadata.annotations
- Pod的注释,以annotation-key="escaped-annotation-value"
格式显示,每行显示一个标签以下信息可通过环境变量从
fieldRef
获得:
status.podIP
- 节点IPspec.serviceAccountName
- Pod服务帐号名称, 版本要求 v1.4.0-alpha.3spec.nodeName
- 节点名称, 版本要求 v1.4.0-alpha.3status.hostIP
- 节点IP, 版本要求 v1.7.0-alpha.1
# 把 Pod 基本信息放到环境变量中
案例:
apiVersion: v1
kind: Pod
metadata:
name: test-env-pod
namespace: kube-system
spec:
containers:
- name: test-env-pod
image: busybox:latest
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name #获取Pod名称
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace #获取Pod名字空间
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP #获取节点IP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
在这个容器中查看环境变量:
$ env | grep POD
POD_IP=172.30.19.24
POD_NAME=test-env-pod
POD_NAMESPACE=kube-system
1
2
3
4
2
3
4
可以看到相关信息都已被写入。
# 把 Pod 基本信息生成文件挂载到容器内部
比如把上面那个加个注释改成挂载文件到容器内部:
apiVersion: v1
kind: Pod
metadata:
name: test-env-pod
namespace: kube-system
annotations:
build: test
own: qikqiak
spec:
volumes:
- name: pod-info
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations
containers:
- name: test-env-pod
image: busybox:latest
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
这样,我们就能在容器中看到两个文件:
$ ls /etc/podinfo
labels
annotations
$ cat /etc/podinfo/labels
k8s-app="test-volume"
node-env="test"
$ cat /etc/podinfo/annotations
build="test"
kubernetes.io/config.seen="2018-03-02T17:51:10.856356259+08:00"
kubernetes.io/config.source="api"
own="qikqiak"
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11