尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Kubernetes 1.18.8 离线部署实战:从拆包到集群扩容
简介这份资源是 Kubernetes 1.18.8 版本的离线部署工具包面向需要搭建 k8s 集群的运维工程师、云原生学习者及备考 CKA 的技术人员可解决内网环境无法拉取镜像、组件安装繁琐的问题。压缩包共 21 个文件约 610.15MB以 sh 脚本、yaml 配置、md 说明文档为主另含 kubeadm、kubectl、kubelet、crictl、sealos 等二进制组件以及 calico 网络插件、docker 安装包与镜像归档覆盖主控节点与工作节点的核心部署要素。目前已有 290 人学习下载。资源按 bin、images、shell 等目录组织init.sh、master.sh、docker.sh 等脚本可辅助完成初始化与节点加入配合 kubeadm.yaml、10-kubeadm.conf 等配置能快速复现一套可用的 1.18.8 集群适合作为离线部署与版本特性验证的实操参考。1. 从 kube1.18.8.tar.gz 说起一个离线部署包的拆解与落地如果你手里正好有一个kube1.18.8.tar.gz大概率不是随便下的——要么是内网机器装不了外网源要么是客户现场只给一个 U 盘要么是测试环境反复重装嫌在线拉镜像太慢。这个包本质上是一个 Kubernetes 1.18.8 的离线部署资源集合通常包含 kubelet、kubeadm、kubectl 三个核心二进制以及一套预打包的容器镜像 tar 包有的版本还会附带 CNI 插件和 dashboard 的 yaml。它解决的核心问题只有一个在没有稳定外网、甚至完全没有外网的机器上把一套可用的 k8s 集群拉起来。适合谁适合需要在隔离环境做交付的运维、需要反复重建测试集群的研发以及想搞明白 kubeadm 到底在背后干了什么的人。但别急着解压这个包有几个地方如果不提前看清楚后面会反复翻车。2. 拆包先看结构kube1.18.8.tar.gz 里到底装了什么拿到一个离线包最忌讳的就是直接tar -zxvf然后照着网上随便一篇教程开干。不同来源的kube1.18.8.tar.gz内容差异很大有的只给二进制有的把镜像也塞进去了有的还混了 docker 的 rpm。先摸清结构后面每一步才有依据。2.1 解压与目录层级确认我一般会先在一个临时目录里解压不直接扔到/root下避免污染现场。mkdir -p /tmp/kube-offline cd /tmp/kube-offline tar -zxvf /path/to/kube1.18.8.tar.gz # 先只看一层目录不要急着递归 find . -maxdepth 2 -type d | sort逻辑说明-maxdepth 2是为了快速看清顶层和二级目录避免一上来就被几百个镜像文件刷屏。参数上-z表示 gzip 解压-x提取-v输出过程-f指定文件。如果包很大-v可以去掉减少终端输出开销。常见结构大致是三类bin/下放 kubeadm、kubelet、kubectlimages/下放一堆.tar镜像文件rpms/或packages/下放 docker 或 containerd 的安装包。如果解压后只有一个孤零零的kube1.18.8目录里面再分amd64和arm64那就要注意架构匹配别在 x86 机器上装了 arm 的二进制。2.2 二进制版本与镜像清单核对解压完先别装先核对版本。kubeadm 和 kubelet 版本必须一致否则 join 的时候会直接报版本偏差。cd /tmp/kube-offline # 查看二进制版本注意这里用的是相对路径 ./bin/kubeadm version -o short ./bin/kubelet --version # 列出镜像 tar 包统计数量 ls -1 images/*.tar | wc -l ls -1 images/ | head -20逻辑说明kubeadm version -o short只输出短版本号方便脚本比对。kubelet --version会输出Kubernetes v1.18.8这样的格式。镜像数量很关键——k8s 1.18.8 核心镜像大约 8 到 10 个包括 kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、pause、etcd、coredns。如果镜像 tar 包数量明显偏少比如只有三四个那这个包大概率不完整后面kubeadm init会卡在拉镜像阶段。参数上ls -1是每行一个文件方便wc -l统计。head -20是防止镜像太多刷屏。如果发现镜像文件名带v1.18.8后缀说明是版本对齐的如果文件名很乱比如kube-apiserver.tar不带版本那就要手动docker load之后用docker tag补版本号否则 kubeadm 不认识。提示不要用docker load -i images/*.tar一次性加载所有镜像有些包里的 tar 是嵌套的或者文件名有空格批量加载容易中断。稳妥做法是写个 for 循环逐个加载并记录日志。3. 从零到集群kubeadm init 的离线参数与镜像预加载结构看清了接下来就是真正把集群拉起来。k8s 1.18.8 这个版本kubeadm 已经比较成熟但离线场景下有几个参数必须显式指定否则它会默认去外网拉镜像然后超时失败。3.1 系统前置检查与 docker 安装在装 k8s 之前先把 docker 装好并确认 cgroup driver 是 systemd。1.18.8 时代 docker 还是主流运行时containerd 虽然能用但配置更绕。# 关闭 swap这是 kubelet 的硬性要求 swapoff -a sed -i /swap/s/^/#/ /etc/fstab # 安装离线包里的 docker rpm如果有 cd /tmp/kube-offline/rpms yum localinstall -y *.rpm # 确认 docker 状态和 cgroup driver systemctl enable docker systemctl start docker docker info | grep -i cgroup逻辑说明swapoff -a临时关闭sed那行是永久注释掉 fstab 里的 swap 条目否则重启后 swap 又回来了kubelet 会拒绝启动。yum localinstall会自动处理 rpm 之间的依赖比rpm -ivh省心。docker info | grep -i cgroup应该输出Cgroup Driver: systemd如果是cgroupfs后面 kubelet 启动会报错需要改/etc/docker/daemon.json加exec-opts: [native.cgroupdriversystemd]然后重启 docker。参数上如果离线包里没有 docker rpm那就得自己提前准备好对应系统的 docker-ce 包。CentOS 7 和 CentOS 8 的包不通用别混。3.2 镜像预加载与 kubeadm init 关键参数镜像加载是离线部署最核心的一步。加载完还要确认docker images里能看到k8s.gcr.io/开头的镜像因为 kubeadm 默认去这个 registry 找。cd /tmp/kube-offline/images for img in *.tar; do echo loading $img docker load -i $img /tmp/image-load.log 21 done # 检查关键镜像是否齐全 docker images | grep -E kube-apiserver|kube-controller|kube-scheduler|kube-proxy|pause|etcd|coredns逻辑说明for 循环逐个加载日志重定向到文件方便失败时回溯是哪个 tar 坏了。docker load不需要指定 tagtar 包里自带。检查那行用grep -E匹配多个关键词如果少了一个kubeadm init就会卡在[kubelet-check]或者直接报image pull failed。接下来是 init 命令离线场景必须加--image-repository或者--config指定本地镜像。但 1.18.8 的 kubeadm 对--image-repository支持已经很好可以直接指向本地 registry或者用--ignore-preflight-errors跳过外网检查。kubeadm init \ --kubernetes-versionv1.18.8 \ --pod-network-cidr10.244.0.0/16 \ --image-repositoryregistry.aliyuncs.com/google_containers \ --ignore-preflight-errorsSwap,ImagePull \ --v5逻辑说明--kubernetes-version必须和二进制版本严格一致写v1.18.8不能写1.18.8。--pod-network-cidr是给 flannel 用的如果后面装 calico 就要改成192.168.0.0/16这个一旦 init 完就不能改改就得 reset 重来。--image-repository这里写的是阿里云镜像地址但离线场景下如果本地已经 load 了k8s.gcr.io/的镜像其实可以不加这个参数kubeadm 会优先用本地已有的。--ignore-preflight-errors跳过 swap 和镜像拉取检查--v5输出详细日志方便看卡在哪一步。参数上--pod-network-cidr不要和宿主机网段重叠否则 pod 起来后路由会乱。--ignore-preflight-errors不要无脑写all至少保留Swap和ImagePull其他错误该报还得报。注意如果 init 过程中卡在[wait-control-plane]超过两分钟大概率是 kubelet 没起来。用journalctl -xeu kubelet看日志常见原因是 cgroup driver 不匹配或者镜像 tag 不对。4. 避坑与排查离线部署 k8s 1.18.8 最容易翻车的五个点离线部署和在线部署最大的区别是在线部署出错了可以重新拉离线部署出错了只能干瞪眼。下面这五个坑我几乎每次交付都会遇到至少两个。4.1 镜像 tag 与 kubeadm 预期不一致现象kubeadm init报failed to pull image k8s.gcr.io/kube-apiserver:v1.18.8但docker images里明明有kube-apiserver。原因docker load进来的镜像 tag 可能是k8s.gcr.io/kube-apiserver:v1.18.8但 kubeadm 在某些配置下会去找registry.aliyuncs.com/google_containers/kube-apiserver:v1.18.8tag 前缀不同就匹配不上。解决要么在 init 时用--image-repository指定和本地镜像一致的前缀要么手动docker tag把本地镜像改成 kubeadm 期望的名字。我一般会先kubeadm config images list --kubernetes-versionv1.18.8看它到底要哪些镜像和什么 tag然后逐个比对。4.2 cgroup driver 不一致导致 kubelet 反复重启现象systemctl status kubelet显示 active (running) 但几秒后变成 failedjournalctl里报failed to run Kubelet: misconfiguration: kubelet cgroup driver: cgroupfs is different from docker cgroup driver: systemd。原因docker 默认 cgroup driver 是cgroupfs而 kubelet 1.18.8 默认期望systemd两者不一致时 kubelet 拒绝启动。解决改/etc/docker/daemon.json加exec-opts: [native.cgroupdriversystemd]然后systemctl daemon-reload systemctl restart docker。注意改完 docker 后之前跑的容器可能受影响最好在 init 之前就改好。4.3 防火墙和 iptables 规则拦截 pod 通信现象集群 init 成功节点也 join 了但kubectl get pods -n kube-system里 coredns 一直ContainerCreating或者CrashLoopBackOff。原因CentOS 默认 firewalld 开着或者 iptables 规则里 FORWARD 链默认 DROP导致 pod 跨节点通信被拦。解决测试环境直接systemctl stop firewalld systemctl disable firewalld然后iptables -P FORWARD ACCEPT。生产环境不能这么粗暴需要按 flannel 或 calico 的文档放行特定端口和网段。但离线交付现场很多时候就是先关防火墙把集群跑通再补规则。4.4 join 时 token 过期或证书不匹配现象worker 节点kubeadm join报failed to verify the root CA或者token is expired。原因kubeadm init输出的 token 默认 24 小时过期如果隔天才去 jointoken 已经失效。另外如果 master 重新 init 过CA 证书变了旧 token 对应的 hash 也失效。解决在 master 上kubeadm token create --print-join-command重新生成一条完整的 join 命令直接复制执行不要手动拼。如果 CA 变了那只能重新 join没有后悔药。4.5 离线包里的 CNI 插件版本不兼容现象flannel 或 calico 的 yaml 应用后pod 一直Init:0/1或者CrashLoopBackOff日志里报failed to find plugin flannel in path [/opt/cni/bin]。原因离线包里如果只给了 k8s 核心镜像没给 CNI 插件的二进制或者给的 flannel 版本太老和 k8s 1.18.8 的 CNI 接口不兼容。解决确认/opt/cni/bin/下有flannel、bridge、host-local等二进制。如果没有从离线包的cni/目录里拷过去或者单独下载对应版本的 CNI 插件包。flannel 的 yaml 里image字段要改成离线包里已有的镜像 tag否则它会去外网拉。5. 验证与进阶集群健康检查与节点扩容的实操技巧集群跑起来只是第一步能不能稳定用、能不能加节点才是离线部署的真正考验。这一章不讲虚的只讲我每次交付完必做的验证步骤和一个扩容技巧。5.1 集群健康检查的四个必看指标kubectl get nodes显示 Ready 不代表集群真的健康。我一般会按顺序看这四个地方第一kubectl get pods -n kube-system -o wide确认所有系统 pod 都是 Running且 coredns 是 2/2 或者至少 1/1。如果 coredns 是 0/1那集群内 DNS 解析就是坏的后面部署任何服务都会出问题。第二kubectl get cs看 scheduler、controller-manager、etcd 三个组件的健康状态。1.18.8 时代kubectl get cs还能用输出Healthy才算正常。如果显示Unhealthy去/etc/kubernetes/manifests/下看对应静态 pod 的 yaml 有没有被改坏。第三kubectl run test-nginx --imagenginx:alpine --rm -it -- sh起一个临时 pod 看能不能正常调度和运行。如果卡在Pending用kubectl describe pod看事件常见原因是资源不足或者污点没容忍。第四kubectl logs -n kube-system -l k8s-appkube-dns --tail20看 coredns 日志有没有报错。如果日志里一直刷plugin/forward: no upstream说明 coredns 的 configmap 里 upstream 配错了离线环境要指向可用的 DNS 或者改成/etc/resolv.conf里的地址。# 一条命令快速巡检 kubectl get nodes -o wide \ kubectl get pods -n kube-system -o wide \ kubectl get cs \ kubectl cluster-info逻辑说明kubectl get nodes -o wide看节点 IP 和版本kubectl get pods -n kube-system -o wide看系统 pod 分布kubectl get cs看组件健康kubectl cluster-info看 API server 地址。这四条输出正常集群基本就没大问题。5.2 离线扩容 worker 节点的三个关键动作扩容在离线环境比在线麻烦因为新节点没有镜像。我的习惯是先把离线包拷到新节点解压后只做三件事。第一装 docker 和 kubelet、kubeadm 二进制。把bin/下的 kubelet 和 kubeadm 拷到/usr/bin/然后systemctl enable kubelet。注意 kubelet 的 service 文件如果离线包里没给要从 master 的/usr/lib/systemd/system/kubelet.service拷一份过来否则 systemd 不认识。第二加载镜像。新节点不需要加载全部镜像只需要pause、kube-proxy和 flannel 或 calico 的镜像。但为了省事我一般还是把images/下所有 tar 都 load 一遍反正离线包就在本地不费流量。第三用 master 上重新生成的 join 命令加入。join 之前确认新节点的/etc/hosts里 master 的主机名能解析否则 join 会报no such host。join 成功后在 master 上kubectl get nodes应该能看到新节点状态从NotReady变成Ready通常需要几十秒到一分钟耐心等。# 在 master 上生成新的 join 命令 kubeadm token create --print-join-command # 在新节点上执行示例实际以输出为准 kubeadm join 192.168.1.100:6443 --token abcdef.1234567890abcdef \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx逻辑说明--print-join-command会自动带上当前有效的 token 和 CA 证书 hash比手动拼靠谱。--discovery-token-ca-cert-hash是防止中间人攻击的不能省。如果新节点 join 后一直 NotReady先看journalctl -xeu kubelet再看kubectl describe node 新节点名的 Conditions常见原因是 CNI 没就绪或者 kubelet 版本和 master 不一致。提示离线扩容时如果新节点和 master 的 kubelet 版本差了一个小版本比如 master 是 1.18.8新节点是 1.18.7join 可能会成功但后续行为不一致。我一般强制要求版本完全一致差一个 patch 都不行。从那以后我每次拿到一个kube1.18.8.tar.gz都强制先解压看目录、核对镜像 tag、确认 cgroup driver再动手 init。这套流程帮我省掉了至少三次现场返工。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

