Skip to content

Commit 177568a

Browse files
authored
Merge pull request #29661 from bang9211/bang9211/downward-api-volume-expose-pod-information/v0.1
[ko]Translate tasks/inject-data-application/downward-api-volume-expose-po
2 parents 3b31998 + 5c73239 commit 177568a

File tree

3 files changed

+354
-0
lines changed

3 files changed

+354
-0
lines changed
Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
---
2+
title: 파일로 컨테이너에 파드 정보 노출하기
3+
content_type: task
4+
weight: 40
5+
---
6+
7+
<!-- overview -->
8+
9+
본 페이지는 파드가 DownwardAPIVolumeFile을 사용하여 파드에서 실행되는 컨테이너에
10+
자신에 대한 정보를 노출하는 방법에 대해 설명한다. DownwardAPIVolumeFile은 파드 필드와
11+
컨테이너 필드를 노출할 수 있다.
12+
13+
14+
15+
## {{% heading "prerequisites" %}}
16+
17+
18+
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
19+
20+
21+
22+
<!-- steps -->
23+
24+
## 다운워드(Downward) API
25+
26+
실행 중인 컨테이너에 파드 및 컨테이너 필드를 노출하는 방법에는 두 가지가 있다.
27+
28+
* [환경 변수](/docs/tasks/inject-data-application/environment-variable-expose-pod-information/#the-downward-api)
29+
* 볼륨 파일
30+
31+
파드 및 컨테이너 필드를 노출하는 이 두 가지 방법을 *다운워드 API*라고 한다.
32+
33+
## 파드 필드 저장
34+
35+
이 연습에서는 하나의 컨테이너를 가진 파드를 생성한다.
36+
다음은 파드에 대한 구성 파일이다.
37+
38+
{{< codenew file="pods/inject/dapi-volume.yaml" >}}
39+
40+
구성 파일에서 파드에 `downwardAPI` 볼륨이 있고 컨테이너가 `/etc/podinfo`에 볼륨을 마운트하는
41+
것을 확인할 수 있다.
42+
43+
`downwardAPI` 아래의 배열을 살펴보자. 배열의 각 요소는
44+
[DownwardAPIVolumeFile](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#downwardapivolumefile-v1-core)이다.
45+
첫 번째 요소는 파드의 `metadata.labels` 필드 값이 `labels`라는 파일에 저장되어야 함을 지정한다.
46+
두 번째 요소는 파드의 `annotations` 필드 값이 `annotations`라는 파일에 저장되어야 함을 지정한다.
47+
48+
{{< note >}}
49+
이 예제의 필드는 파드에 있는 컨테이너의 필드가 아니라 파드 필드이다.
50+
{{< /note >}}
51+
52+
파드를 생성한다.
53+
54+
```shell
55+
kubectl apply -f https://k8s.io/examples/pods/inject/dapi-volume.yaml
56+
```
57+
58+
파드의 컨테이너가 실행 중인지 확인한다.
59+
60+
```shell
61+
kubectl get pods
62+
```
63+
64+
컨테이너의 로그를 본다.
65+
66+
```shell
67+
kubectl logs kubernetes-downwardapi-volume-example
68+
```
69+
70+
출력은 `labels` 파일과 `annotations` 파일의 내용을 보여준다.
71+
72+
```shell
73+
cluster="test-cluster1"
74+
rack="rack-22"
75+
zone="us-est-coast"
76+
77+
build="two"
78+
builder="john-doe"
79+
```
80+
81+
파드에서 실행 중인 컨테이너의 셸을 가져오자.
82+
83+
```shell
84+
kubectl exec -it kubernetes-downwardapi-volume-example -- sh
85+
```
86+
87+
셸에서 `labels` 파일을 보자.
88+
89+
```shell
90+
/# cat /etc/podinfo/labels
91+
```
92+
93+
출력을 통해 모든 파드의 레이블이 `labels` 파일에 기록되었음을 확인할 수 있다.
94+
95+
```shell
96+
cluster="test-cluster1"
97+
rack="rack-22"
98+
zone="us-est-coast"
99+
```
100+
101+
마찬가지로 `annotations` 파일을 확인하자.
102+
103+
```shell
104+
/# cat /etc/podinfo/annotations
105+
```
106+
107+
`etc/podinfo` 디렉터리에 파일을 확인하자.
108+
109+
```shell
110+
/# ls -laR /etc/podinfo
111+
```
112+
113+
출력에서 `labels``annotations` 파일이
114+
임시 하위 디렉터리에 있음을 알 수 있다. 이 예제에서는
115+
`..2982_06_02_21_47_53.299460680`이다. `/etc/podinfo` 디렉터리에서 `..data`
116+
임시 하위 디렉토리에 대한 심볼릭 링크이다. `/etc/podinfo` 디렉토리에서
117+
`labels``annotations` 또한 심볼릭 링크이다.
118+
119+
```
120+
drwxr-xr-x ... Feb 6 21:47 ..2982_06_02_21_47_53.299460680
121+
lrwxrwxrwx ... Feb 6 21:47 ..data -> ..2982_06_02_21_47_53.299460680
122+
lrwxrwxrwx ... Feb 6 21:47 annotations -> ..data/annotations
123+
lrwxrwxrwx ... Feb 6 21:47 labels -> ..data/labels
124+
125+
/etc/..2982_06_02_21_47_53.299460680:
126+
total 8
127+
-rw-r--r-- ... Feb 6 21:47 annotations
128+
-rw-r--r-- ... Feb 6 21:47 labels
129+
```
130+
131+
심볼릭 링크를 사용하면 메타데이터의 동적(dynamic) 원자적(atomic) 갱신이 가능하다.
132+
업데이트는 새 임시 디렉터리에 기록되고, `..data` 심볼릭 링크는
133+
[rename(2)](http://man7.org/linux/man-pages/man2/rename.2.html)을 사용하여
134+
원자적(atomic)으로 갱신한다.
135+
136+
{{< note >}}
137+
다운워드 API를 [subPath](/docs/concepts/storage/volumes/#using-subpath)
138+
볼륨 마운트로 사용하는 컨테이너는 다운워드 API 업데이트를 수신하지 않는다.
139+
{{< /note >}}
140+
141+
셸을 종료한다.
142+
143+
```shell
144+
/# exit
145+
```
146+
147+
## 컨테이너 필드 저장
148+
149+
이전 연습에서는 파드 필드를 DownwardAPIVolumeFile에 저장하였다.
150+
이 다음 연습에서는 컨테이너 필드를 저장한다. 다음은 하나의 컨테이너를 가진 파드의 구성 파일이다.
151+
152+
{{< codenew file="pods/inject/dapi-volume-resources.yaml" >}}
153+
154+
구성 파일에서 파드에 `downwardAPI` 볼륨이 있고 컨테이너는 `/etc/podinfo`에 볼륨을
155+
마운트하는 것을 확인할 수 있다.
156+
157+
`downwardAPI` 아래의 `items` 배열을 살펴보자. 배열의 각 요소는 DownwardAPIVolumeFile이다.
158+
159+
첫 번째 요소는 `client-container`라는 컨테이너에서
160+
`1m`으로 지정된 형식의 `limits.cpu` 필드 값이
161+
`cpu_limit`이라는 파일에 저장되어야 함을 지정한다. `divisor` 필드는 선택 사항이며
162+
기본값인 `1`은 CPU에 대한 코어 및 메모리에 대한 바이트를 의미한다.
163+
164+
파드를 생성한다.
165+
166+
```shell
167+
kubectl apply -f https://k8s.io/examples/pods/inject/dapi-volume-resources.yaml
168+
```
169+
170+
파드에서 실행 중인 컨테이너의 셸을 가져온다.
171+
172+
```shell
173+
kubectl exec -it kubernetes-downwardapi-volume-example-2 -- sh
174+
```
175+
176+
셸에서 `cpu_limit` 파일을 확인한다.
177+
178+
```shell
179+
/# cat /etc/podinfo/cpu_limit
180+
```
181+
비슷한 명령을 통해 `cpu_request`, `mem_limit`
182+
`mem_request` 파일을 확인할 수 있다.
183+
184+
185+
186+
<!-- discussion -->
187+
188+
## 다운워드 API의 기능
189+
190+
다음 정보는 환경 변수 및 `downwardAPI` 볼륨을 통해 컨테이너에서 사용할 수 있다.
191+
192+
* `fieldRef`를 통해 다음 정보를 사용할 수 있다.
193+
* `metadata.name` - 파드의 이름
194+
* `metadata.namespace` - 파드의 네임스페이스(Namespace)
195+
* `metadata.uid` - 파드의 UID
196+
* `metadata.labels['<KEY>']` - 파드의 레이블 `<KEY>` 값 (예를 들어, `metadata.labels['mylabel']`)
197+
* `metadata.annotations['<KEY>']` - 파드의 어노테이션 `<KEY>` 값 (예를 들어, `metadata.annotations['myannotation']`)
198+
* `resourceFieldRef`를 통해 다음 정보를 사용할 수 있다.
199+
* 컨테이너의 CPU 한도(limit)
200+
* 컨테이너의 CPU 요청(request)
201+
* 컨테이너의 메모리 한도(limit)
202+
* 컨테이너의 메모리 요청(request)
203+
* 컨테이너의 hugepages 한도(limit) (`DownwardAPIHugePages` [기능 게이트(feature gate)](/docs/reference/command-line-tools-reference/feature-gates/)가 활성화된 경우)
204+
* 컨테이너의 hugepages 요청(request) (`DownwardAPIHugePages` [기능 게이트(feature gate)](/docs/reference/command-line-tools-reference/feature-gates/)가 활성화된 경우)
205+
* 컨테이너의 임시-스토리지 한도(limit)
206+
* 컨테이너의 임시-스토리지 요청(request)
207+
208+
`downwardAPI` 볼륨 `fieldRef`를 통해 다음 정보를 사용할 수 있다.
209+
210+
* `metadata.labels` - 한 줄에 하나의 레이블이 있는
211+
`label-key="escaped-label-value"` 형식의 모든 파드 레이블
212+
* `metadata.annotations` - 한 줄에 하나의 어노테이션이 있는 `annotation-key="escaped-annotation-value"` 형식의 모든 파드 어노테이션
213+
214+
환경 변수를 통해 다음 정보를 사용할 수 있다.
215+
216+
* `status.podIP` - 파드의 IP 주소
217+
* `spec.serviceAccountName` - 파드의 서비스 계정 이름, v1.4.0-alpha.3부터 사용 가능
218+
* `spec.nodeName` - 노드의 이름, v1.4.0-alpha.3부터 사용 가능
219+
* `status.hostIP` - 노드의 IP, v1.7.0-alpha.1 이후 사용 가능
220+
221+
{{< note >}}
222+
컨테이너에 대해 CPU 및 메모리 한도(limit)가 지정되지 않은 경우 다운워드 API는 기본적으로
223+
CPU 및 메모리에 대해 할당 가능한 노드 값으로 설정한다.
224+
{{< /note >}}
225+
226+
## 특정 경로 및 파일 권한에 대한 프로젝트 키
227+
228+
키(key)를 파드 안의 특정 경로에, 특정 권한으로, 파일 단위로 투영(project)할 수 있다.
229+
자세한 내용은
230+
[시크릿(Secrets)](/ko/docs/concepts/configuration/secret/)을 참조한다.
231+
232+
## 다운워드 API에 대한 동기
233+
234+
컨테이너가 쿠버네티스에 과도하게 결합되지 않고 자체에 대한 정보를 갖는 것이 때때로 유용하다.
235+
다운워드 API를 사용하면 컨테이너가 쿠버네티스 클라이언트 또는 API 서버를 사용하지 않고
236+
자체 또는 클러스터에 대한 정보를 사용할 수 있다.
237+
238+
예를 들어 잘 알려진 특정 환경 변수에 고유 식별자가 있다고 가정하는
239+
기존 애플리케이션이 있다. 한 가지 가능성은 애플리케이션을 래핑하는 것이지만
240+
이는 지루하고 오류가 발생하기 쉬우며 낮은 결합 목표를 위반한다.
241+
더 나은 옵션은 파드의 이름을 식별자로 사용하고
242+
파드의 이름을 잘 알려진 환경 변수에 삽입하는 것이다.
243+
244+
245+
246+
247+
## {{% heading "whatsnext" %}}
248+
249+
250+
* [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core)
251+
* [볼륨](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#volume-v1-core)
252+
* [DownwardAPIVolumeSource](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#downwardapivolumesource-v1-core)
253+
* [DownwardAPIVolumeFile](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#downwardapivolumefile-v1-core)
254+
* [ResourceFieldSelector](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#resourcefieldselector-v1-core)
255+
256+
257+
258+
259+
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
name: kubernetes-downwardapi-volume-example-2
5+
spec:
6+
containers:
7+
- name: client-container
8+
image: k8s.gcr.io/busybox:1.24
9+
command: ["sh", "-c"]
10+
args:
11+
- while true; do
12+
echo -en '\n';
13+
if [[ -e /etc/podinfo/cpu_limit ]]; then
14+
echo -en '\n'; cat /etc/podinfo/cpu_limit; fi;
15+
if [[ -e /etc/podinfo/cpu_request ]]; then
16+
echo -en '\n'; cat /etc/podinfo/cpu_request; fi;
17+
if [[ -e /etc/podinfo/mem_limit ]]; then
18+
echo -en '\n'; cat /etc/podinfo/mem_limit; fi;
19+
if [[ -e /etc/podinfo/mem_request ]]; then
20+
echo -en '\n'; cat /etc/podinfo/mem_request; fi;
21+
sleep 5;
22+
done;
23+
resources:
24+
requests:
25+
memory: "32Mi"
26+
cpu: "125m"
27+
limits:
28+
memory: "64Mi"
29+
cpu: "250m"
30+
volumeMounts:
31+
- name: podinfo
32+
mountPath: /etc/podinfo
33+
volumes:
34+
- name: podinfo
35+
downwardAPI:
36+
items:
37+
- path: "cpu_limit"
38+
resourceFieldRef:
39+
containerName: client-container
40+
resource: limits.cpu
41+
divisor: 1m
42+
- path: "cpu_request"
43+
resourceFieldRef:
44+
containerName: client-container
45+
resource: requests.cpu
46+
divisor: 1m
47+
- path: "mem_limit"
48+
resourceFieldRef:
49+
containerName: client-container
50+
resource: limits.memory
51+
divisor: 1Mi
52+
- path: "mem_request"
53+
resourceFieldRef:
54+
containerName: client-container
55+
resource: requests.memory
56+
divisor: 1Mi
57+
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
name: kubernetes-downwardapi-volume-example
5+
labels:
6+
zone: us-est-coast
7+
cluster: test-cluster1
8+
rack: rack-22
9+
annotations:
10+
build: two
11+
builder: john-doe
12+
spec:
13+
containers:
14+
- name: client-container
15+
image: k8s.gcr.io/busybox
16+
command: ["sh", "-c"]
17+
args:
18+
- while true; do
19+
if [[ -e /etc/podinfo/labels ]]; then
20+
echo -en '\n\n'; cat /etc/podinfo/labels; fi;
21+
if [[ -e /etc/podinfo/annotations ]]; then
22+
echo -en '\n\n'; cat /etc/podinfo/annotations; fi;
23+
sleep 5;
24+
done;
25+
volumeMounts:
26+
- name: podinfo
27+
mountPath: /etc/podinfo
28+
volumes:
29+
- name: podinfo
30+
downwardAPI:
31+
items:
32+
- path: "labels"
33+
fieldRef:
34+
fieldPath: metadata.labels
35+
- path: "annotations"
36+
fieldRef:
37+
fieldPath: metadata.annotations
38+

0 commit comments

Comments
 (0)