안녕하세요. ManVSCloud 김수현입니다.
DKOS(Docker Kubernetes Online Study) 2주차 과정을 마쳤습니다.

가상 머신, 물리 서버, AWS, Azure 환경에서 k8s 클러스터를 배포하는 것을 스터디하였지만 Naver Cloud Platform에서 k8s 클러스터를 배포하는 방법은 따로 스터디 하지 않아 이에 대해 공유하고자 오늘은 네이버 클라우드에서 k8s 클러스터 배포와 사용에 대해 알아보도록 하겠습니다.
Classic

2021년 03월 04일까지만 사용할 수 있었고 현재는 사용 불가능하므로 저는 VPC 환경에서 Kubernetes Service 사용법에 대해 써보도록 하겠습니다.
VPC – VPC & Subnet 생성

우선 Naver Cloud Platform에서 VPC 환경을 사용하시려면 VPC 생성하여 서브넷 구성을 해주셔야합니다. 기존 AWS나 Azure와 같은 퍼블릭 클라우드 사용 경험이 많으시다면 이를 구성하는데에 큰 어려움이 없으실 것이라 생각합니다.

저는 위 이미지와 같이 생성해주었습니다.
오늘 포스팅에서는 LB까지는 사용하지 않지만 Naver Cloud 에서 k8s 클러스터 배포 시 가장 기본이 되는 서브넷 구성이라고 볼 수 있겠습니다.
VPC – Server

우선 서버를 생성해줍니다.
해당 서버 내에서 이후 생성할 각 클러스터들을 컨트롤 해줄 것입니다.
OS는 CentOS나 Ubuntu 아무것이나 괜찮습니다.

