클러스터 문제 진단을 위한 스냅샷 만들기

클러스터 중 하나에 문제가 발생하면 클라우드 고객 관리에서 도움을 얻을 수 있습니다. 고객 관리에 문의할 때 문제 진단을 위해 클러스터 '스냅샷'이 필요할 수도 있습니다. 스냅샷은 클러스터 및 노드 구성 파일을 캡처해서 하나의 tar 파일로 만든 것입니다.

이 문서에서는 클러스터에 대해 기본 스냅샷 또는 맞춤설정된 스냅샷을 만드는 방법을 설명합니다. 또한 클러스터에 특정 오류가 발생했을 때 스냅샷을 만드는 방법을 설명합니다.

기본 스냅샷

다음 섹션에서는 표준 스냅샷에 포함된 항목과 이를 만드는 방법을 설명합니다. 맞춤설정된 스냅샷에 대한 자세한 내용은 맞춤설정된 스냅샷을 참조하세요.

기본 스냅샷에 포함되는 정보는 무엇인가요?

클러스터 스냅샷은 클러스터의 구성 파일 및 로그가 포함된 tar 파일입니다. 특히, 명령어의 기본 구성에는 클러스터에 대한 다음 정보가 포함됩니다.

  • Kubernetes 버전.

  • kube-system 및 gke-system 네임스페이스의 Kubernetes 리소스 상태: 클러스터, 머신, 노드, 서비스, 엔드포인트, ConfigMap, ReplicaSet, CronJob, pod, 이러한 pod 소유자, 배포, DaemonSet, StatefulSet.

  • IP 주소, iptable 규칙, 마운트 지점, 파일 시스템, 네트워크 연결, 실행 중인 프로세스를 포함한 각 노드 구성에 대한 세부정보.

  • bmctl check cluster --snapshot 명령어의 로그

클러스터의 사용자 인증 정보는 기본 스냅샷에 포함되지 않습니다. Cloud Customer Care에서 이 정보를 요청하면 클러스터 정보 검색을 참조하세요.

스냅샷 명령어를 실행할 때 수집되는 전체 정보 목록은 세부 구성 파일 섹션에 표시된 구성 파일을 참조하세요. 이 구성 파일은 기본 스냅샷을 만들 때 실행되는 명령어를 보여줍니다.

기본 스냅샷을 만드는 방법

bmctl check cluster 명령어는 클러스터의 스냅샷을 만듭니다. 이 명령어를 사용하여 다음 작업 중 하나를 수행할 수 있습니다.

  • 스냅샷을 만들고 이 스냅샷을 Cloud Storage 버킷에 자동으로 업로드합니다.
  • 클러스터의 스냅샷을 만들고 명령어를 실행하는 로컬 머신에 스냅샷 파일을 저장합니다.

방법 #1: 기본 스냅샷을 만들고 Cloud Storage 버킷으로 자동 업로드

스냅샷을 만들고 Cloud Storage 버킷으로 업로드하려면 다음을 수행합니다.

  1. API 및 서비스 계정을 설정합니다.

    1. Google Cloud 프로젝트 내에서 Cloud Storage API를 사용 설정합니다.
    2. 서비스 계정이 데이터를 Cloud Storage로 업로드할 수 있도록 서비스 계정에 storage.admin 역할을 부여합니다.
    3. 서비스 계정에 대해 JSON 키를 다운로드합니다.

    자세한 내용은 Google 서비스 및 서비스 계정 사용 설정을 참조하세요.

  2. 다음 bmctl 명령어를 실행하여 스냅샷을 만들고 Cloud Storage 버킷으로 자동으로 업로드합니다.

    bmctl check cluster --snapshot --cluster=CLUSTER_NAME \
        --kubeconfig=KUBECONFIG_PATH \
        --upload-to BUCKET_NAME \
        [--service-account-key-file SERVICE_ACCOUNT_KEY_FILE]

    명령어에서 다음 항목을 클러스터 환경에 해당하는 정보로 바꿉니다.

    • CLUSTER_NAME: 스냅샷을 만들려는 클러스터의 이름입니다.
    • KUBECONFIG_PATH: 관리자 클러스터 kubeconfig 파일의 경로 (kubeconfig 파일의 경로는 기본적으로 bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig입니다. 그러나 WORKSPACE_DIR 플래그로 작업공간을 지정한 경우 경로는 WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig입니다.)
    • BUCKET_NAME: 소유한 Cloud Storage 버킷의 이름입니다.
    • SERVICE_ACCOUNT_KEY_FILE: --service-account-key-file 플래그를 제공하지 않으면 bmctlGOOGLE_APPLICATION_CREDENTIALS 환경 변수에서 서비스 계정 키 파일의 경로를 가져오려고 시도합니다.
  3. Google Cloud 지원팀의 업데이트된 클러스터 스냅샷 보기 허용에 설명된 대로 서비스 계정을 만들고 클라우드 고객 관리와 액세스를 공유합니다.

방법 2: 로컬 머신에 기본 스냅샷 만들기

다음 명령어로 생성된 클러스터의 상태를 캡처할 수 있습니다.

