반응형

 

downwardAPI 볼륨에 파일로 메타데이터 전달

환경변수 대신 파일로 메타데이터를 노출하려는 경우 downwardAPI 볼륨을 정의해 컨테이너에 마운트 할 수 있습니다. 환경변수로 파드의 레이블이나 어노테이션을 노출할 수 없기 때문에 downwardAPI 볼륨을 사용해야 합니다. 이유는 나중에 추가로 다뤄보겠습니다.

 

환경변수와 마찬가지로 메타데이터를 프로세스에 노출시키려면 각 메타데이터 필드를 명시적으로 지정해야 합니다. 다음 예제에서 환경변수 대신 볼륨을 사용하도록 이전 예제를 수정하는 방법을 살펴보겠습니다.

 

예제. 1) downwardAPI 볼륨을 갖는 파드: downward-api-volume.yaml

apiVersion: v1
kind: Pod
metadata:
  name: downward
  labels:          # 
    foo: bar       #
  annotations:     #
    key1: value1   # 이 레이블과 어노테이션은 downwardAPI 볼륨으로 노출됩니다.
    key2: |        #
      multi        #
      line         #
      value        #
spec:
  containers:
    - name: main
      image: busybox
      command: ["sleep", "9999999"]
      resources:
        requests:
          cpu: 15m
          memory: 100Ki
        limits:
          cpu: 100m
          memory: 4M1
      volumeMounts:                  #
        - name: downward             # dwonward 볼륨은 /etc/downward 아래에 마운트합니다.
          mountPath: /etc/downward   #
  volumes:
    - name: downward  # downwardAPI 볼륨을 downward라는 이름으로 정의합니다.
      downwardAPI:    #
        items:
          - path: "podName"               # 파드의 이름(매니페스트에 있는 metadata.name
            fieldRef:                     # 필드에서 확인할 수 있습니다.)은 podName 파일에
              fieldPath: metadata.name    # 기록됩니다.
          - path: "podNamespace"
            fieldRef:
              fieldPath: metadata.namespace
          - path: "labels"                    #
            fieldRef:                         # 파드의 레이블은 /etc.downward/labels 파일에 기록됩니다.
              fieldPath: metadata.labels      #
          - path: "annotations"                   #
            fieldRef:                             # 파드의 어노테이션을
              fieldPath: metadata.annotations     # /ect/downward/annotations 파일에 기록합니다.
          - path: "containerCpuRequestMilliCores"
            resourceFieldRef:
              containerName: main
              resource: requests.cpu
              divisor: 1m
          - path: "containerMemoryLimitBytes"
            resourceFieldRef:
              containerName: main
              resource: limits.memory
              divisor: 1

 

환경변수로 메타데이터를 전달하는 대신 downward라는 볼륨을 정의하고 컨테이너의 /etc/downward 아래에 마운트 합니다. 이 볼륨에 포함된 파일들은 볼륨 스펙의 downward API.items 속성 아래에 설정됩니다.

 

각 항목은 메타데이터를 기록할 경로(파일 이름)와 파일에 저장할 값의 파드 수준의 필 드나 컨테이너 리소스 필드에 대한 참조를 지정합니다.

 

이전에 만든 파드를 삭제하고 이전 예제의 매니페스트를 사용해 새로운 파드를 만듭니다. 그런 다음 마운트된 downwardAPI 볼륨 디렉터리의 내용을 살펴봅시다. /etc/downward/ 아래에 볼륨을 마운트 했으므로 다음 예제에 표시된 것처럼 파일을 나열할 수 있습니다. 또한 컨피그맵과 시크릿 볼륨과 마찬가지로 파드 스펙에서 downwardAPI 볼륨의 defaultMode 속성으로 파일 권한을 변경할 수 있습니다.

 

예제. 2) downwardAPI 볼륨 내의 파일들

$ kubectl exec downward -- 1s -1L /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

 

