本文介绍如何使用Downward API,将Pod信息呈现给运行中的容器。
背景信息
Kubernetes Downward API提供了以下两种方式,可以将Pod信息(包括Pod和容器字段)呈现给运行中的容器。
-
环境变量(Environment variables)
用于单个变量,可以将Pod信息直接注入容器内部。
-
Volume挂载(Volume Files)
可以将Pod信息生成为文件,直接挂载到容器内部。
目前阿里云容器服务Kubernetes(ACK和ASK)和弹性容器实例(ECI),已经支持了Downward API的大部分常用字段,下文将为您介绍使用方式。
环境变量方式
您可以通过Downward API将Pod的名称、命名空间、IP等信息注入到容器的环境变量中。通过环境变量可以获得的值如下表所示。
参数 |
描述 |
---|---|
metadata.name |
Pod名称。 |
metadata.namespace |
Pod命名空间。 |
metadata.uid |
Pod的UID。 |
metadata.labels[‘<KEY>’] |
Pod的标签值。 |
metadata.annotations[‘<KEY>’] |
Pod的注解值。 |
spec.serviceAccountName |
Pod服务账号名称。 |
spec.nodeName |
节点名称。 |
status.podIP |
节点IP。 |
Deployment示例如下:
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: vk-downward-env
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
annotations:
regionId: cn-beijing
platform: Aliyun ECI
labels:
app: nginx
env: test
spec:
containers:
- name: nginx
image: nginx
env:
- name: MY_metadata.name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_metadata.namespace
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_metadata.uid
valueFrom:
fieldRef:
fieldPath: metadata.uid
- name: MY_metadata.labels
valueFrom:
fieldRef:
fieldPath: metadata.labels['env']
- name: MY_metadata.annotations
valueFrom:
fieldRef:
fieldPath: metadata.annotations['regionId']
- name: MY_status.podIP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: MY_spec.serviceAccountName
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
- name: MY_spec.nodeName
valueFrom:
fieldRef:
fieldPath: spec.nodeName
nodeName: virtual-kubelet #ACK场景下指定nodeName调度Pod到ECI
登入容器查看环境变量,可以看到fieldRef已经生效。示例如下:
root@default-vk-downward-env:/# env
MY_spec.nodeName=virtual-kubelet
MY_spec.serviceAccountName=default
MY_metadata.annotations=cn-beijing
MY_metadata.namespace=default
MY_metadata.uid=f4881309-f3dd-11e9-bcf9-9efaf54dcfa7
MY_metadata.name=vk-downward-env
MY_metadata.labels=test
MY_status.podIP=192.168.6.245
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_PORT=6443
PWD=/
PKG_RELEASE=1~buster
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://172.22.*.*:443
NJS_VERSION=0.3.5
TERM=xterm
SHLVL=1
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=172.22.*.*
KUBERNETES_SERVICE_HOST=192.168.*.*
KUBERNETES_PORT=tcp://172.22.*.*:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.17.4
_=/usr/bin/env
Volume挂载方式
您可以通过Downward API将Pod的Label、Annotation等信息通过Volume挂载到容器的某个文件中。通过Volume挂载可以获得的值如下表所示。
参数 |
描述 |
---|---|
metadata.name |
Pod名称。 |
metadata.namespace |
Pod命名空间。 |
metadata.uid |
Pod的UID。 |
metadata.labels[‘<KEY>’] |
Pod的标签值。 |
metadata.annotations[‘<KEY>’] |
Pod的注解值。 |
metadata.labels |
Pod的所有标签。 |
metadata.annotations |
Pod的所有注解。 |
目前仅支持Pod字段,还不支持容器字段,例如:limits.cpu、requests.cpu、limits.memory、requests.memory、limits.ephemeral-storage、requests.ephemeral-storage。
Deployment示例如下:
apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: vk-downward-down-volume
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
annotations:
regionId: cn-beijing
platform: Aliyun ECI
labels:
app: nginx
env: test
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
readOnly: false
volumes:
- name: podinfo
downwardAPI:
items:
- path: "metadata.name"
fieldRef:
fieldPath: metadata.name
- path: "metadata.namespace"
fieldRef:
fieldPath: metadata.namespace
- path: "metadata.uid"
fieldRef:
fieldPath: metadata.uid
- path: "metadata.labels"
fieldRef:
fieldPath: metadata.labels
- path: "metadata.annotations"
fieldRef:
fieldPath: metadata.annotations
nodeName: virtual-kubelet
登入容器查看volume的挂载目录,可以看到volume的fieldRef已经生效,并存储在容器指定的目录下。示例如下:
Welcome to Alibaba Cloud Elastic Container Instance!
root@default-vk-downward-down-volume:/# cd /etc/podinfo/
root@default-vk-downward-down-volume:/etc/podinfo# ls
metadata.annotations metadata.labels metadata.name metadata.namespace metadata.uid
root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.namespace
default
root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.name
vk-downward-down-volume
root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.uid
fa50b2b2-f3e3-11e9-bcf9-9efaf54dcfa7
root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.annotations
platform="Aliyun ECI"
regionId="cn-beijing"
root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.labels
app="nginx"
env="test"
root@default-vk-downward-down-volume:/etc/podinfo#