Optional: Broken ETCD Cluster

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

  2. 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
  3. 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
  4. SecondCP, ThidCP 노드에 연결된 터미널로 이동해서 ETCD Pod를 삭제

    sudo mv /etc/kubernetes/manifests/etcd.yaml /root/
  5. 웹 브라우저를 열고 HAPROXY_IP_ADDRESS:9999/stats 주소로 접속해서 API 서버들의 연결 상태 확인

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

  7. Pod 목록 확인 - API 서버가 동작 하는지 확인

    kubectl get pod -A
  8. kube-apiserver 로그 확인

    crictl logs $(crictl ps --name kube-apiserver -aq)
  9. ETCD Pod의 Manifest /etc/kubernetes/manifests/etcd.yaml 를 텍스트 에디터로 열고 실행 옵션에 --force-new-cluster 추가

    ...
    spec:
      containers:
      - command:
        - etcd
        - --advertise-client-urls=https://xxx.xxx.xxx.xxx:2379
        ....
        ....
        - --force-new-cluster
  10. ETCD 컨테이너가 재성성되었는지 확인

    sudo crictl ps --name=etcd -a
  11. ETCD 컨테이너 로그 확인

    sudo crictl logs $(sudo crictl ps --name=etcd -q)
  12. CP 노드의 사설 IP 확인

    ip addr show ens5 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  13. SecondCP, ThidCP 노드에 연결된 터미널로 이동

  14. kube-apiserver Pod의 Manifest /etc/kubernetes/manifests/kube-apiserver.yaml 를 텍스트 에디터로 열고 --etcd-servers 옵션의 값을 수정

    - --etcd-servers=https://CP_PRIVATE_IP_ADDRESS:2379
  15. 웹 브라우저를 열고 HAPROXY_IP_ADDRESS:9999/stats 주소로 접속해서 API 서버들의 연결 상태 확인

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

  17. Pod 목록 확인 - API 서버가 동작 하는지 확인

    {
        kubectl get pod -A
        kubectl get node
    }
  18. ETCD Pod 상태 확인

    kubectl get pod -n kube-system -l component=etcd
  19. 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
  20. SecondCP에서 실행할 ETCD를 클러스터에 추가

    kubectl -n kube-system exec -it etcd-cp -- \
    etcdctl \
    --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 add secondcp \
    --peer-urls=https://$(kubectl get node secondcp -ojsonpath='{.status.addresses[0].address}'):2380
  21. SecondCP 노드에 연결된 터미널로 이동

  22. ETCD 데이터 삭제

    rm -rf /var/lib/etcd/*
  23. ETCD Pod를 생성

    sudo mv /root/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
  24. CP 노드에 연결된 터미널로 이동

  25. 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
  26. ThirdCP에서 실행할 ETCD를 클러스터에 추가

    kubectl -n kube-system exec -it etcd-cp -- \
    etcdctl \
    --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 add secondcp \
    --peer-urls=https://$(kubectl get node thirdcp -ojsonpath='{.status.addresses[0].address}'):2380
  27. ThirdCP 노드에 연결된 터미널로 이동

  28. ETCD 데이터 삭제

    rm -rf /var/lib/etcd/*
  29. ETCD Pod를 생성

    sudo mv /root/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
  30. CP 노드에 연결된 터미널로 이동

  31. 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
  32. 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
    }
  33. 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
  34. 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
  35. SecondCP, ThidCP 노드에 연결된 터미널로 이동

  36. kube-apiserver Pod의 Manifest /etc/kubernetes/manifests/kube-apiserver.yaml 를 텍스트 에디터로 열고 --etcd-servers 옵션의 값을 수정

    - --etcd-servers=https://127.0.0.1:2379
  37. CP 노드에 연결된 터미널로 이동

  38. ETCD Pod의 Manifest /etc/kubernetes/manifests/etcd.yaml 를 텍스트 에디터로 열고 실행 옵션에 --force-new-cluster 삭제

    ...
    spec:
      containers:
      - command:
        - etcd
        - --advertise-client-urls=https://xxx.xxx.xxx.xxx:2379
        ....
        ....
        - --force-new-cluster <- 해당 라인 삭제 
  39. Pod 목록 확인 - API 서버가 동작 하는지 확인

    {
        kubectl get pod -A
        kubectl get node
    }

Last updated