이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

22. Kubernetes Private Registry image 사용법

이쿠우우 2020. 9. 20. 08:57
반응형

 

 

Kubernetes Private Registry image 사용법

 


참고 : Docker Private Registry 관련 글

Docker Private Registry 구성하기

Docker Private Registry 암호 설정

Docker Private Registry IP가 아닌 Domain으로 접속하기
Docker login 실패 오류 해결법
docker htpasswd 명령 실패 오류


 

 

1. Secret 을 사용한 Private Registry Container image Pull

일반적으로 Container Image를 Pull할때는 대부분 공개되어 있는 Public 이미지를 사용함.

대표적으로 Docker Hub 와 같은 Site가 있음.

하지만 사설(Private) 이미지를 이용할 때는 인증 정보가 필요함.

Kubernetes 는 Docker Private Registry 에 접근 할 수 있음

사용자 정보를 Secret 으로 저장하여 사용할 수 있음

 

1.1. Docker와 kubernetes 의 Private Registry 에 접근하기 위한 방법 차이

[docker 환경에서 Private Registry 에 접근하는 방법]

docker login

 

[Kubernetes 환경에서 Private Registry 에 접근하는 방법]

docker login 명령 대신 Private Registry 의 인증 정보를 저장하는 Secret 을 생성해야함 

 

 

1.2. Docker login 성공 시 생성되는 config.json 파일을 사용해서 Secret 생성하기

 

1.2.1. 설정을 하지 않은 상태에서 docker private registry 로부터 image pull 해보기

docker private registry 에 저장되어 있는 image 확인

[참고]

server.crt 는 인증 설정된 docker private registry Server에 https로 접근하기 위한 공개키임.

private registry server에서 복사해옴.

만약 인증설정이 되어있지 않은 private registry Server의 경우는 필요없음

 

[iksoon_centos 이미지를 받아오는 deployment 예제]

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment

  labels:

    app: iksoon-tomcat

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod

  template:

    metadata:

      labels:

        app: iksoon-pod

    spec:

      containers:

      - name: iksoon-tomcat

        image: 10.0.2.5:5000/peksoon_tomcat_test # docker private registry에 저장되어있는 images

        ports:

        - containerPort: 8080

      imagePullSecrets:            # 해당 images 를 받아올때 사용할 secret ojbect 설정

      - name: iksoon-secret-test    # 이 설정을 하지 않으면 images를 받아오지 못함

상위 deployment 를 생성하면

ErrImagePull 이 발생하며 pod 가 생성이 안됨

image 를 pull 해오지 못하기 때문.

상위 설정중 imagePullSecrets 에 해당하는 secret이 없기 때문임

kubernetes 에 해당 이미지를 받아오기 위해 secret 을 생성해줘야함

 

1.2.2. docker login 전에는 config.json 파일이 존재하지 않음

[config.json 파일 찾기] 

 cd ~/.docker

 

1.2.3. docker login 해서 config.json 파일 생성

[명령어]

docker login 10.0.2.5:5000

 

[명령어 옵션 설명]

10.0.2.5:5000  = docker private registry 주소

 

[주의]

docker private registry 에서 생성한 인증서의 도메인과 일치해야함

명령 이후에 config.json 파일 확인 가능

vi ~/.docker/config.json

1.2.4. Config.json 파일을 사용해서 Kubernetes Secret 생성

 

[첫번째 방법 : create 명령으로 생성법]

kubectl create secret generic iksoon-secret-test --from-file=.dockerconfigjson=/root/.docker/config.json --type=kubernetes.io/dockerconfigjson

 

[명령어 옵션 설명]

--from-file=.dockerconfigjson=/root/.docker/config.json상위 docker login 명령으로 생성한 config.json 의 경로

 

[두번째 방법 : Yaml 형식으로 생성법]

apiVersion: v1

kind: Secret

metadata:

  name: iksoon-secret-test

data:

  #.dockerconfigjson: <base-64-encoded-json-here>

  .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxMC4wLjIuNTo1MDAwIjogewoJCQkiYXV0aCI6ICJhV3R6YjI5dU9uRjNaWEl4TWpNMCIKCQl9Cgl9Cn0=

type: kubernetes.io/dockerconfigjson

.dockerconfigjson 설정에 들어갈 내용은 아래와 같음

cat ~/.docker/config.json | base64 

 

[Secret 생성 확인]

kubectl get secret

kubectl describe secret

 

kubectl get secret iksoon-secret-test  --output=yaml

 

1.2.5. Secret 생성 후 다시 deployment 생성해보기

정상적으로 image 받아와서 pods 생성됨

 

 

1.3. ID 와 Password를 직접 입력하여 Secret 생성하는 방법도 있음

1.3.1. ID Password 입력 Kubernetes Secret 생성

[명령어]

kubectl create secret \

docker-registry [secret 이름]\

--docker-server=[사설 레지스트리 주소 (포트 포함) 도메인의 경우 도메인만 입력 ]\

--docker-username=[docker 아이디]\

--docker-password=[docker 비번]

 

[예제]

kubectl create secret docker-registry iksoon-secret-test --docker-server=10.0.2.5:5000 --docker-username=iksoon --docker-password=qwer1234

 

1.3.2. Secret 생성 확인

[명령어]

kubectl get secret

kubectl describe secret

kubectl get secret iksoon-secret-test  --output=yaml

 

[결과]

