ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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)를 인터넷에 안전하게 연결하기위한 작업
        #  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> 로 접속




    댓글

Designed by Tistory.