해당 서버의 패스워드 확인 후 서버로 접속해줍니다.
이후 아래 명령어를 이용하여 kubectl과 docker를 설치해줍시다.
[root@kubernetes-server-kr2 ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF
가끔 gpgkey 부분을 엔터쳐서 다음 줄로 내려버리시는 경우가 있는데 정상 설치가 안되니 아래 이미지와 같이 되게 해주세요.

[root@kubernetes-server-kr2 ~]# yum install -y kubectl //yum-utils device-mapper-persistent-data lvm2는 이미 설치가 되어있어서 따로 설치해줄 필요가 없었습니다. [root@kubernetes-server-kr2 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo [root@kubernetes-server-kr2 ~]# yum install -y docker-ce [root@kubernetes-server-kr2 ~]# systemctl enable --now docker
VPC – NKS Cluster

이제 Kubernetes Service를 생성해줄 것입니다.

NKS 클러스터는 현재 1.17과 1.18 버전을 지원하고 있습니다.
또한 Pod Security Policy, Audit Log는 클러스터 생성 후에도 수정할 수 있으니 이후에 설정하셔도 됩니다.

생성 중에 NAT Gateway를 생성하라는 메시지가 발생합니다.
이는 왜 NAT Gateway를 생성해야하는지에 대해 아래 내용에서 보여드리기위해 따로 NAT Gateway를 먼저 설정해두지 않았습니다.
일단 넘어갑시다.

원하시는 서버 스펙과 노드 수를 정해준 뒤 추가해주면 클러스터가 생성됩니다.
해당 클러스터 생성에는 다소 시간이 소요됩니다.
VPC – Practice
이제 생성한 Server와 각 k8s 클러스터들을 이용하여 실습을 해보도록 하겠습니다.
우선 Server에서 생성한 k8s 클러스터를 컨트롤하기 위해서는 kubernetes service에서 생성한 클러스터들을 설정파일을 다운로드 해야합니다.

위 이미지와 같이 해당 설정파일을 다운로드 한 뒤에 Server로 넣어줍시다.
간단하게 마우스 이동으로 파일을 옮기시려면 lrzsz 를 설치하여 PC와 서버 간에 간단하게 파일을 업로드, 다운로드를 하실 수 있습니다.
yum install lrzsz
설정파일이 Server에 있는데 이는 아래와 같이 사용할 수 있습니다.
kubectl –kubeconfig=/root/kubeconfig-d1f34144-76a5-46fa-a55c-7186946b8acc.yaml get nodes
원래 kubectl get nodes인데 config 파일을 이용하여 클러스터 접근 구성을 하게 되는 것입니다.
하지만 매번 명령어 입력마다 이렇게 사용할 수는 없으니 alias 설정을 해준다면 더욱 편리하게 사용할 수 있습니다.
[root@kubernetes-server-kr2 ~]# ll total 8 -rw-r--r-- 1 root root 5538 Jun 17 02:19 kubeconfig-d1f34144-76a5-46fa-a55c-7186946b8acc.yaml [root@kubernetes-server-kr2 ~]# kubectl --kubeconfig=/root/kubeconfig-d1f34144-76a5-46fa-a55c-7186946b8acc.yaml get nodes NAME STATUS ROLES AGE VERSION nks-pool-1003-w-eoi Ready <none> 9m23s v1.18.17 nks-pool-1003-w-eoj Ready <none> 9m22s v1.18.17 [root@kubernetes-server-kr2 ~]# cat << EOF >> .bash_profile > alias kubectl='kubectl --kubeconfig="/root/kubeconfig-d1f34144-76a5-46fa-a55c-7186946b8acc.yaml"' > EOF [root@kubernetes-server-kr2 ~]# source .bash_profile

위 이미지는 docker hub입니다.
이전에 업로드 해둔 manvscloud_dkos 파일을 배포해보겠습니다.
[root@kubernetes-server-kr2 ~]# kubectl run manvscloud --image seevirus/manvscloud_dkos:1 pod/manvscloud created [root@kubernetes-server-kr2 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE manvscloud 0/1 ContainerCreating 0 13s [root@kubernetes-server-kr2 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE manvscloud 0/1 ErrImagePull 0 22s
ErrImagePull 메시지가 발생했습니다.
왜 도커 이미지를 Pull 해오지 못한걸까요?
원인은 바로 위에서 NAT Gateway를 설정해주지 않았기때문입니다.
위에서 클러스터 생성 시 “아웃바운드 인터넷 트래픽을 활성화하기 위해서는
NAT Gateway를 반드시 생성해야한다”라고 알려주는 메시지는 바로 NAT Gateway 설정을 해주지 않게되면 아웃바운드 인터넷 트래픽 통신이 전혀 되지 않기때문이죠.

바로 NAT Gateway를 생성해줍시다.
생성한 NAT Gateway는 Private Route Table에 연결해주어야합니다.

위 이미지와 같이 NAT Gateway를 연결해주고 다시 Server로 돌아와서 확인해보도록 합시다.
[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 30m [root@kubernetes-server-kr2 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES manvscloud 1/1 Running 0 17m 198.18.0.169 nks-pool-1003-w-eoj <none> <none>
ErrImagePull이었던 상태가 Running 상태로 변경되어있습니다.
정상적으로 배포가 되었군요.
[root@kubernetes-server-kr2 ~]# kubectl get all --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE default pod/manvscloud 1/1 Running 0 17m kube-system pod/cilium-jv5gz 1/1 Running 0 30m kube-system pod/cilium-monitor-jp82w 1/1 Running 0 27m kube-system pod/cilium-monitor-nbvgm 1/1 Running 0 27m kube-system pod/cilium-operator-78f6b5db7c-77gqn 1/1 Running 0 30m kube-system pod/cilium-operator-78f6b5db7c-pjthh 1/1 Running 0 30m kube-system pod/cilium-z6gbh 1/1 Running 0 30m kube-system pod/coredns-7895d49695-7cjhm 1/1 Running 0 29m kube-system pod/coredns-7895d49695-csj5w 1/1 Running 0 29m kube-system pod/csi-nks-controller-0 6/6 Running 1 28m kube-system pod/csi-nks-node-jtg5t 3/3 Running 1 28m kube-system pod/csi-nks-node-w2cjd 3/3 Running 1 28m kube-system pod/dns-autoscaler-56bf5c7f58-cz2jr 1/1 Running 0 29m kube-system pod/kube-proxy-6xmdd 1/1 Running 0 30m kube-system pod/kube-proxy-qq27q 1/1 Running 0 30m kube-system pod/ncloud-kubernetes-f5lxr 1/1 Running 0 49s kube-system pod/ncloud-kubernetes-kgt9p 1/1 Running 0 49s kube-system pod/nodelocaldns-mkzqz 1/1 Running 0 29m kube-system pod/nodelocaldns-mvc7f 1/1 Running 0 29m kube-system pod/snapshot-controller-0 1/1 Running 0 28m kube-system pod/startup-script-jtknz 1/1 Running 0 27m kube-system pod/startup-script-zlg28 1/1 Running 0 27m NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default service/kubernetes ClusterIP 198.19.128.1 <none> 443/TCP 31m kube-system service/coredns ClusterIP 198.19.128.3 <none> 53/UDP,53/TCP,9153/TCP 29m kube-system service/metrics-server ClusterIP 198.19.128.124 <none> 443/TCP 28m NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE kube-system daemonset.apps/cilium 2 2 2 2 2 <none> 30m kube-system daemonset.apps/cilium-monitor 2 2 2 2 2 <none> 27m kube-system daemonset.apps/csi-nks-node 2 2 2 2 2 <none> 28m kube-system daemonset.apps/kube-proxy 2 2 2 2 2 kubernetes.io/os=linux 31m kube-system daemonset.apps/ncloud-kubernetes 2 2 2 2 2 <none> 27m kube-system daemonset.apps/nodelocaldns 2 2 2 2 2 <none> 29m kube-system daemonset.apps/startup-script 2 2 2 2 2 <none> 27m NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE kube-system deployment.apps/cilium-operator 2/2 2 2 30m kube-system deployment.apps/coredns 2/2 2 2 29m kube-system deployment.apps/dns-autoscaler 1/1 1 1 29m NAMESPACE NAME DESIRED CURRENT READY AGE kube-system replicaset.apps/cilium-operator-78f6b5db7c 2 2 2 30m kube-system replicaset.apps/coredns-7895d49695 2 2 2 29m kube-system replicaset.apps/dns-autoscaler-56bf5c7f58 1 1 1 29m NAMESPACE NAME READY AGE kube-system statefulset.apps/csi-nks-controller 1/1 28m kube-system statefulset.apps/snapshot-controller 1/1 28m
오늘은 NKS 생성과 사용법에 대해 간단하게 알아보았습니다.
NKS를 잘 사용하기 위해서는 Container Registry를 이용해서 컨테이너 이미지를 관리한다거나 Cloud Insight 서비스를 신청해서 모니터링 하기 등이 있습니다.
이는 DKOS 스터디가 진행하며 조금씩 제 블로그에 포스팅할 예정입니다.
Personal Comments
오늘은 네이버 클라우드에서 쿠버네티스 배포에 대해서만 간단하게 포스팅해보았습니다.
쿠버네티스 서비스를 사용하시기 전 VPC에 익숙하지 않으시다면 네이버 클라우드에서 교육하고 있는 Hands-on Lab을 신청하여 들어보시는 것을 권장드립니다.
네이버 클라우드는 한국어로 된 교육과 서비스로 쉽게 배우고 사용할 수 있다는 점이 큰 장점이라고 생각합니다.

■ 일정 : 2021년 7월 14일(수) 10:00~17:00
cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification
추가로 요즘 회사와 주말 일정으로 포스팅되는 날짜가 일정하진 않지만 한 주에 최소 포스팅 2개를 목표로 꾸준히 작성중이니 참고 부탁드립니다.
긴 글 읽어주셔서 감사합니다.