0516_Kubernetes_Worker Node 추가 확장, kubeadm 클러스터 업그레이드

HYOJU DO·2022년 5월 16일
0

Kubernetes

목록 보기
2/13
post-thumbnail

Worker Node 추가 확장

Cluster join
➜ 클러스터 내부에 다른 장치를 추가하는 것

현재 VirtualBox에서 Ubuntu VM 로 진행
kubeadm init 시 출력되는 내용에도 포함되어있음
현재 사용자 계정으로 접속

[ 진행 순서 ]
1. Vagrantfile에 Worker Node VM 추가
2. Docker(런타임) 설치 📌 Docker 설치 내용 정리 후 링크 걸기
3. kubeadm, kubelet, kubectl 설치 (1.22.8 버전)
4. Worker Node 조인 : kubeadm join
➜ Worker Node에서 실행
5. 조인 된 노드 확인 : kubeadm get nodes
➜ Control Plane에서 실행

kubeadm join

💡 VM끼리 SSH 접속 가능해야함 ➜ 키 등록
💡 Token 및 CA 인증서의 해시 값 미리 확인

🎈 인증

토큰 생성

$ kubeadm token create

토큰 확인
➜ 토큰은 생성 후 24시간 이내로 존재

$ kubeadm token list

해시 값 확인

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

인증서 유효기간 == 1년
쿠버네티스 업데이트를 안해주면 인증서가 만료되어 시스템이 다 죽어버림


🎈 Worker Node 확장 (조인)

kubeadm join

$ kubeadm join --token <token> <control-plane-host>:<control-plane-port> \
--discovery-token-ca-cert-hash sha256:<hash>

control-plane-port (API 서버의 포트 번호) : 6443
--token : 인증 위한 키 ➜ 토큰 없이 join 불가
--discovery-token-ca-cert-hash : 토큰 값을 발행해 준 CA 인증서의 Hash 값
➜ 내부적으로 CA가 있고 각 개별적으로 인증서 보유 / k8s에 있는 모든 요소들은 API 서버에게 인증 받아야함

[preflight] Running pre-flight checks
...

✔️ This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

🎈 Worker Node 확장 확인

kubeadm get nodes
Ready 상태가 되어야 함

$ kubectl get nodes
NAME     STATUS     ROLES                  AGE     VERSION
docker   Ready      control-plane,master   2d18h   v1.22.8
worker   ✔️Ready   <none>                  27s     v1.22.8

확장 된 노드의 Worker Node의 Pod 생성 확인

$ watch kubectl get pods -A

Node 제거

Control plane

제거하고자 하는 노드의 파드가 새로운 포드가 노드에 스케쥴링 되어서 실행되지 않도록 설정

$ kubectl drain [노드 이름] --delete-emptydir-data --force --ignore-daemonsets

Worker Node

kubeadm 초기화

$ sudo kubeadm reset

iptables 수동 재설정

$ iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

IPVS 테이블을 재설정

$ ipvsadm -C

Control plane

노드 삭제

$ kubectl delete node worker



kubeadm 클러스터 업그레이드


버전 차이 정책 (Version Skew Policy)

쿠버네티스 구성 요소는 각각의 버전 보유
컨테이너의 버전 업데이트 == 이미지 교체
요즘 무중단 시스템이 대부분이기 때문에 downtime 없이 한 번에 이미지를 교체하는 버전 차이 정책 을 알아야함


✔️ 현 버전 : 1.24 로 가정

🎈 kube-API Server

kube-apiserver 인스턴스가 각각 1단계 마이너 버전 내에 있어야 함
➜ 1.23, 1.24 버전 가능

🌟 다른 구성 요소들은 API Server 보다 최신일 수 X

🎈 Kubelet

2단계 낮은 마이너 버전 까지 지원
➜ API Server 1.24 버전 일 때,
Kublet 1.22, 1.23, 1.24 버전 가능
➜ API Server 1.23, 1.24 버전 일 때,
Kublet 1.22, 1.23 버전 가능

🎈 Controller-Manager / Scheduler / Cloud-Controller-Manager

1단계 낮은 마이너 버전 까지 지원
➜ API Server 1.24 버전 일 때,
1.23, 1.24 버전 가능
➜ API Server 1.23, 1.24 버전 일 때,
1.23 버전 가능

🎈 Kubectl

1단계 높은 버전 / 1단계 낮은 버전 까지 지원
➜ API Server 1.24 버전 일 때,
Kubectl 1.23, 1.24, 1.25 버전 가능
➜ API Server 1.23, 1.24 버전 일 때,
Kubectl 1.23, 1.24 버전 가능


Kubeadm 업그레이드 순서

기본 순서

🌟 순서 중요

  1. kube-apiserver
  2. cm, ccm, sched
  3. kubelet
    (Control Plane -> Worker Node)
    ➜ 업그레이드 전, 해당 노드의 파드를 드레인(drain)
    다른 곳에 이미 replica 서비스가 존재하기 때문에 드레인 해도 문제 x
  4. kube-proxy
    (Control Plane -> Worker Node)
    ➕ etcd는 업그레이드 필수 X

