환경 변수를 통해 파드 정보를 컨테이너에 노출하기

환경 변수를 통해 파드 정보를 컨테이너에 노출하기

이 페이지는 파드가 환경 변수를 사용해 downward API를 통해 파드 안에서 실행되는 컨테이너에 자기 자신에 대한 정보를 노출하는 방법을 보여줘요. 환경 변수를 사용해 파드 필드, 컨테이너 필드, 또는 둘 다를 노출할 수 있어요.

Kubernetes에서 실행 중인 컨테이너에 파드와 컨테이너 필드를 노출하는 두 가지 방법이 있어요.

함께 이 두 가지 방법을 downward API라고 불러요.

서비스가 Kubernetes가 관리하는 컨테이너화된 애플리케이션 간 통신의 주요 수단이므로, 런타임에 서비스를 발견할 수 있는 것은 유용해요. 서비스 접근에 대해 더 읽어보려면 여기를 참고해요.

출처: 문서

본문

시작하기 전에

Kubernetes 클러스터가 있어야 하고 kubectl 명령줄 도구가 클러스터와 통신하도록 구성되어 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 이용해 만들거나, 아래 Kubernetes 플레이그라운드 중 하나를 사용할 수 있어요.

파드 필드를 환경 변수 값으로 사용

이 연습 부분에서는 컨테이너가 하나인 파드를 만들고, 파드 수준 필드를 환경 변수로 실행 중인 컨테이너에 프로젝션해요.

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-fieldref
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox:1.27.2
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
          printenv MY_POD_IP MY_POD_SERVICE_ACCOUNT;
          sleep 10;
        done;
      env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MY_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: MY_POD_SERVICE_ACCOUNT
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName
  restartPolicy: Never

이 매니페스트에서 다섯 개의 환경 변수를 볼 수 있어요. env 필드는 환경 변수 정의의 배열이에요. 배열의 첫 번째 요소는 MY_NODE_NAME 환경 변수가 파드의 spec.nodeName 필드에서 값을 얻도록 지정해요. 마찬가지로 다른 환경 변수들은 파드 필드에서 이름을 얻어요.

파드를 생성해요.

kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-pod.yaml

파드의 컨테이너가 실행 중인지 확인해요.

# If the new Pod isn't yet healthy, rerun this command a few times.
kubectl get pods

컨테이너의 로그를 확인해요.

kubectl logs dapi-envars-fieldref

출력은 선택된 환경 변수의 값을 보여줘요.

minikube
dapi-envars-fieldref
default
172.17.0.4
default

이 값들이 왜 로그에 있는지 보려면 구성 파일의 commandargs 필드를 봐요. 컨테이너가 시작되면 다섯 개의 환경 변수 값을 stdout에 써요. 10초마다 반복해요.

다음으로, 파드에서 실행 중인 컨테이너에 셸로 들어가요.

kubectl exec -it dapi-envars-fieldref -- sh

셸에서 환경 변수를 확인해요.

# Run this in a shell inside the container
printenv

출력은 특정 환경 변수에 파드 필드의 값이 할당되었음을 보여줘요.

MY_POD_SERVICE_ACCOUNT=default
...
MY_POD_NAMESPACE=default
MY_POD_IP=172.17.0.4
...
MY_NODE_NAME=minikube
...
MY_POD_NAME=dapi-envars-fieldref

컨테이너 필드를 환경 변수 값으로 사용

앞선 연습에서는 파드 수준 필드의 정보를 환경 변수 값으로 사용했어요. 이 다음 연습에서는 파드 정의의 일부이지만, 파드 전체가 아니라 특정 컨테이너에서 가져온 필드를 전달해요.

다시 컨테이너가 하나뿐인 파드의 매니페스트예요.

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-resourcefieldref
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox:1.27.2
      command: [ "sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_CPU_REQUEST MY_CPU_LIMIT;
          printenv MY_MEM_REQUEST MY_MEM_LIMIT;
          sleep 10;
        done;
      resources:
        requests:
          memory: "32Mi"
          cpu: "125m"
        limits:
          memory: "64Mi"
          cpu: "250m"
      env:
        - name: MY_CPU_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: requests.cpu
        - name: MY_CPU_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.cpu
        - name: MY_MEM_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: requests.memory
        - name: MY_MEM_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.memory
  restartPolicy: Never

이 매니페스트에서 네 개의 환경 변수를 볼 수 있어요. env 필드는 환경 변수 정의의 배열이에요. 배열의 첫 번째 요소는 MY_CPU_REQUEST 환경 변수가 test-container라는 컨테이너의 requests.cpu 필드에서 값을 얻도록 지정해요. 마찬가지로 다른 환경 변수들은 이 컨테이너에 특화된 필드에서 값을 얻어요.

파드를 생성해요.

kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-container.yaml

파드의 컨테이너가 실행 중인지 확인해요.

# If the new Pod isn't yet healthy, rerun this command a few times.
kubectl get pods

컨테이너의 로그를 확인해요.

kubectl logs dapi-envars-resourcefieldref

출력은 선택된 환경 변수의 값을 보여줘요.

1
1
33554432
67108864

다음 단계

레거시 API 참조에서 파드, 컨테이너, 환경 변수에 대해 읽어보세요.

더 알아보기 (Learn more)