Kubernetes 从容器访问标签

Kubernetes access labels from containers

当我们为复制控制器创建一个 yml 时,我们可以为正在创建的 pod 提供标签。

apiVersion: v1
kind: ReplicationController
metadata:
  name: redis
spec:
  template:
    metadata:
      labels:
        app: redis
        tier: backend

驻留在此 pod 中的容器能否访问这些标签值?

查看 Downward API,它允许容器更多地了解自身。

从容器内部访问 pod 信息的一种方法是使用环境变量。 pod 的 yaml 文件是:

apiVersion: v1
kind: Pod
metadata:
  name: pod-env
spec:
  containers:
    - name: test-container
      image: ubuntu
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_NODE_NAME MY_POD_NAME;
          printenv MY_POD_IP 
          sleep 1000;
        done;
      env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
  restartPolicy: Never

mY_POD_NAME 环境变量从 pod 的字段 spec.nodeName 获取其值。同样我们也可以将容器的字段作为值。 要使用以下命令验证此连接到 pod:

kubectl exec -it pod-env -- /bin/bash

并打印环境变量:

printenv MY_POD_NAME

将信息从 pod 传递到容器的其他方式是使用 downwardAPI:https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/