2020-05-23 12:31:56 +00:00
---
title: 프라이빗 레지스트리에서 이미지 받아오기
2020-06-01 13:09:39 +00:00
content_type: task
2020-05-23 12:31:56 +00:00
weight: 100
---
2020-06-01 13:09:39 +00:00
<!-- overview -->
2020-05-23 12:31:56 +00:00
2022-01-03 07:18:23 +00:00
이 페이지는 프라이빗 컨테이너 레지스트리나 리포지터리로부터 이미지를 받아오기 위해
2022-02-24 05:12:54 +00:00
{{< glossary_tooltip text = "시크릿(Secret)" term_id = "secret" > }}을 사용하는
파드를 생성하는 방법을 보여준다.
현재 많은 곳에서 프라이빗 레지스트리가 사용되고 있다.
여기서는 예시 레지스트리로 [Docker Hub ](https://www.docker.com/products/docker-hub )을 사용한다.
2020-05-23 12:31:56 +00:00
2022-01-03 07:18:23 +00:00
{{% thirdparty-content single="true" %}}
2020-06-01 13:09:39 +00:00
## {{% heading "prerequisites" %}}
2022-01-03 07:18:23 +00:00
* {{< include " task-tutorial-prereqs . md " > }}
2020-05-23 12:31:56 +00:00
2022-01-03 07:18:23 +00:00
* 이 실습을 수행하기 위해, `docker` 명령줄 도구와
2022-02-24 05:12:54 +00:00
[도커 ID ](https://docs.docker.com/docker-id/ ) 및 비밀번호가 필요하다.
* 다른 프라이빗 컨테이너 레지스트리를 사용하는 경우,
해당 레지스트리를 위한 명령줄 도구 및 레지스트리 로그인 정보가 필요하다.
2020-05-23 12:31:56 +00:00
2020-06-01 13:09:39 +00:00
<!-- steps -->
2020-05-23 12:31:56 +00:00
2022-01-03 07:18:23 +00:00
## 도커 허브 로그인
2020-05-23 12:31:56 +00:00
노트북에 프라이빗 이미지를 받아오기 위하여 레지스트리 인증을 필수로 수행해야 한다.
2022-01-03 07:18:23 +00:00
`docker` 도구를 사용하여 도커 허브에 로그인한다. 자세한 정보는
[도커 ID 계정 ](https://docs.docker.com/docker-id/#log-in )의 _로그 인_ 섹션을 참조한다.
2020-05-23 12:31:56 +00:00
```shell
docker login
```
2022-01-03 07:18:23 +00:00
프롬프트가 나타나면, 도커 ID를 입력한 다음, 사용하려는 자격증명(액세스 토큰,
또는 도커 ID의 비밀번호)을 입력한다.
2020-05-23 12:31:56 +00:00
2022-01-03 07:18:23 +00:00
로그인 프로세스를 수행하면 권한 토큰 정보를 가지고 있는 `config.json` 파일이 생성되거나 업데이트된다. [쿠버네티스가 이 파일을 어떻게 해석하는지 ](/ko/docs/concepts/containers/images#config-json ) 참고한다.
2020-05-23 12:31:56 +00:00
`config.json` 파일을 확인하자.
```shell
cat ~/.docker/config.json
```
하단과 유사한 결과를 확인할 수 있다.
```json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "c3R...zE2"
}
}
}
```
{{< note > }}
도커 자격 증명 저장소를 사용하는 경우, `auth` 항목이 아닌, 저장소의 이름을 값으로 사용하는 `credsStore` 항목을 확인할 수 있다.
{{< / note > }}
2022-02-24 05:12:54 +00:00
## 기존의 자격 증명을 기반으로 시크릿 생성하기 {#registry-secret-existing-credentials}
2020-05-23 12:31:56 +00:00
쿠버네티스 클러스터는 프라이빗 이미지를 받아올 때, 컨테이너 레지스트리에 인증하기 위하여
2021-06-24 09:25:11 +00:00
`kubernetes.io/dockerconfigjson` 타입의 시크릿을 사용한다.
2020-05-23 12:31:56 +00:00
2022-02-24 05:12:54 +00:00
만약 이미 `docker login` 을 수행하였다면,
이 때 생성된 자격 증명을 쿠버네티스 클러스터로 복사할 수 있다.
2020-05-23 12:31:56 +00:00
```shell
kubectl create secret generic regcred \
--from-file=.dockerconfigjson=< path / to / . docker / config . json > \
--type=kubernetes.io/dockerconfigjson
```
오브젝트에 대한 더 세밀한 제어(새로운 시크릿에 대한 네임스페이스나 레이블을 지정하는 등)가 필요할 경우,
시크릿을 사용자 정의한 후에 저장할 수도 있다.
다음을 확인하자.
- 데이터 항목의 이름을 `.dockerconfigjson` 으로 설정한다
2022-02-24 05:12:54 +00:00
- 도커 구성 파일을 base64로 인코딩하고 그 문자열을 `data[".dockerconfigjson"]`
2020-05-23 12:31:56 +00:00
필드에 자르지 않고 한 줄로 이어서 붙여넣는다
- `type` 을 `kubernetes.io/dockerconfigjson` 으로 설정한다
예:
```yaml
apiVersion: v1
kind: Secret
metadata:
name: myregistrykey
namespace: awesomeapps
data:
.dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==
type: kubernetes.io/dockerconfigjson
```
만약 `error: no objects passed to create` 메세지가 출력될 경우, base64로 인코딩된 문자열이 유효하지 않음을 의미한다.
또한 `Secret "myregistrykey" is invalid: data[.dockerconfigjson]: invalid value ...` 메세지가 출력될 경우,
base64로 인코딩된 문자열이 정상적으로 디코딩되었으나, `.docker/config.json` 파일로 파싱되지 못한 것을 의미한다.
## 커맨드 라인에서 자격 증명을 통하여 시크릿 생성하기
`regcred` 라는 이름의 시크릿을 생성하자.
```shell
kubectl create secret docker-registry regcred --docker-server=< your-registry-server > --docker-username=< your-name > --docker-password=< your-pword > --docker-email=< your-email >
```
아래의 각 항목에 대한 설명을 참고한다.
2021-02-20 18:24:39 +00:00
* `<your-registry-server>` 은 프라이빗 도커 저장소의 FQDN 주소이다.
2021-10-27 18:49:42 +00:00
도커허브(DockerHub)는 `https://index.docker.io/v1/` 를 사용한다.
2020-05-23 12:31:56 +00:00
* `<your-name>` 은 도커 사용자의 계정이다.
* `<your-pword>` 은 도커 사용자의 비밀번호이다.
* `<your-email>` 은 도커 사용자의 이메일 주소이다.
이를 통해 `regcred` 라는 시크릿으로 클러스터 내에서 도커 자격 증명을 생성했다.
{{< note > }}
커맨드 라인에서 시크릿을 입력하는 경우, 보호되지 않는 셸 히스토리에 내용이 저장될 수 있으며,
이러한 시크릿들은 `kubectl` 이 구동 중인 동안 사용자의 PC의 다른 사용자들에게
보일 수도 있다.
{{< / note > }}
## 시크릿 `regcred` 검증하기
방금 생성한 `regcred` 시크릿의 내용을 확인하기 위하여, YAML 형식으로 시크릿을 확인하자.
```shell
kubectl get secret regcred --output=yaml
```
결과는 다음과 같다.
```yaml
apiVersion: v1
kind: Secret
metadata:
...
name: regcred
...
data:
.dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
type: kubernetes.io/dockerconfigjson
```
`.dockerconfigjson` 필드의 값은 도커 자격 증명의 base64 인코딩 결과이다.
`.dockerconfigjson` 필드의 값을 확인하기 위하여, 시크릿 데이터를 읽을 수 있는
형식으로 변경한다.
```shell
kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
```
결과는 다음과 같다.
```json
{"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"c3R...zE2"}}}
```
`auth` 필드의 값을 확인하기 위하여, base64로 인코딩된 데이터를 읽을 수 있는 형식으로 변경한다.
```shell
echo "c3R...zE2" | base64 --decode
```
결과로, 사용자 이름과 비밀번호가 `:` 로 연결되어 아래와 같이 표현된다.
```none
janedoe:xxxxxxxxxxx
```
참고로 시크릿 데이터에는 사용자의 로컬에 있는 `~/.docker/config.json` 파일과 유사한 인증 토큰이 포함되어 있다.
이를 통해 `regcred` 라는 시크릿으로 클러스터 내에서 도커 자격 증명을 생성했다.
## 시크릿을 사용하는 파드 생성하기
2022-01-03 07:18:23 +00:00
다음은 `regcred` 에 있는 도커 자격 증명에 접근해야 하는 예제 파드의 매니페스트이다.
2020-05-23 12:31:56 +00:00
{{< codenew file = "pods/private-reg-pod.yaml" > }}
2022-01-03 07:18:23 +00:00
위 파일을 컴퓨터에 다운로드한다.
2020-05-23 12:31:56 +00:00
```shell
2022-01-03 07:18:23 +00:00
curl -L -O my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml
2020-05-23 12:31:56 +00:00
```
`my-private-reg-pod.yaml` 파일 안에서, `<your-private-image>` 값을 다음과 같은 프라이빗 저장소 안의 이미지 경로로 변경한다.
```none
your.private.registry.example.com/janedoe/jdoe-private:v1
```
프라이빗 저장소에서 이미지를 받아오기 위하여, 쿠버네티스에서 자격 증명이 필요하다.
2021-02-20 18:24:39 +00:00
구성 파일의 `imagePullSecrets` 필드를 통해 쿠버네티스가
`regcred` 라는 시크릿으로부터 자격 증명을 가져올 수 있다.
2020-05-23 12:31:56 +00:00
시크릿을 사용해서 파드를 생성하고, 파드가 실행되는지 확인하자.
```shell
kubectl apply -f my-private-reg-pod.yaml
kubectl get pod private-reg
```
2020-06-01 13:09:39 +00:00
## {{% heading "whatsnext" %}}
2022-01-03 07:18:23 +00:00
* [시크릿 ](/ko/docs/concepts/configuration/secret/ )에 대해 더 배워 보기
* 또는 {{< api-reference page = "config-and-storage-resources/secret-v1" > }} API 레퍼런스 읽어보기
2020-05-23 12:31:56 +00:00
* [프라이빗 레지스트리 사용 ](/ko/docs/concepts/containers/images/#프라이빗-레지스트리-사용 )에 대해 더 배워 보기.
* [서비스 어카운트에 풀 시크릿(pull secret) 추가하기 ](/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account )에 대해 더 배워 보기.
* [kubectl create secret docker-registry ](/docs/reference/generated/kubectl/kubectl-commands/#-em-secret-docker-registry-em- )에 대해 읽어보기.
2022-01-03 07:18:23 +00:00
* 파드의 [컨테이너 정의 ](/docs/reference/kubernetes-api/workload-resources/pod-v1/#containers )의 `imagePullSecrets` 필드에 대해 읽어보기