Exercise 16.2: Detailed Steps

  1. HAProxy로 SSH 접속

    ssh root@HAPROXY_IP_ADDRESS
  2. HAProxy 설치

    sudo apt update && sudo apt install -y haproxy
  3. HAProxy 설정파일에 /etc/haproxy/haproxy.cfg 라인들을 추가 - CP_IP_ADDRESS에 CP 노드의 IP 주소를 넣으세요.

    frontend kubernetes-cp
       mode	tcp
       option tcplog
       bind *:6443
       default_backend kubernetes-cp-nodes
    
    backend kubernetes-cp-nodes
       mode tcp
       balance roundrobin
       server cp1 CP_IP_ADDRESS:6443 check  
    
    listen stats
         bind :9999
         mode http
         stats enable
         stats hide-version
         stats uri /stats
  4. HAProxy 데몬을 재시작하고 상태 확인

    {
        sudo systemctl restart haproxy
        sudo systemctl status haproxy --no-pager
    }
  5. CP 노드에 연결된 터미널로 이동

  6. /etc/hosts 파일에서 k8scp에 지정된 IP주소를 HAProxy IP 주소로 변경

    HAPROXY_IP_ADDRESS k8scp
  7. k8scp에 연결된 IP 주소 확인

    nslookup k8scp
  8. Worker 노드에 연결된 터미널로 이동

  9. /etc/hosts 파일에서 k8scp에 지정된 IP주소를 HAProxy IP 주소로 변경

    HAPROXY_IP_ADDRESS k8scp
  10. k8scp에 연결된 IP 주소 확인

    nslookup k8scp
  11. 웹 브라우저를 열고 HAPROXY_IP_ADDRESS:9999/stats 주소로 접속

  12. CP 노드에 연결된 터미널로 이동

  13. kubectl 명령어로 API 호출

    {
        kubectl get node
        kubectl get pod -A
    }
  14. HAProxy 통계 페이지를 리프레시해서 트래픽 정보가 업데이트 되는지 확인

  15. SecondCP로 SSH 접속

    ssh root@SECOND_CP_IP_ADDRESS
  16. 실습 환경에 필요한 라이브러리 설치

    sudo apt update && sudo apt install -y \
    curl apt-transport-https vim git wget gnupg2 net-tools \
    software-properties-common lsb-release ca-certificates uidmap
  17. 컨테이너 런타임 설치

    {
        cat <<EOF | sudo tee /etc/modules-load.d/kubernetes.conf
    overlay
    br_netfilter
    EOF
    
        sudp modprobe overlay
        sudo modprobe br_netfilter
    
        cat <<EOF | sudo tee /etc/sysctl.d/kubernetes.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
    
        sudo sysctl --system
        
        sudo mkdir -p /etc/apt/keyrings
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
        echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
        sudo apt update && apt install -y containerd.io
        sudo containerd config default | tee /etc/containerd/config.toml
        sudo sed -e 's/SystemdCgroup = false/SystemdCgroup = true/g' -i /etc/containerd/config.toml
        sudo systemctl restart containerd
        
        cat <<EOF | sudo tee /etc/crictl.yaml
    runtime-endpoint: unix:///run/containerd/containerd.sock
    EOF
    }
  18. 쿠버네티스 설치 및 구동에 필요한 바이너리 설치

    {
        curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
        echo "deb  http://apt.kubernetes.io/  kubernetes-xenial  main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
        sudo apt update && apt install -y kubelet=1.28.1-00 kubeadm=1.28.1-00 kubectl=1.28.1-00
        sudo apt-mark hold kubelet kubeadm kubectl
    }
  19. /etc/hosts 파일에 아래와 같은 라인 추가

    HAPROXY_IP_ADDRESS k8scp
  20. k8scp에 연결된 IP 주소 확인

    nslookup k8scp
  21. ThirdCP로 SSH 접속

    ssh root@THIRD_CP_IP_ADDRESS
  22. 16번부터 20번 단계를 실행

  23. CP 노드에 연결된 터미널로 이동

  24. 컨트롤 플레인 조인 명령어 생성

    echo "sudo kubeadm join k8scp:6443 --control-plane \
    --token $(sudo kubeadm token create) \
    --discovery-token-ca-cert-hash sha256:$(openssl x509 -pubkey \
    -in /etc/kubernetes/pki/ca.crt | openssl rsa \
    -pubin -outform der 2>/dev/null | openssl dgst \
    -sha256 -hex | grep -oE '[A-z0-9]+$') \
    --certificate-key $(sudo kubeadm init phase upload-certs --upload-certs| tail -1)" 
  25. 위에서 생성한 명령어를 SecondCP 노드 및 ThirdCP 노드에 실행

  26. HAProxy 노드에 연결된 터미널로 이동

  27. HAProxy 설정파일을 /etc/haproxy/haproxy.cfg 아래와 같이 수정

    ...
    ...
    backend kubernetes-cp-nodes
       mode tcp
       balance roundrobin
       server cp1 CP_IP_ADDRESS:6443 check
       server cp2 SECOND_CP_IP_ADDRESS:6443 check
       server cp3 THIRD_CP_IP_ADDRESS:6443 check
  28. HAProxy 데몬을 재시작하고 상태 확인

    {
        sudo systemctl restart haproxy
        sudo systemctl status haproxy --no-pager
    }
  29. 웹 브라우저를 열고 HAPROXY_IP_ADDRESS:9999/stats 주소로 접속해서 위에서 추가한 노드들의 연결 상태 확인

  30. CP 노드에 연결된 터미널로 이동

  31. Node 목록 확인

    kubectl get node
  32. kubectl 명령어로 몇가지 API 호출을 실행하고 HAProxy 통계사이트에서 로드가 분산되는지 확인

    for i in {1..10}; do kubectl get pod; done
  33. 실행중인 ETCD Pod 확인

    kubectl get pod -n kube-system -l component=etcd 
  34. 새롭게 추가된 ETCD Pod의 로그 확인

    kubectl -n kube-system logs etcd-secondcp | grep leader
  35. 실행중인 ETCD Pod의 IP 주소 확인

    kubectl get pod -n kube-system -l component=etcd -o wide
  36. 각 노드의 IP 주소 확인

    kubectl get node -o wide
  37. ETCD 클러스터의 멤버 목록 확인

    kubectl -n kube-system exec -it etcd-cp -- \
    etcdctl -w table \
    --endpoints localhost:2379 \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    member list
  38. ETCD 클러스터 멤버 목록을 환경변수로 지정

    {
        export ETCD_ENDPOINTS=$(kubectl -n kube-system exec -it etcd-cp -- \
        etcdctl -w json \
        --endpoints localhost:2379 \
        --cacert /etc/kubernetes/pki/etcd/ca.crt \
        --cert /etc/kubernetes/pki/etcd/server.crt \
        --key /etc/kubernetes/pki/etcd/server.key \
        member list \
        | jq -r '.members | map(.clientURLs[]) | join(",")')
        echo $ETCD_ENDPOINTS
    }
  39. ETCD 클러스터의 리더 확인

    kubectl -n kube-system exec -it etcd-cp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint status
  40. ETCD 클러스터의 각 멤버별 상태 확인

    kubectl -n kube-system exec -it etcd-cp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint health
  41. ETCD 클러스터의 리더 Pod가 배포된 노드에 가서 kubelet 및 컨테이너 런타임 정지- CP 노드의 ETCD가 가장 먼저 구성되었기 때문에 일반적으로 CP 노드에 배포된 ETCD가 리더

    {
        sudo systemctl stop kubelet
        sudo crictl stop $(sudo crictl ps -q)
        sudo systemctl stop containerd.service
    }
  42. ETCD Pod 로그 확인

    kubectl -n kube-system logs etcd-secondcp | grep leader
  43. 웹 브라우저를 열고 HAPROXY_IP_ADDRESS:9999/stats 주소로 접속해서 위에서 노드들의 연결 상태 확인

  44. ETCD 클러스터의 리더가 변경되었는지 확인

    kubectl -n kube-system exec -it etcd-secondcp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint status
  45. ETCD 클러스터 각 멤버별 상태 확인

    kubectl -n kube-system exec -it etcd-secondcp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint health
  46. Node 상태 확인

    kubectl get node
  47. CP 노드에서 kubelet 및 컨테이너 런타임을 재실행

    {
        sudo systemctl start containerd.service
        sudo systemctl start kubelet
    }
  48. 웹 브라우저를 열고 HAPROXY_IP_ADDRESS:9999/stats 주소로 접속해서 위에서 노드들의 연결 상태 확인

  49. 노드 상태 확인

    kubectl get node
  50. 모든 Pod가 정상적으로 실행되고 있는지 확인

    kubectl get pod -A -o wide
  51. ETCD 클러스터의 리더가 다시 변경되었는지 확인

    kubectl -n kube-system exec -it etcd-secondcp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint status
  52. ETCD 클러스터 각 멤버별 상태 확인

    kubectl -n kube-system exec -it etcd-secondcp -- \
    etcdctl -w table \
    --endpoints $ETCD_ENDPOINTS \
    --cacert /etc/kubernetes/pki/etcd/ca.crt \
    --cert /etc/kubernetes/pki/etcd/server.crt \
    --key /etc/kubernetes/pki/etcd/server.key \
    endpoint health

Last updated