ACM/ICPC 北京站网络赛 B Tomb Raider:用二进制枚举解字符串字典序问题

ACM/ICPC 北京站网络赛 B Tomb Raider:用二进制枚举解字符串字典序问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/12 16:29:29
国产超声波传感器如何破解狭小空间液位检测难题:选型、安装与信号处理实战

国产超声波传感器如何破解狭小空间液位检测难题:选型、安装与信号处理实战

1. 狭小空间液位检测的真实困境:为什么传统方案频频翻车做过工业设备或者智能硬件的人都有一个共识:液位检测这件事,听起来简单,做起来要命。尤其是当测量空间被压缩到极限的时候,你会发现市面上大多数方案都开始"…

📅 2026/10/12 16:29:29
openclaw 配置自定义 Gemini 接口地址实践总结:从环境变量到 zsh 生效

openclaw 配置自定义 Gemini 接口地址实践总结:从环境变量到 zsh 生效

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/12 16:29:29
MORE NEWS

更多资讯

📰

PyBullet小车仿真从零构建:可调试可扩展的物理建模实践

1. 项目概述:为什么一个小车仿真值得花一整篇教程来拆解PyBullet 是我过去三年在机器人仿真领域用得最顺手的工具之一,不是因为它功能最全,而是它在“可理解性”和“可调试性”之间找到了极少见的平衡点。很多人第一次接触 PyBullet 时&#…

