Downward API로 Pod에 노드 이름 전달하기
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.nodeNameDeployment에 적용할 때는 컨테이너의 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_NAMEPod가 실행된 뒤 NODE 열과 환경 변수 값을 비교하면 됩니다. 다른 네임스페이스에 만들었다면 조회·실행 명령에도 같은 네임스페이스를 지정해야 합니다.
확인용 Pod는 다음 명령으로 정리할 수 있습니다.
bash
kubectl delete pod node-info함께 전달할 수 있는 정보
Downward API는 모든 클러스터 정보를 내려주는 기능이 아니라 지원하는 Pod 필드를 노출하는 기능입니다.
| 필요한 값 | fieldPath |
|---|---|
| 노드 이름 | spec.nodeName |
| Pod 이름 | metadata.name |
| 네임스페이스 | metadata.namespace |
| Pod IP | status.podIP |
환경 변수로 받은 값은 실행 중인 프로세스에서 계속 갱신되는 조회 API가 아닙니다. Pod가 새로 만들어지면 새 배치에 맞는 값이 전달되는 방식으로 이해하면 됩니다.
참고 자료
Last updated on