본문 바로가기

Kubenetes/Kubernetes API

Downward API

포드가 시작된 후에 알수 있는 데이터, 즉 포드의 IP, 호스트 노드의 이름, 혹은 포드의 이름과 포드의 라벨과 주석과 같이 이미 다른 위치에 지정된 데이터 등을 Downward API를 통해 확인 할 수 있다. 

Downward API는 환경 변수 또는 파일을 통해 포드 메타 데이터를 노출

 

ㅁ Downward API를 사용하여 확인 가능한 메타 데이터

 

 ㅇ 포드의 이름

 ㅇ 포드의 IP 주소

 ㅇ 포드가 속한 네임스페이스

 ㅇ 포드가 실행되고 있는 노드의 이름

 ㅇ 포드가 실행 중인 서비스 계정의 이름

 ㅇ 각 컨테이너에 대한 CPU 및 메모리 요청

 ㅇ 각 컨테이너의 CPU 및 메모리 한계

 ㅇ 포드의 라벨

 ㅇ 포드의 주석

 

ㅁ 환경 변수를 통한 메타 데이터 노출

 

환경 변수를 통해 포드와 컨테이너의 메타 데이터를 컨테이너에 전달하는 방법

포드 메타 데이터와 속성은 환경 변수로 표시 가능

 

[downward-api-env.yaml]

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:                                # metadata.name 필드를 참조한다.
         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:
         resourceFeildRef:                        # 컨테이너의 CPU 및 메모리 요청 및 한계는
           resource: requests.cpu                 # fieldRef 대신, resourceFieldRef를
           divisor: 1m                            # 사용해 참조된다.
     - name: CONTAINER_MEMORY_LIMIT_KIBIBYTES     # 리소스 필드의 경우 필요한 단위로 값을  
       valueFrom:                                 # 가져오는 약수르 정의한다.
         resourceFieldRef:
           resource: limits.memory
           divisor: 1Ki

 

프로세스가 실행되면 포드 스펙에서 정의한 모든 환경 변수를 조회할 수 있다.

아래와 같은 명령어를 사용한다.

 

$ kubectl exec downard env

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

HOSTNAME=downward

CONTAINER_MEMORY_LIMIT_KIBIB"YTES=4096

POD_NAME=downward

POD_NAMESPACE=default

POD_IP=10.0.0.10

NODE_NAME=gke-kubia-default-pool-32a2acs89-fdf

SERVICE_ACCOUNT=default

CONTAIONER_CPU_REQUEST_MILLICORES=15

KUBERNETES_SERVICE_HOST=10.3.240.1

KUBERNETES_SERVICE_PORT=443

...

 

ㅁ Downward API 볼륨 내의 파일을 통한 메타 데이터 전달

 

환경 변수 대신 파일을 통해 메타 데이터를 노출하려면 Downward API 볼륨을 정의하고 컨테이너에 마운트

포드의 라벨이나 주석을 표시하는 데는 Downard API 볼륨을 사용해야 함

 

[downwardAPI 볼륨을 가진 포드: downward-api-volume.yaml]

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:
           filedPath: metadata.name
       - path: "podNamespace"
         fieldRef:
           filedPath: metadata.namespace
       - path: "labels"
         fieldRef:
           filedPath: metadata.labels       
       - path: "annotations"
         fieldRef:
           filedPath: metadata.annotations
       - path: "containerCpuRequestMilliCores"
         resourceFieldRef:
           containerName: main
           resource: requests.cpu
           division: 1m
       - path: "containerMemoryLimitBytes"
         resourceFieldRef:
           containerName: main
           resource: limits.memory
           division: 1

 

환경 변수를 이용해 메타 데이터를 전달하는대신, downward로 불려지는 볼륨을 정의하고 /etc/downward 하위의 컨테이너에 마운트함.

컨테이너에 메타 데이터를 전달하는 downwardAPI 볼륨 사용

 

[마운트된 downwardAPI 볼륨내의 파일 확인 방법]

 

$ kubectl exec downward ls -lL /etc/downward

-rw-r--r-- 1 root root 134 June 22 10:23 annotations

-rw-r--r-- 1 root root 2 June 22 10:23 containerCpuRequestMilliCores

-rw-r--r-- 1 root root 7 June 22 10:23 containerMemoryLimitBytes

-rw-r--r-- 1 root root 9 June 22 10:23 labels

-rw-r--r-- 1 root root 8 June 22 10:23 pod

-rw-r--r-- 1 root root 7 June 22 10:23 podNamespace

 

[downwardAPI 볼륨에서 라벨과 주석 표시하기]

 

$ 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="2017-11-29T13:32:26.89792304Z"

kubernetes.io/config.source="api"

 

 

 

 

 

 

 

'Kubenetes > Kubernetes API' 카테고리의 다른 글

Kubernetes API 서버와 통신  (0) 2021.02.12