我们知道,每个pod在被成功创建出来之后,都会被系统分配一个唯一的名字,IP地址,并且处于某个Namespace中,

那么我们如何在pod的容器内获取pod的这些重要信息呢? 答案就是使用-Downward API

Downward API 可以使用通过以下两种方式将Pod信息注入容器内部。

1:(环境变量) 用于单个变量,可以将pod信息和container信息注入容器内部

2: (volume 挂载) 将数组类信息生成为文件并挂载到容器内部

环境变量方式:将pod信息注入为环境变量

下面的例子通过Downward API将Pod的IP ,名称和所在Namespace注入容器的环境变量中,容器应用使用env命令将全部环境变量打印到标准输出中:

[root@k8s-master ~]# kubectl explain pod.spec.containers.env.valueFrom.fieldRef.fieldPath
KIND:     Pod
VERSION:  v1

FIELD:    fieldPath <string>

DESCRIPTION:
     Path of the field to select in the specified API version.

 

vim dapi-test.yaml

kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
  - name: test-container
    image: busybox
    command: ["/bin/sh","-c","env"]
    env:
      - 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
  restartPolicy: Never

目前Downward API 提供了以下变量:

metadata.name:pod的名称

metadata.namespace: pod所在的namespace

status.PodIP:pod的ip地址

 

 运行kubectl create 命令创建pod

[root@k8s-master ~]# kubectl create -f dapi-test-pod.yaml 
pod/dapi-test-pod created

 查看dapi-test-pod的日志

[root@k8s-master ~]# kubectl logs dapi-test-pod
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=dapi-test-pod
SHLVL=1
HOME=/root
MY_POD_NAMESPACE=default
MY_POD_IP=10.240.0.48
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
MYSQL_PORT_3306_TCP_ADDR=10.96.251.103
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MYSQL_PORT_3306_TCP_PORT=3306
KUBERNETES_PORT_443_TCP_PORT=443
MYSQL_PORT_3306_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYSQL_SERVICE_HOST=10.96.251.103
MYSQL_SERVICE_PORT=3306
MYSQL_PORT=tcp://10.96.251.103:3306
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
MYSQL_PORT_3306_TCP=tcp://10.96.251.103:3306
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
MY_POD_NAME=dapi-test-pod

 从日志中我们可以看到pod的ip,name及namespace等信息 都被 正确保存到了pod的环境变量中

环境变量方式:将容器资源信息注入为环境变量

volme挂载方式