ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

k8s一键部署更新

k8s一键部署更新 K8s 二进制部署工具箱一套不依赖 kubeadm 的 Kubernetes 二进制部署方案组件全部拆开独立部署并配了一个 Web 控制台你只在一个地方操作——浏览器里的网页。集群版本、节点 IP / 主机名 / 角色、SSH 登录密码、CNI、网段、镜像加速……全部在网页填好点几下按钮后端直接在节点上执行部署并把日志实时回传不需要登录服务器终端、不需要手改任何.sh文件。当前内置方案仅作示例展示Kubernetesv1.36.4/ Ubuntu 22.04 / 1 控制面 2 工作节点 / Calico containerd。资源下载地址链接https://pan.quark.cn/s/ed2f4a893483提取码XAnq1. 它解决了什么以前现在在服务器上跑一堆脚本自己看屏幕日志浏览器里点「一键部署」日志实时流式回传先手改00-env.sh填 IPIP / 主机名 / 密码都在网页填脚本自动代入自己ssh-copy-id配免密网页填密码后端自动分发密钥离线拷贝脚本包脚本直接落盘到目标机/opt/k8s-install并执行2. 目录结构k8s-deploy-kit/ ├── README.md ← 你在这里 ├── start-web.sh ← 在第一个控制面节点上启动 Web 控制台唯一需要的一次终端操作 ├── web/ ← Web 控制台纯前端 Python 标准库后端无外部服务依赖 │ ├── index.html ← 配置界面 │ ├── server.py ← 后端静态托管 SSH 编排 流式部署SSE │ ├── sshlib.py ← SSH 操作封装基于 paramiko │ ├── assets/js/catalog.js ← 版本目录新增版本只改这里 │ ├── assets/js/templates/ ← 脚本模板与配置解耦 │ └── tools/ ← selftest.js语法自检、smoke.js页面冒烟、build.js命令行渲染 ├── scripts/ ← 空占位目录可选网页「生成并写入服务器」按钮的落盘副本 └── offline/ ← 离线包说明清单由页面「离线清单」按钮实时生成/检查真正部署时脚本落在目标机的/opt/k8s-install环境变量K8S_INSTALL_DIR可改scripts/只是留给你事后查看/导出的副本不参与执行。⚠️不要在仓库副本里直接跑脚本。仓库自带的scripts/00-env.sh是默认 IP192.168.1.10/11/12。若你在~/k8s-deploy-kit/scripts里执行本机真实 IP 不在这份配置里角色会被判成worker于是报kube-controller-manager 只在控制面节点部署当前角色worker。请始终在/opt/k8s-install网页「一键部署」写入的真实配置里执行cd/opt/k8s-install./run-all.sh plan# 确认本机 IP 在配置的节点列表中cd/opt/k8s-install./run-all.sh step 08-deploy-controller-manager.sh⚠️/opt/k8s-install里的脚本只在网页点「一键部署 / 生成并写入服务器」时才更新。手工./run-all.sh step xxx.sh跑的是磁盘上已存在的那份。所以改了参数后正确顺序是先在网页点「一键部署」它会先写入最新脚本再执行而不是直接手工重跑某一步。各脚本会自查关键项例如08会确认 systemd unit 里确实带上了必需参数旧版会直接报错提醒。国内镜像加速地址https://docker.m.daocloud.io, https://hub-mirror.c.163.com, https://mirror.baidubce.com3. 标准流程全程网页操作只需要一次终端操作在第一个控制面节点上启动 Web 控制台。其余全在浏览器里完成。第 1 步启动 Web 控制台仅此一次终端操作需要在控制节点安装paramiko模块 pip3installparamiko --break-system-packages# 在【第一个控制面节点】上执行cd/opt/k8s-deploy-kit ./start-web.sh# 默认 0.0.0.0:8777安全提示默认监听0.0.0.0仅限可信内网。公网/多租户环境请改用./start-web.sh 8777 127.0.0.1然后本地做 SSH 端口转发ssh -N -L 8777:127.0.0.1:8777 root目标机IP再访问http://127.0.0.1:8777。控制台只在「测试连接 / 分发密钥 / 部署」时用到节点密码密码仅存在于本次请求中不会写入任何脚本或落盘文件。第 2 步笔记本浏览器打开并配参打开http://第一个控制面IP:8777在网页里填「集群基础」Tab集群名、K8s 版本、SSH 用户默认root、SSH 端口、SSH 密码用于首次免密密钥分发。「节点规划」Tab点「按节点数生成」自动建表逐行填每台机器的真实 IP / 主机名 / 角色 / SSH 端口 / 登录密码密码留空则用全局密码。其它 Tab 按需调组件版本、CNI、网段、高可用 VIP、镜像加速、审计日志等。右侧「生成预览」实时校验有错误网段重叠、IPVS 已移除、跨次版本升级等会标红需先修正。第 3 步点按钮全程网页驱动网页顶部「运维操作」工具栏按钮作用测试连接用你填的密码登录各节点确认可达分发密钥在控制面生成 SSH 密钥如没有写入各节点authorized_keys实现免密 SSH预检全部各节点只读预检系统 / 内核 / cgroup v2 / 内存 / 磁盘 / 缺命令离线清单列出需要提前下载的二进制与镜像 下载地址并检查服务器离线目录里已有哪些、缺哪些内网部署用一键部署把脚本落盘到/opt/k8s-install→ 分发密钥 → 执行run-all.sh control-plane自动分发脚本到 worker、远程初始化、批准 CSR、验收日志实时回传拉入工作节点只执行run-all.sh workers分发 → 逐节点初始化 → 批准 CSR → 等待注册。比整集群重来快得多任一节点失败会立刻打印该节点的现场诊断node-diag一键诊断在控制面本机执行diag.sh一次性收集 服务状态/端口/节点/CSR/kubelet 日志/证书/CNI/镜像 等排查证据不依赖 paramikoworker 没加入集群kubectl get node只有 master→ 点「拉入工作节点」重跑它会明确告诉你每台节点卡在哪containerd 没装上 / 证书没分发到 / 连不上 6443 / CSR 没批准不再只丢一句节点数不足。想单独看某台节点在控制面执行./run-all.sh diag-node 节点IP。顺序建议先「测试连接」→「分发密钥」→「预检全部」都通过后再「一键部署」。内网环境可在中间点一次「离线清单」确认离线包齐全。部署中或部署后出现异常直接点「一键诊断」把输出发出来即可定位问题。部署耗时较长日志会持续滚动期间不要关闭页面。就这样没有第 4 步。不需要ssh到服务器、不需要手改脚本、不需要拷文件。4. 部署前置条件项要求系统Ubuntu 22.04 / RHEL 9必须 cgroup v21.35 起不再支持 cgroup v1运行时containerd2.xK8s 1.35 是最后一个支持 containerd 1.x 的版本网络节点互通控制面能 SSH密码或已免密到所有其它节点资源控制面 ≥ 2C4G工作节点 ≥ 2C2G各 ≥ 40G 磁盘联网需拉取二进制与镜像不通外网时用offline/见下Python目标机有python3paramiko。必须预先安装否则「测试连接/分发密钥/一键部署」都会红安装 paramiko控制面节点执行# 有外网sudoapt-getupdatesudoapt-getinstall-ypython3-pip pip3installparamiko# 或直接用 apt 包sudoapt-getinstall-ypython3-paramiko# 离线环境./install-deps.sh装好后执行python3 -c import paramiko; print(paramiko.__version__)确认再重新启动./start-web.sh。把控制台跑在哪台机器上请跑在「第一个控制面节点」上因为它在本地执行run-all.sh并通过 SSH 把脚本与凭据分发到其它节点。5. 离线部署内网环境所有下载都会优先看你配置的离线目录找到本地文件就不联网。默认目录/opt/k8s-offline网页「高级 → 离线包目录」可改。5.1 三步搞定# 1) 在网页点「离线清单」按钮 —— 会列出需要哪些文件、每台的下载地址并检查服务器上已有哪些# 2) 在任意有外网的机器上按清单下载二进制跑 offline/pull-images.sh 导出镜像# 3) 把文件放到控制面节点的 /opt/k8s-offline再点一次「离线清单」确认全绿5.2 目录结构/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 # 可选项目 Calico 清单 └── images/ # 容器镜像 tar用 ctr images import 导入 ├── pause.tar ├── calico.tar └── coredns.tar文件名必须完全一致脚本按文件名匹配。完整清单与逐条下载地址见生成后的offline/README.md或直接在网页点「离线清单」按钮查看/检查。5.3 准备镜像offline/pull-images.sh会拉取 pause / Calico / CoreDNS 并导出为 tar# 在有外网、已装 containerd 或 docker 的机器上执行cd/opt/k8s-install./offline/pull-images.sh# 产物在 offline/images/多节点不用手动拷run-all.sh control-plane里的distribute.sh all会自动把整个离线目录同步到所有节点。5.3.1 镜像加速地址怎么写很容易踩的坑网页「镜像与运行时 → 镜像仓库加速」支持多个地址必须用半角逗号,或换行分隔https://k8s.1ms.run, https://docker.1ms.run, https://ghcr.1ms.run ✅ 正确 https://k8s.1ms.runhttps://docker.1ms.runhttps://ghcr.1ms.run ❌ 全角逗号用全角逗号「」时containerd 会把整串当成一个 host报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 编码。现在的防护网页在你离开输入框时会自动把全角/、/换成半角生成脚本时也会再归一化一次02-install-containerd.sh写完配置后会containerd config dump校验并逐个体检每个镜像地址DNS HTTPS/v2/打印真正生效的endpoint12/13部署 CNI/CoreDNS 前会先判断镜像能不能拿到本地已有 → 直接用镜像源可达 → 在线拉否则立刻中止并给出办法不再空等到超时./run-all.sh diag第 7 节汇总生效的镜像地址、每个地址的可达性、组件镜像地址、本地已有镜像。如果镜像源确实都用不了两条出路① 把镜像 tar 放进${OFFLINE_DIR}/images/最稳② 在网页把CoreDNS 镜像直接改成可达仓库的完整地址如registry.aliyuncs.com/...形式。5.4 自检./run-all.sh offline# 或直接 ./offline-check.sh要求列出的必需文件全部存在run-all.sh control-plane / node / all在部署前也会自动跑一次自检不齐全就直接中止并提示不会跑到一半才报下载失败。6. 升级网页「升级」Tab 填目标版本 → 生成15-upgrade.sh。行为备份二进制与 etcd 快照 → 按 etcd → apiserver → controller-manager → scheduler → kube-proxy → kubelet 顺序替换 → 任一组件起不来自动回滚 → 工作节点默认 drain/uncordon。支持--dry-run。跨次版本升级会被校验拦下。升级也可在网页里通过「一键部署」同款通道触发或登节点手动跑15-upgrade.sh。7. 维护这个工具箱新增 K8s 版本、组件版本、兼容规则都只改web/assets/js/catalog.jsshell 模板一个字不用动。改完模板务必跑自检nodeweb/tools/selftest.js# 5 套场景渲染 bash -n 语法校验 插值残留扫描nodeweb/tools/smoke.js# 页面启动流程冒烟详细的版本目录结构、加新版本的三步操作见web/README.md。8. 三个必须知道的坑老教程的写法在 1.36 上已经跑不通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这三条已写成生成器的硬规则选错会在页面里直接报错。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进