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

이 문서에서는 VMware용 Google Distributed Cloud(소프트웨어만 해당)를 사용하여 만든 클러스터에서 문제를 해결하기 위해 gkectl diagnose 명령어를 사용하여 진단 스냅샷을 만드는 방법을 보여줍니다. gkectl 도구에는 문제를 해결하는 데 사용할 수 있는 두 가지 명령어 gkectl diagnose snapshotgkectl diagnose cluster가 있습니다. 명령어는 관리자 클러스터와 사용자 클러스터 모두에서 작동합니다.

gkectl diagnose cluster 명령어를 사용하여 클러스터 문제를 진단하는 방법을 자세히 알아보려면 클러스터 문제 진단을 참조하세요.

추가 지원이 필요하면 Cloud Customer Care에 문의하세요.

gkectl diagnose snapshot

이 명령어는 클러스터의 상태, 구성, 로그를 tar 파일 하나로 압축합니다. gkectl diagnose snapshot을 실행할 경우 이 명령어는 자동으로 gkectl diagnose cluster를 프로세스의 일부로 실행하고 출력 파일이 /diagnose-report라는 스냅샷의 새 폴더에 배치됩니다.

기본 스냅샷

gkectl diagnose snapshot 명령어 기본 구성에는 클러스터에 대한 다음 정보가 포함됩니다.

  • Kubernetes 버전.

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

  • 제어 영역 상태

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

  • Kubernetes API 서버를 사용할 수 없는 경우 관리자 클러스터의 제어 영역 노드의 컨테이너 로그

  • 리소스 풀 기반의 VM 객체 및 해당 이벤트를 포함한 vSphere 정보. 또한 VM과 연결된 데이터 센터, 클러스터, 네트워크, Datastore 객체에 대한 정보를 수집합니다.

  • 가상 서버, 가상 주소, 풀, 노드, 모니터를 포함한 F5 BIG-IP 부하 분산기 정보

  • gkectl diagnose snapshot 명령어의 로그

  • 프리플라이트 작업 로그

  • 시나리오를 기반으로 한 네임스페이스 내 컨테이너의 로그

  • 스냅샷 파일 /nodes/<admin_master_node_name>/sudo_kubeadm_certs_check-expiration의 관리자 클러스터 Kubernetes 인증서 만료 정보

  • 스냅샷에 있는 모든 파일의 HTML 색인 파일

  • 원하는 경우 --config 플래그를 사용하여 클러스터를 설치하고 업그레이드하는 데 사용되는 관리자 클러스터 구성 파일

vSphere 및 F5를 포함한 사용자 인증 정보는 tar 파일이 만들어지기 전에 삭제됩니다.

경량형 스냅샷

Google Distributed Cloud 버전 1.29 이상에서는 관리자 클러스터와 사용자 클러스터 모두에 gkectl diagnose snapshot 경량형 버전을 사용할 수 있습니다. 이 경량형 스냅샷은 클러스터에 대한 정보를 적게 캡처하므로 스냅샷 프로세스 속도가 빨라집니다. 명령어에 --scenario=lite를 추가할 때 다음 정보만 스냅샷에 포함됩니다.

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

  • gkectl diagnose snapshot 명령어의 로그

클러스터 상태 캡처

gkectl diagnose cluster 명령어가 오류를 찾으면 클러스터 상태를 캡처하고 정보를 Cloud Customer Care에 제공해야 합니다. gkectl diagnose snapshot 명령어를 사용하여 이 정보를 캡처할 수 있습니다.

gkectl diagnose snapshot에는 --config에 대한 플래그(선택사항)가 있습니다. 이 플래그는 클러스터에 대한 정보 수집 외에도 클러스터를 만들거나 업그레이드하는 데 사용된 구성 파일을 수집합니다.

관리자 클러스터 상태 캡처

관리자 클러스터 상태를 캡처하려면 다음 명령어를 실행합니다.

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG --config

--config 파라미터는 선택사항입니다.

대상 클러스터의 가상 IP 주소(VIP)에 문제가 있는 경우 --config 플래그를 사용하여 관리자 클러스터 구성 파일을 제공하여 디버깅 정보를 더 제공합니다.

버전 1.29 이상에서는 기본 스냅샷의 모든 정보가 필요하지 않으면 --scenario=lite를 포함할 수 있습니다.

출력에는 다음 예시 출력에 표시된 것처럼 파일 목록과 tar 파일의 이름이 포함됩니다.

