系列目錄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
能夠看到,被引用的環境變量內容輸出了.
對於一些容器類型,特別是有狀態的,它運行的時候可能須要知道外部依附於pod的信息,好比pod的ip,集羣ip,pod申請的內存和cpu數量等.這時候能夠經過環境變量把這些依附於pod的字段信息傳入到容器內容.另外一種方式是經過DownwardAPIVolumeFiles
把信息傳入到容器內容,這兩種方式合在一塊兒被稱做downward api
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的字段,而不是容器的字段.