📰

机器学习驱动雷达辐射源识别:从数据处理到评估避坑指南

简介:雷达辐射源识别是电子侦察与雷达对抗中的关键环节,传统参数匹配法仅利用外部特征,难以处理复杂脉内调制信号。这份PDF综述聚焦机器学习与辐射源智能识别的交叉方向,面向雷达对抗、信号处理及智能感知领域的研究者与相关专业研…

📰

OpenCV摄像头延迟优化:从缓冲机制到多线程抓帧的实战指南

1. 摄像头读到的画面为什么总是"过去时"如果你用OpenCV做过实时视觉项目,大概率遇到过这种诡异现象:代码逻辑明明没问题,画面也能正常显示,但摄像头前的人已经把手放下了,屏幕里的手还举着;或者做…

📰

Kubernetes 1.18.8 离线包部署指南:从 tar.gz 到 running 集群

简介:这份资源是面向容器编排学习者的 Kubernetes 1.18.8 离线部署工具包,适合需要搭建 k8s 集群、研究核心组件或进行离线环境安装的运维与开发人员。压缩包共 21 个文件,约 610.15MB,涵盖 shell 安装脚本、yaml 配置清单、servi…

📰

大规模MIMO统计信道方案:SLNR波束形成与MMSE功率分配

简介:这套PDF资料围绕Massive MIMO(大规模多输入多输出)系统,面向从事5G/6G无线通信算法研究的工程师、高校师生及相关方向的技术爱好者,重点解决频分双工(FDD)模式下因获取瞬时信道状态信息成本…

📰

花18999元学OpenClaw?先看TaoToken统一Key怎么把开源AI工具跑通

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