Downward API
在实际应用中,很多程序都需要拥有K8S的相关信息,比如运行在哪个Pod、哪个Cluster、哪个Namespace下,而为了避免容器或容器内部的应用程序和K8S过度耦合,引入了Downward API这种方式,将Pod和容器字段暴露给运行中的容器。
Downward API又分为两种具体的方法
- 作为环境变量
- 作为
downward api卷中的文件
fieldRef与resourceFieldRef
这两个字段给了我们动态向容器运行时传递Pod和容器级别字段的能力。
可通过fieldRef获取的字段
metadata.namePod名称metadata.namespacePod命名空间metadata.uidPod的UIDmetadata.annotations['Key']Pod的某个注释metadata.lables['Key']Pod的某个labelspec.serviceAccountNamePod的服务账号名称spec.nodeNamePod所在节点的名称status.hostIPPod所在节点的IP地址status.podIPPod的IP地址
可通过resourceFieldRef获取的字段,这些都是容器的资源Request和limit值
limits.cpurequests.cpulimits.memoryrequests.memorylimits.hugepagesrequests.hugepageslimits.ephemeral-storagerequests.ephemeral-storage
具体的详情字段可以在Downward API这里获取。
环境变量
apiVersion: v1
kind: Pod
metadata:
name: test-env-pod
spec:
containers:
- name: test-env-container
image: alpine:latest
command: ['/bin/sh', '-c']
args:
- while true; do
echo env;
env;
done;
resources:
requests:
memory: "320Mi"
cpu: "125m"
limits:
memory: "640Mi"
cpu: "250m"
env:
- name: MY_TEST
value: '1'
- name: ANOTHER_TEST
value: '2'
- name: 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_CPU_REQUEST
valueFrom:
resourceFieldRef:
containerName: test-env-container
resource: requests.cpu
- name: MY_CPU_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-env-container
resource: limits.cpu
上面的Pod里的容器配置了Entrypoint,作用是每十秒钟打印一次容器内部的环境变量,之后配置了一些环境变量,分为三种
- 手动添加的环境变量
MY_TEST和ANOTHER_TEST - 读取的
Pod级别的环境变量,比如NODE_NAME和POD_NAME - 读取的容器级别的环境变量,容器的两个资源字段
能看到这里已经打印出了所有设置的环境变量,这里因为resource字段是向上取整的,所以打印出来的limit和request都是1
卷
apiVersion: v1
kind: Pod
metadata:
name: test-downward-volume-pod
labels:
zone: shenzhen
cluster: test-cluster1
rack: rack-22
annotations:
build: anne
builder: annesheartrecord
spec:
containers:
- name: test-container
image: alpine:latest
command: ["sh", "-c"]
args:
- while true; do
env;
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的annotations和labels,以便于验证挂载downward volume是否生效,具体的entrypoint的内容和上一个pod类似,也是开启一个循环不断打印容器内部环境变量的值
结语
这篇博客主要介绍了临时容器和Pod调试相关操作。《每天十分钟,轻松入门K8S》的第16篇16.【云原生-K8S】: 往容器中注入数据到这里就结束了,感兴趣的朋友欢迎点赞、评论、收藏、订阅,您的支持就是我最大的动力。
推荐阅读
08.源码级别Pod详解(四): Pod readiness与Container Probe