|
| 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 | + |
0 commit comments