Kubernetes 容器内获取Pod信息
概述
我们知道,Pod的逻辑概念在容器之上,kubernetes在成功创建pod之后,会为pod和容器设置一些额外的信息,例如pod级别的 pod名称、pod IP、Node IP、Label、Annotation、容器级别的资源限制等。在很多的使用场景中,这些信息对容器内的应用有很大的用处,Kubernetes提供了Downward API机制来将Pod和容器的某些元数据信息注入到容器环境中以方便提供给容器中的应用使用。
Downward API可以通过以下两种方式将Pod和容器的元数据信息注入容器内部。
⭕环境变量:将Pod或者容器信息设置为容器的环境变量。
⭕Volume挂载:将Pod或者容器信息以文件的形式挂载到容器内部。
环境变量方式
将Pod信息设置为容器内的环境变量
# dapi-envars-fieldref.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的元数据信息设置环境变量。
⭕spec.nodeName:Pod所在的Node的名称
⭕metadata.name:Pod名称
⭕metadata.namespace:Pod所在的命名空间的名称
⭕status.podIP: Pod的IP地址
⭕spec.serviceAccountName:Pod使用的ServiceAccount名称
可以通过kubectl logs dapi-envars-fieldref 查看上述pod的日志信息
将Container信息设置为容器内的环境变量
# dapi-envars-container.yaml
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-resourcefieldref
spec:
containers:
- name: test-container
image: busybox
imagePullPolicy: Never
command: [ "sh", "-c"]
args:
- while true; do
echo -en '\n';
printenv MY_CPU_REQUEST MY_CPU_LIMIT;
printenv MY_MEM_REQUEST MY_MEM_LIMIT;
sleep 10;
done;
resources:
requests:
memory: "32Mi"
cpu: "125m"
limits:
memory: "64Mi"
cpu: "250m"
env:
- name: MY_CPU_REQUEST
valueFrom:
resourceFieldRef:
containerName: test-container
resource: requests.cpu
- name: MY_CPU_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.cpu
- name: MY_MEM_REQUEST
valueFrom:
resourceFieldRef:
containerName: test-container
resource: requests.memory
- name: MY_MEM_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.memory
restartPolicy: Never
在上例中通过Downward API将Container的资源限制信息设置为环境变量。
⭕requests.cpu:容器的CPU请求值
⭕limits.cpu:容器的CPU限制值
⭕requests.memory: 容器的内存请求值
⭕limits.memory: 容器的内存限制值
Volume 挂载方式
将Pod信息挂载为容器内的文件
下面的例子通过Downward API将Pod的Label、Annotation信息通过Volume挂载为容器中的文件:
# dapi-volume.yaml
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: busybox
command: ["sh", "-c"]
args:
- while true; do
if [[ -e /etc/podinfo/labels ]]; then
echo -en '\n\n'; cat /etc/podinfo/labels; fi;
if [[ -e /etc/podinfo/annotations ]]; then
echo -en '\n\n'; cat /etc/podinfo/annotations; fi;
sleep 5;
done;
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations
在本例中使用了以下Pod元数据信息:
⭕metadata.labels: Pod的Lable列表
⭕metadata.annotations:Pod的Annotation列表
在上例中,系统将在容器内的/etc/podinfo目录下生成labels和annotations两个文件,在labels文件中将包含Pod的全部Label列表,在annotations文件中将包含Pod的全部Annotation列表。
将Container信息挂载为容器内的文件
# dapi-volume-resources.yaml
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-downwardapi-volume-example-2
spec:
containers:
- name: client-container
image: busybox
command: ["sh", "-c"]
args:
- while true; do
echo -en '\n';
if [[ -e /etc/podinfo/cpu_limit ]]; then
echo -en '\n'; cat /etc/podinfo/cpu_limit; fi;
if [[ -e /etc/podinfo/cpu_request ]]; then
echo -en '\n'; cat /etc/podinfo/cpu_request; fi;
if [[ -e /etc/podinfo/mem_limit ]]; then
echo -en '\n'; cat /etc/podinfo/mem_limit; fi;
if [[ -e /etc/podinfo/mem_request ]]; then
echo -en '\n'; cat /etc/podinfo/mem_request; fi;
sleep 5;
done;
resources:
requests:
memory: "32Mi"
cpu: "125m"
limits:
memory: "64Mi"
cpu: "250m"
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
volumes:
- name: podinfo
downwardAPI:
items:
- path: "cpu_limit"
resourceFieldRef:
containerName: client-container
# 容器的CPU限制
resource: limits.cpu
divisor: 1m
- path: "cpu_request"
resourceFieldRef:
containerName: client-container
# 容器的CPU请求
resource: requests.cpu
divisor: 1m
- path: "mem_limit"
resourceFieldRef:
containerName: client-container
# 容器的内存限制
resource: limits.memory
divisor: 1Mi
- path: "mem_request"
resourceFieldRef:
containerName: client-container
# 容器的内存请求
resource: requests.memory
divisor: 1Mi
Downward API支持设置的Pod和Container信息
-
可以通过fieldRef设置的元数据
metadata.name:Pod名称。
metadata.namespace:Pod所在的命名空间名称。
metadata.uid:Pod的UID,
metadata.labels[‘’]:Pod某个Label的值,通过<key>进行引用
metadata.annotations[‘’]:Pod某个Annotation的值,通过<key>进行引用
status.podIP:Pod的IP地址
spec.serviceAccountName:Pod使用的ServiceAccount名称。
spec.nodeName:Pod所在Node的名称,
status.hostIP:Pod所在Node的IP地址 -
可以通过resourceFieldRef设置的数据
Container级别的CPU Limit。
Container级别的CPU Request。
Container级别的Memory Limit。
Container级别的Memory Request。
Container级别的临时存储空间(ephemeral-storage)Limit
Container级别的临时存储空间(ephemeral-storage)Request,
参考来源:
《Kubernetes 权威指南》第5版