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 時,請依序執行:
- 查看狀態:
kubectl get pods(Pending? CrashLoopBackOff? ImagePullBackOff?) - 查看事件 (Events):
kubectl describe pod <pod-name>- 這是最重要的除錯步驟。滑到最下面的 Events 區塊,通常會告訴你原因 (e.g., 硬碟滿了、拉不到 Image、沒權限)。
- 查看日誌 (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,強烈推薦!
- 終端機介面的 K8s 管理神器 (TUI)。類似
快速產生 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 版本時:
- Drain:
kubectl drain <node> --ignore-daemonsets(驅逐 Pod)。 - Upgrade: 進行升級作業 (e.g.,
apt-get upgrade或kubeadm upgrade node)。 - Uncordon:
kubectl uncordon <node>(恢復排程)。
多叢集管理 (Kubeconfig)
Kubeconfig 結構
Kubeconfig 檔案 (預設在 ~/.kube/config) 定義了如何連接 K8s。主要包含三個部分:
- Clusters: 叢集資訊 (API Server URL, CA Certificate)。
- Users: 使用者憑證 (Client Certificate/Key, Token)。
- Contexts: 將
Cluster與User綁定,並指定預設 Namespace。
除錯連線問題
若 kubectl 連不上,檢查:
- API Server 是否活著?(ping IP, curl URL)
- Kubeconfig 是否正確?(
kubectl config view) - 憑證是否過期?
總結
- 除錯黃金三步驟: Status -> Events (
describe) -> Logs。 - 提升效率: 善用
alias k=kubectl、Autocompletion、k9s、kubens。 - 生產環境: 定期備份 ETCD、監控憑證效期、熟練 Node 維護流程 (Drain/Uncordon)。
- 不要手刻 YAML: 善用
--dry-run=client -o yaml。