본문 바로가기
Programming/Kubernetes

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

by guru_k 2022. 1. 12.
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
반응형

댓글