Taking snapshot of admin cluster "[ADMIN_CLUSTER_NAME]"...
   Using default snapshot configuration...
   Setting up "[ADMIN_CLUSTER_NAME]" ssh key file...DONE
   Taking snapshots...
       commands/kubectl_get_pods_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system
       commands/kubectl_get_deployments_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system
       commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system
       ...
       nodes/[ADMIN_CLUSTER_NODE]/commands/journalctl_-u_kubelet
       nodes/[ADMIN_CLUSTER_NODE]/files/var/log/startup.log
       ...
   Snapshot succeeded. Output saved in [TAR_FILE_NAME].tar.gz.

디렉터리에 tar 파일을 추출하려면 다음 명령어를 실행합니다.

tar -zxf TAR_FILE_NAME --directory EXTRACTION_DIRECTORY_NAME

다음을 바꿉니다.

  • TAR_FILE_NAME: tar 파일의 이름입니다.

  • EXTRACTION_DIRECTORY_NAME: tar 파일을 추출해 보관처리하려는 디렉터리입니다.

스냅샷에서 생성된 파일 목록을 보려면 다음 명령어를 실행합니다.

cd EXTRACTION_DIRECTORY_NAME/EXTRACTED_SNAPSHOT_DIRECTORY
ls kubectlCommands
ls nodes/NODE_NAME/commands
ls nodes/NODE_NAME/files

NODE_NAME을 파일을 보려는 노드 이름으로 바꿉니다.

특정 작업의 세부정보를 보려면 파일 중 하나를 엽니다.

관리자 클러스터의 SSH 키 지정

관리자 클러스터 스냅샷을 가져오면 gkectl이 관리자 클러스터의 비공개 SSH 키를 자동으로 찾습니다. --admin-ssh-key-path 파라미터를 사용하여 키를 명시적으로 지정할 수도 있습니다.

SSH를 사용하여 클러스터 노드에 연결 안내를 따라 SSH 키를 다운로드합니다.

그런 다음 gkectl diagnose snapshot 명령어에서 --admin-ssh-key-path를 디코딩한 키 경로로 설정합니다.

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --admin-ssh-key-path=PATH_TO_DECODED_KEY

사용자 클러스터 상태 캡처

사용자 클러스터 상태를 캡처하려면 다음 명령어를 실행합니다.

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME

다음 출력 예시에는 파일 목록과 tar 파일의 이름이 포함됩니다.

Taking snapshot of user cluster "[USER_CLUSTER_NAME]"...
Using default snapshot configuration...
Setting up "[USER_CLUSTER_NAME]" ssh key file...DONE
    commands/kubectl_get_pods_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user
    commands/kubectl_get_deployments_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user
    commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user
    ...
    commands/kubectl_get_pods_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system
    commands/kubectl_get_deployments_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system
    commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system
    ...
    nodes/[USER_CLUSTER_NODE]/commands/journalctl_-u_kubelet
    nodes/[USER_CLUSTER_NODE]/files/var/log/startup.log
    ...
Snapshot succeeded. Output saved in [FILENAME].tar.gz.

스냅샷 시나리오

스냅샷 시나리오를 사용하면 스냅샷에 포함되는 정보를 제어할 수 있습니다. 시나리오를 지정하려면 --scenario 플래그를 사용합니다. 다음 목록에는 가능한 값이 나와 있습니다.

  • system(기본값): 지원되는 시스템 네임스페이스의 로그가 있는 스냅샷을 수집합니다.

  • all: 사용자 정의 네임스페이스를 포함한 모든 네임스페이스의 로그를 사용하여 스냅샷을 수집합니다.

  • lite(1.29 이상): Kubernetes 리소스와 gkectl 로그만 사용하여 스냅샷을 수집합니다. 컨테이너 로그 및 노드 커널 로그와 같은 다른 모든 로그는 제외됩니다.

사용 가능한 스냅샷 시나리오는 Google Distributed Cloud 버전에 따라 달라집니다.

  • 1.13보다 낮은 버전: system, system-with-logs, all, all-with-logs

  • 버전 1.13~1.28: systemall. system 시나리오는 이전의 system-with-logs 시나리오와 동일합니다. all 시나리오는 이전의 all-with-logs 시나리오와 동일합니다.

  • 버전 1.29 이상: system, all, lite.

관리자 클러스터의 스냅샷을 만들기 위해서는 시나리오를 지정할 필요가 없습니다.

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG

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

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --scenario=system

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

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --scenario=all

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

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --scenario=lite

--log-since를 사용하여 스냅샷 제한

--log-since 플래그를 사용하여 로그 컬렉션을 최근 기간으로 제한합니다. 예를 들어 최근 2일 또는 최근 3시간의 로그만 수집할 수 있습니다. 기본적으로 diagnose snapshot은 모든 로그를 수집합니다.

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=CLUSTER_NAME \
    --scenario=system \
    --log-since=DURATION

<var>DURATION</var>120m 또는 48h과 같은 시간 값으로 바꿉니다.

