Programming/Kubernetes

[Kubernetes] k8s HA control-plane node 추가하기 (Add control-plane node)

guru_k 2022. 1. 12. 22:13
728x90
반응형

Single Master로 k8s cluster를 구성했으나 추후 HA 구성을 위해 contorl-plane node를 추가 해야 할 경우 

1. kubeadm-config.yaml update

HA 구성을 위해 추가해야 할 node의 정보를 기존 kubeadm-config.yaml에 추가한다.

기존에 k8s 를 구성한 kubeadm-config.yaml의 정보가 없을 경우 현재 등록되어 있는 configmap을 통해 아래 명령어를 사용하여 가져 온다.

machine01:~$ kubectl get cm kubeadm-config -n kube-system -o yaml

kubeadm-config에 추가 할 control-plane 노드의 정보를 업데이트 한다.

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.20
controlPlaneEndpoint: "10.88.15.225:6443"
apiServer:
  certSANs:
  - 127.0.0.1
  - 10.0.0.1
  - 10.0.0.2                          // 추가 할 Node ip
  - 10.0.0.3                          // 추가 할 Node ip
  - machine01
  - machine02                         // 추가 할 Node Domain
  - machine03                         // 추가 할 Node Domain        
  extraArgs:
    apiserver-count: "3"              // api server 갯수
networking:
  dnsDomain: cluster.local
  podSubnet: 172.28.0.0/14
  serviceSubnet: 172.27.0.0/16
etcd:
  external:
    endpoints:
    - http://10.0.0.1:2379
    - http://10.0.0.2:2379            // etcd에 추가 될 node ip 정보
    - http://10.0.0.3:2379            // etcd에 추가 될 node ip 정보

 

2. 수정 한 kubeadm-config를 실제 k8s cluster secret에 업데이트

kubeadm upload-certs 를 이용하여 secret 업데이트

machine01:~$ sudo kubeadm init phase upload-certs --upload-certs --config master.yaml
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
dbc6746eab5d8dbfe13d62d4da9d0ddedb9819042d1d8a0489fde439ecb83212

이때 사용된 certificate key (dbc6746eab5d8dbfe13d62d4da9d0ddedb9819042d1d8a0489fde439ecb83212) 는 잘 보관해두자. control-plane으로 join 할때 사용 된다.

 

3. control-plane으로 node join

이미 join을 위해 만들어둔 token이 존재한다면 해당 token을 사용하고 없다면 아래 명령어를 이용하여 join에 필요한 token을 생성하자.

machine01:~$ kubeadm token create --print-join-command
 
kubeadm join 10.0.0.1:6443 --token wab1wr.kik92g8b6l4lsc2b     --discovery-token-ca-cert-hash sha256:3729236e56e7ec2d291f0ebe1d66e8e64d83696f10749ec5b6efc49834926a6e

일반적으로 worker node는 위에 join 커맨드를 이용하여 cluster에 조인 시킨다. 허나 우리에게 필요한건 control-plane이므로 --control-plane 옵션과 위에 upload-certs 시 사용된 cert key를 명령어에 추가하여 control-plane 역할을 수행하도록 master에 join 시킨다.

machine02:~$ kubeadm join 10.0.0.1:6443 --token wab1wr.kik92g8b6l4lsc2b     --discovery-token-ca-cert-hash sha256:3729236e56e7ec2d291f0ebe1d66e8e64d83696f10749ec5b6efc49834926a6e --control-plane --certificate-key dbc6746eab5d8dbfe13d62d4da9d0ddedb9819042d1d8a0489fde439ecb83212

 

4. 확인

join 후 control-plane 노드로써 정상적으로 join 되었는지 확인한다.

machine02:~$ mkdir -p $HOME/.kube
machine02:~$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
machine02:~$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
machine02:~$ kubectl get node
 
NAME          STATUS   ROLES                                AGE      VERSION
machine01     Ready    master                               1y       v1.18.20
machine02     Ready    master                               20s      v1.18.20
machine04     Ready    worker                               1y       v1.18.20
machine05     Ready    worker                               1y       v1.18.20

추가적으로 control-plane으로써 역할을 정상적으로 수행 할 수 있도록 control-plane components들이 설치되었는지 확인해보자.

machine02:~$ kubectl get pods -n kube-system -o wide | grep machine02
 
kube-apiserver-machine02            1/1     Running   0          34m      10.0.0.2   machine02     <none>           <none>
kube-controller-manager-machine02   1/1     Running   0          34m      10.0.0.2   machine02     <none>           <none>
kube-flannel-ds-amd64-mwgs8         1/1     Running   0          34m      10.0.0.2   machine02     <none>           <none>
kube-proxy-4xtpx                    1/1     Running   0          34m      10.0.0.2   machine02     <none>           <none>
kube-scheduler-machine02            1/1     Running   0          34m      10.0.0.2  machine02     <none>           <none>

추가적으로 apiserver 호출 주소를 새로 조인된 machine02로 변경 후 api server호출이 정상적으로 실행되는지 확인해보자.

machine02:~$ vi ~/.kube/config

apiVersion: v1
clusters:
- cluster:
    ...
    server: https://10.0.0.2:6443     // 새로 추가한 control-plane node ip or domain 으로 변경
  name: kubernetes
contexts:
...

확인

machine02:~$ kubectl get node
 
NAME          STATUS   ROLES                                AGE      VERSION
machine01     Ready    master                               1y       v1.18.20
machine02     Ready    master                               1h       v1.18.20
machine04     Ready    worker                               1y       v1.18.20
machine05     Ready    worker                               1y       v1.18.20
728x90
반응형