PaaS/Kubernetes

(Kubernetes) Controlplane HA 구성

armyost 2021. 8. 27. 18:02
728x90

개요

Kubernetes HA(고가용성)는 아래 두 가지를 충족해야 한다.

1. KubeAPI가 계속 살아 있을 것

2. 신뢰할 수 있는 Etcd가 존재할 것

 

1번은 DNS와 로드벨런싱이면 kubeadm 단계에서 달성 가능하나,

2번은 Controlplane의 갯수가 중요한 부분이다. 혹은 Etcd를 꾸준히 백업을 받는 방법이 있다. 

 

HA를 위한 Controlplane 노드 갯수의 중요성

Kubernetes는 친절하게도 최소한의 안정성을 충족할 경우에만 정상적으로 작동하게끔 설계되어 있다. 

Controlplain을 이중화 해서 쓰던 도중 한대가 장애가 나면 그 클러스터는 일반적인 방법으로는 가동이 안된다. (복구 프로세스로 넘어가야 됨)

왜 그럴까? 

그 이유는 Quorum이라는 알고리즘이 작동하기 때문인데, 

Etcd가 두개인데 두개가 각기 다른 데이터를 갖고 있다면 누가 옳은지 결정할수 없기에 

정족수(1/2) 이상의 신뢰가 형성될 때만 옳은 데이터로 보고 있다. 

 

클러스터가 구성되어 있는 Etcd에 write 이벤트가 발생하면 RAFT라는 알고리즘으로 투표를 해 리더를 선출한다. 오직 리더만이 Etcd에 write할 수 있다. 이게 Quorum의 역할이다.

 

간단하게 공식과 테이블로 정리하면 아래와 같다.

Quorum  = N/2 + 1  정수가 아니면 절삭

 

Instance 갯수 Quorum(최소한의 Available Node) Fault Tolerance(몇개까지 장애나도 되나)
1 1 0
2 2 0
3 2 1
4 3 1
5 3 2
6 4 2
7 4 3

 

 

HA 클러스터링 구성방법

kubeAPI는 가급적 LoadBalancing과 DNS세팅까지 해서 URL로 호출되게 해야한다. 

※ 주의사항 : 로드벨런서가 잘 작동하는지 'curl 로드벨런싱DNS:6443'으로 호출해보고 점검해보고 이니셜라이징을 시작한다.

 

1. Quorum 갯수를 계산해서 Controlplane 노드를 준비한다. (kubeadm init 전까지 수행해놓아야함)

 

2. 첫번째 Controlplane 노드에서 아래와 같이 이니셜라이징 한다.

$ sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs

 

3. 기본적으로 하는 실행권한 관련 작업(이니셜라이징이 끝나면 수행하라고 친절하게 나옴)

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

 

4. weaveNet을 설치한다. 

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

 

5. 정상적으로 Pod가 실행되는지 확인

$ kubectl get pod -n kube-system -w

 

6. 그외 Controlplane 노드에서는 Join만 하면 된다. (--control-plane 와 –certificate-key 이라는 옵션이 있으면 해당 노드가 Controlplane이 되고 없으면 Worker가 됨)

kubeadm join lb-apiserver.jpkim.co.kr:6443 --token -----wd95dn2ucm7 \
        --discovery-token-ca-cert-hash sha256:02e98e1e5a-----------77fa5bb2fc2497b5c90cbaeec2f90aefe842e074e652 \
        --control-plane --certificate-key 7cd997d9cd1e517388d1a012d--------e93ee2c99916bea530ab50782b67