다음 고려사항이 적용됩니다.

  • --log-since 플래그는 kubectljournalctl 로그에서만 지원됩니다.
  • --log-since과 같은 명령어 플래그는 맞춤설정된 스냅샷 구성에서 허용되지 않습니다.

스냅샷의 테스트 실행 수행

--dry-run 플래그를 사용하여 수행할 작업과 스냅샷 구성을 표시할 수 있습니다.

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

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=ADMIN_CLUSTER_NAME \
    --dry-run

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

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --dry-run

스냅샷 구성 사용

이러한 두 시나리오(--scenario system 또는 all)가 요구를 충족하지 않으면 --snapshot-config 플래그를 사용해서 스냅샷 구성 파일을 전달하여 맞춤화된 스냅샷을 만들 수 있습니다.

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --snapshot-config=SNAPSHOT_CONFIG_FILE

스냅샷 구성 생성

--scenario 플래그와 --dry-run 플래그를 전달하여 특정 시나리오의 스냅샷 구성을 생성할 수 있습니다. 예를 들어 사용자 클러스터의 기본 시나리오 스냅샷 구성(system)을 보려면 다음 명령어를 입력합니다.

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --scenario=system
    --dry-run

출력은 다음 예시와 비슷합니다.

numOfParallelThreads: 10
excludeWords:
- password
kubectlCommands:
- commands:
  - kubectl get clusters -o wide
  - kubectl get machines -o wide
  - kubectl get clusters -o yaml
  - kubectl get machines -o yaml
  - kubectl describe clusters
  - kubectl describe machines
  namespaces:
  - default
- commands:
  - kubectl version
  - kubectl cluster-info
  - kubectl get nodes -o wide
  - kubectl get nodes -o yaml
  - kubectl describe nodes
  namespaces: []
- commands:
  - kubectl get pods -o wide
  - kubectl get deployments -o wide
  - kubectl get daemonsets -o wide
  - kubectl get statefulsets -o wide
  - kubectl get replicasets -o wide
  - kubectl get services -o wide
  - kubectl get jobs -o wide
  - kubectl get cronjobs -o wide
  - kubectl get endpoints -o wide
  - kubectl get configmaps -o wide
  - kubectl get pods -o yaml
  - kubectl get deployments -o yaml
  - kubectl get daemonsets -o yaml
  - kubectl get statefulsets -o yaml
  - kubectl get replicasets -o yaml
  - kubectl get services -o yaml
  - kubectl get jobs -o yaml
  - kubectl get cronjobs -o yaml
  - kubectl get endpoints -o yaml
  - kubectl get configmaps -o yaml
  - kubectl describe pods
  - kubectl describe deployments
  - kubectl describe daemonsets
  - kubectl describe statefulsets
  - kubectl describe replicasets
  - kubectl describe services
  - kubectl describe jobs
  - kubectl describe cronjobs
  - kubectl describe endpoints
  - kubectl describe configmaps
  namespaces:
  - kube-system
  - gke-system
  - gke-connect.*
prometheusRequests: []
nodeCommands:
- nodes: []
  commands:
  - uptime
  - df --all --inodes
  - ip addr
  - sudo iptables-save --counters
  - mount
  - ip route list table all
  - top -bn1
  - sudo docker ps -a
  - ps -edF
  - ps -eo pid,tid,ppid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm,args,cgroup
  - sudo conntrack --count
nodeFiles:
- nodes: []
  files:
  - /proc/sys/fs/file-nr
  - /proc/sys/net/nf_conntrack_max
seesawCommands: []
seesawFiles: []
nodeCollectors:
- nodes: []
f5:
  enabled: true
vCenter:
  enabled: true

다음 정보가 출력에 표시됩니다.

  • numOfParallelThreads: 스냅샷을 만드는 데 사용된 동시 스레드 수입니다.

  • excludeWords: 스냅샷에서 제외할 단어 목록입니다(대소문자를 구분하지 않음). 이러한 단어가 포함된 줄은 스냅샷 결과에서 삭제됩니다. 'password'는 지정 여부와 관계없이 항상 제외됩니다.

  • kubectlCommands: 실행할 kubectl 명령어의 목록입니다. 결과가 저장됩니다. 명령어는 해당 네임스페이스에서 실행됩니다. kubectl logs 명령어의 경우 해당 네임스페이스의 모든 포드와 컨테이너가 자동으로 추가됩니다. 네임스페이스 지정에 정규 표현식이 지원됩니다. 네임스페이스를 지정하지 않으면 default 네임스페이스가 사용됩니다.

  • nodeCommands: 해당 노드에서 실행할 명령어 목록입니다. 결과가 저장됩니다. 노드가 지정되지 않으면 대상 클러스터의 모든 노드가 고려됩니다.

  • nodeFiles: 해당 노드에서 수집할 파일의 목록입니다. 파일이 저장됩니다. 노드가 지정되지 않으면 대상 클러스터의 모든 노드가 고려됩니다.

  • seesawCommands: Seesaw 부하 분산기 정보를 수집하기 위해 실행할 명령어 목록입니다. 클러스터가 Seesaw 부하 분산기를 사용하면 결과가 저장됩니다.

  • seesawFiles: Seesaw 부하 분산기를 위해 수집할 파일 목록입니다.

  • nodeCollectors: eBPF 정보를 수집하기 위해 Cilium 노드를 위해 실행하는 수집기입니다.

  • f5: F5 BIG-IP 부하 분산기와 관련된 정보 수집을 사용 설정하는 플래그입니다.

  • vCenter: vCenter와 관련된 정보를 수집할 수 있는 플래그입니다.

  • prometheusRequests: Prometheus 요청 목록입니다. 결과가 저장됩니다.