bmctl check cluster --snapshot --cluster=CLUSTER_NAME \
    --kubeconfig=KUBECONFIG_PATH

다음을 바꿉니다.

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

  • KUBECONFIG_PATH: 관리자 클러스터 kubeconfig 파일의 경로 (kubeconfig 파일의 경로는 기본적으로 bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig입니다. 그러나 WORKSPACE_DIR 플래그로 작업공간을 지정한 경우 경로는 WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig입니다.)

이 명령어는 로컬 머신에 tar 파일을 출력합니다. 이 tar 파일의 이름은 snapshot-CLUSTER_NAME-TIMESTAMP.tar.gz 형식입니다. 여기서 TIMESTAMP는 파일이 생성된 날짜 및 시간을 나타냅니다. 이 tar 파일에는 클러스터의 시스템 구성요소 및 머신에 대한 관련 디버그 정보가 포함됩니다.

이 명령어를 실행하면 gke-system, gke-connect, capi-system, capi-webhook-system, cert-manager, capi-kubeadm-bootstrap-system 네임스페이스에서 포드에 대한 정보가 수집됩니다.

하지만 --snapshot-scenario all 플래그를 사용해서 수집되는 진단 정보 범위를 넓힐 수 있습니다. 이 플래그는 클러스터의 모든 포드를 포함하도록 진단 스냅샷 범위를 늘립니다.

bmctl check cluster --snapshot --snapshot-scenario all \
    --cluster=CLUSTER_NAME \
    --kubeconfig=KUBECONFIG_PATH

스냅샷 시나리오

bmctl check cluster --snapshot 명령어는 두 가지 시나리오를 지원합니다. 시나리오를 지정하려면 --scenario 플래그를 사용합니다. 다음 목록에는 가능한 값이 나와 있습니다.

  • system: 로그를 포함한 시스템 구성요소의 스냅샷을 수집합니다.

  • all: 로그를 포함한 모든 포드의 스냅샷을 수집합니다.

두 가지 시나리오를 각각 관리자 클러스터 또는 사용자 클러스터에 사용할 수 있습니다. 예를 들어 system 시나리오를 사용하여 관리자 클러스터 스냅샷을 만들려면 다음을 실행합니다.

bmctl check cluster --snapshot --snapshot-scenario system \
    --cluster=ADMIN_CLUSTER_NAME \
    --kubeconfig=ADMIN_KUBECONFIG_PATH

all 시나리오를 사용하여 사용자 클러스터 스냅샷을 만들려면 다음을 실행합니다.

bmctl check cluster --snapshot --snapshot-scenario all \
    --cluster=USER_CLUSTER_NAME \
    --kubeconfig=USER_KUBECONFIG_PATH

스냅샷의 테스트 실행 수행

--snapshot-dry-run 플래그를 사용하면 명령어가 스냅샷을 만들지 않습니다. 대신 스냅샷 명령어가 수행할 작업을 표시하고 스냅샷 구성 파일을 출력합니다. 스냅샷 구성 파일에 대한 자세한 내용은 맞춤설정된 스냅샷을 만드는 방법을 참조하세요.

관리자 클러스터에서 테스트 실행 스냅샷을 수행하려면 다음 명령어를 입력합니다.

bmctl check cluster --snapshot --snapshot-dry-run \
    --cluster=ADMIN_CLUSTER_NAME \
    --kubeconfig=ADMIN_KUBECONFIG_PATH

사용자 클러스터에서 테스트 실행 스냅샷을 수행하려면 다음 명령어를 입력합니다.

bmctl check cluster --snapshot --snapshot-dry-run \
    --cluster=USER_CLUSTER_NAME \
    --kubeconfig=USER_KUBECONFIG_PATH

맞춤설정된 스냅샷

다음 이유로 인해 클러스터에 대해 맞춤설정된 스냅샷을 만들어야 할 수도 있습니다.

  • 기본 스냅샷에 제공되는 것보다 더 많은 클러스터에 대한 정보를 포함하기 위해
  • 기본 스냅샷에 있는 일부 정보를 제외하기 위해

맞춤설정된 스냅샷을 만드는 방법

