Chuyển đến nội dung chính

第1課:Kubernetes 架構 & 叢集元件

控制平面與工作節點元件。kubeadm 叢集啟動流程。 CKA 考試環境中的 ETCD、API Server、Scheduler、Controller Manager。

kubeadm 叢集初始化流程與 kubeconfig

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.yamlkubectl get pods -n kube-system
etcd控制平面/etc/kubernetes/manifests/etcd.yamletcdctl 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=...
產生節點加入 tokenkubeadm token create --print-join-command
確認控制平面 Podkubectl get pods -n kube-system
靜態 Pod manifestls /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 不受影響。