Cloud Storage 버킷에 스냅샷 업로드

기록 보관, 분석, 스토리지를 간편하게 수행하기 위해 특정 클러스터의 모든 스냅샷을 Cloud Storage 버킷에 업로드할 수 있습니다. Cloud Customer Care의 도움이 필요한 경우에 특히 유용합니다.

Cloud Storage 버킷에 스냅샷을 업로드하기 전에 다음 초기 요구사항을 검토하고 완료합니다.

  • Fleet 호스트 프로젝트에서 storage.googleapis.com을 사용 설정합니다. 다른 프로젝트를 사용해도 되지만 Fleet 호스트 프로젝트를 사용하는 것이 좋습니다.

    gcloud services enable --project=FLEET_HOST_PROJECT_ID storage.googleapis.com
    
  • roles/storage.admin를 상위 프로젝트의 서비스 계정에 부여하고 --service-account-key-file 파라미터를 사용하여 서비스 계정 JSON 키 파일을 전달합니다. 모든 서비스 계정을 사용할 수 있지만 연결 등록 서비스 계정을 사용하는 것이 좋습니다. 자세한 내용은 서비스 계정을 참조하세요.

    gcloud projects add-iam-policy-binding FLEET_HOST_PROJECT_ID \
      --member "serviceAccount:CONNECT_REGISTER_SERVICE_ACCOUNT" \
      --role "roles/storage.admin"
    

    CONNECT_REGISTER_SERVICE_ACCOUNT를 연결 등록 서비스 계정으로 바꿉니다.

이러한 요구사항을 충족하는 경우 이제 스냅샷을 Cloud Storage 버킷에 업로드할 수 있습니다.

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name CLUSTER_NAME \
    --upload \
    --share-with GOOGLE_SUPPORT_SERVICE_ACCOUNT

--share-with 플래그는 서비스 계정 이름 목록을 허용할 수 있습니다. GOOGLE_SUPPORT_SERVICE_ACCOUNT를 Cloud Customer Care에서 제공하는 Cloud Customer Care 서비스 계정과 Cloud Customer Care에서 제공하는 다른 서비스 계정으로 바꿉니다.

--upload 플래그를 사용하면 명령어가 프로젝트에서 이름이 'anthos-snapshot-'으로 시작하는 스토리지 버킷을 검색합니다. 이러한 버킷이 있으면 명령어가 스냅샷을 해당 버킷에 업로드합니다. 명령어로 이름이 일치하는 버킷을 찾을 수 없으면 이름이 anthos-snapshot-UUID인 새 버킷을 만듭니다. 여기서 UUID는 32자리의 범용 고유 식별자입니다.

--share-with 플래그를 사용하면 Cloud Customer Care와 버킷 액세스 권한을 수동으로 공유할 필요가 없습니다.

Cloud Storage 버킷에 스냅샷을 업로드할 때 다음 출력 예시가 표시됩니다.

Using "system" snapshot configuration...
Taking snapshot of user cluster <var>CLUSTER_NAME</var>...
Setting up <var>CLUSTER_NAME</var> ssh key...DONE
Using the gke-connect register service account key...
Setting up Google Cloud Storage bucket for uploading the snapshot...DONE
Taking snapshots in 10 thread(s)...
   ...
Snapshot succeeded.
Snapshots saved in "<var>SNAPSHOT_FILE_PATH</var>".
Uploading snapshot to Google Cloud Storage......  DONE
Uploaded the snapshot successfully to gs://anthos-snapshot-a4b17874-7979-4b6a-a76d-e49446290282/<var>xSNAPSHOT_FILE_NAME</var>.
Shared successfully with service accounts:
<var>GOOGLE_SUPPORT_SERVICE_ACCOUNT</var>

다음 단계

추가 지원이 필요하면 Cloud Customer Care에 문의하세요.