[k8s] 2. 쿠버네티스 설치, 클러스터 구성하기

쿠버네티스 설치, 클러스터 구성하기

클러스터는 쿠버네티스에서 관리하는 컨테이너화된 애플리케이션을 실행하는 '노드'라고 하는 기계의 집합이다. 클러스터는 최소 1개의 마스터 노드와 최소 1개의 워커 노드를 가진다.

워커 노드는 애플리케이션의 구성요소인 파드(Pod)를 호스트한다. 마스터 노드는 워커 노드와 클러스터 내 파드를 관리한다. 다수의 마스터 노드는 failover(장애극복)과 고가용성의 클러스터에서 사용한다.

클러스터를 구성하기 전에 몇가지 컴포넌트의 개념을 알아보자.


마스터 컴포넌트

kube-apiserver

API 서버는 쿠버네티스의 API를 노출하는 쿠버네티스 컨트롤 플레인 컴포넌트이다. API 서버의 주요 구현은 kube-apiserver이다. 즉, 더 많은 인스턴스를 배포해서 확장할 수 있다. 여러 kube-apiserver 인스턴스를 실행하고, 인스턴스간의 트래픽을 균형있게 조절할 수 있다.

etcd

모든 클러스터 데이터를 담는 쿠버네티스 뒷단의 저장소로 사용되는 일관성, 고가용성 키-값(Key-Value) 저장소이다.

kube-scheduler

노드가 배정되지 않은 새로 생성된 파드를 감지하고 그 파드가 구동될 노드를 선택하는 마스터 상의 컴포넌트이다. 스케줄링 결정을 위해 고려되는 요소는 리소스에 대한 개별 및 총체적 요구 사항, 하드웨어/소프트웨어/정책적 제약 등의 모든 사항이 포함되어 있다.

kube-controller-manager

컨트롤러를 구동하는 마스터 상의 컴포넌트이다. 논리적으로 각 컨트롤러는 개별 프로세스이지만, 복잡성을 갖추기 위해 모두 단일 바이너리로 컴파일되고 단일 프로세스 내에서 실행된다. 컨트롤러에는 노드 컨트롤러, 레플리케이션 컨트롤러, 엔드포인트 컨트롤러, 서비스 어카운트 & 토큰 컨트롤러가 있다.



노드 컴포넌트

kubelet

클러스터의 각 노드에서 실행되는 에이전트이다. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리한다. 다양한 메커니즘을 통해 제공된 파드 스펙(PodSpec)의 집합을 받아서 해당 파드 스펙에 따라 건강하게 동작하는 것을 확실히 한다. Kubelet은 쿠버네티스를 통해 생성되지 않는 컨테이너는 관리하지 않는다.

kube-proxy

클러스터의 각 노드에서 실행되는 네트워크 프록시로, 쿠버네티스 서비스 개념의 구현부이다. kube-proxy는 노드의 네트워크 규칙을 유지, 관리한다. 이 네트워크 규칙이 내부 네트워크 세션에서 바깥으로 네트워크 통신을 할 수 있도록 해준다.




이제 쿠버네티스를 설치하고 클러스터를 구성해보자. 필자의 환경은 Ubuntu 18.04이다. os에 따라 설치법이 다를 수 있으나 쿠버네티스 설치 후의 kubectl 명령은 동일하니 centOS 등의 운영체제를 사용한다면 구글링을 통해 충분히 해결할 수 있을 것이다.

docker 설치

컨테이너 기반의 툴이기 때문에 도커 설치가 필요하다.

sudo wget -qO- https://get.docker.com/ | sh
cs

이 명령어는 리눅스 배포판을 알아서 인식해서 도커를 설치한다. wget 명령어가 사용되지 않는다면 sudo apt-get install wget 명령을 사용해서 wget 패키지를 설치한 후 진행하자.

포트 설정

아래 표의 포트들은 쿠버네티스가 사용하는 포트임으로 비워두자. 클라우드를 사용한다면 포트 보안 정책의 수정이 필요하다. 필자는 NHN Toast Cloud을 사용중이므로 보안 정책을 Master, Worker 포트에 맞게 각각 설정해놓았다.



쿠버네티스 설치(kubeadm, kubelet, kubectl)

클러스터 구성을 위해 필요한 kubeadm, kubelet, kubectl을 설치한다.

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
cs

쿠버네티스 구동 시 swap을 사용할 수 없다. 따라서 swap을 꺼준다.

swapoff -a
cs


클러스터 구성 - Master


kubeadm init --pod-network-cidr=10.244.0.0/16
cs

네트워크 옵션은 pod network 구성을 위한 옵션이다. 어떤 구성을 할지에 따라 옵션이 달라지는데 공식 홈페이지(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network)를 확인하자. 이번에는 Flannel을 사용할 것이다.

다시 init하고 싶다면 kubeadm reset 을 통해 리셋할 수 있다.

성공적으로 init이 되었다면 출력 결과의 마지막 줄에 kubeadm join ~ 부분을 어딘가에 잘 복사해놓자. 워커 노드를 마스터 노드에 연결하기 위한 명령이고, 24시간동안 유효하다.

그 윗줄을 잘 보면 CONFIG 파일을 특정 경로에 복사해두라는 말과 세줄의 명령어를 출력하는데 이는 앞으로 kubectl을 통해 명령을 내릴 때 어느 클러스터에 명령을 내릴 지 드으이 설정이 저장된 파일이다. 세 줄의 명령을 실행한다.

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

이제 pod network 설정이다.

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

Master 노드의 구성은 완료되었다. 진행 사항이 궁금하다면 kubectl get pods --all-namespaces 명령어를 입력하면 생성중인 컨테이너들을 볼 수 있다.


클러스터 구성 - Worker


워커 노드에서도 위에서의 docker, kubeadm, kubelet, kubectl을 설치한다. 위에 서술한 포트 정책 변경도 잊지 말자. 필자는 2개의 워커 노드를 구성했다. (1 마스터노드 - 2 워커노드) 복수의 워커노드를 사용하더라도 똑같이 docker, kubeadm, kubelet, kubectl을 설치하면 된다.

이제 워커노드에서 master를 init하고 나서 잘 복사해뒀던 명령어 (kubeadm join~)를 입력한다.

kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
#예시 코드이므로 마스터에서 복사해두었던 코드 사용하기!
cs

token의 유효기간은 24시간이고 혹시 위 명령어를 잃어버렸거나 유효기간이 지난 것 같으면 kubeadm token create --print-join-command 명령어를 master 노드에서 입력하면 된다.

마스터 노드에서 get 명령을 입력하여 join이 잘 되었는지 확인해보자.

kubectl get no
#kubectl get nodes와 
cs


댓글 없음:

Powered by Blogger.