🎈 여러 대 기준 업그레이드 순서

  1. 기본 Control Plane Node 업그레이드
  2. 추가 Control Plane Node 업그레이드
  3. Worker Node 업그레이드

실습

✔️ 실행할 버전 업그레이드
1.22.8 -> 1.22.9 -> 1.23.x

패치 버전은 상관 X
그러나 kubeadm 으로 버전 업그레이드할 때는 절차대로 수행

  1. Control Plane의 kubeadm 업그레이드
  2. Control plane의 kubeadm으로 api, cm, shed 업그레이드
  3. Control Plane의 kublet, kubectl 업그레이드
  4. Work node의 kubeadm 업그레이드
  5. Worker node의 kubeadm으로 업그레이드 📌 이건 뭐지..?
  6. Worker Node kubler, kubectl 업그레이드

💡큰 틀
kubeadm 패키지 설치 후 업그레이드
kubelet, kubectl 패키지 설치 후 업그레이드


🎈 Control Plane

kubeadm 업그레이드

kubeadm 버전 잠금 해제

$ sudo apt-mark unhold kubeadm

패키지 목록 업데이트

sudo apt update

kubeadm 패키지 업데이트

$ sudo apt upgrade kubeadm=1.22.9-00 -y

kubeadm 버전 확인

$ kubeadm version

kubeadm 버전 잠금

$ sudo apt-mark hold kubeadm

✔️ 오류 없이 업그레이드 계획 마무리 되는지 확인
sudo 붙이기

$ sudo kubeadm upgrade plan

업그레이드 할 버전 정하고 kubeadm 업그레이드 실행

$ sudo kubeadm upgrade apply v1.22.9

kubelet, kubectl 업그레이드

아직 kubelet 등 업그레이드 안했기 때문에 not ready 상태

$ kubectl get nodes

kubelet, kubectl 버전 잠금 해제

$ sudo apt-mark unhold kubelet kubectl

kubelet, kubectl 패키지 업그레이드

$ sudo apt upgrade kubectl=1.22.9-00 kubelet=1.22.9-00 -y

kubelet, kubectl 버전 잠금

$ sudo apt-mark hold kubelet kubectl

kubelet, kubectl 버전 확인

$ kubelet --version
$ kubectl version

➕ drain 작업
현재는 따로 pod를 만들지 않았기 떄문에 drain 할 필요 x

데몬, kublet 재시작

$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet

➕ uncordon 작업

kubelet 상태 확인

$ systemctl status kubelet

버전 업그레이드 확인

$ kubectl get nodes

➜ 여기까지 한 사이클

🎈 worker node

마스터 노드와 동일하게 작업

kubeadm 업그레이드

버전 홀드 풀고 패키지 목록 업데이트

$ sudo apt-mark unhold kubeadm
$ sudo apt update

kubeadm 버전 업그레이드

$ sudo apt upgrade kubeadm=1.22.9-00 -y

kubeadm 버전 확인

$ kubeadm version

kubeadm 버전 잠금

$ sudo apt-mark hold kubeadm

✔️ master node와 다른 부분

$ sudo kubeadm upgrade node

drain 작업 (Control Plane과 마찬가지로 패스)

kubelet, kubectl 업그레이드

kubelet, kubectl 버전 잠금 해제

$ sudo apt-mark unhold kublet kubectl

kubelet, kubectl 버전 업그레이드

$ apt upgrade kubectl=1.22.9-00 kubelet=1.22.9-00 -y

kubelet, kubectl 버전 잠금

$ sudo apt-mark hold kublet kubectl

kubelet, kubectl 버전 확인

$ kublet --version
$ kubectl version

데몬 재시작 + kublet 재시작

$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet

uncordon 작업

최종 버전 확인

$ kubectl get nodes



고가용성을 위한 토폴로지 구성


고가용성 구현 == Control Plane 여러 개 배치

고가용성 토폴로지 구성 명령어


Stacked Etcd 토폴로지

Control Plane + etcd
➜ 한 대로 구현
로드밸런서 필수
➜ HA-Proxy VM 한 대 더 생성
백앤드의 Control Plane들에게 트래픽 분산

외부 Etcd 토폴로지


별도의 VM에 etcd 존재
etcd는 io가 많기 때문에 별도의 VM으로 구성하는 것 추천



💡 TIP : Ubuntu 패키지 다운로드 속도 높이기


우분투 패키지 다운로드 느린 이유
: 사용자의 네트워크 문제도 있을 수 있지만
기본적으로 패키지 다운로드 서버가 영국에 있음

$ sudo -i
# cd /etc/apt/
# vi sources.list

archive.ubuntu.com / security.ubuntu.com을 모두 mirror.kakao.com로 변경해줌

# sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
# sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list



profile
Be on CLOUD nine! ☁️ ( 수정 예정 == 📌)

0개의 댓글