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ı
Downward API, iki farklı yöntemle bir Pod'un metadata bilgilerini container'a sağlar;
- Environment variable olarak
- 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
...
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
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"
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.