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에서 실행
💡 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
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
쿠버네티스 구성 요소는 각각의 버전 보유
컨테이너의 버전 업데이트 == 이미지 교체
요즘 무중단 시스템
이 대부분이기 때문에 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 버전 가능
🌟 순서 중요
🎈 여러 대
기준 업그레이드 순서
✔️ 실행할 버전 업그레이드
1.22.8 -> 1.22.9 -> 1.23.x
패치 버전은 상관 X
그러나kubeadm
으로 버전 업그레이드할 때는 절차대로 수행
kubeadm
업그레이드api, cm, shed
업그레이드kublet, kubectl
업그레이드kubeadm
업그레이드📌 이건 뭐지..?
kubler, kubectl
업그레이드💡큰 틀
kubeadm 패키지 설치 후 업그레이드
kubelet, kubectl 패키지 설치 후 업그레이드
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
➜ 여기까지 한 사이클
마스터 노드와 동일하게 작업
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 여러 개
배치
Control Plane + etcd
➜ 한 대로 구현
로드밸런서 필수
➜ HA-Proxy VM 한 대 더 생성
백앤드의 Control Plane들에게 트래픽 분산
별도의 VM에 etcd 존재
etcd는 io가 많기 때문에 별도의 VM으로 구성하는 것 추천
우분투 패키지 다운로드 느린 이유
: 사용자의 네트워크 문제도 있을 수 있지만
기본적으로 패키지 다운로드 서버가 영국에 있음
$ 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