목표
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:[위 명령어를 통해 얻은 해시값]
'Kubernetes' 카테고리의 다른 글
Helm이란? (0) | 2021.10.01 |
---|---|
Kubernetes 오브젝트를 이용한 Apache 웹 서버 구성하기 (0) | 2021.09.07 |
Kubernetes 인강 정리 (0) | 2021.08.20 |
EKS를 활용한 웹 애플리케이션 배포하기 (0) | 2021.08.16 |
The connection to the server ~ 에러 발생 해결 (0) | 2021.07.30 |