7.5. 컨테이너에서 API 오브젝트를 사용하도록 허용
Downward API 는 AWS의 Red Hat OpenShift Service에 결합하지 않고 컨테이너에서 API 오브젝트에 대한 정보를 사용할 수 있는 메커니즘입니다. 이러한 정보에는 Pod 이름, 네임스페이스, 리소스 값이 포함됩니다. 컨테이너는 환경 변수 또는 볼륨 플러그인을 사용하여 Downward API의 정보를 사용할 수 있습니다.
7.5.1. Downward API를 사용하여 컨테이너에 Pod 정보 노출
Downward API에는 Pod 이름, 프로젝트, 리소스 값과 같은 정보가 포함됩니다. 컨테이너는 환경 변수 또는 볼륨 플러그인을 사용하여 Downward API의 정보를 사용할 수 있습니다.
Pod 내 필드는 FieldRef
API 유형을 사용하여 선택합니다. FieldRef
에는 두 개의 필드가 있습니다.
필드 | 설명 |
---|---|
| Pod와 관련하여 선택할 필드의 경로입니다. |
|
|
현재 v1 API에서 유효한 선택기는 다음과 같습니다.
선택기 | 설명 |
---|---|
| Pod의 이름입니다. 이는 환경 변수와 볼륨 모두에서 지원됩니다. |
| Pod의 네임스페이스입니다. 환경 변수와 볼륨 모두에서 지원됩니다. |
| Pod의 라벨입니다. 볼륨에서만 지원되며 환경 변수에서는 지원되지 않습니다. |
| Pod의 주석입니다. 볼륨에서만 지원되며 환경 변수에서는 지원되지 않습니다. |
| Pod의 IP입니다. 환경 변수에서만 지원되며 볼륨에서는 지원되지 않습니다. |
apiVersion
필드가 지정되지 않은 경우 기본값은 포함된 Pod 템플릿의 API 버전입니다.
7.5.2. Downward API를 사용하여 컨테이너 값을 사용하는 방법 이해
컨테이너는 환경 변수 또는 볼륨 플러그인을 사용하여 API 값을 사용할 수 있습니다. 선택하는 메서드에 따라 컨테이너에서 다음을 사용할 수 있습니다.
- Pod 이름
- Pod 프로젝트/네임스페이스
- Pod 주석
- Pod 라벨
볼륨 플러그인만 사용하여 주석 및 레이블을 사용할 수 있습니다.
7.5.2.1. 환경 변수를 사용하여 컨테이너 값 사용
컨테이너의 환경 변수를 사용할 때는 변수 값을 value
필드에서 지정하는 리터럴 값 대신 FieldRef
소스에서 제공하도록 EnvVar
유형의 valueFrom
필드(EnvVarSource
유형)를 사용합니다.
프로세스에 변수 값이 변경되었음을 알리는 방식으로 프로세스를 시작한 후에는 환경 변수를 업데이트할 수 없으므로 Pod의 상수 특성만 이러한 방식으로 사용할 수 있습니다. 환경 변수를 사용하여 지원되는 필드는 다음과 같습니다.
- Pod 이름
- Pod 프로젝트/네임스페이스
프로세스
컨테이너에서 사용할 환경 변수가 포함된 새 Pod 사양을 생성합니다.
다음과 유사한
pod.yaml
파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: env-test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: MY_POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] restartPolicy: Never # ...
pod.yaml
파일에서 Pod를 생성합니다.$ oc create -f pod.yaml
검증
컨테이너의 로그에
MY_POD_NAME
및MY_POD_NAMESPACE
값이 있는지 확인합니다.$ oc logs -p dapi-env-test-pod
7.5.2.2. 볼륨 플러그인을 사용하여 컨테이너 값 사용
컨테이너는 볼륨 플러그인을 사용하여 API 값을 사용할 수 있습니다.
컨테이너는 다음을 사용할 수 있습니다.
- Pod 이름
- Pod 프로젝트/네임스페이스
- Pod 주석
- Pod 라벨
프로세스
볼륨 플러그인을 사용하려면 다음을 수행합니다.
컨테이너에서 사용할 환경 변수가 포함된 새 Pod 사양을 생성합니다.
다음과 유사한
volume-pod.yaml
파일을 생성합니다.kind: Pod apiVersion: v1 metadata: labels: zone: us-east-coast cluster: downward-api-test-cluster1 rack: rack-123 name: dapi-volume-test-pod annotations: annotation1: "345" annotation2: "456" spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: volume-test-container image: gcr.io/google_containers/busybox command: ["sh", "-c", "cat /tmp/etc/pod_labels /tmp/etc/pod_annotations"] volumeMounts: - name: podinfo mountPath: /tmp/etc readOnly: false securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] volumes: - name: podinfo downwardAPI: defaultMode: 420 items: - fieldRef: fieldPath: metadata.name path: pod_name - fieldRef: fieldPath: metadata.namespace path: pod_namespace - fieldRef: fieldPath: metadata.labels path: pod_labels - fieldRef: fieldPath: metadata.annotations path: pod_annotations restartPolicy: Never # ...
volume-pod.yaml
파일에서 Pod를 생성합니다.$ oc create -f volume-pod.yaml
검증
컨테이너의 로그를 확인하고 구성된 필드가 있는지 확인합니다.
$ oc logs -p dapi-volume-test-pod
출력 예
cluster=downward-api-test-cluster1 rack=rack-123 zone=us-east-coast annotation1=345 annotation2=456 kubernetes.io/config.source=api
7.5.3. Downward API를 사용하여 컨테이너 리소스를 사용하는 방법 이해
Pod를 생성할 때 이미지 및 애플리케이션 작성자가 특정 환경에 대한 이미지를 올바르게 생성할 수 있도록 Downward API를 사용하여 컴퓨팅 리소스 요청 및 제한에 대한 정보를 삽입할 수 있습니다.
환경 변수 또는 볼륨 플러그인을 사용하여 이 작업을 수행할 수 있습니다.
7.5.3.1. 환경 변수를 사용하여 컨테이너 리소스 사용
Pod를 생성할 때는 Downward API에서 환경 변수를 사용하여 컴퓨팅 리소스 요청 및 제한에 대한 정보를 삽입할 수 있습니다.
Pod 구성을 생성할 때 spec.container
필드의 resources
필드에 해당하는 환경 변수를 지정합니다.
리소스 제한이 컨테이너 구성에 포함되지 않은 경우 Downward API의 기본값은 노드의 CPU 및 메모리 할당 가능 값으로 설정됩니다.
프로세스
삽입할 리소스가 포함된 새 Pod 사양을 생성합니다.
다음과 유사한
pod.yaml
파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: containers: - name: test-container image: gcr.io/google_containers/busybox:1.24 command: [ "/bin/sh", "-c", "env" ] resources: requests: memory: "32Mi" cpu: "125m" limits: memory: "64Mi" cpu: "250m" env: - name: MY_CPU_REQUEST valueFrom: resourceFieldRef: resource: requests.cpu - name: MY_CPU_LIMIT valueFrom: resourceFieldRef: resource: limits.cpu - name: MY_MEM_REQUEST valueFrom: resourceFieldRef: resource: requests.memory - name: MY_MEM_LIMIT valueFrom: resourceFieldRef: resource: limits.memory # ...
pod.yaml
파일에서 Pod를 생성합니다.$ oc create -f pod.yaml
7.5.3.2. 볼륨 플러그인을 사용하여 컨테이너 리소스 사용
Pod를 생성할 때 Downward API를 사용하여 볼륨 플러그인을 사용하여 컴퓨팅 리소스 요청 및 제한에 대한 정보를 삽입할 수 있습니다.
Pod 구성을 생성할 때 spec.volumes.downwardAPI.items
필드를 사용하여 spec.resources
필드에 해당하는 원하는 리소스를 설명합니다.
리소스 제한이 컨테이너 구성에 포함되지 않은 경우 Downward API의 기본값은 노드의 CPU 및 메모리 할당 가능 값으로 설정됩니다.
프로세스
삽입할 리소스가 포함된 새 Pod 사양을 생성합니다.
다음과 유사한
pod.yaml
파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: containers: - name: client-container image: gcr.io/google_containers/busybox:1.24 command: ["sh", "-c", "while true; do echo; if [[ -e /etc/cpu_limit ]]; then cat /etc/cpu_limit; fi; if [[ -e /etc/cpu_request ]]; then cat /etc/cpu_request; fi; if [[ -e /etc/mem_limit ]]; then cat /etc/mem_limit; fi; if [[ -e /etc/mem_request ]]; then cat /etc/mem_request; fi; sleep 5; done"] resources: requests: memory: "32Mi" cpu: "125m" limits: memory: "64Mi" cpu: "250m" volumeMounts: - name: podinfo mountPath: /etc readOnly: false volumes: - name: podinfo downwardAPI: items: - path: "cpu_limit" resourceFieldRef: containerName: client-container resource: limits.cpu - path: "cpu_request" resourceFieldRef: containerName: client-container resource: requests.cpu - path: "mem_limit" resourceFieldRef: containerName: client-container resource: limits.memory - path: "mem_request" resourceFieldRef: containerName: client-container resource: requests.memory # ...
volume-pod.yaml
파일에서 Pod를 생성합니다.$ oc create -f volume-pod.yaml
7.5.4. Downward API를 사용하여 보안 사용
Pod를 생성할 때 이미지 및 애플리케이션 작성자가 특정 환경에 대한 이미지를 생성할 수 있도록 Downward API를 사용하여 보안을 삽입할 수 있습니다.
프로세스
삽입할 시크릿을 생성합니다.
다음과 유사한
secret.yaml
파일을 생성합니다.apiVersion: v1 kind: Secret metadata: name: mysecret data: password: <password> username: <username> type: kubernetes.io/basic-auth
secret.yaml
파일에서 보안 오브젝트를 생성합니다.$ oc create -f secret.yaml
위
Secret
오브젝트의username
필드를 참조하는 Pod를 생성합니다.다음과 유사한
pod.yaml
파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: env-test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: MY_SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] restartPolicy: Never # ...
pod.yaml
파일에서 Pod를 생성합니다.$ oc create -f pod.yaml
검증
컨테이너의 로그에
MY_SECRET_USERNAME
값이 있는지 확인합니다.$ oc logs -p dapi-env-test-pod
7.5.5. Downward API를 사용하여 구성 맵 사용
Pod를 생성할 때 이미지 및 애플리케이션 작성자가 특정 환경에 대한 이미지를 생성할 수 있도록 Downward API를 사용하여 구성 맵 값을 삽입할 수 있습니다.
프로세스
삽입할 값으로 구성 맵을 생성합니다.
다음과 유사한
configmap.yaml
파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: myconfigmap data: mykey: myvalue
configmap.yaml
파일에서 구성 맵을 생성합니다.$ oc create -f configmap.yaml
위 구성 맵을 참조하는 Pod를 생성합니다.
다음과 유사한
pod.yaml
파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: env-test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: MY_CONFIGMAP_VALUE valueFrom: configMapKeyRef: name: myconfigmap key: mykey securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] restartPolicy: Always # ...
pod.yaml
파일에서 Pod를 생성합니다.$ oc create -f pod.yaml
검증
컨테이너의 로그에
MY_CONFIGMAP_VALUE
값이 있는지 확인합니다.$ oc logs -p dapi-env-test-pod
7.5.6. 환경 변수 참조
Pod를 생성할 때 $()
구문을 사용하여 이전에 정의한 환경 변수의 값을 참조할 수 있습니다. 환경 변수 참조를 확인할 수 없는 경우에는 값이 제공된 문자열로 그대로 유지됩니다.
프로세스
기존 환경 변수를 참조하는 Pod를 생성합니다.
다음과 유사한
pod.yaml
파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: env-test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: MY_EXISTING_ENV value: my_value - name: MY_ENV_VAR_REF_ENV value: $(MY_EXISTING_ENV) securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] restartPolicy: Never # ...
pod.yaml
파일에서 Pod를 생성합니다.$ oc create -f pod.yaml
검증
컨테이너의 로그에
MY_ENV_VAR_REF_ENV
값이 있는지 확인합니다.$ oc logs -p dapi-env-test-pod
7.5.7. 환경 변수 참조 이스케이프
Pod를 생성할 때 이중 달러 기호를 사용하여 환경 변수 참조를 이스케이프할 수 있습니다. 그러면 해당 값이 제공된 값의 단일 달러 기호 버전으로 설정됩니다.
프로세스
기존 환경 변수를 참조하는 Pod를 생성합니다.
다음과 유사한
pod.yaml
파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: dapi-env-test-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault containers: - name: env-test-container image: gcr.io/google_containers/busybox command: [ "/bin/sh", "-c", "env" ] env: - name: MY_NEW_ENV value: $$(SOME_OTHER_ENV) securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] restartPolicy: Never # ...
pod.yaml
파일에서 Pod를 생성합니다.$ oc create -f pod.yaml
검증
컨테이너의 로그에
MY_NEW_ENV
값이 있는지 확인합니다.$ oc logs -p dapi-env-test-pod