1、概述
我们知道,当pod被成功调度之后,当查看pod的状态的时候,就会看到pod的IP地址,和pod所在主机的IP地址,如下图所示:
[root@nccztsjb-node-23 ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-ds-lw4vj 1/1 Running 0 10d 172.39.21.91 nccztsjb-node-25 <none> <none> nginx-ds-nrf4t 1/1 Running 0 10d 172.39.209.108 nccztsjb-node-23 <none> <none> nginx-ds-zlw6f 1/1 Running 0 2d23h 172.39.157.203 nccztsjb-node-24 <none> <none> nginx-test-56745657-cdwn2 1/1 Running 0 3d23h 172.39.209.110 nccztsjb-node-23 <none> <none> nginx-test-56745657-cfss5 1/1 Running 0 3d23h 172.39.209.112 nccztsjb-node-23 <none> <none> nginx-test-56745657-h5hbn 1/1 Running 0 3d23h 172.39.209.111 nccztsjb-node-23 <none> <none> nginx-test-56745657-m6hm4 1/1 Running 0 10d 172.39.21.90 nccztsjb-node-25 <none> <none> nginx-test-56745657-pqhqp 1/1 Running 0 10d 172.39.21.93 nccztsjb-node-25 <none> <none> [root@nccztsjb-node-23 ~]#
那么,如果在容器的内部,想要知道pod的ip和pod所在的节点的ip,该怎么做呢?
OK,在本文中,我们就会介绍,如何通过变量注入的方式,获得pod的状态中的一些信息,然后变成pod的变量,供其中的容器来进行使用
2、将pod的信息注入为环境变量
比如,我们想要将pod启动后,所在的节点的信息注入为容器的环境变量,可以通过以下的方式
增加环境变量到yaml配置文件中(已经运行的,可以通过kubectl edit来进行修改)
env: - name: INSTANCE_HOST_IP valueFrom: fieldRef: fieldPath: status.hostIP - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP dnsPolicy: ClusterFirst restartPolicy: Always
重新应用yaml配置文件
查看pod的状态
[root@nccztsjb-node-23 ~]# kubectl get pod -l app=nginx-taints NAME READY STATUS RESTARTS AGE nginx-taints-549f6d97ff-6p7nj 1/1 Running 0 28s nginx-taints-549f6d97ff-7thxm 1/1 Running 0 28s nginx-taints-549f6d97ff-8h4zj 1/1 Running 0 28s nginx-taints-549f6d97ff-95j4v 1/1 Running 0 28s nginx-taints-549f6d97ff-zgp6m 1/1 Running 0 28s [root@nccztsjb-node-23 ~]#
进入其中的一个容器,查看环境变量
[root@nccztsjb-node-23 ~]# kubectl exec -it nginx-taints-549f6d97ff-6p7nj -- bash -c "env | grep IP" POD_IP=172.39.209.114 INSTANCE_HOST_IP=172.20.58.83 [root@nccztsjb-node-23 ~]#
可以看到,在容器中,已经可以获得这2个环境变量了。
这种,在容器内获取POD信息的方式叫做(Downward API)
OK,以上就简单介绍了如何在容器中获取pod所在的主机IP地址、POD自己的IP地址的方式,并且这些值都是以变量的方式在容器中存在的。
3、downward api的好处是什么
使用downward api,对于容器需要的关于自己的,也就是pod的信息,通过环境变量的方式注入到容器中,就不需要和k8s 的api进行交互来动态获取这些信息,降低了与api server的耦合度。