반응형

 

Downward API로 메타데이터 전달

 

오래간만에 다시 쿠버네티스로 돌아왔습니다. 이번 포스팅에서는 메타데이터를 전달하는 방법에 대해 다뤄보도록 하겠습니다. 이전에 저희는 환경변수 또는 컨피그맵과 시크릿 볼륨으로 설정 데이터를 애플리케이션에 전 달하는 방법을 살펴봤습니다. 이는 사용자가 데이터를 직접 설정하거나 파드가 노드에 스케줄링돼 실행되기 이전에 이미 알고 있는 데이터에는 적합합니다.

 

그러나 파드의 IP, 호스트 노드 이름 또는 파드 자체의 이름(파드의 이름이 생성되는 경우. 예를 들어 레플리카셋이나 그와 유사 한 컨트롤러에 의해 파드가 생성되는 경우)과 같이 실행 시점까지 알려지지 않은 데이터의 경우나 파드의 레이블이나 어노테이션과 같이 어딘가에 이미 설정된 데이터일 경우에 동일한 정보를 여러 곳에 반복해서 설정하고 싶지는 않을 것입니다.

 

이 두 가지 문제는 쿠버네티스의 Downward API로 해결할 수 있습니다. 환경변수 또는 (downwardAPI 볼륨 내에 있는) 파일로 파드와 해당 환경의 메타데이터를 전달할 수 있습니다. 이 때 이름 때문에 혼동 하지 말아야 합니다. Downward API는 애플리케이션이 호출해서 데이터를 가져오는 REST 엔드포인트와 다릅니다. 다음 그림과 같이 환경변수 또는 파일에 파드의 스펙 또는 상태값이 채워지 도록 하는 방식입니다.

 

사용 가능한 메타데이터 이해

Downward API를 사용하면 파드 자체의 메타데이터를 해당 파드 내에서 실행 중인 프로세스에 노출할 수 있다. 현재 다음 정보를 컨테이너에 전달할 수 있습니다.

  • 파드의 이름
  • 파드의 IP 주소
  • 파드가 속한 네임스페이스
  • 파드가 실행 중인 노드의 이름
  • 파드가 실행 중인 서비스 어카운트 이름
  • 각 컨테이너의 CPU와 메모리 요청
  • 각 컨테이너의 CPU와 메모리 제한
  • 파드의 레이블
  • 파드의 어노테이션

 

서비스 어카운트(Service Account), CPU/메모리 요청 (request)과 제한(limit)을 제외하고는 목록에 있는 대부분의 항목은 별도의 설명 없이도 보는데 문제는 크게 없을 것입니다. 이에 대한 내용은 이후에 쿠버네티스를 진행하면서 천천히 다룰 여정이고 간단하게 설명하자면 다음과 같습니다.

 

  • 서비스 어카운트: 파드가 API 서버와 통신할 때 인증하는 계정
  • CPU/메모리 요청 및 제한: 컨테이너에 보장되는 CPU와 메모리의 양과 컨테이너가 얻을 수 있는 최대 양

 

목록에 있는 대부분의 항목은 환경변수 또는 downwardAPI 볼륨으로 컨테이너에 전 달될 수 있지만 레이블과 어노테이션은 볼륨으로만 노출될 수 있습니다. 일부 데이터는 다른 방법(이를테면 운영체제에서 직접)으로도 얻을 수 있지만, Downward API는 더 간단한 대안 을 제공합니다.

 

다음 항목에서 컨테이너 내부에 있는 프로세스에 메타데이터를 전달하는 예를 살펴보겠습니다.

 

환경변수로 메타데이터 노출하기

먼저 환경변수로 파드와 컨테이너의 메타데이터를 컨테이너에 전달하는 방법을 살펴보겠습니다. 다음 예제의 매니페스트를 이용해 컨테이너가 하나인 간단한 파드를 만들 수 있습니다.

 

예시) Downward API: downward-api-env.yaml

apiVersion: v1
kind: Pod
metadata:
  name: down
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:              >  특정 값을 설정하는 대신 파드 매니페스트의 metadata.name을 참조한다.
        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:    >  컨테이너의 CPU/메모리 요청과 제한은 fieldRef CHA resourceFieldRef  사용해 참조한다.
        resourceFieldRef:
          resource: requests.cpu
          divisor: 1m   >  리소스 필드의 경우 필요한 단위의 값을 얻으려면 제수(divisor)를 정의한다.
    - name: CONTAINER_MEMORY_LIMIT_KIBIBYTES
      valueFrom:
        resourceFieldRef:
          resource: limits.memory
          divisor: 1Ki

 

프로세스가 실행되면 파드 스펙에 정의한 모든 환경변수를 조회할 수 있습니다. 파드의 이름, IP와 네임스페이스는 각각 POD_NAME, POD_IP와 POD_NAMESPACE 환경변수로 노출됩니다. 컨테이너가 실행 중인 노드의 이름은 NODE_NAME 변수로 노출됩니다. 서비스 어카운트 이름은 SERVICE_ACCOUNT 환경변수 로 사용 가능합니다. 그리고 이 컨테이너에 요청된 CPU 양과 컨테이너가 사용할 수 있는 최대 메모리 양을 갖는 두 개의 환경변수를 작성합니다.

 

자원 제한(limits) 또는 요청(requests)을 노출시키는 환경변수의 경우 제수(divisor)를 지정할 수 있습니다. 제한 또는 요청의 실제 값은 제수로 나누고 결과값을 환경변수로 노출합니다. 이 예제에 서는 CPU 요청에 대한 제수를 1m(1밀리코어 또는 1000분의 1 CPU 코어)로 설정했습니다. CPU 요청을 15m로 설정했기 때문에 환경변수 CONTAINER_CPU_REQUEST_MILLICORES는 15로 설정 됩니다. 마찬가지로 메모리 제한을 4Mi(4 메비바이트, Mebibyte)로 설정하고 제수를 1Ki(1 키비바이트,Kibibyte)로 설정했으므로 CONTAINER_MEMORY_LIMIT_KIBIBYTES 환경변수는 4096으로 설정됩니다.

 

  • 제수는 어떤 수를 나누는 수로, 여기서는 CPU나 메모리를 요청하거나 제한할 때 사용하는 단위 정도로 이해하면 됩니다

 

CPU 제한과 요청의 제수는 1(전체 코어 하나를 의미함) 또는 1m(1밀리코어)로 설정합니다. 메모리 제한/요청의 제수는 1바이트), 1k(킬로 바이트) 또는 1Ki(키비 바이트), 1M(메가 바이트) 또는 1Mi(메비 바이트) 등이 될 수 있습니다.

 

파드를 만든 후에는 kubectl exec를 사용해 다음 예제와 같이 컨테이너에 있는 모든 환경변수를 볼 수 있습니다.

 

예제2) downward 파드 내의 환경변수

$ kubectl exec downward env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/biniyoole
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-sg17
SERVICE_ACCOUNT=default
CONTAINER_CPU_REQUEST_MILLICORES=15
KUBERNETES_SERVICE_HOST=10.3.240.1
KUBERNETES_SERVICE_PORT=443
...

 

컨테이너 내부에서 실행되는 모든 프로세스는 해당 변수를 읽을 수 있고, 필요한 대로 사용할 수 있습니다.

 

 

반응형