kubernetes

k8s 마스터노드 HA 구성

misankim 2023. 3. 7. 08:21
k8s 마스터노드 HA 구성

 

참고 URL

 

 

마스터노드를 3대로 HA 구성(Stacked control plane, Stacked etcd)

 

외부 etcd를 구성하지 않는 이상 기본적으로 마스터노드에 etcd가 포함되어 있기 때문에 RAFT 알고리즘으로 인해 마스터노드(etcd)는 홀수로 구성해야함

 

(RAFT 알고리즘이란 리더와 팔로워의 관계를 통해 다중화된 데이터의 정확성을 높이는 방식으로 redis, etcd에서 사용하는 방식입니다. RAFT 알고리즘에 대해 더 이해하시고자하는 경우 http://thesecretlivesofdata.com/raft/ 페이지 방문하시어 예제를 통해 확인하시는 것을 권장드립니다)

 

# k8s HA 구성의 두 가지 옵션

 

## stacked etcd -> etcd 가 포함된 마스터노드를 다중으로 구성하여 HA 구성

 

구성이 간편하지만 마스터노드의 수가 늘어남에 따라 etcd 포드도 늘어나는 특징
마스터노드에 etcd 가 포함되어 있기 때문에 마스터노드에 부하 발생 시 etcd 에도 영향

 

## external etcd -> 마스터노드 외부에 별도의 etcd 를 구성하여 HA 구성

 

마스터노드 HA 구성 + etcd HA 구성으로 더 많은 수의 노드가 필요함
마스터노드와 etcd 가 분리되어 있기 때문에 마스터노드의 수와 etcd 의 수를 별도로 구성 가능하며, 부하의 영향을 덜 받음

 

# 사전 조건 -> kubeadm init 명령어를 이용하여 클러스터를 초기화하기 직전의 상태

 

docker 설치
kubeadm, kubelet, kubectl(옵션) 설치
(외부 etcd를 구성하려는 경우) 별도의 etcd 노드 3대

 

# 사전작업

 

## 마스터노드(kube-apiserver) 를 위한 로드밸런서 생성

 

TCP 6443 포트가 kube-apiserver의 기본 수신 포트이므로 리스너 포트는 6443으로 설정

 

(AWS 에서 internal CLB로 테스트 정상적, 토스트 클라우드 로드밸런서 테스트 정상적)

 

# 최초 하나의 마스터 노드 설정

 

export LOAD_BALANCER_DNS=internal-kube-int-clb-802230529.ap-northeast-1.elb.amazonaws.com
export LOAD_BALANCER_PORT=6443


kubeadm init --control-plane-endpoint "$LOAD_BALANCER_DNS:$LOAD_BALANCER_PORT" --upload-certs --pod-network-cidr=10.244.0.0/16

 

(flannel CNI 애드온 설치를 위해 --pod-network-cidr 옵션 추가했음)

 

출력으로 다른 마스터 노드를 추가하기 위한 kubeadm join 커맨드와 워커 노드를 추가하기 위한 kubeadm join 커맨드가 출력되면 둘 다 복사해놓는다

 

<마스터 노드 join 커맨드>

 

kubeadm join internal-kube-int-clb-802230529.ap-northeast-1.elb.amazonaws.com:6443 --token h8yobm.kwv80p458iceia7l \
    --discovery-token-ca-cert-hash sha256:86eaa0cd6360ea3f9f80af43acfbbfc3e7158ef6388e1555696576d5b7472758 \
    --control-plane --certificate-key 407d84b78d598dcd721106020f6ec03c9385118ec27520b1935c696c78d1a078

 

<워커 노드 join 커맨드>

 

kubeadm join internal-kube-int-clb-802230529.ap-northeast-1.elb.amazonaws.com:6443 --token h8yobm.kwv80p458iceia7l \
    --discovery-token-ca-cert-hash sha256:86eaa0cd6360ea3f9f80af43acfbbfc3e7158ef6388e1555696576d5b7472758

 

## kubectl 명령어를 사용하기 위한 kubeconfig 파일 복사

 

### 루트 사용자의 경우

 

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

 

### 루트 사용자가 아닌 경우

 

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

 

## 마스터 노드에 CNI 플러그인 flannel 설치

 

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


kubectl get all -n kube-system

 

# 나머지 다른 마스터 노드 설정

 

마스터 노드 구성 시 출력된 다른 마스터 노드를 추가하는 커맨드를 실행한다

 

kubeadm join internal-kube-int-clb-802230529.ap-northeast-1.elb.amazonaws.com:6443 --token h8yobm.kwv80p458iceia7l \
    --discovery-token-ca-cert-hash sha256:86eaa0cd6360ea3f9f80af43acfbbfc3e7158ef6388e1555696576d5b7472758 \
    --control-plane --certificate-key 407d84b78d598dcd721106020f6ec03c9385118ec27520b1935c696c78d1a078

 

최초 구성한 마스터 노드에서 정상적으로 노드가 추가되었는지 확인
kubectl get node
kubectl get pod -n kube-system

 

로드밸런서 리스너에 모든 마스터 노드 추가

 

(참고) 노드 제거

 

제거할 노드에서 실행
kubeadm reset
rm -rf /etc/kubernetes/pki

 

(참고) 노드 제거 중 etcd 클러스터 관련 오류 발생 시 etcd 멤버에서 제거(포드 이름과 etcd 멤버 이름은 확인하여 수정)

 

kubectl exec -it -n kube-system etcd-kube-1.novalocal -- etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key member list 

kubectl exec -it -n kube-system etcd-kube-1.novalocal -- etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key member remove e1417d86c63ba965

 

(참고) 마스터 노드 설치 중 중단되어 컨테이너만 생성된 경우 삭제

 

docker rm -f $(docker ps -aq)

 

# 워커 노드 설정

 

마스터 노드 구성 시 출력된 워커 노드를 추가하는 커맨드를 실행한다

 

kubeadm join internal-kube-int-clb-802230529.ap-northeast-1.elb.amazonaws.com:6443 --token h8yobm.kwv80p458iceia7l \
    --discovery-token-ca-cert-hash sha256:86eaa0cd6360ea3f9f80af43acfbbfc3e7158ef6388e1555696576d5b7472758



최초 구성한 마스터 노드에서 정상적으로 노드가 추가되었는지 확인
kubectl get node
kubectl get pod -n kube-system

 

클러스터 설정 확인
kubeadm config view

 

(참고) HA 구성된 마스터노드(kube-apiserver) 다운 시 로드밸런서 상태 검사에 의해 상태 검사의 비정상 임계치를 넘어서면 다운된 노드로 트래픽을 보내지 않기 때문에 마스터노드는 서비스 중단 없이 사용 가능