系列目录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的字段,而不是容器的字段.