NCP

[NCP] Container Registry에서 이미지를 가져오기 & 로드밸런서 연결

안녕하세요. ManVSCloud 김수현입니다.

오늘은 Naver Cloud Platform에서 Container Registry에서 이미지를 가져오는 방법과 Load Balancer에 연결하는 방법을 알아보도록 하겠습니다.


CONTAINER REGISTRY에서 이미지를 가져오기

아직 Container Registry를 생성해본 적이 없으시다면 위 [NAVER CLOUD KUBERNETES – CONTAINER REGISTRY로 컨테이너 이미지를 관리]를 먼저 보고 오시기 바랍니다.

위 포스팅에서는 push를 해보았습니다. 오늘은 pull을 해볼 시간입니다.

우선 테스트용으로 하고 계시다면 이전에 했던 docker image를 전부 지우고 한 번 해보도록합시다.

[root@kubernetes-server-kr2 ~]# docker rm `docker ps -a -q`
[root@kubernetes-server-kr2 ~]# docker rmi -f `docker images -q`

docker login을 해줍시다.

[root@kubernetes-server-kr2 ~]# docker login <CONTAINER REGISTRY에 나와있는 엔드포인트>
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

docker pull 엔드포인트/이미지:버전 명령어로 docker 이미지를 가져올 수 있습니다.

[root@kubernetes-server-kr2 ~]# docker pull manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0
1.0: Pulling from manvscloud-apache
2d473b07cdd5: Pull complete 
444a3233aeea: Pull complete 
Digest: sha256:b2e60515712f6c5d4f155e9d234299fa82640d8dc7766405fe997c1b80658c07
Status: Downloaded newer image for manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0
manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0

또한 k8s에서 secret을 이용한다면 패스워드, OAuth 토큰, ssh 키와 같은 정보를 저장 및 관리할 수 있는데 이를 이용하여 pod를 생성해보도록 합시다.

[root@kubernetes-server-kr2 ~]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-p5mq2   kubernetes.io/service-account-token   3      11d

kubectl create secret docker-registry “secret 이름” –docker-server=레지스트리-엔드포인트 –docker-username=Access-Key-ID –docker-password=Secret-Key –docker-email=계정으로 아래와 같이 secret을 만들 수 있습니다.

[root@kubernetes-server-kr2 ~]# kubectl create secret docker-registry manvscloud-sec --docker-server=레지스트리-엔드포인트 --docker-username=Access-Key-ID --docker-password=Secret-Key --docker-email=계정

[root@kubernetes-server-kr2 ~]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-p5mq2   kubernetes.io/service-account-token   3      11d
manvscloud-sec        kubernetes.io/dockerconfigjson        1      19s

이제 yaml 파일을 생성하여 위에서 생성한 secret을 이용하여 이미지를 pull 및 pod 생성을 해봅시다.

vi apache.yaml

apiVersion: v1
kind: Pod
metadata:
 name: manvscloud-apache
 namespace: default
spec:
 containers:
 - name: manvscloud-apache
   image: manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0
 imagePullSecrets:
 - name: manvscloud-sec
[root@kubernetes-server-kr2 ~]# kubectl create -f apache.yaml 
pod/manvscloud-apache created

[root@kubernetes-server-kr2 ~]# kubectl get pods
NAME                                 READY   STATUS    RESTARTS   AGE
manvscloud-apache                    1/1     Running   0          4s

CONTAINER REGISTRY에 있는 이미지를 잘 가져와 pod가 생성되었습니다.
이렇게 CONTAINER REGISTRY를 이용하여 이미지 배포 관리가 쉽게 가능합시다.

또한 CONTAINER REGISTRY에서 Configuration을 클릭하여 Public Endpoint를 활성화/비활성화 선택이 가능합니다. 네이버 클라우드 내부에서만 사용할 것이라면 비활성화 하는 것이 좋습니다.


로드밸런서 연결

네이버 클라우드 Kubernetes Service를 사용중이라면 서비스 생성 시에 type을 LoadBalancer로 지정할 경우 네이버 클라우드 콘솔 내에 로드밸런서 인스턴스가 자동으로 생성됩니다.

로드밸런서 설정의 경우 어노테이션으로 설정할 수 있습니다.

