Kubernetes

Kubeadm을 이용한 쿠버네티스 클러스터 배포하기

JAEJUNG 2021. 9. 7. 15:51

목표

k8s 설치와 버전 업그레이드, node를 제거하고 추가하는 방법을 설명한다.

 

설치 환경

쿠버네티스 설치 환경은 Ubuntu 20.04.2 LTS 이다.

 

설치 과정

1. Kubernetes 설치

2. 클러스터 구축


kubernetes 설치

 

패키지 업데이트를 수행하고 Repository를 추가한다.

vagrant@kube-control1:~$ sudo apt-get update

vagrant@kube-control1:~$ sudo apt-get install -y apt-transport-https ca-certificates curl

#구글 클라우드의 사이닝 키 추가
vagrant@kube-control1:~$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

#Repository 추가
vagrant@kube-control1:~$ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

 

 

설치 가능한 버전을 조회한다.

vagrant@kube-control1:~$ apt-cache madison kubeadm
   kubeadm |  1.21.1-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
   kubeadm |  1.21.0-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
...

 

 

Repository를 추가했기 때문에 패키지 업데이트 후 원하는 버전을 설치하고 holding 시켜준다.

vagrant@kube-control1:~$ sudo apt-get update

vagrant@kube-control1:~$ sudo apt install kubectl=1.19.11-00 kubeadm=1.19.11-00 kubelet=1.19.11-00

vagrant@kube-control1:~$ sudo apt-mark hold kubelet kubeadm kubectl
# apt-get 버전 1.1부터 hold된 버전을 unhold 시키지 않고도 아래 명령어를 통해
# 버전 업그레이드가 가능하다. 
vagrant@kube-control1:~$ sudo apt-get update
vagrant@kube-control1:~$ sudo apt-get install -y --allow-change-held-packages kubeadm=1.21.x-00

 

클러스터 구축

 

kubeadm init 명령어를 통해 Control-plane을 initialize 시켜준다.

 

option

--pod-network-cidr: 컨테이너에 부여될 ip 대역

--apiserver-advertise-address=<ip-address>: worker node가 접근할 주소

vagrant@kube-control1:~$ sudo kubeadm init --control-plane-endpoint 192.168.100.11 --pod-network-cidr 192.168.0.0/16 --apiserver-advertise-address=192.168.100.11
...
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, 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

...
sudo kubeadm join 192.168.100.11:6443 --token fal89d.enoyxa9yocd5rgmi --discovery-token-ca-cert-hash sha256:be6f41a044d75957f388c4cd407a4bb4141691098544e10222346e1725d64bd2

 

kubectl이 사용할 자격증명 파일을 복사해준다.

vagrant@kube-control1:~$ mkdir ~/.kube

vagrant@kube-control1:~$ sudo ls /etc/kubernetes/admin.conf 

vagrant@kube-control1:~$ sudo cp /etc/kubernetes/admin.conf ~/.kube/config

vagrant@kube-control1:~$ sudo chown vagrant:vagrant ~/.kube/config

 

pod의 network add-on을 구성을 위해 calico yaml 파일을 다운받는다.

vagrant@kube-control1:~$ curl https://docs.projectcalico.org/manifests/calico.yaml -O
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  185k  100  185k    0     0   295k      0 --:--:-- --:--:-- --:--:--  295k

vagrant@kube-control1:~$ ls
calico.yaml

 

 

yaml 파일의 네트워크 대역을 수정해준다.

원래는 이 부분에서 value 값을 수정해줘야 하지만 control-plane의 endpoint를

동일하게 설정했기 때문에 수정할 필요 없음.

# - name: CALICO_IPV4POOL_CIDR
            #   value: "192.168.0.0/16"

 

control-plane node가 추가된 것을 확인한다.

여기서 master는 control plane을 뜻함.

vagrant@kube-control1:~$ kubectl get nodes
NAME            STATUS   ROLES    AGE   VERSION
kube-control1   Ready    master   17m   v1.18.18

 

 

yaml 파일을 적용시켜 준다.

vagrant@kube-control1:~$ kubectl apply -f calico.yaml

 

Worker 노드 추가/제거

 

제거하려는 node에 접속한 후 kubeadm reset 명령어를 실행해준다.

vagrant@kube-node3:~$ kubeadm reset

kubeadm reset은 아래 네 가지 작업을 수행한다.

  • preflight - Run reset pre-flight checks
  • update-cluster-status - Remove this node from the ClusterStatus object
  • remove-etcd-member - Remove a local etcd member.
  • cleanup-node - Run cleanup node.

 

reset 후 status가 inactive 상태인지 확인한다.

vagrant@kube-node3:~$ systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
     Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/kubelet.service.d
             └─10-kubeadm.conf
     Active: inactive (dead) since Tue 2021-06-15 06:10:43 UTC; 13s ago

 

control-panel에서 해당 노드를 delete 시켜준다.

vagrant@kube-control1:~$ kubectl delete node kube-node3 node "kube-node3" deleted

 

+++ Worker node 추가

 

Worker node를 다시 추가해야 할 경우 join 명령어를 사용한다.

이 때, join에 사용했던 토큰은 24시간이 지나면 만료된다.

아래와 같이 최초 node join을 위한 토큰 발행 시 아래와 같이 Expires Date가 존재한다.

vagrant@kube-control1:~$ kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
us4apj.czp9qe09qm35rdd5   1h          2021-06-16T09:22:15Z   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token

 

토큰 발행시간 기준 24시간 이후에는 토큰이 만료되기 때문에 node join이 불가능하다.

그러므로 아래와 같이 token create 명령어를 통해 토큰을 재 생성해준다.

vagrant@kube-control1:~$ kubeadm token create
W0616 07:50:08.705172  173704 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
fal89d.enoyxa9yocd5rgmi

 

토큰 리스트를 확인하면 조금 전 생성했던 토큰을 확인할 수 있다.

vagrant@kube-control1:~$ kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
fal89d.enoyxa9yocd5rgmi   23h         2021-06-17T07:50:08Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token

 

처음 클러스터 구축 시엔 join을 위한 명령줄이 제공되지만, 그 후엔 수동으로 명령어를 입력하기 때문에

토큰과 더불어 CA key가 가진 sha256 해시값이 필요하다.

아래 명령어를 통해 먼저 hash 값을 확인하자.

vagrant@kube-node3:~$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

 

확인한 후엔 kubeadm join 명령어로 Worker node를 추가해주면 된다.

vagrant@kube-node3:~$ sudo kubeadm join 192.168.100.11:6443 --token [새로 생성한 토큰값] --discovery-token-ca-cert-hash sha256:[위 명령어를 통해 얻은 해시값]