一、概述
Pod的逻辑概念在容器之上,Kubernetes在成功创建Pod之后,会为Pod和容器设置一些额外的信息,例如Pod级别的Pod名称、Pod IP、Node IP、Label、Annotation、容器级别的资源限制等。在很多应用场景中,这些信息对容器内的应用来说都很有用,例如使用Pod名称作为日志记录的一个字段用于标识日志来源。为了在容器内获取Pod级别的这些信息,Kubernetes提供了Downward API机制来将Pod和容器的某些元数据信息注入容器环境内,供容器应用方便地使用。
Downward API可以通过以下两种方式将Pod和容器的元数据信息注
入容器内部。
(1)环境变量:将Pod或Container信息设置为容器内的环境变量。
(2)Volume挂载:将Pod或Container信息以文件的形式挂载到容器内部。
二、环境变量方式
通过环境变量的方式可以将Pod信息或Container信息注入容器运行环境中。
1、将Pod信息设置为容器内的环境变量
下面的例子通过Downward API将Pod的IP、名称和所在命名空间注入容器的环境变量中,Pod的YAML文件内容如下:
[root@k8s-master01 APIPod] # vim apipod.yaml
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars
spec:
nodeName: k8s-node02
containers:
- name: nginx
image: registry.cn-beijing.aliyuncs.com/dotbalo/nginx
imagePullPolicy: IfNotPresent
command: ["sh","-c"]
args:
- |
while true;do
echo;
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
[root@k8s-master01 APIPod] # kubectl create -f apipod.yaml
pod/dapi-envars created
[root@k8s-master01 APIPod] # kubectl get po
NAME READY STATUS RESTARTS AGE
dapi-envars 1/1 Running 0 39s
command: ["sh", "-c"]
是 Kubernetes Pod 中的容器启动参数,表示使用/bin/sh(Linux Shell 的一个实现)作为容器的入口点,并通过-c参数执行一段命令或脚本。
sh是一个 shell 程序,通常是 /bin/sh 的符号链接,指向某个 shell 的实现(比如 Bash、Dash 或其他)。-c是 sh 的参数,表示从命令行读取一段字符串,并将这段字符串作为命令执行。
args 使用多行脚本:
args 是一个字符串数组,使用|表示这是一个多行字符串,并保持换行符。- |的作用是表示将多行文本作为一个块字符串处理,这是 YAML 规范的一部分。YAML 格式要求多行脚本需用|引导,表示这是一个块字符串。所以有了- |
-表示数组的一个元素。|表示这是一个块字符串,保持多行和换行符
---
command:指定容器的入口命令。
args:为 command 提供参数。
行为:
command: ["sh", "-c"]启动 /bin/sh,并告诉它从 args 中读取命令。
args中的脚本会被作为一个参数传递给 sh 的 -c,然后执行。
注意,环境变量不直接设置value,而是设置valueFrom对Pod的元数据进行引用。
在本例中通过对Downward API的设置使用了以下Pod的元数据信息设置环境变量。
- ◎ spec.nodeName:Pod所在Node的名称。
- ◎ metadata.name:Pod名称。
- ◎ metadata.namespace:Pod所在命名空间的名称。
- ◎ status.podIP:Pod的IP地址。
- ◎ spec.serviceAccountName:Pod使用的ServiceAccount名称。

最低0.47元/天 解锁文章
709

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