"metadata": {
  "annotations": {
    "key1" : "value1",
    "key2" : "value2"
  }
}
https://guide.ncloud-docs.com/docs/nks-nks-1-8

실습을 통해 직접 로드밸런서를 생성해봅시다.
이번 실습에서는 어노테이션을 이용하여 추가적인 설정은 하지 않았습니다.
간단하게 로드밸런서 연결만 따라할 수 있도록 해두었습니다.

vi manvscloud-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 name: apache-deployment
spec:
 replicas: 3
 selector:
   matchLabels:
     app: apache
 template:
   metadata:
     labels:
       app: apache
   spec:
     containers:
     - name: apache
       image: manvscloud-k8s-cr.kr.ncr.ntruss.com/manvscloud-apache:1.0
       ports:
       - containerPort: 80
     imagePullSecrets:
     - name: manvscloud-sec

아래와 같이 kubectl get pods –show-labels 했을 때 LABELS이 붙어있을 것입니다.
replicas, label 등은 따로 쿠버네티스에 대한 공부가 필요하니 이러한 설정에 이해가 어려우신 분들은 우선 kubernetes에 대한 공부를 우선적으로 간단하게나마 하시는 것을 권장드립니다.

[root@kubernetes-server-kr2 ~]# kubectl get pods --show-labels
NAME                                 READY   STATUS    RESTARTS   AGE   LABELS
apache-deployment-75895cbcbb-6dlvz   1/1     Running   0          14s   app=apache,pod-template-hash=75895cbcbb
apache-deployment-75895cbcbb-l7q4d   1/1     Running   0          14s   app=apache,pod-template-hash=75895cbcbb
apache-deployment-75895cbcbb-vcvpq   1/1     Running   0          14s   app=apache,pod-template-hash=75895cbcbb

[root@kubernetes-server-kr2 ~]# for pod in $(kubectl get pod -l app=apache |awk 'NR>1 {print $1}'); do kubectl exec $pod -- /bin/sh -c "hostname > /var/www/html/index.html; echo '안녕하세요. ManVSCloud입니다.' >> /var/www/html/index.html"; done

각 pod 내 index.html 파일을 수정해주었습니다.
로드밸런서를 연결하여 접속하기 위해 LoadBalancer를 생성해봅시다.

아래와 같이 Serivces yaml을 생성합니다.

vi lb.yaml

kind: Service
apiVersion: v1
metadata:
 name: lb-service
spec:
 ports:
   - port: 80
     targetPort: 80
 selector:
   app: apache
 type: LoadBalancer
[root@kubernetes-server-kr2 ~]# kubectl create -f lb.yaml 
service/lb-service created

kubectl get services 명령어로 확인해보면 EXTERNAL-IP가 NCP 내 LB로 되어있는 것을 확인할 수 있습니다.

[root@kubernetes-server-kr2 ~]# kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP                                                        PORT(S)        AGE
kubernetes   ClusterIP      198.19.128.1    <none>                                                             443/TCP        11d
lb-service   LoadBalancer   198.19.208.51   default-lb-service-821a9-7191539-4b535e410da7.kr.lb.naverncp.com   80:31033/TCP   5m33s

콘솔을 보면 따로 Load Balancer를 생성해주지 않았는데 따로 콘솔상에서 생성되어 있는 것을 확인할 수 있습니다. 삭제도 마찬가지입니다.
kubectl delete svc lb-service를 해주면 콘솔상에서도 자동 제거가 됩니다.

생성된 LB의 접속 정보를 이용하여 웹에서 접속해보면 위에서 추가해준 index.html의 값이 나오고 있습니다.

로드밸런싱 알고리즘은 기본값인 Round Robin으로 설정되어 있으며 Least Connection과 Source IP Hash로도 변경이 가능합니다.


Personal Comments

오늘은 CONTAINER REGISTRY에서 이미지를 가져오는 방법과 로드밸런싱 연동 방법을 알아보았습니다.

참고로 실습 과정을 따라해보실 경우 .yaml 파일을 그대로 복사하지 마시고 엔드포인트를 잘 수정하여 사용하시기 바랍니다.

긴 글 읽어주셔서 감사합니다.

함께 보며 공부하기 좋은 자료

Previous Post Next Post

You Might Also Like

No Comments

Leave a Reply