문제 해결: 클러스터 진단 및 재설정

클러스터를 진단하거나 확인하여 문제를 디버깅하고 클러스터 상태의 스냅샷을 캡처할 수 있습니다. 또한 설치 시 부분적으로 성공했지만 클러스터가 오류를 반환하거나 올바르게 작동하지 않는 경우 클러스터를 재설정할 수 있습니다.

bmctl check cluster를 사용한 클러스터 진단

bmctl check cluster 명령어로 생성된 클러스터의 상태를 캡처할 수 있습니다. 명령 플래그를 사용하면 명령어의 진단 범위를 선택할 수 있으므로 집중된 정보를 얻을 수 있습니다.

진단 정보는 문제를 발견하고 더 효과적으로 배포를 디버깅하는 데 도움이 될 수 있습니다. 이 명령어는 정의된 범위에 해당하는 모든 관련 클러스터 및 노드 구성 파일을 캡처한 후 단일 tar 보관 파일에 해당 정보를 패키징합니다.

bmctl check cluster --snapshot --cluster CLUSTER_NAME --admin-kubeconfig ADMIN_KUBECONFIG_PATH

다음을 바꿉니다.

  • CLUSTER_NAME: 대상 클러스터의 이름입니다.

  • ADMIN_KUBECONFIG_PATH: 관리자 클러스터 kubeconfig 파일의 경로입니다.

이 명령어는 지정된 클러스터에 있는 모든 시스템 구성요소와 머신의 관련 디버그 정보를 포함하는 tar 보관 파일을 출력합니다.

다음 명령어 플래그로 수집된 진단 정보의 범위를 변경할 수 있습니다.

  • --snapshot-scenario all 플래그는 지정된 클러스터의 모든 pod를 포함하도록 진단 스냅샷의 범위를 늘립니다.
bmctl check cluster --snapshot --snapshot-scenario all --cluster CLUSTER_NAME --admin-kubeconfig ADMIN_KUBECONFIG_PATH
  • --snapshot-dry-run 플래그는 --snapshot-config string 플래그와 함께 작동합니다. 커스텀 진단 범위를 정의하기 위해 수정할 수 있는 구성 파일을 출력하려면 --snapshot-dry-run 플래그를 사용하세요. 범위에 특정 pod, 네임스페이스 또는 노드 명령어가 포함될 수 있습니다.

--snapshot-dry-run 플래그로 생성된 출력 파일을 수정한 후에는 이 파일을 입력으로 사용하여 아래에 설명된 --snapshot-config string 플래그로 특정 범위를 진단할 수 있습니다. 이 플래그를 생략하면 기본 구성이 적용됩니다.

bmctl check cluster --snapshot --snapshot-dry-run --cluster CLUSTER_NAME --admin-kubeconfig ADMIN_KUBECONFIG_PATH
  • --snapshot-config 플래그는 bmctl 명령어에 지시하여 스냅샷 구성 파일에 지정된 범위 옵션을 사용하도록 합니다. 일반적으로 --snapshot-dry-run 플래그로 스냅샷 구성 파일을 만듭니다.
bmctl check cluster --snapshot --snapshot-config SNAPSHOT_CONFIG_FILE --cluster CLUSTER_NAME --admin-kubeconfig ADMIN_KUBECONFIG_PATH

관리자 클러스터에 연결할 수 없을 때 클러스터 진단

