1. Kubernetes 架構概覽(CKA 重點)
CKA 考試不僅考理論,還要求對叢集元件進行故障排除。
控制平面節點 工作節點
────────────── ────────────
kube-apiserver ◄──────────── kubelet
etcd kube-proxy
kube-scheduler 容器執行環境
controller-manager (containerd)
cloud-controller-manager (選用)
所有元件透過 kube-apiserver 通訊(只有 etcd 與 API server 直接通訊)
| 元件 | 位置 | 設定 / Pod 路徑 | 故障排除 |
|---|---|---|---|
| kube-apiserver | 控制平面 | /etc/kubernetes/manifests/kube-apiserver.yaml | kubectl get pods -n kube-system |
| etcd | 控制平面 | /etc/kubernetes/manifests/etcd.yaml | etcdctl member list |
| kube-scheduler | 控制平面 | /etc/kubernetes/manifests/kube-scheduler.yaml | 檢查 kube-system 日誌 |
| controller-manager | 控制平面 | /etc/kubernetes/manifests/kube-controller-manager.yaml | 檢查 kube-system 日誌 |
| kubelet | 所有節點 | /var/lib/kubelet/config.yaml、systemd 服務 | systemctl status kubelet |
考試重點:在 kubeadm 叢集中,控制平面元件以靜態 Pod(
/etc/kubernetes/manifests/目錄中的檔案)運行。kubelet 會自動啟動和重新啟動它們。編輯 manifest 檔案後,kubelet 會自動重新載入 Pod(不需要 kubectl apply)。
2. kubeadm — 叢集啟動
# 1. 初始化控制平面
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.1.10
# 2. 設定 kubeconfig
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
# 3. 安裝 CNI(Pod 網路)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 4. 加入工作節點
kubeadm join 192.168.1.10:6443 --token xxx --discovery-token-ca-cert-hash sha256:yyy
3. 靜態 Pod & Manifest
# 靜態 Pod 路徑
/etc/kubernetes/manifests/
├── etcd.yaml
├── kube-apiserver.yaml
├── kube-controller-manager.yaml
└── kube-scheduler.yaml
# 確認 kubelet 的靜態 Pod 路徑
cat /var/lib/kubelet/config.yaml | grep staticPodPath
# staticPodPath: /etc/kubernetes/manifests
# 故障排除:元件無法啟動時
kubectl get pods -n kube-system
kubectl describe pod kube-apiserver-controlplane -n kube-system
kubectl logs kube-apiserver-controlplane -n kube-system
4. kubeconfig & Context
# 當前 context
kubectl config current-context
# 切換 context(CKA 考試中每道題目需要切換叢集)
kubectl config use-context cluster1
# 檢視 kubeconfig
kubectl config view
cat ~/.kube/config
5. 速查表
| 任務 | 指令 |
|---|---|
| 初始化叢集 | kubeadm init --pod-network-cidr=... |
| 產生節點加入 token | kubeadm token create --print-join-command |
| 確認控制平面 Pod | kubectl get pods -n kube-system |
| 靜態 Pod manifest | ls /etc/kubernetes/manifests/ |
| 確認 kubelet 設定 | cat /var/lib/kubelet/config.yaml |
6. 練習題
Q1:在 kubeadm 叢集中 kube-apiserver 未運行時,最先應該檢查的檔案是?
- A) /etc/kubernetes/kubelet.conf
- B) /etc/kubernetes/manifests/kube-apiserver.yaml ✓
- C) ~/.kube/config
- D) /var/log/syslog
解析:在 kubeadm 叢集中 kube-apiserver 以靜態 Pod 運行。kubelet 會偵測 manifest 變更並自動重新載入。YAML 語法錯誤或設定錯誤是最常見的原因。
Q2:如何取得讓新工作節點加入叢集的 join 指令?
- A) kubectl get nodes --join-command
- B) kubeadm token create --print-join-command ✓
- C) kubeadm init --print-join
- D) kubectl cluster-info --join
解析:kubeadm token create --print-join-command 會產生新的 token 並顯示完整的 join 指令。Token 的預設有效期限為 24 小時。
Q3:如果 kube-scheduler 停止運行會發生什麼?
- A) 現有的 Pod 會崩潰
- B) 新的 Pod 會停留在 Pending 狀態,不會被排程到節點 ✓
- C) 整個叢集會停止運作
- D) 所有 Service 會無法存取
解析:kube-scheduler 負責將新 Pod 分配到節點。停止後,新 Pod 會維持在 Pending 狀態。已經執行中的 Pod 不受影響。