# k8s 通过环境变量向容器暴露 Pod 信息
本页展示了 Pod 如何使用环境变量向 Pod 中运行的容器暴露有关自身的信息。环境变量可以暴露 Pod 字段和容器字段。
# Before you begin
您需要有一个 k8s 集群,并且必须配置 kubectl 命令行工具以与集群通信。如果您还没有集群,可以使用 Minikube 创建集群,也可以使用 k8s 的其中一个场地:
# Downward API
有两种方式将 Pod 和容器字段暴露给运行中的容器:
- 环境变量
- DownwardAPIVolumeFiles
这两种暴露 Pod 和容器字段的方式被称为 Downward API。
# 使用 Pod 字段作为环境变量的值
在本练习中,您将创建一个有一个容器的 Pod。下面是 POD 的配置文件:
dapi-envars-pod.yaml |
---|
apiVersion: v1 kind: Pod metadata: name: dapi-envars-fieldref spec: containers: - name: test-container image: k8s.gcr.io/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 |
在配置文件中,您可以看到五个环境变量。env 字段是 EnvVars 的数组。数组中的第一个元素指定 MY_NODE_NAME 环境变量从 Pod 的 spec.nodeName 字段中获取其值。类似地,其他环境变量从 Pod 字段中获取它们的名称。
注意: 示例中的字段是 Pod 的字段。它们不是 Pod 中的容器的字段。
创建 Pod:
kubectl create -f https://k8s.io/docs/tasks/inject-data-application/dapi-envars-pod.yaml
验证 Pod 中的容器是 running 状态:
kubectl get pods
查看容器日志:
kubectl logs dapi-envars-fieldref
输出显示选定的环境变量的值:
minikube
dapi-envars-fieldref
default
172.17.0.4
default
想要知道为什么这些值会打印在日志中,请查看配置文件的 command 和 args 字段。当容器启动时,它将 5 个环境变量的值写到标准输出中。每十秒钟重复一次。
接下来,将一个 shell 放入正在您的 Pod 中运行的容器里面:
kubectl exec -it dapi-envars-fieldref -- sh
在 shell 中,查看环境变量:
/# printenv
输出结果显示,某些环境变量已被指定为 Pod 字段的值:
MY_POD_SERVICE_ACCOUNT=default
...
MY_POD_NAMESPACE=default
MY_POD_IP=172.17.0.4
...
MY_NODE_NAME=minikube
...
MY_POD_NAME=dapi-envars-fieldref
# 使用容器字段作为环境变量的值
在前面的练习中,您使用 Pod 字段作为环境变量的值。在下一个练习中,您将使用容器字段用作环境变量的值。下面是一个 Pod 的配置文件,其中包含一个容器:
dapi-envars-container.yaml |
---|
apiVersion: v1 kind: Pod metadata: name: dapi-envars-resourcefieldref spec: containers: - name: test-container image: k8s.gcr.io/busybox:1.24 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 10; 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 |
在配置文件中,您可以看到四个环境变量。env 字段是 EnvVars 的数组。数组中的第一个元素指定 MY_CPU_REQUEST 环境变量从名为 test-container 的容器的 requests.cpu 字段中获取其值。类似地,其他环境变量从容器字段中获取它们的值。
创建 Pod:
kubectl create -f https://k8s.io/docs/tasks/inject-data-application/dapi-envars-container.yaml
验证 Pod 中的容器是 running 状态:
kubectl get pods
查看容器日志:
kubectl logs dapi-envars-resourcefieldref
输出展示了选定环境变量的值:
1
1
33554432
67108864