Kubernetes Cluster 集群管理與維運

作為 Kubernetes 管理員 (Administrator) 或維運工程師 (SRE/DevOps),除了部署應用程式,我們還需要負責叢集的 健康監控故障排除 (Troubleshooting) 以及 日常維運

本章將整理實務上最常用的管理指令與技巧,幫助你更高效地管理 Kubernetes 叢集。

資源監控與除錯 (Troubleshooting)

當 Pod 跑不動或叢集怪怪的時候,這些是你的救命指令。

Node 與 Pod 資源用量

需安裝 Metrics Server 才能使用 top 指令。

# 查看 Node 的 CPU/Memory 使用量 (找出誰是吃資源怪獸)
kubectl top nodes

# 查看 Pod 的資源使用量 (支援 namespace 篩選)
kubectl top pods -n <namespace>
kubectl top pods -A --sort-by=cpu  # 所有 Namespace 並依 CPU 排序

診斷 Pod 問題 (Pod Lifecycle)

當 Pod 狀態不是 Running 時,請依序執行:

  1. 查看狀態: kubectl get pods (Pending? CrashLoopBackOff? ImagePullBackOff?)
  2. 查看事件 (Events): kubectl describe pod <pod-name>
    • 這是最重要的除錯步驟。滑到最下面的 Events 區塊,通常會告訴你原因 (e.g., 硬碟滿了、拉不到 Image、沒權限)。
  3. 查看日誌 (Logs): kubectl logs <pod-name>
    • 如果 Pod 啟動失敗,看 Application 的 Standard Output (stdout)。
    • -f: 持續追蹤 (Follow)。
    • --previous: 查看 「上一次」 崩潰前的 Log (非常有用,專治 CrashLoopBackOff)。
    • -c <container>: 如果 Pod 有多個容器 (Sidecar),需指定容器名稱。

進入容器內部 (Exec)

有些問題光看 Log 不夠,得進去「案發現場」。

# 進入容器取得 Shell
kubectl exec -it <pod-name> -- /bin/bash  # 或 /bin/sh

# 臨時測試網路連線 (例如測試 Service 是否通)
kubectl exec -it <pod-name> -- curl <service-ip>

高效使用 kubectl (Productivity Tips)

Kubernetes 指令很長,學會這些技巧可以節省你每天 30% 的打字時間。

必備:自動補全 (Autocompletion)

不要手打完整的資源名稱! 設定好 Autocompletion 後,按 Tab 鍵會自動補全。

Bash 使用者:

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

Zsh 使用者:

source <(kubectl completion zsh)
echo "source <(kubectl completion zsh)" >> ~/.zshrc

必備:別名 (Aliases)

建立 ~/.kube_aliases 並在 .bashrc.zshrc 中 source 它。社群常用的 k alias:

alias k='kubectl'
alias kg='kubectl get'
alias kgp='kubectl get pods'
alias kgs='kubectl get services'
alias kd='kubectl describe'
alias kl='kubectl logs'
alias kex='kubectl exec -it'
# 快速切換 Namespace (不推薦手打,建議用 kubens)
alias kn='kubectl config set-context --current --namespace'

必備:工具推薦

  • kubectx & kubens:
    • kubectx: 快速切換 Cluster (Context)。
    • kubens: 快速切換預設 Namespace。
  • k9s:
    • 終端機介面的 K8s 管理神器 (TUI)。類似 top / htop,可以用鍵盤快速瀏覽、刪除 Pod、看 Log,強烈推薦!

快速產生 YAML (Imperative Commands)

考試 (CKA) 或快速測試時,不要手寫 YAML!用指令產生模板再來改。關鍵參數:--dry-run=client -o yaml

產生 Pod YAML:

kubectl run nginx --image=nginx --restart=Never --dry-run=client -o yaml > pod.yaml

產生 Deployment YAML:

kubectl create deployment web --image=nginx --replicas=3 --dry-run=client -o yaml > deploy.yaml

產生 Service YAML:

kubectl expose deployment web --name=web-svc --port=80 --target-port=8080 --type=NodePort --dry-run=client -o yaml > svc.yaml

產生 CronJob YAML:

kubectl create cronjob my-job --image=busybox --schedule="*/1 * * * *" --dry-run=client -o yaml > cronjob.yaml

叢集維護與升級

備份 ETCD (Backup)

Kubernetes 的所有狀態 (State) 都存在 ETCD。備份 ETCD 是生產環境最重要的任務。通常在 Master Node 執行。

# 備份 (Snapshot Save)
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save /tmp/etcd-backup.db

# 還原 (Snapshot Restore)
# 注意:還原是破壞性操作,需停止 kube-apiserver 並移除舊資料目錄
ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup.db \
  --data-dir=/var/lib/etcd-new

憑證更新 (Certificate Renewal)

K8s 組件 (API Server, Kubelet, Scheduler) 預設憑證效期為 1 年 (使用 kubeadm 安裝的話)。

# 檢查憑證剩餘時間
kubeadm certs check-expiration

# 更新所有憑證
kubeadm certs renew all

# 更新後需重啟 Static Pod (apiserver, controller-manager, scheduler)
# 通常是將 manifest 移出 /etc/kubernetes/manifests 再移回來,或直接重啟 kubelet
systemctl restart kubelet

節點升級 (Node Upgrade)

當你需要升級 Node 的 OS Kernel 或 K8s 版本時:

  1. Drain: kubectl drain <node> --ignore-daemonsets (驅逐 Pod)。
  2. Upgrade: 進行升級作業 (e.g., apt-get upgradekubeadm upgrade node)。
  3. Uncordon: kubectl uncordon <node> (恢復排程)。

多叢集管理 (Kubeconfig)

Kubeconfig 結構

Kubeconfig 檔案 (預設在 ~/.kube/config) 定義了如何連接 K8s。主要包含三個部分:

  1. Clusters: 叢集資訊 (API Server URL, CA Certificate)。
  2. Users: 使用者憑證 (Client Certificate/Key, Token)。
  3. Contexts: 將 ClusterUser 綁定,並指定預設 Namespace。

除錯連線問題

kubectl 連不上,檢查:

  1. API Server 是否活著?(ping IP, curl URL)
  2. Kubeconfig 是否正確?(kubectl config view)
  3. 憑證是否過期?

總結

  • 除錯黃金三步驟: Status -> Events (describe) -> Logs。
  • 提升效率: 善用 alias k=kubectl、Autocompletion、k9skubens
  • 生產環境: 定期備份 ETCD、監控憑證效期、熟練 Node 維護流程 (Drain/Uncordon)。
  • 不要手刻 YAML: 善用 --dry-run=client -o yaml