관리자 클러스터가 작동 중지되거나 연결할 수 없는 경우 스냅샷 구성 파일을 사용하여 클러스터 스냅샷을 만듭니다. 스냅샷 구성 파일은 YAML 형식입니다. 구성 파일에는 클러스터에 정보를 캡처하는 방법을 지정하는 다음 필드가 포함되어 있습니다.

  • numOfParallelThreads: 스냅샷 루틴은 일반적으로 여러 명령어를 실행합니다. 여러 동시 스레드를 사용하면 루틴을 더 빠르게 실행할 수 있습니다. 다음 예시와 같이 numOfParallelThreads10으로 설정하는 것이 좋습니다. 스냅샷이 너무 오래 걸리면 이 값을 늘립니다.

  • excludeWords: 스냅샷에 대량의 클러스터 노드 데이터가 포함됩니다. 스냅샷을 공유할 때 보안 위험을 줄이려면 excludeWords를 사용합니다. 예를 들어 해당 비밀번호 문자열을 식별할 수 없도록 password를 제외합니다.

  • nodeCommands: 이 섹션에서는 다음 정보를 지정합니다.

    • nodes: 정보를 수집할 클러스터 노드의 IP 주소 목록입니다. 관리자 클러스터에 연결할 수 없을 때 스냅샷을 만들려면 노드 IP 주소를 하나 이상 지정합니다.

    • commands: 각 노드에서 실행할 명령어 및 인수 목록입니다. 각 명령어의 출력이 스냅샷에 포함됩니다.

  • nodeFiles: 이 섹션에서는 다음 정보를 지정합니다.

    • nodes: 파일을 수집할 클러스터 노드의 IP 주소 목록입니다. 관리자 클러스터에 연결할 수 없을 때 스냅샷을 만들려면 노드 IP 주소를 하나 이상 지정합니다.

    • files: 각 노드에서 검색할 파일의 목록입니다. 지정된 파일이 노드에서 발견되면 스냅샷에 포함됩니다.

  • nodeSSHKey: 노드의 SSH 키 파일 경로입니다. 이 필드는 관리자 클러스터에 연결할 수 없을 때 스냅샷을 만드는 데 필요합니다.

스냅샷 구성 파일을 사용하여 스냅샷을 만들려면 다음 명령어를 사용합니다.

bmctl check cluster --snapshot --snapshot-config SNAPSHOT_CONFIG

SNAPSHOT_CONFIG를 스냅샷 구성 파일의 경로로 바꿉니다.

다음 샘플 스냅샷 구성 파일은 스냅샷을 만드는 데 사용되는 표준 명령어와 파일을 보여줍니다. 추가 진단 정보가 필요한 경우 명령어와 파일을 더 추가할 수 있습니다.

numOfParallelThreads: 10
excludeWords:
- password
nodeCommands:
- nodes:
  - 10.200.0.3
  - 10.200.0.4
  commands:
  - uptime
  - df --all --inodes
  - ip addr
  - ip neigh
  - iptables-save --counters
  - mount
  - ip route list table all
  - top -bn1 || true
  - docker info || true
  - docker ps -a || true
  - crictl ps -a || true
  - docker ps -a | grep anthos-baremetal-haproxy | cut -d ' ' -f1 | head -n 1 | xargs
    sudo docker logs || true
  - docker ps -a | grep anthos-baremetal-keepalived | cut -d ' ' -f1 | head -n 1 |
    xargs sudo docker logs || true
  - crictl ps -a | grep anthos-baremetal-haproxy | cut -d ' ' -f1 | head -n 1 | xargs
    sudo crictl logs || true
  - crictl ps -a | grep anthos-baremetal-keepalived | cut -d ' ' -f1 | head -n 1 |
    xargs sudo crictl logs || true
  - ps -edF
  - ps -eo pid,tid,ppid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm,args,cgroup
  - conntrack --count
  - dmesg
  - systemctl status -l docker || true
  - journalctl --utc -u docker
  - journalctl --utc -u docker-monitor.service
  - systemctl status -l kubelet
  - journalctl --utc -u kubelet
  - journalctl --utc -u kubelet-monitor.service
  - journalctl --utc --boot --dmesg
  - journalctl --utc -u node-problem-detector
  - systemctl status -l containerd || true
  - journalctl --utc -u containerd
  - systemctl status -l docker.haproxy || true
  - journalctl --utc -u docker.haproxy
  - systemctl status -l docker.keepalived || true
  - journalctl --utc -u docker.keepalived
  - systemctl status -l container.haproxy || true
  - journalctl --utc -u container.haproxy
  - systemctl status -l container.keepalived || true
  - journalctl --utc -u container.keepalived
