Downward API
容器内部获取pod级别的信息,包括Pod级别的Pod名称、Pod IP、Node IP、Label、Annotation、容器级别的资源限制等
Downward API 在容器内获取Pod信息
Downward API将Pod和容器的元数据信息注入容器内部的两种方式
- 环境变量:将Pod或Container信息设置为容器内的环境变量
- Volume挂载:将Pod或Container信息以文件的形式挂载到容器内部
环境变量方式
将Pod信息设置为容器内的环境变量
通过Downward API将Pod的IP、名称和所在命名空间注入容器的环境变量中
# dapi-envars-pod.yaml
# 环境变量不直接设置value,而是设置valueFrom对Pod的元数据进行引用
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-fieldref
spec:
containers:
- name: test-container
image: busybox
imagePullPolicy: IfNotPresent
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;
leep 10;
done;
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName # Pod所在Node的名称
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name # Pod名称
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace # Pod所在命名空间的名称
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP # Pod的IP地址
- name: MY_POD_SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName #Pod使用的ServiceAccount名称
restartPolicy: Never
# 创建
# kubectl create -f dapi-envars-pod.yaml
# 查看pod日志,核查容器启动命令的输出
# kubectl logs dapi-envars-fieldref
# 查看容器的内的环境变量设置
# kubectl exec -it dapi-envars-fieldref -- printenv |grep MY
将Container信息设置为容器内的环境变量
将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;
args:
- while true; do
echo -en '\n';
printenv MY_CPU_REQUEST MY_CPU_LIMIT;
printenv MY_MEM_REQUEST MY_MEM_LIMIT;
sleep 3600;
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 # 容器的CPU请求值。
- name: MY_CPU_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.cpu # 容器的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
# 创建
# kubectl create -f dapi-envars-container.yaml
# 查看日志
# kubectl logs dapi-envars-resourcefieldref
Volume挂载方式
将Pod信息挂载为容器内的文件
将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
imagePullPolicy: IfNotPresent
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 # Pod的Label列表
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations # Pod的Annotation列表
# 创建
# kubectl create -f dapi-volume.yaml
# 查看日志
# kubectl logs kubernetes-downwardapi-volume-example
# 进入容器查看挂载文件
# kubectl exec -it kubernetes-downwardapi-volume-example -- ls /etc/podinfo
# 查看文件内容
# kubectl exec -it kubernetes-downwardapi-volume-example -- cat /etc/podinfo/labels
# kubectl exec -it kubernetes-downwardapi-volume-example -- cat /etc/podinfo/annotations
将Container信息挂载为容器内的文件
将Container的资源限制信息通过Volume挂载为容器中的文件
# dpi-volume-resources.yaml
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-downwardapi-volume-example-2
spec:
containers:
- name: client-container
image: busybox
imagePullPolicy: IfNotPresent
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_1imit"
resourceFieldRef:
containerName: client-container
resource: limits.cpu # 容器的CPU限制值。
divisor: 1m
- path: "cpu_request"
resourceFieldRef:
containerName: client-container
resource: requests.cpu # 容器的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
# 创建
# kubectl create -f dpi-volume-resources.yaml
# 查看日志
# kubectl logs kubernetes-downwardapi-volume-example-2
# 查看容器内挂载的文件
# kubectl exec -it kubernetes-downwardapi-volume-example-2 -- ls /etc/podinfo
# 查看文件内容
# kubectl exec -it kubernetes-downwardapi-volume-example-2 -- cat /etc/podinfo/cpu_1imit
# kubectl exec -it kubernetes-downwardapi-volume-example-2 -- cat /etc/podinfo/cpu_request
# kubectl exec -it kubernetes-downwardapi-volume-example-2 -- cat /etc/podinfo/mem_limit
# kubectl exec -it kubernetes-downwardapi-volume-example-2 -- cat /etc/podinfo/mem_request
Downward API支持设置的Pod和Container信息
Downward API支持设置的Pod和Container信息
可以通过fieldRef设置的元数据
- metadata.name:Pod名称。
- metadata.namespace:Pod所在的命名空间名称。
- metadata.uid:Pod的UID,
- metadata.labels[‘’]:Pod某个Label的值,通过进行引用
- metadata.annotations[‘’]:Pod某个Annotation的值,通过进行引用,
可以通过resourceFieldRef设置的数据
- Container级别的CPU Limit。
- Container级别的CPU Request。
- Container级别的Memory Limit。
- Container级别的Memory Request。
- Container级别的临时存储空间(ephemeral-storage)Limit
- Container级别的临时存储空间(ephemeral-storage)Request,
对以下信息通过fieldRef字段进行设置
- metadata.labels:Pod的Label列表,每个Label都以key为文件名,value为文件内容,每个Label各占一行。
- metadata.namannotations : Pod 的 Annotation 列 表 , 每 个Annotation都以key为文件名,value为文件内容,每个Annotation各占一行
以下Pod的元数据信息可以被设置为容器内的环境变量
- status.podIP:Pod的IP地址
- spec.serviceAccountName:Pod使用的ServiceAccount名称。
- spec.nodeName:Pod所在Node的名称,
- status.hostIP:Pod所在Node的IP地址
本文介绍Kubernetes DownwardAPI的功能与使用方法,包括如何将Pod和容器的元数据及资源限制信息注入容器内的环境变量或挂载为Volume文件。
699

被折叠的 条评论
为什么被折叠?



