kubernetes容器編排之定義環境變量以及經過downwardapi把pod信息做爲環境變量傳入容器內

系列目錄html

在學習docker的時候,你們可能常常看到很多示例在docker run的時候指定環境變量(好比wordpress的docker示例就是經過環境變量傳入帳戶和密碼到容器內).這裏之因此常常用到環境變量,主要基於如下兩點緣由node

  • 容器內的操做每每都是自動化的,而不像在windows會有圖形界面提示輸入信息或者像在linux有交互式命令能夠輸入程序須要的數據.也就是程序運行時須要的參數沒法交互式指定,不一樣程序讀取配置的方式又各式各樣,這種狀況下讀取環境變量是比較通用的作法linux

  • 容器的隔離性,在k8s裏,pod是最小的邏輯單元,關於容器運行時的不少信息(pod的ip,節點的ip,申請的cpu資源,內存資源)都存在pod裏,可是有些時候pod內的容器想要知道這些信息,然而容器沒法直接讀取到pod的全部信息,kubernetes自己提供了download ap(下面交介紹)i來把pod的信息傳遞給容器,其實就是經過環境變量把pod的信息傳遞給容器.docker

爲容器定義環境變量

當建立pod的時候,能夠在配置文件裏使用env字段來定義環境變量,示例以下windows

apiVersion: v1
kind: Pod
metadata:
  name: envar-demo
  labels:
    purpose: demonstrate-envars
spec:
  containers:
  - name: envar-demo-container
    image: tutum/hello-world
    env:
    - name: DEMO_GREETING
      value: "Hello from the environment"
    - name: DEMO_FAREWELL
      value: "Such a sweet sorrow"

咱們經過kubectl apply -f建立它api

經過執行命令kubectl exec -it envar-demo /bin/sh進入交互式命令執行容器bash

輸入printenv來查看環境變量是否正確傳入app

/ # printenv DEMO_GREETING
Hello from the environment
/ # printenv DEMO_FAREWELL
Such a sweet sorrow
/ #

在配置文件中使用環境變量

以上咱們經過交互式容器查看到了咱們定義的環境變量,實際上咱們在配置文件中定義的環境變量也能夠在配置文件中其它位置被引用,好比作爲容器初始化執行命令的參數,請看下面示例:wordpress

apiVersion: v1
kind: Pod
metadata:
  name: print-greeting
spec:
  containers:
  - name: env-print-demo
    image: tutum/hello-world
    env:
    - name: GREETING
      value: "Warm greetings to"
    - name: HONORIFIC
      value: "The Most Honorable"
    - name: NAME
      value: "Kubernetes"
    command: ["echo"]
    args: ["$(GREETING) $(HONORIFIC) $(NAME)"]

與上面不一樣的是,上面僅僅定義了變量,這裏咱們引用了定義的變量.學習

咱們經過以上配置建立容器,而後執行kubectl logs查看輸出日誌

λ kubectl logs print-greeting
Warm greetings to The Most Honorable Kubernetes

能夠看到,被引用的環境變量內容輸出了.

downwardapi介紹及簡單使用

對於一些容器類型,特別是有狀態的,它運行的時候可能須要知道外部依附於pod的信息,好比pod的ip,集羣ip,pod申請的內存和cpu數量等.這時候能夠經過環境變量把這些依附於pod的字段信息傳入到容器內容.另外一種方式是經過DownwardAPIVolumeFiles把信息傳入到容器內容,這兩種方式合在一塊兒被稱做downward api

使用pod的字段值做爲環境變量

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-fieldref
spec:
  containers:
    - name: test-container
      image: tutum/hello-world
      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

以上配置文件,咱們引用了pod的若干屬性而後經過printenv打印出來查看.

咱們使用kubectl logs pod名稱來查看輸出信息

docker-for-desktop
dapi-envars-fieldref
default
10.1.0.75

須要注意的是,以上字段是pod的字段,而不是容器的字段.

相關文章
相關標籤/搜索