Skip to Content
Infra & DevOpsDownward API로 Pod에 노드 이름 전달하기
☁️ Infra & DevOps2019년 9월 3일

Downward API로 Pod에 노드 이름 전달하기

#kubernetes#infra-devops#pod#env#downward-api#apm

Pod 안의 애플리케이션에서 자신이 배치된 노드 이름을 읽어야 할 때 쓰는 설정입니다. Pod의 호스트 이름과 Kubernetes Node 이름은 다를 수 있어 필요한 값을 명시적으로 전달했습니다.

원래 메모의 설정은 Downward API에서 spec.nodeName을 읽어 NODE_NAME 환경 변수에 넣는 방식이었습니다.

fieldRef 설정

다음은 동작을 확인할 수 있는 Pod 예시입니다. 실제 수집기 이미지 대신 환경 변수를 조회하기 위한 컨테이너를 사용합니다.

yaml
node-info.yaml
apiVersion: v1 kind: Pod metadata: name: node-info spec: containers: - name: example image: busybox:1.36.1 command: ["sleep", "3600"] env: - name: NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName

Deployment에 적용할 때는 컨테이너의 env 설정을 .spec.template.spec.containers 아래에 넣습니다.

애플리케이션에서는 일반 환경 변수처럼 읽을 수 있습니다. Java라면 System.getenv("NODE_NAME")으로 접근합니다. 이 값은 Kubernetes Node의 이름이며, 반드시 물리 장비의 OS 호스트 이름과 일치하는 것은 아닙니다.

배치 결과와 환경 변수 비교

bash
kubectl apply -f node-info.yaml kubectl get pod node-info -o wide kubectl exec node-info -- printenv NODE_NAME

Pod가 실행된 뒤 NODE 열과 환경 변수 값을 비교하면 됩니다. 다른 네임스페이스에 만들었다면 조회·실행 명령에도 같은 네임스페이스를 지정해야 합니다.

확인용 Pod는 다음 명령으로 정리할 수 있습니다.

bash
kubectl delete pod node-info

함께 전달할 수 있는 정보

Downward API는 모든 클러스터 정보를 내려주는 기능이 아니라 지원하는 Pod 필드를 노출하는 기능입니다.

필요한 값fieldPath
노드 이름spec.nodeName
Pod 이름metadata.name
네임스페이스metadata.namespace
Pod IPstatus.podIP

환경 변수로 받은 값은 실행 중인 프로세스에서 계속 갱신되는 조회 API가 아닙니다. Pod가 새로 만들어지면 새 배치에 맞는 값이 전달되는 방식으로 이해하면 됩니다.

참고 자료

Last updated on