각 파일은 볼륨 정의의 항목(item)에 해당합니다. 그러나 환경변수로는 레이블과 어노 테이션을 노출할 수 없었기 때문에 다음 예제로 노출하려는 내용이 두 파일에 저장돼 있는지 확인할 수 있습니다.

 

예제. 3) 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="2016-11-28T14:27:45.6649242822"
kubernetes.io/config.source="api"

 

위에서 볼 수 있듯이 각 레이블/어노테이션은 별도의 줄에 키값 형식으로 저장됩니다. 값이 여러 줄인 경우 줄 바꾸기 문자가 \n으로 표시돼 한 줄로 기록됩니다.

 

레이블과 어노테이션 업데이트

파드가 실행되는 동안 레이블과 어노테이션을 수정할 수 있습니다. 레이블이나 어노테이션이 변경될 때 쿠버네티스가 이 값을 가지고 있는 파일을 업데이트해서 파드가 항상 최신 데이터를 볼 수 있도록 합니다. 이것은 레이블과 어노테이션 이 왜 환경변수로 노출될 수 없는지도 설명할 수도 있습니다. 환경변숫값은 나중에 업데이트할 수 없기 때문에 파드의 레이블 또는 어노테이션이 환경변수로 노출된 경우 변경이 발생한 다음에 새로운 값을 노출할 수 있는 방법이 없습니다.

 

볼륨 스펙에서 컨테이너 수준의 메타데이터 참조

이 내용을 마무리하기 전에 한 가지 짚어봐야 할 것은 컨테이너의 리소스 제한 또는 요청(resourceFieldRef를 사용해 수행)과 같은 컨테이너 수준의 메타데이터를 노출하는 경우 다음 예제에 표시된 것처럼 리소스 필드를 참조하는 컨테이너의 이름을 지정해야 합니다.

 

예제. 4) downwardAPI 볼륨에서 컨테이너 수준의 메타데이터 참조

spec:
  volumes:
    - name: downward
      downwardAPI:
        items:
          - path: "containerCpuRequestMilliCores"
            resourceFieldRef:
              containerName: main #컨테이너 이름이 반드시 지정돼야 합니다.
              resource: requests.cpu
              divisor: 1m

 

볼륨이 컨테이너가 아니라 파드 수준에서 정의됐다고 생각하면 그 이유가 분명해집니다. 볼륨 스펙 내에서 컨테이너의 리소스 필드를 참조할 때는 참조하는 컨테이너의 이름을 명시적으로 지정해야 합니다. 컨테이너가 하나인 파드에서도 마찬가지입니다.

 

볼륨을 사용해 컨테이너의 리소스 요청이나 제한을 노출하는 것은 환경변수를 사용하는 것보다 약간 더 복잡하지만 필요할 경우 한 컨테이너의 리소스 필드를 다른 컨테이너에 전달할 수 있는 장점이 있습니다(단, 두 컨테이너는 모두 같은 파드에 있어야 한다). 환경변수로는 컨테이너 자신의 리소스 제한과 요청만 전달할 수 있다.

 

Downward API 사용 시기 이해

 

앞에서 본 바와 같이 Downward API 사용은 그렇게 복잡하지는 않습니다. 이것은 애플리케이션을 쿠버네티스에 독립적 (Kubernetes-agnostic)으로 유지할 수 있게 합니다. 환경변수의 특정 데이터를 활용하는 기존 애플리케이션을 처리할 때 특히 유용합니다. Downward API를 사용하면 애플리케이션을 다시 짜거나 데이터를 가져와서 환경변수에 노출하는 Shell 스크립트를 사용하지 않고도 데이터를 애플리케이션에 노출할 수 있습니다.

 

그러나 Downward API로 사용 가능한 메타데이터는 상당히 제한적입니다. 더 많은 정 보가 필요한 경우 쿠버네티스 API 서버에서 직접 가져와야 한다. 다음 포스팅에서 그 방법에 대해 다뤄보도록 하겠습니다.

반응형