환경 변수를 통해 파드 정보를 컨테이너에 노출하기
환경 변수를 통해 파드 정보를 컨테이너에 노출하기
이 페이지는 파드가 환경 변수를 사용해 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
이 값들이 왜 로그에 있는지 보려면 구성 파일의 command와 args 필드를 봐요. 컨테이너가 시작되면 다섯 개의 환경 변수 값을 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
다음 단계
- 컨테이너용 환경 변수 정의 읽기
- 파드의 spec API 정의 읽기 (파드의 일부인 Container 정의 포함)
- downward API로 노출할 수 있는 사용 가능한 필드 목록 읽기
레거시 API 참조에서 파드, 컨테이너, 환경 변수에 대해 읽어보세요.