Cloud/Kubernetes

Kubernetes) AWS 기반 쿠버네티스 H.A 구축 프로젝트 2편

Adım Kim 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)를 인터넷에 안전하게 연결하기위한 작업
    #  master node, worker node 둘다 실행

(1)  인스턴스 > 인스턴스 에서 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> 로 접속