本章節說明在沒有額外部署主機 (即所有機器皆為 Kubernetes 叢集節點) 的特殊情境下,如何透過交互安裝的方式完成叢集建置。在此範例中,我們將以 3 節點 (1 Master, 2 Worker) 的架構進行說明。

重要注意事項

部署限制

Image Registry

在此交互安裝的架構下,強烈建議使用外部 Image Registry (如 Harbor)。

若使用 Koffline Container 內建的 Built-in Registry,會遇到 Image IP 更換 的問題:

  • 當部署來源從 Worker 2 轉移至 Master 1 時,Registry 的 IP 位址也會隨之改變。
  • 這將導致在部署 Worker 2 時,系統仍嘗試連線舊的 IP (原 Worker 2) 抓取鏡像,造成抓不到鏡像 (Image Pull Error) 的錯誤。

因此, 正式環境安裝時為避免因 Image 拉取 URL 變換導致的部署失敗,請務必使用外部 Image Registry。

階段一:由 Worker 2 發起安裝

首先,請在 Worker 2 上依照標準程序進行操作,將 Master 1 (master1)Worker 1 (worker1) 加入叢集。

  1. 先將 Master 1 與 Worker 1 加入到 hosts.yml,並執行安裝指令
  all:
  vars:
    ansible_user: <部署專用帳號>
  hosts:
    master1:
      ansible_host: <Master Node IP>
      ip: <Master Node IP>
      access_ip: <Master Node IP>
    worker1:
      ansible_host: <Worker Node 1 IP>
      ip: <Worker Node 1 IP>
      access_ip: <Worker Node 1 IP>
  children:
    kube_control_plane:
      hosts:
        master1:
    kube_node:
      hosts:
        worker1:
    etcd:
      hosts:
        master1:
    k8s_cluster:
      children:
        kube_control_plane:
        kube_node:
    calico_rr:
      hosts: {}
  
  1. 參考 安裝 & 建置 文件,在 Worker 2 上執行安裝指令。
  cd /kubespray && ansible-playbook \
  -e "unsafe_show_logs=true" -e "update_repo_cache=false" -i /inventory/hosts.yml \
  --private-key /root/.ssh/id_rsa cluster.yml -v -b -K
  

階段二:驗證與清理

待安裝完成後,請進行以下驗證與清理步驟:

  1. 驗證 Master 1:確認 Master 1 已安裝成功且 Kubernetes 服務正常運作。
  2. 清理 Worker 2:回到 Worker 2,刪除相關的 Image 與 Koffline Container,避免安裝過程中異常。
  # 範例指令 (請依實際狀況調整)
sudo /usr/local/bin/nerdctl rm -f koffline
sudo /usr/local/bin/nerdctl rmi <koffline-image-name>
  

階段三:由 Master 1 反向安裝 Worker 2

接著我們將操作轉移至 Master 1,將 Worker 2 安裝回叢集中。

在此步驟中,務必在 Master 1 上重新執行 gen-inventory.sh。這是為了確保能正確抓取並更新 Package 與 Image 的下載 URL,使其指向新的拉取來源(Master 1)。

  # 在Master 1 的 Koffline Container 內執行
/outputs/gen-inventory.sh
  

將 worker2 加入到 hosts.yml

  all:
  vars:
    ansible_user: <部署專用帳號>
  hosts:
    master1:
      ansible_host: <Master Node IP>
      ip: <Master Node IP>
      access_ip: <Master Node IP>
    worker1:
      ansible_host: <Worker Node 1 IP>
      ip: <Worker Node 1 IP>
      access_ip: <Worker Node 1 IP>
    worker2:
      ansible_host: <Worker Node 2 IP>
      ip: <Worker Node 2 IP>
      access_ip: <Worker Node 2 IP>
  children:
    kube_control_plane:
      hosts:
        master1:
    kube_node:
      hosts:
        worker1:
        worker2:
    etcd:
      hosts:
        master1:
    k8s_cluster:
      children:
        kube_control_plane:
        kube_node:
    calico_rr:
      hosts: {}
  

接著執行安裝指令,請務必加上 --limit 參數以限制僅部署 Worker 2 (worker2),避免影響已運作的節點。

  cd /kubespray && ansible-playbook \
  -e "unsafe_show_logs=true" -e "update_repo_cache=false" -i /inventory/hosts.yml \
  --private-key /root/.ssh/id_rsa cluster.yml -v -b -K --limit "worker2"
  
Was this page helpful?