Kubernetes Private Registry image 사용법
참고 : 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 > Kubernetes 이론' 카테고리의 다른 글
Security Context (0) | 2020.09.20 |
---|---|
Privileged Container (0) | 2020.09.20 |
Helm (0) | 2020.09.07 |
Kubernetes Update (2) | 2020.08.23 |
Kubernetes Secret (0) | 2020.08.17 |