오랜만에 쿠버네티스 글입니다.
그동안 데이터 서버를 운용하면서 서버가 이런 저런 이유로 펑펑 터져나가고 틈틈히 복구를 진행 했었는데요.
여러개의 서버가 터져나갈 동안 다행이도 Control-plane 노드만큼은 무사해서 어렵지 않게 복구할 수 있었습니다.
그러나 Control-plane 노드가 터지면 어떻게 복구해야 할지 가늠 조차 되지 않아서 Contol-plane을 여러개 두고자 설정을 진행했습니다.
현재 제가 사용중인 쿠버네티스는 위와 같이 7개의 서버로 구성되어 있으며, 이 중 하나를 Control-plane으로 사용중 입니다. 이렇게 현재 사용중인 노드들 중 일부를 control plane으로 ROLES를 변경하는 것을 진행해 보겠습니다.
0. 사전 지식
일반적으로 Kubernetes에서 Control-plane은 홀수개를 가져야 한다고 합니다.
그 이유는 분산 시스템에서 사용하는 etcd의 리더 선출 알고리즘과 쿼럼(Quorum) 때문입니다. etcd는 Raft와 같은 합의 알고리즘을 사용하여 클러스터의 상태를 관리하고 리더를 선출하는데, 이러한 알고리즘은 과반수 이상의 노드가 동의해야 결정을 내릴 수 있도록 설계되어있기 때문입니다.
1. Control-plane 설정
고가용성을 보장하기 위해 Control-plane 앞단에 로드 밸런서를 설치합니다. 로드 밸런서는 HAProxy를 사용했습니다. 로드 밸런서를 설치 후 haproxy 설정을 편집합니다.
sudo apt install -y haproxy
sudo vi /etc/haproxy/haproxy.cfg
#기존 설정 아래 추가
frontend k8s-api
bind *:6443
mode tcp
option tcplog
default_backend k8s-api-backend
backend k8s-api-backend
mode tcp
option tcp-check
balance roundrobin
server master1 <master1 IP 주소>:6443 check
server master2 <master2 IP 주소>:6443 check
설정 편집을 마치면, 서비스를 재시작합니다.
sudo systemctl restart haproxy
kubernetes에 Control-plane endpoint 설정값을 추가합니다.
kubectl -n kube-system edit configmap kubeadm-config
data:
ClusterConfiguration: |
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
...
controlPlaneEndpoint: "HAProxy IP:Port" # HAProxy가 설치된 PC IP 주소 및 설정 포트값
...
또한, Control-plane 인스턴스들 간의 통신에는 certificates가 반드시 필요합니다. 기존 Control-plane 노드에서 Certificate를 생성합니다.
kubeadm init phase upload-certs --upload-certs
이때 생성한 토큰을 복사하고, 클러스터에 join하는 코드에 추가하여 실행합니다. --certificate-key 옵션을 추가하면 자동으로 Control-plane으로 Kubernetes에 join하는 코드를 작성해줍니다.
kubeadm token create --print-join-command --certificate-key {앞서 발급한 Certificate token}
2. 노드 연결
기존 노드 연결 해제는 이 글 을 참고하여 삭제합니다.
그 후 위 명령어로 생성된 아래 명령어를 붙여넣어 실행하면 Control-plane으로 Join이 완료됩니다.
kubeadm join {설정한 HAProxy 주소:Port} --token {생성된 token} --discovery-token-ca-cert-hash {생성된 cert hash} --control-plane --certificate-key {생성한 certificate-key}
Join한 서버에서 kubectl을 사용하기 위해 아래 설정을 마치면,
To start administering your cluster from this node, 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
Run 'kubectl get nodes' to see this node join the cluster.
새로운 Control-plane 서버에서도 kubectl을 사용할 수 있게 되었습니다.
이로써, 하나뿐인 Control-plane 서버에 문제가 생겨도 금방 복구가 가능할 것 같습니다.
'MLOps > Kubernetes' 카테고리의 다른 글
Kubernetes Dashboard(Grafana / Prometheus) (0) | 2024.07.05 |
---|---|
쿠버네티스 실행 (1) | 2024.07.01 |
쿠버네티스 개요 및 설치 (0) | 2024.06.17 |