前面我们从pod的原理到生命周期介绍了pod的一些使用,作为kubernetes中最核心的对象,最基本的调度单元,我们可以发现pod中的属性还是非常繁多的,前面我们使用过一个volumes的属性,表示声明一个数据卷,我们可以通过命令kubectl explain pod.spec.volumes
去查看该对象下面的属性非常多,前面我们只是简单的使用了hostpath和empryDir{}这两种模式,其中还有一种叫做downwardAPI这个模式和其他模式不一样的地方在于它不是为了存放容器的数据也不是用来进行容器和宿主机的数据交换的,而是让pod里的容器能够直接获取到这个pod对象本身的一些信息。
https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/downward-api/
downwardAPI提供了两种方式用于将pod的信息注入到容器内部:
环境变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[root@master1 ~]# cat env-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: env-pod
namespace: kube-system
spec:
containers:
- name: env-pod
image: busybox
command: ["/bin/sh", "-c","env"]
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
|
打印
1
2
3
4
|
[root@k8s-master ~]# kubectl logs env-pod -n kube-system | grep POD
POD_IP=205.205.0.2
POD_NAME=env-pod
POD_NAMESPACE=kube-system
|
可以看到pod的ip,name, namespace都是通过环境变量打印出来的.
volume挂载
downward API除了提供环境变量外,还提供通过volume挂载的方式去获取pod的基本信息,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
apiVersion: v1
kind: Pod
metadata:
name: volume-pod
namespace: kube-system
labels:
k8s-app: test-volume
node-env: test
annotations:
own: wangmuniangniang
bulid: test
spec:
volumes:
- name: podinfo
downwardAPI:
items:
- path: labels
fieldRef:
fieldPath: metadata.annotations
- path: anntations
fieldRef:
fieldPath: metadata.annotations
containers:
- name: volume-pod
image: busybox
args:
- sleep
- "3600"
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
|
查看
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@master1 ~]# kubectl exec -it volume-pod /bin/sh -n kube-system
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ls /etc/podinfo/
anntations labels
/ # ls
bin dev etc home proc root sys tmp usr var
/ # cat /etc/podinfo/labels
bulid="test"
kubernetes.io/config.seen="2022-04-27T03:23:02.840574876-04:00"
kubernetes.io/config.source="api"
own="wangmuniangniang"/ # ^C
/ #
|
注意
downwardAPI能够获取到的信息,一定是pod里的容器进程启动之前就能够确定下来的信息,而如果想要获取pod容器运行之后才会出现的信息,比如容器进程PID,则不能使用downwardAPI,而应该考虑在pod里定义一个sidecar容器来获取了.