Kubernetes實踐之深入掌握Pod——在容器內獲取Pod信息


在容器內獲取Pod信息

我們知道,每個Pod在被成功創建出來之后,都會被系統分配唯一 的名字、IP地址,並且處於某個Namespace中,那么我們如何在Pod的容 器內獲取Pod的這些重要信息呢?答案就是使用Downward API。 Downward API可以通過以下兩種方式將Pod信息注入容器內部。

(1)環境變量:用於單個變量,可以將Pod信息和Container信息注 入容器內部。
(2)Volume掛載:將數組類信息生成為文件並掛載到容器內部。 下面通過幾個例子對Downward API的用法進行說明。

環境變量方式:將Pod信息注入為環境變量

下面的例子通過Downward API將Pod的IP、名稱和所在Namespace 注入容器的環境變量中,容器應用使用env命令將全部環境變量打印到標准輸出中:

apiVersion: v1
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

查看日志

[root@lab-26 test]# kubectl logs dapi-test-pod|grep MY
MY_POD_NAMESPACE=default
MY_POD_IP=172.152.106.5
MY_POD_NAME=dapi-test-pod

注意到上面valueFrom這種特殊的語法是Downward API的寫法。目前Downward API提供了以下變量:

  • metadata.name:Pod的名稱,當Pod通過RC生成時,其名稱是 RC隨機產生的唯一名稱。
  • status.podIP:Pod的IP地址,之所以叫作status.podIP而非 metadata.IP,是因為Pod的IP屬於狀態數據,而非元數據
  • metadata.namespace:Pod所在的Namespace

從日志中我們可以看到Pod的IP、Name及Namespace等信息都被正 確保存到了Pod的環境變量中。

環境變量方式:將容器資源信息注入為環境變量

下面的例子通過Downward API將Container的資源請求和限制信息注入容器的環境變量中,容器應用使用printenv命令將設置的資源請求 和資源限制環境變量打印到標准輸出中

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod-container-vars 
spec:
  containers:
    - name: test-container
      image: busybox
      imagePullPolicy: Never
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_CPU_REQUEST MY_CPU_LIMIT;
          printenv MY_MEM_REQUEST MY_MEM_LIMIT;
          sleep 3600;
        done;
      resources:
        requests:
          memory: "32Mi"
          cpu: "125m"
        limits:
          memory: "64Mi"
          cpu: "250m"
      env:
        - name: MY_CPU_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: requests.cpu
        - name: MY_CPU_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.cpu
        - name: MY_MEM_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: requests.memory
        - name: MY_MEM_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.memory
  restartPolicy: Never

查看日志

[root@lab-26 test]# kubectl logs  dapi-test-pod-container-vars 
1
1
33554432
67108864

 注意valueFrom這種特殊的Downward API語法,目前resourceFieldRef可以將容器的資源請求和資源限制等配置設置為容器內部的環境變量

  • requests.cpu:容器的CPU請求值
  • limits.cpu:容器的CPU限制值
  • requests.memory:容器的內存請求值
  • limits.memory:容器的內存限制值

 Volume掛載方式

下面的例子通過Downward API將Pod的Label、Annotation列表通過 Volume掛載為容器中的一個文件,容器應用使用echo命令將文件的內容 打印到標准輸出中:

apiVersion: v1 
kind: Pod 
metadata:
  name: dapi-test-pod-volume
  labels:
    zone: us-est-coast
    cluster: test-cluster1
    rack: rack-22
  annotations:
    build: two
    builder: john-doe
spec:
  containers:
    - name: test-container
      image: busybox
      imagePullPolicy: Never
      command: ["sh", "-c"]
      args:
      - while true; do
          if [[ -e /tmp/labels ]]; then
            echo -en '\n\n'; cat /tmp/labels; fi;
          if [[ -e /tmp/annotations ]]; then
            echo -en '\n\n'; cat /tmp/annotations; fi;
          sleep 3600;
        done;
      volumeMounts:
        - name: podinfo
          mountPath: /tmp/
          readOnly: false
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "labels"
            fieldRef:
              fieldPath: metadata.labels
          - path: "annotations"
            fieldRef:
              fieldPath: metadata.annotations 

通過items 的設置,系統會根據path的名稱生成文件,根據上例的設置,系統將在 容器內生成/etc/labels和/etc/annotations兩個文件,在/etc/labels文件中將 包含metadata.labels的全部Label列表,在/etc/annotations文件中將包含 metadata.annotations的全部Label列表

查看結果

[root@lab-26 ~]# kubectl logs dapi-test-pod-volume
cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"

 Downward API用處

在某些集群中,集群中的每個節點都需要將自身的標識(ID)及進程綁定的IP地址等信息事先寫入配置文件中,進程在啟動時會讀取這些 信息,然后將這些信息發布到某個類似服務注冊中心的地方,以實現集 群節點的自動發現功能。此時Downward API就可以派上用場了,具體 做法是先編寫一個預啟動腳本或Init Container,通過環境變量或文件方 式獲取Pod自身的名稱、IP地址等信息,然后將這些信息寫入主程序的 配置文件中,最后啟動主程序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM