-
Kubernetes) AWS 기반 쿠버네티스 H.A 구축 프로젝트 2편Cloud/Kubernetes 2022. 10. 18. 23:14
실습 환경 : AWS console (2022/10), Visual Studio Code
실습 목적 : stacked etcd 방식의 고가용성(HA) 쿠버네티스 클러스터를 구성해본다.
참고1 : kubectl 자동완성 설정
source <(kubectl completion bash) echo "source <(kubectl completion bash)" >> ~/.bashrc
5. MasterNode2, MasterNode3 제거하기
# 버전 업그레이드 전에 노드를 2개만 남겨두고 하기 위해 제거 (실습을 위한 제거)
# 필요할 때 클러스터에 연결된 노드를 제거하는 방법으로 사용할 수 있다.
(1) Taint 해제kubectl taint node --all node-role.kubernetes.io/master- kubectl taint node --all node-role.kubernetes.io/contorl-plane- # (1.24.x 이전)
(2) 삭제할 마스터 노드에 kubectl 권한 부여 (master2,3 둘다 진행)
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
(3) cordon 과 drain 명령으로 삭제진행 (master2,3 둘다 진행)
- cordon 명령을 사용하면 해당 포드에 스케쥴링 실행을 중지한다.
- drain 명령을 사용하면 해당 포드의 스케쥴링을 중지하고 실행중인 포드를 삭제한다.
- drain 명령 사용시, 데몬셋으로 실행중인 포드가 있다면 --ignore-daemonsets 옵션을 사용한다.
kubectl drain <Node명> --ignore-daemonsets kubectl get no
- SchedulingDisabled 상태가된 Node는 더이상 Pod를 생성할 수 없는 상태가 된다.
(4) cordon 과 drain 명령으로 삭제진행 (master2,3 둘다 진행)
kubectl delete no <Node 명> kubectl get no kubeadm reset
- kubectl get no 명령을 입력하여 master 노드가 삭제되었는지 확인한다.
- master1 에서 The connection to the server k8s:6443 was refused 에러가 발생하면 다음 명령어로 초기화
한 다음 다시 init(master node에서),apply(CLI), join(worker node에서) 명령을 사용한다sudo -i kubeadm reset # master node kubeadm init --kubernetes-version=1.24.1 --control-plane-endpoint="k8s:6443" --pod-network-cidr=192.168.0.0/16 --upload-certs|tee /tmp/kubeadm.out mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config kubectl apply -f calico.yaml # worker node kubeadm join k8s:6443 --token xzs2ah.08b8kpyamfwqmco6 \ --discovery-token-ca-cert-hash sha256:79b27fd4f1e71911935ba52284003e42e03a93406cfe851352a6944a115b169d
6. 업그레이드 전 백업을 위한 etcd 설정
(1) master1 의 etcd 접근
sudo grep data-dir /etc/kubernetes/manifests/etcd.yaml kubectl -n kube-system exec -it etcd-master1 -- sh # kubectl -n kube-system exec -it etcd-<Tab> -- sh etcdctl -h exit
- master1의 etcd에 etcdctl -h 명령을 입력하면 etcdctl 명령의 도움말을 확인할 수 있다.
(2) master1 의 etcd 동작 정보 확인
kubectl -n kube-system describe po etcd-master1 # kubectl -n kube-system describe po etcd-<tab>
(3) etcd client 설치
apt install -y etcd-client
(4) snap shot 적용하기
cd /etc/kubernetes/pki/etcd ls ETCDCTL_API=3 etcdctl --cacert=./ca.crt --cert=./server.crt \ --key=./server.key --endpoints=https://127.0.0.1:2379 snapshot save /var/lib/etcd/snapshot.db alias e='cd /etc/kubernetes/pki/etcd;ETCDCTL_API=3 etcdctl \ --cacert=./ca.crt --cert=./server.crt --key=./server.key --endpoints=https://127.0.0.1:2379' echo "alias e='cd /etc/kubernetes/pki/etcd;ETCDCTL_API=3 etcdctl --cacert=./ca.crt \ --cert=./server.crt --key=./server.key --endpoints=https://127.0.0.1:2379'" >> ~/.bashrc e snapshot save /var/lib/etcd/snapshot.db
7. update 진행 - master node
(1) 업데이트할 버전 다운로드 및 확인
sudo apt-get install -y kubeadm=1.25.2-00 sudo kubeadm version
(2) 노드 드레인
kubectl drain master1 --ignore-daemonsets
(3) Upgrade plan 확인
sudo kubeadm upgrade plan
(4) kubeadm 업그레이드sudo kubeadm upgrade apply v1.25.2
(5) kubelet, kubectl 업그레이드
sudo apt-get install -y kubelet=1.25.2-00 kubectl=1.25.2-00
(6) 업그레이드 적용을 위해 재시작, uncordon 후 노드 확인
sudo systemctl daemon-reload sudo systemctl restart kubelet kubectl uncordon master1 kubectl get node
8. update 진행 - worker node
(1) worker node 에서 kubeadm, kubelet, kubectl 업그레이드
sudo apt-get update && sudo apt-get install -y kubeadm=1.25.2-00 kubelet=1.25.2-00 kubectl=1.25.2-00
(2) master node 에서 노드 드레인
kubectl drain worker1 --ignore-daemonsets --delete-emptydir-data
(3) worker node 에서 업그레이드 적용을 위한 재시작sudo kubeadm upgrade node sudo systemctl daemon-reload sudo systemctl restart kubelet
(4) master node 에서 worknode uncordon 후, 노드 확인
kubectl uncordon worker1 kubectl get node
(5) master node Taint 해제 (Optional , 테스트환경에서 사용)
kubectl taint node master1 node-role.kubernetes.io/control-plane- kubectl describe no master1|grep -i taint
9. 소스/대상 확인 중지
# master node가 게이트웨이 역할을 하게하고, private subnet instance(worker node)를 인터넷에 안전하게 연결하기위한 작업
(1) 인스턴스 > 인스턴스 에서 node 선택 후, 작업 -> 네트워킹 -> 소스/대상 확인 변경 클릭
# master node, worker node 둘다 실행(2) 소스/대상 확인 중지 선택 후 저장
10. Dashboard 설치하기
(1) metrics-server 설정하기1
# 참조 : https://github.com/kubernetes-sigs/metrics-server
kubectl apply -f \ https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
(2) metrics-server 에디터
kubectl -n kube-system edit deployment metrics-server
- editor 접근 후, 아래 줄 추가
- --kubelet-insecure-tls
(3) top 명령어 (리소스를 많이쓰는 Pod 식별)
kubectl top pods --all-namespaces kubectl top nodes
(4) Dashboard 앱 배포하기
kubectl apply -f \ https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
(5) 리소스 목록 확인
kubectl get -f \ https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
(6) 외부에서 접근할 수 있도록 service type 변경kubectl edit -n kubernetes-dashboard svc kubernetes-dashboard kubectl get -n kubernetes-dashboard svc kubernetes-dashboard
- edit 명령 후 변경, type: ClusterIP -> NodePort로 변경
- get 명령후 , Port 확인
(7) 로그인을 위한 Token 발급
kubectl -n kubernetes-dashboard create token kubernetes-dashboard
(8) 권한 부여
kubectl create clusterrolebinding kubernetes-dashboard-admin --clusterrole cluster-admin \ --serviceaccount kubernetes-dashboard:kubernetes-dashboard
(9) 확인
- https://<master node public IP>:<dashboard Port> 로 접속'Cloud > Kubernetes' 카테고리의 다른 글
Kubernetes) Application 배포 (0) 2022.10.24 Kubernetes) Kubernetes ReplicaSet (0) 2022.10.21 Kubernetes) AWS 기반 쿠버네티스 H.A 구축 프로젝트 1편 (0) 2022.10.18 Kubernetes) Kubernetes Volume (0) 2022.10.13 Kubernetes) Kubernetes Pod (0) 2022.10.13