정상 동작

 

 

 


 

 

 

2. 특정 secret을 default로 imagePullSecrets에 할당시키기

 

상위 방법에서 알아본 것처럼 pod 생성 시 imagePullSecrets 옵션을 사용해야 

Private Registry에서 image를 pull 해올 수 있음.

하지만 매번 imagePullSecrets 옵션을 추가하는것도 귀찮을 수 있음

두번째 방법으로 imagePullSecrets옵션을 사용하지 않고

특정 secret을 default로 imagePullSecrets에 할당시켜서 사용하는 방법을 설명하겠음.

 

 

iksoon-secret-test는 생성되어있는 상태에서 진행함.

 

2.1. 특정 namespace에 default로 지정되어있는 secret항목을 조회함.

 

[명령어]

kubectl describe serviceaccount default -n <namespace_name>

 

[예제]

kubectl describe serviceaccount default -n default

 

[결과]

Image pull secrtes: 항목이 none으로 되어있으면 

아직 imagePullSecrets에 default secret이 할당되어있지 않은 상태.

 

2.2. namespace의 imagePullSecrets에 default secret 을 할당함.

 

[명령어]

kubectl patch -n <namespace_name> serviceaccount/default -p '{"imagePullSecrets":[{"name": "<image_pull_secret_name>"}]}'

 

[예제]

kubectl patch -n default serviceaccount/default -p '{"imagePullSecrets":[{"name": "iksoon-secret-test"}]}'

 

 

2.3. 확인

다시 namespace를 확인해보면

Image pull secrtes: 항목에 secret이 할당되어있는것을 확인할 수 있음.

이후 pod생성 시 imagePullSecrets 옵션이 없어도

Private Registry에서 image를 pull 해올 수 있음.

 

 

 

 


 

 

 

 

 

인증설정 되어있는 Private Registry에서 Domain 주소로 이미지 받아오기

 

 

Host 의 /etc/hosts에 domain을 설정해놓으면

kubernetes에서 image를 pull할때 해당 /etc/hosts 설정을 반영하는지 test함.

 

1. /etc/hosts 파일에 Domain 추가

 

모든 Node (Master, Worker)의 

/etc/hosts 파일에 Domain추가

 

[명령어]

vi /etc/hosts 

 

(설정 추가)

10.0.2.5 iksoon.docker.com

 

 

2. 전자서명 설정

 

[모든 Node에 전자서명 update.]

/etc/pki/ca-trust/source/anchors

경로에 Private Registry 접근용 공개키가 있어야함.

 

[파일 설명]

server.crt = private registry https 접근 공개치

 

[인증서 update 명령어]

update-ca-trust

 

[Docker 재기동]

service docker restart

 

 

3. Image Pull Secret 생성

 

Private Registry 주소인 iksoon.docker.com:5000에서 

image pull 받을 수 있도록 

secret 생성해야함

 

[config.json 파일 생성]

docker login iksoon.docker.com:5000

로그인 성공 후 

cat ~/.docker/config.json 확인

 

[secret 생성]

cat ~/.docker/config.json | base64

명령으로 나온 결과로 secret 생성

 

[ 참고 secret.yaml ]

apiVersion: v1

kind: Secret

metadata:

  name: iksoon-secret-test

data:

  .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxMC4wLjIuNTo1MDAwIjogewoJCQkiYXV0aCI6ICJhV3R6YjI5dU9uRjNaWEl4TWpNMCIKCQl9LAoJCSJpa3Nvb24uZG9ja2VyLmNvbTo1MDAwIjogewoJCQkiYXV0aCI6ICJhV3R6YjI5dU9uRjNaWEl4TWpNMCIKCQl9Cgl9Cn0=

type: kubernetes.io/dockerconfigjson

 

4. Domain으로 Private Registry Image Pull 

[참고 deployment.yaml]

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment

  labels:

    app: iksoon-tomcat

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod

  template:

    metadata:

      labels:

        app: iksoon-pod

    spec:

      containers:

      - name: iksoon-tomcat

        image: iksoon.docker.com:5000/domain_iksoon_tomcat:1.0.0

        ports:

        - containerPort: 8080

      imagePullSecrets:

      - name: iksoon-secret-test

결과 : 성공

 

 


 

설정 완료 후 /etc/hosts파일 변경하면서 Test

 

각 Node의 /etc/hosts 파일 변경

 

docker image 는 삭제하고 진행함

 

[Master Node의 domain 제거 후 image pull 결과]

정상 Runngin

 

[Worker, Master Node의 domain 제거 후 image pull 결과]

ErrImagePull

 

[ Test결과 ]

각 Worker Node 의 /etc/hosts 파일에 영향을 받음

 

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

 

 

 

참고

https://kubernetes.io/docs/concepts/configuration/secret/

https://kubernetes.io/ko/docs/tasks/configure-pod-container/pull-image-private-registry/

https://cloud.ibm.com/docs/containers?topic=containers-registry#use_imagePullSecret

 

 

 

 

 

 

반응형

'클라우드 > Kubernetes' 카테고리의 다른 글

24. Security Context  (0) 2020.09.20
23. Privileged Container  (0) 2020.09.20
21. Helm  (0) 2020.09.07
20. Kubernetes 인증 ( Proxy )  (0) 2020.08.29
19. Kubernetes 인증 (Webhook 외부 인증 LDAP)  (0) 2020.08.29