맞춤설정된 스냅샷을 만들려면 스냅샷 구성 파일을 사용해야 합니다. 다음 단계에서는 구성 파일을 만들고, 이를 수정하고, 이를 사용해서 클러스터에 대해 맞춤설정된 스냅샷을 만드는 방법을 설명합니다.

  1. 클러스터에서 다음 명령어를 실행하고 출력을 파일에 기록하여 스냅샷 구성 파일을 만듭니다.

    bmctl check cluster \
        --snapshot --snapshot-dry-run --cluster CLUSTER_NAME \
        --kubeconfig KUBECONFIG_PATH
  2. 맞춤설정된 스냅샷에 표시하려는 정보 유형을 정의합니다. 이렇게 하려면 1단계에서 만든 스냅샷 구성 파일을 수정합니다. 예를 들어 특정 노드의 실행 시간과 같이 스냅샷에 추가 정보를 포함하고 싶으면 구성 파일에서 관련 섹션에 Linux 명령어 uptime을 추가합니다. 다음 구성 파일 스냅샷은 스냅샷 명령어를 사용해서 노드 10.200.0.3에 대해 uptime 정보를 제공하는 방법을 보여줍니다. 이 정보는 표준 스냅샷에 표시되지 않습니다.

    ...
    nodeCommands:
    - nodes:
      - 10.200.0.3
      commands:
      - uptime
    ...
    
  3. 구성 파일을 수정해서 원하는 스냅샷 유형을 정의한 다음에는 다음 명령어를 실행하여 맞춤설정된 스냅샷을 만듭니다.

    bmctl check cluster --snapshot --snapshot-config SNAPSHOT_CONFIG_FILE \
        --cluster CLUSTER_NAME--kubeconfig KUBECONFIG_PATH

    --snapshot-config 플래그는 bmctl 명령어가 스냅샷 구성 파일 내용을 사용해서 스냅샷에 표시되는 정보를 정의하도록 지시합니다.

세부 구성 파일

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

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

구성 파일에 있는 다음 항목은 위에서 샘플 구성 파일에 표시되는 것과 다르게 보일 수 있습니다.

  • nodeCommandsnodeFiles 섹션에 있는 노드 IP 주소
  • 클러스터의 nodeSSHKey 경로

구성 파일의 필드

스냅샷 구성 파일은 YAML 형식입니다. 구성 파일에는 다음 필드가 포함됩니다.

  • numOfParallelThreads: 스냅샷 루틴은 일반적으로 여러 명령어를 실행합니다. 여러 동시 스레드를 사용하면 루틴을 더 빠르게 실행할 수 있습니다. 앞의 샘플 구성 파일에 나온 것처럼 numOfParallelThreads10으로 설정하는 것이 좋습니다. 스냅샷이 너무 오래 걸리면 이 값을 늘립니다.

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

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

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

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

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

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

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

  • nodeSSHKey: SSH 키 파일의 경로입니다. 관리자 클러스터에 연결할 수 없으면 이 필드가 필요합니다.

특정 오류가 발생할 때 스냅샷 만들기

설치 또는 업그레이드 중단 중에 기본 스냅샷을 만드는 방법

관리자, 하이브리드 또는 독립형 클러스터를 설치하거나 업그레이드할 때 bmctl은 다음 출력이 표시될 수 있는 시점에 멈출 수 있습니다.

  • 클러스터 kubeconfig가 준비될 때까지 기다리는 중입니다.
  • 클러스터가 준비될 때까지 기다리는 중입니다.
  • 노드 풀이 준비될 때까지 기다리는 중입니다.
  • 업그레이드가 완료될 때까지 기다리는 중입니다.

설치 또는 업그레이드가 중단되면 부트스트랩 클러스터를 사용하여 다음 명령어를 실행하여 클러스터의 스냅샷을 만들 수 있습니다.

bmctl check cluster --snapshot --cluster=CLUSTER_NAME \
    --kubeconfig=WORKSPACE_DIR/.kindkubeconfig

설치 또는 업그레이드 중단 중에 맞춤설정된 스냅샷을 만드는 방법

다음 단계는 설치 또는 업그레이드가 중단될 때 클러스터의 맞춤설정된 스냅샷을 만드는 방법을 보여줍니다.

  1. 아카이브에서 클러스터의 스냅샷 구성 파일을 검색합니다.

  2. 스냅샷에 필요한 정보가 포함되도록 스냅샷 구성 파일을 수정합니다.

  3. 다음 명령어를 실행하여 맞춤설정된 스냅샷을 만듭니다.

    bmctl check cluster --snapshot
        --snapshot-config=SNAPSHOT_CONFIG_FILE \
        --cluster=CLUSTER_NAME
        --kubeconfig=WORKSPACE_DIR/.kindkubeconfig

관리자 클러스터에 연결할 수 없을 때 맞춤설정된 스냅샷을 만드는 방법

관리자 클러스터에 연결할 수 없을 때 다음 명령어를 실행하여 클러스터에 대해 맞춤설정된 스냅샷을 만들 수 있습니다.

bmctl check cluster --snapshot --cluster CLUSTER_NAME
    --node-ssh-key SSH_KEY_FILE
    --nodes NODE_1_IP_ADDRESS, NODE_2_IP_ADDRESS, ...

명령어에서 다음 항목을 클러스터 환경에 해당하는 정보로 바꿉니다.

  • CLUSTER_NAME: 스냅샷을 만들려는 클러스터의 이름입니다.
  • SSH_KEY_FILE: 노드 SSH 키 파일의 경로입니다.
  • NODE_x_IP_ADDRESS: 정보가 필요한 클러스터 노드의 IP 주소입니다.

또는 노드 IP 주소를 별도의 줄에 나열할 수 있습니다.

bmctl check cluster
    --snapshot --cluster CLUSTER_NAME \
    --node-ssh-key SSH_KEY_FILE \
    --nodes NODE_1_IP_ADDRESS \
    --nodes NODE_2_IP_ADDRESS
  ...