
K8s 二進(jìn)制部署工具箱一套不依賴 kubeadm 的 Kubernetes 二進(jìn)制部署方案組件全部拆開獨(dú)立部署并配了一個(gè) Web 控制臺你只在一個(gè)地方操作——瀏覽器里的網(wǎng)頁。集群版本、節(jié)點(diǎn) IP / 主機(jī)名 / 角色、SSH 登錄密碼、CNI、網(wǎng)段、鏡像加速……全部在網(wǎng)頁填好點(diǎn)幾下按鈕后端直接在節(jié)點(diǎn)上執(zhí)行部署并把日志實(shí)時(shí)回傳不需要登錄服務(wù)器終端、不需要手改任何.sh文件。當(dāng)前內(nèi)置方案僅作示例展示Kubernetesv1.36.4/ Ubuntu 22.04 / 1 控制面 2 工作節(jié)點(diǎn) / Calico containerd。資源下載地址鏈接https://pan.quark.cn/s/ed2f4a893483提取碼XAnq1. 它解決了什么以前現(xiàn)在在服務(wù)器上跑一堆腳本自己看屏幕日志瀏覽器里點(diǎn)「一鍵部署」日志實(shí)時(shí)流式回傳先手改00-env.sh填 IPIP / 主機(jī)名 / 密碼都在網(wǎng)頁填腳本自動代入自己ssh-copy-id配免密網(wǎng)頁填密碼后端自動分發(fā)密鑰離線拷貝腳本包腳本直接落盤到目標(biāo)機(jī)/opt/k8s-install并執(zhí)行2. 目錄結(jié)構(gòu)k8s-deploy-kit/ ├── README.md ← 你在這里 ├── start-web.sh ← 在第一個(gè)控制面節(jié)點(diǎn)上啟動 Web 控制臺唯一需要的一次終端操作 ├── web/ ← Web 控制臺純前端 Python 標(biāo)準(zhǔn)庫后端無外部服務(wù)依賴 │ ├── index.html ← 配置界面 │ ├── server.py ← 后端靜態(tài)托管 SSH 編排 流式部署SSE │ ├── sshlib.py ← SSH 操作封裝基于 paramiko │ ├── assets/js/catalog.js ← 版本目錄新增版本只改這里 │ ├── assets/js/templates/ ← 腳本模板與配置解耦 │ └── tools/ ← selftest.js語法自檢、smoke.js頁面冒煙、build.js命令行渲染 ├── scripts/ ← 空占位目錄可選網(wǎng)頁「生成并寫入服務(wù)器」按鈕的落盤副本 └── offline/ ← 離線包說明清單由頁面「離線清單」按鈕實(shí)時(shí)生成/檢查真正部署時(shí)腳本落在目標(biāo)機(jī)的/opt/k8s-install環(huán)境變量K8S_INSTALL_DIR可改scripts/只是留給你事后查看/導(dǎo)出的副本不參與執(zhí)行。??不要在倉庫副本里直接跑腳本。倉庫自帶的scripts/00-env.sh是默認(rèn) IP192.168.1.10/11/12。若你在~/k8s-deploy-kit/scripts里執(zhí)行本機(jī)真實(shí) IP 不在這份配置里角色會被判成worker于是報(bào)kube-controller-manager 只在控制面節(jié)點(diǎn)部署當(dāng)前角色worker。請始終在/opt/k8s-install網(wǎng)頁「一鍵部署」寫入的真實(shí)配置里執(zhí)行cd/opt/k8s-install./run-all.sh plan# 確認(rèn)本機(jī) IP 在配置的節(jié)點(diǎn)列表中cd/opt/k8s-install./run-all.sh step 08-deploy-controller-manager.sh??/opt/k8s-install里的腳本只在網(wǎng)頁點(diǎn)「一鍵部署 / 生成并寫入服務(wù)器」時(shí)才更新。手工./run-all.sh step xxx.sh跑的是磁盤上已存在的那份。所以改了參數(shù)后正確順序是先在網(wǎng)頁點(diǎn)「一鍵部署」它會先寫入最新腳本再執(zhí)行而不是直接手工重跑某一步。各腳本會自查關(guān)鍵項(xiàng)例如08會確認(rèn) systemd unit 里確實(shí)帶上了必需參數(shù)舊版會直接報(bào)錯(cuò)提醒。國內(nèi)鏡像加速地址https://docker.m.daocloud.io, https://hub-mirror.c.163.com, https://mirror.baidubce.com3. 標(biāo)準(zhǔn)流程全程網(wǎng)頁操作只需要一次終端操作在第一個(gè)控制面節(jié)點(diǎn)上啟動 Web 控制臺。其余全在瀏覽器里完成。第 1 步啟動 Web 控制臺僅此一次終端操作需要在控制節(jié)點(diǎn)安裝paramiko模塊 pip3installparamiko --break-system-packages# 在【第一個(gè)控制面節(jié)點(diǎn)】上執(zhí)行cd/opt/k8s-deploy-kit ./start-web.sh# 默認(rèn) 0.0.0.0:8777安全提示默認(rèn)監(jiān)聽0.0.0.0僅限可信內(nèi)網(wǎng)。公網(wǎng)/多租戶環(huán)境請改用./start-web.sh 8777 127.0.0.1然后本地做 SSH 端口轉(zhuǎn)發(fā)ssh -N -L 8777:127.0.0.1:8777 root目標(biāo)機(jī)IP再訪問http://127.0.0.1:8777??刂婆_只在「測試連接 / 分發(fā)密鑰 / 部署」時(shí)用到節(jié)點(diǎn)密碼密碼僅存在于本次請求中不會寫入任何腳本或落盤文件。第 2 步筆記本瀏覽器打開并配參打開http://第一個(gè)控制面IP:8777在網(wǎng)頁里填「集群基礎(chǔ)」Tab集群名、K8s 版本、SSH 用戶默認(rèn)root、SSH 端口、SSH 密碼用于首次免密密鑰分發(fā)?!腹?jié)點(diǎn)規(guī)劃」Tab點(diǎn)「按節(jié)點(diǎn)數(shù)生成」自動建表逐行填每臺機(jī)器的真實(shí) IP / 主機(jī)名 / 角色 / SSH 端口 / 登錄密碼密碼留空則用全局密碼。其它 Tab 按需調(diào)組件版本、CNI、網(wǎng)段、高可用 VIP、鏡像加速、審計(jì)日志等。右側(cè)「生成預(yù)覽」實(shí)時(shí)校驗(yàn)有錯(cuò)誤網(wǎng)段重疊、IPVS 已移除、跨次版本升級等會標(biāo)紅需先修正。第 3 步點(diǎn)按鈕全程網(wǎng)頁驅(qū)動網(wǎng)頁頂部「運(yùn)維操作」工具欄按鈕作用測試連接用你填的密碼登錄各節(jié)點(diǎn)確認(rèn)可達(dá)分發(fā)密鑰在控制面生成 SSH 密鑰如沒有寫入各節(jié)點(diǎn)authorized_keys實(shí)現(xiàn)免密 SSH預(yù)檢全部各節(jié)點(diǎn)只讀預(yù)檢系統(tǒng) / 內(nèi)核 / cgroup v2 / 內(nèi)存 / 磁盤 / 缺命令離線清單列出需要提前下載的二進(jìn)制與鏡像 下載地址并檢查服務(wù)器離線目錄里已有哪些、缺哪些內(nèi)網(wǎng)部署用一鍵部署把腳本落盤到/opt/k8s-install→ 分發(fā)密鑰 → 執(zhí)行run-all.sh control-plane自動分發(fā)腳本到 worker、遠(yuǎn)程初始化、批準(zhǔn) CSR、驗(yàn)收日志實(shí)時(shí)回傳拉入工作節(jié)點(diǎn)只執(zhí)行run-all.sh workers分發(fā) → 逐節(jié)點(diǎn)初始化 → 批準(zhǔn) CSR → 等待注冊。比整集群重來快得多任一節(jié)點(diǎn)失敗會立刻打印該節(jié)點(diǎn)的現(xiàn)場診斷node-diag一鍵診斷在控制面本機(jī)執(zhí)行diag.sh一次性收集 服務(wù)狀態(tài)/端口/節(jié)點(diǎn)/CSR/kubelet 日志/證書/CNI/鏡像 等排查證據(jù)不依賴 paramikoworker 沒加入集群kubectl get node只有 master→ 點(diǎn)「拉入工作節(jié)點(diǎn)」重跑它會明確告訴你每臺節(jié)點(diǎn)卡在哪containerd 沒裝上 / 證書沒分發(fā)到 / 連不上 6443 / CSR 沒批準(zhǔn)不再只丟一句節(jié)點(diǎn)數(shù)不足。想單獨(dú)看某臺節(jié)點(diǎn)在控制面執(zhí)行./run-all.sh diag-node 節(jié)點(diǎn)IP。順序建議先「測試連接」→「分發(fā)密鑰」→「預(yù)檢全部」都通過后再「一鍵部署」。內(nèi)網(wǎng)環(huán)境可在中間點(diǎn)一次「離線清單」確認(rèn)離線包齊全。部署中或部署后出現(xiàn)異常直接點(diǎn)「一鍵診斷」把輸出發(fā)出來即可定位問題。部署耗時(shí)較長日志會持續(xù)滾動期間不要關(guān)閉頁面。就這樣沒有第 4 步。不需要ssh到服務(wù)器、不需要手改腳本、不需要拷文件。4. 部署前置條件項(xiàng)要求系統(tǒng)Ubuntu 22.04 / RHEL 9必須 cgroup v21.35 起不再支持 cgroup v1運(yùn)行時(shí)containerd2.xK8s 1.35 是最后一個(gè)支持 containerd 1.x 的版本網(wǎng)絡(luò)節(jié)點(diǎn)互通控制面能 SSH密碼或已免密到所有其它節(jié)點(diǎn)資源控制面 ≥ 2C4G工作節(jié)點(diǎn) ≥ 2C2G各 ≥ 40G 磁盤聯(lián)網(wǎng)需拉取二進(jìn)制與鏡像不通外網(wǎng)時(shí)用offline/見下Python目標(biāo)機(jī)有python3paramiko。必須預(yù)先安裝否則「測試連接/分發(fā)密鑰/一鍵部署」都會紅安裝 paramiko控制面節(jié)點(diǎn)執(zhí)行# 有外網(wǎng)sudoapt-getupdatesudoapt-getinstall-ypython3-pip pip3installparamiko# 或直接用 apt 包sudoapt-getinstall-ypython3-paramiko# 離線環(huán)境./install-deps.sh裝好后執(zhí)行python3 -c import paramiko; print(paramiko.__version__)確認(rèn)再重新啟動./start-web.sh。把控制臺跑在哪臺機(jī)器上請跑在「第一個(gè)控制面節(jié)點(diǎn)」上因?yàn)樗诒镜貓?zhí)行run-all.sh并通過 SSH 把腳本與憑據(jù)分發(fā)到其它節(jié)點(diǎn)。5. 離線部署內(nèi)網(wǎng)環(huán)境所有下載都會優(yōu)先看你配置的離線目錄找到本地文件就不聯(lián)網(wǎng)。默認(rèn)目錄/opt/k8s-offline網(wǎng)頁「高級 → 離線包目錄」可改。5.1 三步搞定# 1) 在網(wǎng)頁點(diǎn)「離線清單」按鈕 —— 會列出需要哪些文件、每臺的下載地址并檢查服務(wù)器上已有哪些# 2) 在任意有外網(wǎng)的機(jī)器上按清單下載二進(jìn)制跑 offline/pull-images.sh 導(dǎo)出鏡像# 3) 把文件放到控制面節(jié)點(diǎn)的 /opt/k8s-offline再點(diǎn)一次「離線清單」確認(rèn)全綠5.2 目錄結(jié)構(gòu)/opt/k8s-offline/ ├── kubernetes-server-linux-amd64.tar.gz # dl.k8s.io ├── etcd-v3.6.13-linux-amd64.tar.gz # github.com/etcd-io/etcd ├── containerd-2.2.7-linux-amd64.tar.gz # github.com/containerd/containerd ├── runc.amd64 # github.com/opencontainers/runc ├── cni-plugins-linux-amd64-v1.7.1.tgz # github.com/containernetworking/plugins ├── crictl-v1.33.0-linux-amd64.tar.gz # github.com/kubernetes-sigs/cri-tools ├── cfssl_1.6.5_linux_amd64 # github.com/cloudflare/cfssl ├── cfssljson_1.6.5_linux_amd64 # github.com/cloudflare/cfssl ├── calico-v3.32.0.yaml # 可選項(xiàng)目 Calico 清單 └── images/ # 容器鏡像 tar用 ctr images import 導(dǎo)入 ├── pause.tar ├── calico.tar └── coredns.tar文件名必須完全一致腳本按文件名匹配。完整清單與逐條下載地址見生成后的offline/README.md或直接在網(wǎng)頁點(diǎn)「離線清單」按鈕查看/檢查。5.3 準(zhǔn)備鏡像offline/pull-images.sh會拉取 pause / Calico / CoreDNS 并導(dǎo)出為 tar# 在有外網(wǎng)、已裝 containerd 或 docker 的機(jī)器上執(zhí)行cd/opt/k8s-install./offline/pull-images.sh# 產(chǎn)物在 offline/images/多節(jié)點(diǎn)不用手動拷run-all.sh control-plane里的distribute.sh all會自動把整個(gè)離線目錄同步到所有節(jié)點(diǎn)。5.3.1 鏡像加速地址怎么寫很容易踩的坑網(wǎng)頁「鏡像與運(yùn)行時(shí) → 鏡像倉庫加速」支持多個(gè)地址必須用半角逗號,或換行分隔https://k8s.1ms.run, https://docker.1ms.run, https://ghcr.1ms.run ? 正確 https://k8s.1ms.runhttps://docker.1ms.runhttps://ghcr.1ms.run ? 全角逗號用全角逗號「」時(shí)containerd 會把整串當(dāng)成一個(gè) host報(bào)failed to resolve reference registry.k8s.io/coredns/coredns:1.12.1: Head https://k8s.1ms.run/%EF%BC%8Chttps://docker.1ms.run/...: dial tcp: lookup k8s.1ms.run: no such host%EF%BC%8C就是全角逗號的 URL 編碼。現(xiàn)在的防護(hù)網(wǎng)頁在你離開輸入框時(shí)會自動把全角/、/換成半角生成腳本時(shí)也會再歸一化一次02-install-containerd.sh寫完配置后會containerd config dump校驗(yàn)并逐個(gè)體檢每個(gè)鏡像地址DNS HTTPS/v2/打印真正生效的endpoint12/13部署 CNI/CoreDNS 前會先判斷鏡像能不能拿到本地已有 → 直接用鏡像源可達(dá) → 在線拉否則立刻中止并給出辦法不再空等到超時(shí)./run-all.sh diag第 7 節(jié)匯總生效的鏡像地址、每個(gè)地址的可達(dá)性、組件鏡像地址、本地已有鏡像。如果鏡像源確實(shí)都用不了兩條出路① 把鏡像 tar 放進(jìn)${OFFLINE_DIR}/images/最穩(wěn)② 在網(wǎng)頁把CoreDNS 鏡像直接改成可達(dá)倉庫的完整地址如registry.aliyuncs.com/...形式。5.4 自檢./run-all.sh offline# 或直接 ./offline-check.sh要求列出的必需文件全部存在run-all.sh control-plane / node / all在部署前也會自動跑一次自檢不齊全就直接中止并提示不會跑到一半才報(bào)下載失敗。6. 升級網(wǎng)頁「升級」Tab 填目標(biāo)版本 → 生成15-upgrade.sh。行為備份二進(jìn)制與 etcd 快照 → 按 etcd → apiserver → controller-manager → scheduler → kube-proxy → kubelet 順序替換 → 任一組件起不來自動回滾 → 工作節(jié)點(diǎn)默認(rèn) drain/uncordon。支持--dry-run。跨次版本升級會被校驗(yàn)攔下。升級也可在網(wǎng)頁里通過「一鍵部署」同款通道觸發(fā)或登節(jié)點(diǎn)手動跑15-upgrade.sh。7. 維護(hù)這個(gè)工具箱新增 K8s 版本、組件版本、兼容規(guī)則都只改web/assets/js/catalog.jsshell 模板一個(gè)字不用動。改完模板務(wù)必跑自檢nodeweb/tools/selftest.js# 5 套場景渲染 bash -n 語法校驗(yàn) 插值殘留掃描nodeweb/tools/smoke.js# 頁面啟動流程冒煙詳細(xì)的版本目錄結(jié)構(gòu)、加新版本的三步操作見web/README.md。8. 三個(gè)必須知道的坑老教程的寫法在 1.36 上已經(jīng)跑不通containerd 必須 2.x—— 配置格式也變了version 3io.containerd.cri.v1.*kube-proxy 的 IPVS 模式已被移除1.35 棄用、1.36 刪除→ 只能用 iptables 或 nftableskubelet 移除了--pod-infra-container-image→ pause 鏡像只能配在 containerd 的pinned_images.sandbox這三條已寫成生成器的硬規(guī)則選錯(cuò)會在頁面里直接報(bào)錯(cuò)。