Kubernetes Downward API的介绍及使用

我们都知道,Pod的逻辑概念在容器之上,K8s 在成功创建Pod之后,会为Pod和容器设置一些额外的信息,例如Pod级别的Pod 名称,Pod IP ,Label,Annotation,容器级别的资源限制等。

在很多应用场景中,这些信息对容器内的应用来说都很有用,例如使用Pod名称作为日志记录的一个字段用于标识日志来源,为了在容器内获取Pod级别的这些信息,k8s 提供了Downward API 机制来将Pod 和容器的某些元数据信息注入容器环境内,供容器应用方便地使用。

Downward API 可以通过以下两种方式将Pod 和容器的元数据信息注入容器内部。
(1)环境变量:将Pod或Container信息设置为容器内的环境变量。
(2)Volume挂载:将Pod或Container信息以文件的形式挂载到容器内部。

下面通过例子对Downward API 的用法进行说明。

一. 环境变量方式
通过环境变量的方式可以将Pod 信息或Container 信息注入容器运行环境中,下面通过两个例子进行说明。

  1. 将Pod 信息设置为容器内的环境变量
    下面的例子通过Downward API 将Pod 的IP,名称和所在命名空间注入容器的环境变量中,Pod 的yaml 文件如下:
# dapi-envars-pod.yaml
apiVersion: v1
kind: Pod
metadata: 
  name: dapi-envars-fieldref
spec: 
  containers:
   - name: test-container
     image: busybox
     command: ["sh","-c"]
     args:
     - while true; do
        echo -en '\n';
        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

注意,环境变量不直接设置value,而是设置valueFrom 对Pod 的元数据进行引用。
在本例中通过会Downward API 的设置使用了以下Pod 的元数据信息设置环境变量。
(1) spec.nodeName: Pod 所在Node 的名称。
(2)metadata.name: Pod 名称。
(3)metadata.namespace:Pod所在命名空间的名称。
(4)status.podIP:Pod的IP地址。
(5)spec.serviceAccountName:Pod 使用的ServiceAccount名称。

运行kubectl create 命令创建这个Pod:

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

查看Pod的日志,可以看到容器启动命令将环境变量的值打印出来:

[root@k8s-master ~]# kubectl logs dapi-envars-fieldref

k8s-node-1
dapi-envars-fieldref
default
10.244.109.86
default
.......

我们从日志中可以看到Pod 的Node IP ,Pod名称,命名空间名称,Pod IP ServiceAccount 名称等信息都被正确设置到了容器的环境变量中。

也可以通过kubectl exec 命令登陆容器查看环境变量的设置:

[root@k8s-master ~]# kubectl  exec -it dapi-envars-fieldref -- sh
/ # printenv | grep MY
MY_POD_SERVICE_ACCOUNT=default
MY_POD_NAMESPACE=default
MY_POD_IP=10.244.109.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝颜~岁月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值