nodeFiles:
- nodes:
  - 10.200.0.3
  - 10.200.0.4
  files:
  - /proc/sys/fs/file-nr
  - /proc/sys/net/netfilter/nf_conntrack_max
  - /proc/sys/net/ipv4/conf/all/rp_filter
  - /lib/systemd/system/kubelet.service
  - /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
  - /lib/systemd/system/docker.service || true
  - /etc/systemd/system/containerd.service || true
  - /etc/docker/daemon.json || true
  - /etc/containerd/config.toml || true
  - /etc/systemd/system/container.keepalived.service || true
  - /etc/systemd/system/container.haproxy.service || true
  - /etc/systemd/system/docker.keepalived.service || true
  - /etc/systemd/system/docker.haproxy.service || true
nodeSSHKey: ~/.ssh/id_rsa # path to your ssh key file to each nodes

관리자 클러스터의 중단된 설치/업그레이드에 대한 스냅샷 만들기

관리자/하이브리드/독립형 클러스터를 설치할 때 bmctl이 다음 출력에서 멈춘 경우

  • 클러스터 kubeconfig가 준비될 때까지 대기
  • 클러스터가 준비될 때까지 대기
  • 노드 풀이 준비될 때까지 대기

또는 관리자/하이브리드/독립형 클러스터를 업그레이드하는 경우

  • 업그레이드가 완료될 때까지 대기

다음 명령어를 실행하여 부트스트랩 클러스터를 사용하여 스냅샷을 만들 수 있습니다.

bmctl check cluster --snapshot --kubeconfig <var>WORKSPACE_DIR</var>/.kindkubeconfig --cluster <var>CLUSTER_NAME</var>

bmctl reset cluster로 클러스터 재설정

클러스터가 올바르게 설치되지 않으면 노드를 재설정하여 정상 상태로 되돌릴 수 있습니다. 그런 다음 구성을 변경한 후에 클러스터를 다시 설치할 수 있습니다.

자체 관리 클러스터 재설정

관리자 클러스터와 같이 자체적으로 관리되는 클러스터를 재설정하려면 다음 명령어를 실행합니다.

bmctl reset --cluster CLUSTER_NAME

CLUSTER_NAME을 재설정하려는 클러스터의 이름으로 바꿉니다.

사용자 클러스터 재설정

사용자 클러스터를 재설정하려면 다음 명령어를 실행합니다.

bmctl reset --cluster CLUSTER_NAME --admin-kubeconfig ADMIN_KUBECONFIG_PATH

CLUSTER_NAME을 재설정하려는 사용자 클러스터의 이름으로 바꾸고 ADMIN_KUBECONFIG_PATH를 연결된 관리자 클러스터의 kubeconfig 파일 경로로 바꿉니다. bmctl--kubeconfig--admin-kubeconfig 플래그의 별칭으로 사용하도록 지원합니다.

클러스터 세부정보 재설정

클러스터 유형에 관계없이 재설정 명령어가 전체 클러스터에 적용됩니다. 클러스터 내 노드 하위 집합을 대상으로 하는 옵션은 없습니다.

bmctl cluster reset 명령어의 결과는 이 샘플과 비슷하게 표시됩니다.

bmctl reset --cluster cluster1
Creating bootstrap cluster... OK
Deleting GKE Hub member admin in project my-gcp-project...
Successfully deleted GKE Hub member admin in project my-gcp-project
Loading images... OK
Starting reset jobs...
Resetting: 1    Completed: 0    Failed: 0
...
Resetting: 0    Completed: 1    Failed: 0
Flushing logs... OK

재설정 작업 중에 bmctl은 먼저 GKE 허브 멤버십 등록 삭제를 시도한 다음 영향을 받은 노드를 삭제합니다. 초기화 중에는 anthos-system StorageClass의 스토리지 마운트 및 데이터도 삭제됩니다.

bmctl은 모든 노드에 대해 kubeadm reset을 실행하고, 클러스터 네트워킹에 사용되는 터널 인터페이스를 삭제하고, 다음 디렉터리를 삭제합니다.

  • /etc/kubernetes
  • /etc/cni/net.d
  • /root/.kube
  • /var/lib/kubelet

부하 분산기 노드에서 bmctl도 다음 작업을 수행합니다.

  • keepalivedhaproxy 서비스 사용 중지
  • keepalivedhaproxy의 구성 파일 삭제

재설정 도구는 클러스터 구성 파일이 현재 작업 디렉터리의 다음 위치에 있을 것으로 예상합니다.

bmctl-workspace/cluster name/cluster name.yaml