這是一個非常詳盡且專業的 Ansible Playbook 集合,用於在 Ubuntu 系統上實現 Kubernetes 1.34.1 集群的離線(Air-gapped)安裝與部署。
我將根據您提供的 Ansible Playbook 內容,撰寫一份結構化、完整的技術文件(README)。
本文件詳細說明如何使用 Ansible Playbook 來實現 Kubernetes (K8s)
- 物料準備與打包:在一個有網際網路連線的機器上,下載所有必需的 .deb 套件(Docker, K8s 核心)、**容器鏡像(K8s 核心與 Calico)**以及 CNI 網路配置檔案,並打包成單一資源包。
- 集群離線安裝與部署:將資源包傳輸到目標離線節點(Master/Worker),並執行安裝、系統配置、鏡像載入與集群初始化。
本方案採用 Calico Operator 作為網絡插件的部署方式。
| 項目 | 描述 | 備註 |
|---|---|---|
| Ansible 控制機 | 已安裝 Ansible |
用於執行 Playbook。 |
| 操作系統 | 目標節點需為 Ubuntu 20.04/22.04 或兼容版本。 | Playbook 內的 APT 倉庫設定基於 Ubuntu。 |
| 網路連線 | 階段一的機器需要完整的網際網路連線。 | 用於下載所有離線物料。 |
| 用戶權限 | 所有 Playbook 步驟均需要 become: yes (root 權限) 執行。 |
Ansible 連線用戶需配置 sudo 權限。 |
| K8s 版本 |
kube_version 定義)。 |
|
| Calico 版本 |
calico_version 定義)。 |
假設您有一個名為 hosts.ini 的 Inventory 文件,至少需要定義 Master 節點。
[master]
192.168.1.10 ansible_user=your_ssh_user master_ip=192.168.1.10
[worker]
192.168.1.11 ansible_user=your_ssh_user
192.168.1.12 ansible_user=your_ssh_user
[K8S-Nodes:children]
master
worker此階段在 Ansible 控制機 (localhost) 執行,需要網路連線。
- 創建必要目錄:
/home/administrator/kubernetes/offline(offline_dir)/home/administrator/kubernetes/offline/offline_packages(pkg_dir)
- 設置 Docker 與 K8s APT 倉庫:
- 安裝前置依賴 (
ca-certificates,curl,gnupg)。 - 下載 Docker GPG Key 並添加 Docker APT 倉庫。
- 下載 K8s GPG Key 並添加 K8s APT 倉庫 (基於
v1.34)。
- 安裝前置依賴 (
- 下載所有 .deb 套件:
- 使用
apt-get download和apt-get install --download-only下載containerd.io,docker-ce,kubelet,kubeadm,kubectl等核心套件及其所有運行時依賴,確保離線安裝的完整性。
- 使用
- 準備鏡像清單與 CNI Manifest:
- 創建
required_images.txt包含所有 K8s 核心組件和 Calico 的容器鏡像列表。 - 下載 Calico 的
tigera-operator.yaml和custom-resources.yaml配置檔。
- 創建
- 處理容器鏡像 (通過
image_handling.yml- 程式碼中為獨立的 Task Block):- 遍歷
required_images.txt。 - K8s 核心鏡像 (如
registry.k8s.io/...):使用registry.aliyuncs.com/google_containers加速器拉取,然後重新docker tag為官方名稱,並清理加速器鏡像。 - Calico 鏡像 (如
docker.io/...):直接拉取。 - 最後使用
docker save將所有已拉取的鏡像打包成k8s_calico_images_v1.34.1.tar.gz。
- 遍歷
- 製作最終離線資源包:
- 將
offline_dir下的所有文件打包成k8s_offline_bundle_v1.34.1.tar.gz。
- 將
此階段在 目標 K8s 節點 (K8S-Nodes 組) 執行,無需網路連線。
- 解壓縮離線資源包:
- 將
k8s_offline_bundle_v1.34.1.tar.gz解壓縮到目標節點的{{ offline_dir }}。
- 將
- 系統前置配置:
- 關閉 Swap:
swapoff -a並註釋/etc/fstab中的 Swap 條目。 - 網路模組與 Sysctl:載入
overlay和br_netfilter模組,並配置sysctl參數以啟用 IPv4 轉發和 Bridge Filter,這是 K8s 和 CNI 網絡的必需配置。
- 關閉 Swap:
- 離線安裝所有 .deb 套件:
- 使用
dpkg -i {{ pkg_dir }}/*.deb離線安裝所有預先下載的套件。
- 使用
- 配置 Containerd Cgroup Driver:
- 生成默認配置檔
/etc/containerd/config.toml。 - 將
SystemdCgroup設置為true,以確保 Containerd 和 Kubelet 使用相同的systemdCgroup 驅動。 - 重啟並啟用
containerd服務。
- 生成默認配置檔
- 啟用 Kubelet 服務:
- 啟動並設置
kubelet開機自啟。
- 啟動並設置
- 導入所有 K8s 核心與 Calico 鏡像:
- 使用
docker load -i ...載入預先打包的鏡像檔案,使鏡像在離線環境中可用。
- 使用
- 集群初始化與網絡部署 (註釋部分,需手動執行或取消註釋):
| 步驟編號 | 節點類型 | 動作 | 說明 |
|---|---|---|---|
| 8. | Master | kubeadm init |
初始化集群,指定 $master\_ip$ 和 $pod\_network\_cidr$。 |
| 9. | Master | 配置 Kubeconfig | 將 /etc/kubernetes/admin.conf 複製到 $HOME/.kube/config。 |
| 10. | Master | 部署 Tigera Operator |
kubectl apply -f tigera-operator.yaml (這是 CNI 部署的第一步)。 |
| 11. | Master | 部署 Calico CRs |
kubectl apply -f custom-resources.yaml (定義 Calico 網絡配置)。 |
| 12. | Worker | 執行 Join 命令 | 執行 Master 節點初始化後生成的 kubeadm join 命令。 |
以下是 Playbook 中使用的核心變數:
vars:
k8s_version: "v1.34.1" # Kubelet/Kubeadm 的版本標籤
kube_version: "1.34.1" # APT 倉庫使用的版本號
offline_dir: "/home/administrator/kubernetes/offline" # 資源包存放主目錄
pkg_dir: "{{ offline_dir }}/offline_packages" # .deb 套件目錄
k8s_accelerator: "registry.aliyuncs.com/google_containers" # K8s 核心鏡像加速器
calico_version: "v3.30.3" # Calico 版本
pod_network_cidr: "192.168.0.0/16" # Pod 網絡 CIDR
master_ip: "192.168.1.10" # Master 節點 IP (用於 kubeadm init)問題描述:在階段二的第 4 步 dpkg -i 執行時,可能會因為某些次級依賴缺失而報錯。
解決方案:
- 檢查:確保階段一的第 4 步 (
強制下載所有套件的運行時依賴) 已成功執行。apt-get install -y --reinstall --download-only比單純的apt-get download更能確保依賴完整性。 - 修復:如果遇到依賴問題,可以在目標節點上執行
apt --fix-broken install,雖然這會嘗試聯網下載,但在完全離線環境中,唯一的辦法是手動檢查缺失的.deb包並將其添加到離線資源包中。
問題描述:在階段一處理鏡像時,如果網路不穩定或加速器地址不可用,docker pull 可能失敗。
解決方案:
- 檢查:確保
k8s_accelerator(registry.aliyuncs.com/google_containers) 在執行機器上是可訪問且有效的。 - 手動替換:如果加速器無法使用,必須手動尋找一個可用的鏡像倉庫,並修改
image_handling.yml中的邏輯,或者將required_images.txt中的鏡像替換為可用的離義鏡像地址。
問題描述:kubelet 啟動後,節點一直處於 NotReady 狀態,日誌顯示 cgroup driver 不匹配。
解決方案:
- 階段二的第 5 步已處理:確保
containerd的SystemdCgroup設置為true。這是$v1.22+$ 之後 K8s 的標準做法,與kubelet保持一致。執行後必須systemctl restart containerd。
這份 Ansible Playbook 為在嚴格的離線環境下部署 K8s
- Kubernetes 官方文檔:https://kubernetes.io/docs/setup/
- Calico 官方文檔:https://docs.tigera.io/calico/latest/
- Ansible 官方文檔:https://docs.ansible.com/