在未啟用進階叢集時建立診斷快照

本文說明如何使用 gkectl diagnose 指令,為使用 Google Distributed Cloud (僅限軟體) for VMware 建立的叢集建立診斷快照,以排解問題 (進階叢集未啟用時)。如果enableAdvancedClusters管理員叢集設定檔使用者叢集設定檔中設為 false,系統就不會啟用進階叢集。如果啟用進階叢集,請參閱「啟用進階叢集時建立快照」。

gkectl 工具提供兩項指令,可排解叢集問題:gkectl diagnose snapshotgkectl diagnose cluster。這些指令適用於管理員和使用者叢集。

如要進一步瞭解如何使用 gkectl diagnose cluster 指令診斷叢集問題,請參閱「診斷叢集問題」。

gkectl diagnose snapshot

這項指令會將叢集的狀態、設定和記錄壓縮成 tar 檔案。執行 gkectl diagnose snapshot 時,指令會自動執行 gkectl diagnose cluster,並將輸出檔案放在快照中的新資料夾 /diagnose-report

預設快照

gkectl diagnose snapshot 指令的預設設定會擷取叢集的下列資訊:

  • Kubernetes 版本。

  • kube-system 和 gke-system 命名空間中的 Kubernetes 資源狀態:叢集、機器、節點、服務、端點、ConfigMap、ReplicaSet、CronJob、Pod,以及這些 Pod 的擁有者,包括 Deployment、DaemonSet 和 StatefulSet。

  • 控制層的狀態。

  • 每個節點設定的詳細資料,包括 IP 位址、iptables 規則、掛接點、檔案系統、網路連線和執行中的程序。

  • Kubernetes API 伺服器無法使用時,管理員叢集控制層節點的容器記錄。

  • vSphere 資訊,包括 VM 物件及其以資源集區為基礎的事件。也會收集與 VM 相關聯的資料中心、叢集、網路和資料存放區物件資訊。

  • 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、Pod,以及這些 Pod 的擁有者,包括 Deployment、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 以下版本:systemsystem-with-logsallall-with-logs

  • 1.13 至 1.28 版:systemallsystem情境與舊版system-with-logs情境相同。all 情境與舊版 all-with-logs 情境相同。

  • 1.29 以上版本:systemalllite

如要建立管理員叢集的快照,您不需要指定情境:

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 標記,將記錄收集範圍限制在近期。舉例來說,您可以只收集最近兩天或最近三小時的記錄。根據預設,diagnose snapshot 會收集所有記錄。

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

<var>DURATION</var> 替換為時間值,例如 120m48h

請注意下列事項:

  • --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 systemall) 不符合您的需求,您可以傳遞快照設定檔並使用 --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 指令,系統會自動新增對應命名空間中的所有 Pod 和容器。指定命名空間時,系統支援規則運算式。如果未指定命名空間,系統會採用 default 命名空間。

  • nodeCommands:要在對應節點上執行的指令清單。結果會儲存。如未指定節點,系統會將目標叢集中的所有節點納入考量。

  • nodeFiles:要從對應節點收集的檔案清單。檔案已儲存。如未指定節點,系統會將目標叢集中的所有節點納入考量。

  • seesawCommands:要執行的指令清單,用於收集 Seesaw 負載平衡器資訊。如果叢集使用 Seesaw 負載平衡器,系統會儲存結果。

  • seesawFiles:要為 Seesaw 負載平衡器收集的檔案清單。

  • nodeCollectors:為 Cilium 節點執行的收集器,用於收集 eBPF 資訊。

  • f5:啟用收集 F5 BIG-IP 負載平衡器相關資訊的旗標。

  • vCenter:啟用收集 vCenter 相關資訊的旗標。

  • prometheusRequests:Prometheus 要求清單。結果已儲存。

將快照上傳至 Cloud Storage bucket

為方便記錄、分析及儲存,您可以將特定叢集的所有快照上傳至 Cloud Storage 值區。如果您需要 Cloud Customer Care 團隊的協助,這項資訊就特別實用。

將快照上傳至 Cloud Storage 值區前,請先詳閱並完成下列初始規定:

  • 車隊主專案中啟用 storage.googleapis.com。雖然可以使用其他專案,但建議使用機群主專案。

    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-」的儲存空間值區。如果這類值區存在,指令會將快照上傳至該值區。如果指令找不到名稱相符的 bucket,就會建立名為 anthos-snapshot-UUID 的新 bucket,其中 UUID 是 32 位數的通用唯一 ID。

使用 --share-with 旗標時,您不需要手動與 Cloud Customer Care 分享值區存取權

將快照上傳至 Cloud Storage bucket 時,系統會顯示下列範例輸出內容:

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 團隊聯絡。

如要進一步瞭解支援資源,包括下列項目,請參閱「取得支援」: