The need
There will be scenarios when the running containter needs information about the pod - namespace, pod-name, labels applied .. available from within the pod.
The container is not aware of it's runtime - if it is docker, mesos, kubernetes or something else
Alternative solutions
One can query the Kubernetes API server and get the data, but there are issues with this approach:
- requires intelligent scripting &/or client SDKs
- the pod itself should be self-aware to an extent to query the context => it is not really portable (or in easier terms there is some hardcoding or assumptions somewhere)
Downward API
Downward API allows 2 ways of exposing pod metadata to containers
a. as environment variables
❯ cat /tmp/pod-info.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: test-container
    image: busybox
    command: [ "/bin/sh", "-c", "env | grep MY_POD" ]
    env:
    - 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
❯ kubectl logs pod/test-pod
MY_POD_NAMESPACE=default
MY_POD_IP=10.244.2.5
MY_POD_NAME=test-pod
- as file contents
❯ cat /tmp/pod-info.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod-vol
  labels:
    env: stage
    team: acme
  annotations:
    build: "1.22"
    commitHash: "abcd1234"
spec:
  containers:
    - name: test-container
      image: busybox
      command: ["sh", "-c", "sleep 5; cat /var/tmp/pod-*.txt" ]
      volumeMounts:
        - name: podinfo
          mountPath: /var/tmp
          readOnly: false
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "pod-labels.txt"
            fieldRef:
              fieldPath: metadata.labels
          - path: "pod-annotations.txt"
            fieldRef:
              fieldPath: metadata.annotations
❯ kubectl logs pod/test-pod-vol
build="1.22"
commitHash="abcd1234"
kubernetes.io/config.seen="2022-04-18T05:07:43.287165252Z"
kubernetes.io/config.source="api"env="stage"
team="acme"%
 
 
              
 
    
Top comments (0)