|
| 1 | +--- |
| 2 | +title: 시크릿(Secret)을 사용하여 안전하게 자격증명 배포하기 |
| 3 | +content_type: task |
| 4 | +weight: 50 |
| 5 | +min-kubernetes-server-version: v1.6 |
| 6 | +--- |
| 7 | + |
| 8 | +<!-- overview --> |
| 9 | +본 페이지는 암호 및 암호화 키와 같은 민감한 데이터를 파드에 안전하게 |
| 10 | +주입하는 방법을 설명한다. |
| 11 | + |
| 12 | +## {{% heading "prerequisites" %}} |
| 13 | + |
| 14 | + |
| 15 | +{{< include "task-tutorial-prereqs.md" >}} |
| 16 | + |
| 17 | +### 시크릿 데이터를 base-64 표현으로 변환하기 |
| 18 | + |
| 19 | +사용자 이름 `my-app`과 비밀번호 `39528$vdg7Jb`의 두 가지 시크릿 데이터가 필요하다고 가정한다. |
| 20 | +먼저 base64 인코딩 도구를 사용하여 사용자 이름과 암호를 base64 표현으로 변환한다. 다음은 일반적으로 사용 가능한 base64 프로그램을 사용하는 예제이다. |
| 21 | + |
| 22 | +```shell |
| 23 | +echo -n 'my-app' | base64 |
| 24 | +echo -n '39528$vdg7Jb' | base64 |
| 25 | +``` |
| 26 | + |
| 27 | +사용자 이름의 base-64 표현이 `bXktYXBw`이고 암호의 base-64 표현이 `Mzk1MjgkdmRnN0pi`임을 |
| 28 | +출력을 통해 확인할 수 있다. |
| 29 | + |
| 30 | +{{< caution >}} |
| 31 | +사용자의 OS가 신뢰하는 로컬 툴을 사용하여 외부 툴의 보안 위험을 줄이자. |
| 32 | +{{< /caution >}} |
| 33 | + |
| 34 | +<!-- steps --> |
| 35 | + |
| 36 | +## 시크릿 생성하기 |
| 37 | + |
| 38 | +다음은 사용자 이름과 암호가 들어 있는 시크릿을 생성하는 데 사용할 수 있는 |
| 39 | +구성 파일이다. |
| 40 | + |
| 41 | +{{< codenew file="pods/inject/secret.yaml" >}} |
| 42 | + |
| 43 | +1. 시크릿을 생성한다. |
| 44 | + |
| 45 | + ```shell |
| 46 | + kubectl apply -f https://k8s.io/examples/pods/inject/secret.yaml |
| 47 | + ``` |
| 48 | + |
| 49 | +2. 시크릿에 대한 정보를 확인한다. |
| 50 | + |
| 51 | + ```shell |
| 52 | + kubectl get secret test-secret |
| 53 | + ``` |
| 54 | + |
| 55 | + Output: |
| 56 | + |
| 57 | + ``` |
| 58 | + NAME TYPE DATA AGE |
| 59 | + test-secret Opaque 2 1m |
| 60 | + ``` |
| 61 | + |
| 62 | +3. 시크릿에 대한 자세한 정보를 확인한다. |
| 63 | + |
| 64 | + ```shell |
| 65 | + kubectl describe secret test-secret |
| 66 | + ``` |
| 67 | + |
| 68 | + Output: |
| 69 | + |
| 70 | + ``` |
| 71 | + Name: test-secret |
| 72 | + Namespace: default |
| 73 | + Labels: <none> |
| 74 | + Annotations: <none> |
| 75 | + |
| 76 | + Type: Opaque |
| 77 | + |
| 78 | + Data |
| 79 | + ==== |
| 80 | + password: 13 bytes |
| 81 | + username: 7 bytes |
| 82 | + ``` |
| 83 | + |
| 84 | +### kubectl로 직접 시크릿 생성하기 |
| 85 | + |
| 86 | +Base64 인코딩 단계를 건너뛰려면 `kubectl create secret` 명령을 사용하여 |
| 87 | +동일한 Secret을 생성할 수 있다. 다음은 예시이다. |
| 88 | + |
| 89 | +```shell |
| 90 | +kubectl create secret generic test-secret --from-literal='username=my-app' --from-literal='password=39528$vdg7Jb' |
| 91 | +``` |
| 92 | + |
| 93 | +이와 같이 더 편리하게 사용할 수 있다. 앞에서 설명한 자세한 접근 방식은 각 단계를 |
| 94 | +명시적으로 실행하여 현재 상황을 확인할 수 있다. |
| 95 | + |
| 96 | + |
| 97 | +## 볼륨을 통해 시크릿 데이터에 접근할 수 있는 파드 생성하기 |
| 98 | + |
| 99 | +다음은 파드를 생성하는 데 사용할 수 있는 구성 파일이다. |
| 100 | + |
| 101 | +{{< codenew file="pods/inject/secret-pod.yaml" >}} |
| 102 | + |
| 103 | +1. 파드를 생성한다. |
| 104 | + |
| 105 | + ```shell |
| 106 | + kubectl apply -f https://k8s.io/examples/pods/inject/secret-pod.yaml |
| 107 | + ``` |
| 108 | + |
| 109 | +2. 파드가 실행중인지 확인한다. |
| 110 | + |
| 111 | + ```shell |
| 112 | + kubectl get pod secret-test-pod |
| 113 | + ``` |
| 114 | + |
| 115 | + Output: |
| 116 | + ``` |
| 117 | + NAME READY STATUS RESTARTS AGE |
| 118 | + secret-test-pod 1/1 Running 0 42m |
| 119 | + ``` |
| 120 | +
|
| 121 | +3. 파드에서 실행 중인 컨테이너의 셸을 가져오자. |
| 122 | + ```shell |
| 123 | + kubectl exec -i -t secret-test-pod -- /bin/bash |
| 124 | + ``` |
| 125 | + |
| 126 | +4. 시크릿 데이터는 `/etc/secret-volume`에 마운트된 볼륨을 통해 |
| 127 | +컨테이너에 노출된다. |
| 128 | + |
| 129 | + 셸에서 `/etc/secret-volume` 디렉터리의 파일을 나열한다. |
| 130 | + ```shell |
| 131 | + # 컨테이너 내부의 셸에서 실행하자 |
| 132 | + ls /etc/secret-volume |
| 133 | + ``` |
| 134 | + 두 개의 파일과 각 파일의 시크릿 데이터 조각을 확인할 수 있다. |
| 135 | + ``` |
| 136 | + password username |
| 137 | + ``` |
| 138 | + |
| 139 | +5. 셸에서 `username` 및 `password` 파일의 내용을 출력한다. |
| 140 | + ```shell |
| 141 | + # 컨테이너 내부의 셸에서 실행하자 |
| 142 | + echo "$( cat /etc/secret-volume/username )" |
| 143 | + echo "$( cat /etc/secret-volume/password )" |
| 144 | + ``` |
| 145 | + 사용자 이름과 비밀번호가 출력된다. |
| 146 | + ``` |
| 147 | + my-app |
| 148 | + 39528$vdg7Jb |
| 149 | + ``` |
| 150 | + |
| 151 | +## 시크릿 데이터를 사용하여 컨테이너 환경 변수 정의하기 |
| 152 | + |
| 153 | +### 단일 시크릿 데이터로 컨테이너 환경 변수 정의하기 |
| 154 | + |
| 155 | +* 환경 변수를 시크릿의 키-값 쌍으로 정의한다. |
| 156 | + |
| 157 | + ```shell |
| 158 | + kubectl create secret generic backend-user --from-literal=backend-username='backend-admin' |
| 159 | + ``` |
| 160 | + |
| 161 | +* 시크릿에 정의된 `backend-username` 값을 파드 명세의 `SECRET_USERNAME` 환경 변수에 할당한다. |
| 162 | + |
| 163 | + {{< codenew file="pods/inject/pod-single-secret-env-variable.yaml" >}} |
| 164 | + |
| 165 | +* 파드를 생성한다. |
| 166 | + |
| 167 | + ```shell |
| 168 | + kubectl create -f https://k8s.io/examples/pods/inject/pod-single-secret-env-variable.yaml |
| 169 | + ``` |
| 170 | + |
| 171 | +* 셸에서 `SECRET_USERNAME` 컨테이너 환경 변수의 내용을 출력한다. |
| 172 | + |
| 173 | + ```shell |
| 174 | + kubectl exec -i -t env-single-secret -- /bin/sh -c 'echo $SECRET_USERNAME' |
| 175 | + ``` |
| 176 | + |
| 177 | + 출력은 다음과 같다. |
| 178 | + ``` |
| 179 | + backend-admin |
| 180 | + ``` |
| 181 | + |
| 182 | +### 여러 시크릿 데이터로 컨테이너 환경 변수 정의하기 |
| 183 | + |
| 184 | +* 이전 예제와 마찬가지로 시크릿을 먼저 생성한다. |
| 185 | + |
| 186 | + ```shell |
| 187 | + kubectl create secret generic backend-user --from-literal=backend-username='backend-admin' |
| 188 | + kubectl create secret generic db-user --from-literal=db-username='db-admin' |
| 189 | + ``` |
| 190 | + |
| 191 | +* 파드 명세에 환경 변수를 정의한다. |
| 192 | + |
| 193 | + {{< codenew file="pods/inject/pod-multiple-secret-env-variable.yaml" >}} |
| 194 | + |
| 195 | +* 파드를 생성한다. |
| 196 | + |
| 197 | + ```shell |
| 198 | + kubectl create -f https://k8s.io/examples/pods/inject/pod-multiple-secret-env-variable.yaml |
| 199 | + ``` |
| 200 | + |
| 201 | +* 셸에서 컨테이너 환경 변수를 출력한다. |
| 202 | + |
| 203 | + ```shell |
| 204 | + kubectl exec -i -t envvars-multiple-secrets -- /bin/sh -c 'env | grep _USERNAME' |
| 205 | + ``` |
| 206 | + 출력은 다음과 같다. |
| 207 | + ``` |
| 208 | + DB_USERNAME=db-admin |
| 209 | + BACKEND_USERNAME=backend-admin |
| 210 | + ``` |
| 211 | + |
| 212 | + |
| 213 | +## 시크릿의 모든 키-값 쌍을 컨테이너 환경 변수로 구성하기 |
| 214 | + |
| 215 | +{{< note >}} |
| 216 | +이 기능은 쿠버네티스 v1.6 이상에서 사용할 수 있다. |
| 217 | +{{< /note >}} |
| 218 | + |
| 219 | +* 여러 키-값 쌍을 포함하는 시크릿을 생성한다. |
| 220 | + |
| 221 | + ```shell |
| 222 | + kubectl create secret generic test-secret --from-literal=username='my-app' --from-literal=password='39528$vdg7Jb' |
| 223 | + ``` |
| 224 | + |
| 225 | +* envFrom을 사용하여 시크릿의 모든 데이터를 컨테이너 환경 변수로 정의한다. 시크릿의 키는 파드에서 환경 변수의 이름이 된다. |
| 226 | + |
| 227 | + {{< codenew file="pods/inject/pod-secret-envFrom.yaml" >}} |
| 228 | + |
| 229 | +* 파드를 생성한다. |
| 230 | + |
| 231 | + ```shell |
| 232 | + kubectl create -f https://k8s.io/examples/pods/inject/pod-secret-envFrom.yaml |
| 233 | + ``` |
| 234 | + |
| 235 | +* `username` 및 `password` 컨테이너 환경 변수를 셸에서 출력한다. |
| 236 | + |
| 237 | + ```shell |
| 238 | + kubectl exec -i -t envfrom-secret -- /bin/sh -c 'echo "username: $username\npassword: $password\n"' |
| 239 | + ``` |
| 240 | + |
| 241 | + 출력은 다음과 같다. |
| 242 | + ``` |
| 243 | + username: my-app |
| 244 | + password: 39528$vdg7Jb |
| 245 | + ``` |
| 246 | + |
| 247 | +### 참고 |
| 248 | + |
| 249 | +* [시크릿](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#secret-v1-core) |
| 250 | +* [볼륨](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#volume-v1-core) |
| 251 | +* [파드](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#pod-v1-core) |
| 252 | + |
| 253 | +## {{% heading "whatsnext" %}} |
| 254 | + |
| 255 | +* [시크릿](/ko/docs/concepts/configuration/secret/)에 대해 더 배워 보기. |
| 256 | +* [볼륨](/ko/docs/concepts/storage/volumes/)에 대해 더 배워 보기. |
0 commit comments