Kubernetes Downward API ve Metadata

Kubernetes Downward API, bir Pod'un metadata bilgilerini container içine environment variable veya özel bir volume olarak geçmenize olanak sağlayan bir mekanizmadır.

Bir uygulama Downward API'yi kullanarak, örneğin Pod'un adı, namespace'i, IP adresi gibi bilgilere erişebilir. Bu, uygulamanın Kubernetes cluster'ındaki dinamik ortamla etkileşimde bulunmasını sağlar ve uygulamanın kendi durumunu veya çevresel koşullarını anlamasına yardımcı olur.

Downward API, özellikle bir Pod'un kendisini ve çevresini dinamik olarak yapılandırması gereken durumlarda faydalıdır. Örneğin, bir uygulama loglama veya izleme amacıyla Pod'un adına ihtiyaç duyabilir veya Pod'un IP adresine bağlı olarak yapılandırma yapabilir.

Downward API kullanarak şu metadata bilgilerini container içinden elde edebilirsiniz:

  • Pod'un adı
  • Pod'un IP adresi
  • Pod'un ait olduğu namespace
  • Pod'un üzerinde çalıştığı node'un adı
  • Pod'un altında çalıştığı service account adı
  • Her bir container'ın CPU ve memory request bilgisi
  • Her bir container'ın CPU ve memory limit bilgisi
  • Pod'un label'ları
  • Pod'un annotation'ları
💡
Pod label ve annotation metadata verileri sadece volume methoduyla elde edilebilir. Geri kalan tüm metadata verileri hem environment variable hem de volume methoduyla elde edilebilir.

Downward API, iki farklı yöntemle bir Pod'un metadata bilgilerini container'a sağlar;

  1. Environment variable olarak
  2. downwardAPI tipinde volume mount ederek

1. Environment Variable Kullanarak Pod Metadata Verisine Erişmek

Pod ile ilgili metadata verilerini container içine environment variable olarak geçebiliriz. Bunun için aşağıdaki YAML dosyasını örnek alabilirsiniz:

apiVersion: v1
kind: Pod
metadata:
  name: downward
spec:
  containers:
  - name: main
    image: busybox
    command: ["sleep", "9999999"]
    resources:
      requests:
        cpu: 15m
        memory: 100Ki
      limits:
        cpu: 100m
        memory: 4Mi
    env:
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    - name: POD_IP
      valueFrom:
        fieldRef:
          fieldPath: status.podIP
    - name: NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
    - name: SERVICE_ACCOUNT
      valueFrom:
        fieldRef:
          fieldPath: spec.serviceAccountName
    - name: CONTAINER_CPU_REQUEST_MILLICORES
      valueFrom:
        resourceFieldRef:
          resource: requests.cpu
          divisor: 1m
    - name: CONTAINER_MEMORY_LIMIT_KIBIBYTES
      valueFrom:
        resourceFieldRef:
          resource: limits.memory
          divisor: 1Ki

Bu manifest örneğini şemaya dökelim:

Pod'u oluşturduktan sonra kubectl exec komutuyla tüm shell environment variable'larını listelersek, Pod'a dair tüm metadata verilerini görebiliriz.

$ kubectl exec downward env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=downward
CONTAINER_MEMORY_LIMIT_KIBIBYTES=4096
POD_NAME=downward
POD_NAMESPACE=default
POD_IP=10.0.0.10
NODE_NAME=gke-kubia-default-pool-32a2cac8-sgl7
SERVICE_ACCOUNT=default
CONTAINER_CPU_REQUEST_MILLICORES=15
KUBERNETES_SERVICE_HOST=10.3.240.1
KUBERNETES_SERVICE_PORT=443
...
💡
Environment variable'lar, container oluşturulduktan sonra güncellenemez. Bu nedenle label ve annotation gibi dinamik güncellenebilecek veriler için downwardAPI volume kullanmalısınız.

2. downwardAPI Volume Kullanarak Pod Metadata Verisine Erişmek

Pod ile ilgili metadata verilerine container'a downwardAPI tipinde bir volume mount ederekte elde ebiliriz. Bunun için aşağıdaki YAML dosyasını örnek alabilirsiniz:

apiVersion: v1
kind: Pod
metadata:
  name: downward
  labels:
    foo: bar
  annotations:
    key1: value1
    key2: |
      multi
      line
      value
spec:
  containers:
  - name: main
    image: busybox
    command: ["sleep", "9999999"]
    resources:
      requests:
        cpu: 15m
        memory: 100Ki
      limits:
        cpu: 100m
        memory: 4Mi
    volumeMounts:
    - name: downward
      mountPath: /etc/downward
volumes:
  - name: downward
    downwardAPI:
      items:
      - path: "podName"
        fieldRef:
          fieldPath: metadata.name
      - path: "podNamespace"
        fieldRef:
          fieldPath: metadata.namespace
      - path: "labels"
        fieldRef:
          fieldPath: metadata.labels
      - path: "annotations"
        fieldRef:
          fieldPath: metadata.annotations
      - path: "containerCpuRequestMilliCores"
        resourceFieldRef:
          containerName: main
          resource: requests.cpu
          divisor: 1m
      - path: "containerMemoryLimitBytes"
        resourceFieldRef:
          containerName: main
          resource: limits.memory
          divisor: 1

Bu manifest örneğini şemaya dökelim:

Pod'u oluşturduktan sonra kubectl exec komutuyla mount ettiğimiz /etc/downward dizinini listelersek, Pod'a dair tüm metadata verilerini dosyalar halinde görebiliriz.

$ kubectl exec downward ls -lL /etc/downward
-rw-r--r-- 1 root root 134 May 25 10:23 annotations
-rw-r--r-- 1 root root 2 May 25 10:23 containerCpuRequestMilliCores
-rw-r--r-- 1 root root 7 May 25 10:23 containerMemoryLimitBytes
-rw-r--r-- 1 root root 9 May 25 10:23 labels
-rw-r--r-- 1 root root 8 May 25 10:23 podName
-rw-r--r-- 1 root root 7 May 25 10:23 podNamespace
💡
configMap ve secret volume konusunda olduğu gibi, dosya izinlerini pod spesifikasyonundaki downwardAPI volume'un defaultMode özelliği aracılığıyla değiştirebilirsiniz.

Bu dizindeki dosyalardan birkaçının içeriğine bakalım:

$ kubectl exec downward cat /etc/downward/labels
foo="bar"
$ kubectl exec downward cat /etc/downward/annotations
key1="value1"
key2="multi\nline\nvalue\n"
kubernetes.io/config.seen="2016-11-28T14:27:45.664924282Z"
kubernetes.io/config.source="api"
💡
Pod label ve annotation metadata verileri sadece volume methoduyla elde edilebilir.

Bir pod içinde birden fazla container olabileceği için containerCpuRequestMilliCores ve containerMemoryLimitBytes gibi her bir container'a özgü metadata verilerini expose ederken containerName parametresini kullanmalıyız. Böylece container verileri çakışmadan her biri kendi ismiyle eklenecektir.


Sıradaki yazı ile eğitim serisine devam edebilirsiniz.

Kubernetes API Server Nedir? Nasıl Haberleşilir?
Kubernetes API Server, Kubernetes kaynaklarına erişim sağlar ve istemciler tarafından yapılan istekleri işler.