본문 바로가기
Web/Infra

직접 쿠버네티스 클러스터를 구성해보자 With NCP

by EricJeong 2021. 11. 17.

쿠버네티스 기반 서비스를 구성하기 위해서 AWS, GCP, NCP 등의 플랫폼을 사용할 때에는 두 가지 선택지가 있습니다. 

 

1. 클라우드에서 제공해주는 쿠버네티스 서비스 이용하기

2. 직접 머신을 발급받아 쿠버네티스 구성하기

 

대부분의 상황에서는 클라우드 서비스에서 구성해주는 쿠버네티스 서비스를 이용하는 편이 손쉽고 간편하게 관리받을 수 있습니다. 하지만 쿠버네티스를 학습하고 있고, 어떻게 클러스터를 구성해야 할지 직접 핸즈온을 해보고 싶다면 2번 방법을 통해 간접적으로 간단하게 쿠버네티스 클러스터를 구성해볼 수 있습니다. 

 

 

방화벽 포트 열기

쿠버네티스 설치를 위해서는 필수로 열려있어야 하는 포트가 있습니다.

 

공통

TCP 22번 포트를 열어주셔야 합니다. [SSH를 하기 위함]

마스터 노드

TCP Inbound 6443 Kubernetes API server All
TCP Inbound 2379-2380 etcd server client API kube-apiserver, etcd
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 10259 kube-scheduler Self
TCP Inbound 10257 kube-controller-manager Self

워커 노드

TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 30000-32767 NodePort Services† All

 

 

위 정보를 ACG 설정에서 설정해주어야 합니다. 

 

 

노드 두 개 발급받기

쿠버네티스 클러스터는 클러스터를 관리하는 마스터 노드와 실제로 어플리케이션이 동작하는 워커 노드가 있습니다. 각각 여러개를 동작하게 만들 수도 있고 마스터와 워커노드 각 하나씩 동작하도록 만들수도 있습니다. 

 

마스터와 워커노드 각 하나씩으로 동작하는 클러스터를 구성하기 위해서는 우선 기본 리눅스 머신을 발급받아야 합니다. NCP 콘솔에서 Server > 서버 생성으로 가신 후 Ubuntu 16.04 버전을 선택합니다. 그 후 적절히 CPU와 메모리 등을 선택해주시고 생성해주시면 됩니다. 서버 접속은 인증키를 이용하여 가능하기 때문에 인증키가 없으신 분들은 서버 생성 시 같이 생성해두시고, 소중히 보관해주시면 됩니다. 키 분실 시 서버 접속이 불가능해집니다!

 

서버 발급 이후에는 접속을 위해 포트 포워딩 설정을 진행해야 합니다. 서버 우클릭 > 포트 포워딩 설정으로 들어가면 되며, 포트는 아무 포트나 입력해주세요! 저는 각각 2222, 2223번 포트를 할당해주었습니다.

 

머신을 발급받으셨다면 XShell 등을 이용하여 접속해주세요. 아래 그림처럼 두 머신에 모두 연결해두고 작업하시면 왔다 갔다 하면서 작업할 때 편리하게 작업할 수 있습니다.

 

설정을 마치셨다면 서버 우클릭 > 관리자 비밀번호 확인을 통해 root계정의 비밀번호를 조회한 후 서버에 접속해주세요.

어떤 노드를 마스터로 두고 워커로 지정할지는 자유롭게 마음속으로 미리 결정해주세요.

마스터 / 워커 노드 공통

도커 설치

컨테이너 런타임을 설치해야 쿠버네티스 구성이 가능합니다. 컨테이너 런타임은 여러 종류가 있지만 그 중 가장 널리 쓰이는게 바로 도커입니다. 마스터와 워커노드 모두 도커를 설치해야 합니다. 도커 설치는 여기를 참고해주세요.

 

참고로, NCP는 sudo 명령어를 사용하면 에러가 발생합니다. sudo 없이 명령어를 사용해주세요! (루트 계정으로 로그인되어있음)

 

 

 

Install Docker Engine on Ubuntu

 

docs.docker.com

 

apt-get update

apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io

 

docker 드라이버 교체

cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload
systemctl restart docker

 

Kubeadm, Kubelet, Kubectl 설치

쿠버네티스 클러스터를 구성할 때 가장 코어가 되는 3가지 툴을 설치해야 합니다. 간단하게 3가지 툴의 사용처를 알아보자면, 아래와 같습니다.

kubeadm은 클러스터를 구성하고, 업데이트할 때 사용
kubelet은 작업이 생겼을 때 실제로 머신에서 작업을 진행하는 머신마다 하나씩 있는 작업 관리자 역할
kubectl은 쿠버네티스 클러스터에 명령을 내리기위해 사용하는 CLI

 

apt-get update
apt-get install -y apt-transport-https ca-certificates curl
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

systemctl enable kubelet

 

스왑 메모리 비활성화

kubelet은 스왑 메모리를 사용하도록 설정할 시 에러가 발생할 수 있습니다. 그래서 마스터/워커노드 모두 스왑메모리를 사용하지 않도록 설정해야 합니다.

 

# 아래 명령어를 모두 실행해야 합니다.
# 현재 스왑메모리 비활성화
swapoff -a

# 영구적으로 비활성화
sed -i '2s/^/#/' /etc/fstab

 

마스터/워커 노드에서 공통적으로 진행할 작업은 여기까지입니다.

 

마스터 노드 세팅

쿠버네티스 클러스터를 구성해봅시다.

kubeadm config images pull
kubeadm init

 

결과로 아래 내용이 콘솔에 출력됩니다.

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.41.82.130:6443 --token 48u8a5.w5auxkwgbxgl3jj5 \
	--discovery-token-ca-cert-hash sha256:4d3bf6f22cdb64474342878435c89948b5d4d128576320a40c9b15628049de22

위 명령어를 입력하면 워커 노드를 클러스터로 참여시키기 위하 명령어가 출력됩니다. 잘 보관해둡시다. 워커 노드에서는 아래쪽 두줄의 명령어만 입력해도 바로 조인이 가능합니다.

 

kubeadm으로 클러스터 구성을 완료하셨다면, kubectl 설정을 진행해주시면 됩니다.

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

 

이후 파드 끼리의 통신을 위해 네트워크 플러그인을 설치해주세요.  아래 중 하나를 자유롭게 선택해서 설치해주시면 됩니다.

 

선택지 1번, Weave

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

선택지 2번, Flannel

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

선택지 3번, Calico

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

워커 노드 세팅

마스터 노드에서 kubeadm init을 할 때 출력된 문구를 입력하기만 하면 됩니다.

kubeadm join 10.41.82.130:6443 --token 48u8a5.w5auxkwgbxgl3jj5 \
	--discovery-token-ca-cert-hash sha256:4d3bf6f22cdb64474342878435c89948b5d4d128576320a40c9b15628049de22

 

모두 완료되었다면 kubectl get node 명령어로 모든 노드가 준비되었는지 확인해주세요.

 

여기까지 완료하셨다면, 쿠버네티스 클러스터 구성이 완료되었습니다 :)

댓글