新闻详情

新闻详情

首页 / 资讯中心 / 详情

Kubernetes离线部署指南:kubeadm+containerd内网集群搭建全流程

发布时间:2026/9/16 7:13:07来源:尧图网络
Kubernetes离线部署指南:kubeadm+containerd内网集群搭建全流程
Kubernetes离线部署这件事放在开发测试环境里基本是每个团队迟早都会撞上的一道坎。很多项目的研发网段完全隔离或者企业内部对系统外联有严格约束apt、yum、docker pull这些日常操作全被卡死可是K8s从系统依赖到容器镜像每一步都在向网络要资源。这篇指南就是冲着这个场景来的把在断网机器上从零搭一套K8s开发测试集群所需的完整物料、操作步骤、踩坑经验都列清楚照着做基本能把集群跑起来中间不会再被“拉不到镜像”这种问题逼疯。这次分享的目标读者很明确被内网环境折磨的DevOps、需要自己在测试环境搭建平台的开发同学还有刚接触K8s想搞一套完整离线实践的新手。内容覆盖制品准备、基础环境配置、kubeadm初始化、常用插件离线安装、以及高频问题排查整体按“先在线打包、后离线安装”的思路展开用到什么解释什么。1. 项目概述与整体设计思路在动手之前我先把离线部署的底层逻辑讲透。开发测试环境的离线部署本质上不是“在没有网络的地方变魔法”而是把在线环境下原本自动完成的依赖获取动作提前手动做完再搬到目标环境里执行。1.1 为什么开发测试环境需要离线方案这个问题我在不同团队被问过很多次。真实场景大概有三类一是涉密研发网或企业内网物理隔离、外网禁访这是最严格的二是托管机房或云上VPC网络策略只开放白名单端口公共镜像源根本不通三是临时搭建的演示、培训或比赛环境场地网络不稳定与其现场赌运气不如全部离线。开发测试环境还有一个容易被忽略的特点它需要频繁重建。版本升级、环境损坏、人员交接都可能要求你快速再拉一套集群。如果这套集群的搭建过程高度依赖外网那么每次重建都是一次完整的外网依赖窗口这在隔离环境下是不可接受的。离线部署方案把依赖固化成制品包重建集群只是重复执行时间成本和失败风险都会大幅下降。1.2 方案选型kubeadm还是二进制手动部署搭建K8s集群的常见路线有三种kubeadm引导安装、二进制手动部署、以及基于Playbook的自动化工具比如kubeasz、sealos。开发测试环境我建议优先选kubeadm。原因很直接kubeadm是官方维护的集群引导工具生产环境大量使用它的配置文件可审查、可版本化、可重复执行同时它把etcd、apiserver、controller-manager、scheduler这些组件的静态Pod定义直接生成到集群里架构清晰排查问题更容易。二进制手动部署在离线场景下不是不行但需要自己处理大量systemd单元文件和证书签发开发测试环境没必要背这个复杂度。另外要提醒一下不要一上来就想着用sealos这类封装工具。sealos确实能把离线部署压缩到一条命令但它的镜像方案相对黑盒出了问题不好定位。等到你用kubeadm把流程跑通、理解底层逻辑之后再谈工具化封装也不迟。本指南核心就是kubeadm加containerd的组合。1.3 离线部署的思路闭环制品准备、搬运落地、离线安装离线部署如果拆成三个阶段来看思路会非常清晰。第一个阶段是制品准备在能联网的机器上完成所有依赖的下载和归档。需要准备的制品包含三类操作系统层依赖rpm包或deb包、K8s核心二进制与工具kubeadm、kubelet、kubectl还有集群运行所需的所有容器镜像。这一阶段的核心目标是把“网络依赖”彻底固化成“文件依赖”。第二个阶段是搬运落地通过U盘、内网传输通道等介质把制品包拷到目标机器上再完成解压归档、本地仓库初始化等操作。这个阶段要特别注意目录规划、校验值和版本锁定。第三个阶段是离线安装目标机器完全断网状态下向本地仓库和本地镜像库请求资源完成K8s集群初始化、节点加入、网络插件安装和应用组件部署。整个过程不需要任何外网请求这就是离线部署的意义所在。2. 离线资源准备与制品清单整个离线部署工程里资源准备是最枯燥但最关键的环节。前面版本选错一个后面可能全部推倒重来。2.1 需要准备的完整制品清单我整理了一份开发测试环境最常用的清单以CentOS 7.9或兼容的Rocky Linux 8加Kubernetes 1.28.x为例直接按这个清单准备就不会缺东西。制品类别具体内容版本建议用途说明操作系统CentOS 7.9/Ubuntu 22.04稳定版统一基座避免系统差异容器运行时containerd1.7.xK8s默认CRI运行时辅助工具crictl与K8s版本匹配命令行查看容器和镜像K8s组件kubeadm、kubelet、kubectl1.28.x集群引导与日常管理系统依赖rpmlibseccomp、conntrack等以安装提示为准containerd和kubelet的系统依赖核心镜像见2.3小节与K8s版本严格对应apiserver、etcd、pause等网络插件镜像Calico或Flannel与K8s兼容Pod网络方案辅助组件镜像Dashboard、metrics-server选择稳定版Web管理、资源监控提示版本锁定是离线部署的第一原则。K8s镜像与kubeadm版本必须一一对应etcd和pause版本也不要手动修改否则初始化时镜像拉取环节校验会直接报错。建议以kubeadm config images list命令在联网机器上输出的结果为准。2.2 制作离线yum仓库操作系统和K8s相关的rpm包在离线机器上必须有一个本地仓库来源。最常用的做法是在联网机器上准备一个目录把需要的rpm包放进去然后用createrepo生成仓库元数据最后通过HTTP或直接拷贝分发到目标机器。先在一台联网机器上创建目录结构mkdir -p /opt/k8s-offline/rpms cd /opt/k8s-offline/rpms # 下载K8s核心组件rpm包以1.28.2为例 yumdownloader --resolve kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2 # 下载containerd及其依赖 yumdownloader --resolve containerd.io # 加入常见系统依赖 yumdownloader --resolve libseccomp-devel下载完成后生成仓库元数据yum install -y createrepo createrepo /opt/k8s-offline/rpms把整个rpms目录拷到离线机器后在离线机器上创建本地repo文件cat /etc/yum.repos.d/k8s-local.repo EOF [k8s-local] nameKubernetes Local Repository baseurlfile:///opt/k8s-offline/rpms enabled1 gpgcheck0 EOF yum clean all yum makecache注意gpgcheck设为0在这里是合理的因为包来源已经通过内网传输链路做了可信保证继续开启校验反而可能因为缺少GPG公钥导致安装失败。2.3 获取K8s核心镜像与组件镜像K8s集群运行所需的镜像必须在联网机器上提前拉取并导出为tar包。用kubeadm命令可以直接拿到需要的镜像清单kubeadm config images list --kubernetes-version v1.28.2输出大概是这样registry.k8s.io/kube-apiserver:v1.28.2 registry.k8s.io/kube-controller-manager:v1.28.2 registry.k8s.io/kube-scheduler:v1.28.2 registry.k8s.io/kube-proxy:v1.28.2 registry.k8s.io/pause:3.9 registry.k8s.io/etcd:3.5.9 registry.k8s.io/coredns/coredns:v1.10.1逐一拉取并打tar包# 安装docker仅用于镜像搬运或使用skopeo、ctr等方式 docker pull registry.k8s.io/kube-apiserver:v1.28.2 # 以此类推将全部镜像拉取到本地 mkdir -p /opt/k8s-offline/images docker save registry.k8s.io/kube-apiserver:v1.28.2 -o /opt/k8s-offline/images/kube-apiserver.tar开发测试环境如果还需要Dashboard、metrics-server、Calico等组件也一并拉取导出。推荐的辅助镜像清单组件镜像版本Dashboardkubernetesui/dashboardv2.7.0Dashboard metricskubernetesui/metrics-scraperv1.0.8metrics-serverregistry.k8s.io/metrics-server/metrics-serverv0.6.4Calicocalico/cni、calico/node、calico/kube-controllersv3.26.1实操心得所有tar包导出后顺手生成一个sha256校验文件传到离线机器后先校验再导入。镜像动辄几百MB甚至上GB拷贝过程中偶尔会发生文件损坏没有校验机制你会花大量时间排一个根本不存在的问题。2.4 目录规划与传递介质安排我习惯把离线制品包按统一目录结构组织目标机器直接照抄这个结构减少出错。/opt/k8s-offline/ ├── rpms/ # yum仓库目录含createrepo元数据 ├── images/ # 所有镜像tar包 ├── packages/ # kubeadm、kubelet、kubectl二进制如果不用rpm ├── configs/ # kubeadm配置文件、calico yaml等 └── checksum.sha256 # 所有文件的校验文件传递介质建议使用内网共享存储或高速U盘大镜像文件通过U盘拷贝时注意文件系统格式建议用exFAT或ext4避免单文件4GB限制。3. 基础环境初始化与离线安装准备制品搬运完成后离线机器上要开始真正的安装动作。这一阶段以“可重复执行”为原则所有修改都留有日志和记录。3.1 主机规划与节点划分建议开发测试环境我建议至少准备一台控制节点加一台工作节点。如果资源有限单机All-in-One也可以但最好在虚拟机里做快照方便出问题时回滚。推荐的资源基线节点角色配置建议用途控制平面节点4C8G 100GB磁盘运行etcd、apiserver、controller-manager、scheduler工作节点4C8G 100GB磁盘起运行业务Pod如果跑大模型推理类应用建议加GPU单机All-in-One8C16G 200GB磁盘演示、开发联调注意etcd和业务资源抢占问题主机名和hosts解析提前配置好所有节点的主机名都不能重复并且集群内所有节点都能通过主机名互相访问。hostnamectl set-hostname k8s-master01 cat /etc/hosts EOF 192.168.10.11 k8s-master01 192.168.10.12 k8s-node01 EOF3.2 系统基础配置内核模块、系统参数、关闭swapK8s对系统层有一个硬性要求swap必须关闭否则kubelet启动会直接报错退出。这是因为K8s的Pod内存管理机制依赖cgroup来控制和统计内存使用swap的存在会让这种统计失真。执行以下操作# 关闭swap并注释/etc/fstab相关行 swapoff -a sed -i / swap / s/^/#/ /etc/fstab # 加载K8s所需内核模块 cat /etc/modules-load.d/k8s.conf EOF overlay br_netfilter EOF modprobe overlay modprobe br_netfilter # 设置内核参数 cat /etc/sysctl.d/k8s.conf EOF net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOF sysctl --system这几个内核参数的作用我用个直观的方式解释net.ipv4.ip_forward控制着K8s集群内部Pod和Service的流量转发如果不开启ClusterIP模式的Service流量无法正确路由到Pod集群内Pod之间也无法跨节点通信。br_netfilter相关参数是确保经过Linux网桥的流量也能被iptables规则处理这是K8s网络策略和Service转发的基础。3.3 安装containerd并处理关键配置离线机器上安装containerd首选从离线yum仓库直接安装yum install -y containerd.io安装完成后初始化配置并调整关键项。containerd的默认配置文件是/etc/containerd/config.toml先生成默认配置再修改mkdir -p /etc/containerd containerd config default /etc/containerd/config.toml然后修改两个地方。第一是sandboxpause镜像地址确保和K8s版本一致[plugins.io.containerd.grpc.v1.cri] sandbox_image registry.k8s.io/pause:3.9第二是cgroup驱动必须改为systemd[plugins.io.containerd.grpc.v1.cri.containerd.runtimes.runc.options] SystemdCgroup true关于cgroup驱动这里多写几句。Linux系统有两套cgroup管理方式cgroupfs和systemd。K8s官方强烈建议kubelet使用systemd驱动因为systemd本身在初始化时就会接管cgroup如果kubelet用cgroupfs而systemd也在管理cgroup两者同时控制系统资源分配会出现“双头管理”轻则资源统计异常重则节点崩溃。这就是为什么kubelet和containerd的cgroup驱动必须要一致且都为systemd。修改完成后启动containerd并验证systemctl enable containerd systemctl start containerd ctr version3.4 安装kubeadm、kubelet、kubectl并锁定版本K8s三件套的安装同样走本地yum仓库yum install -y kubeadm-1.28.2 kubelet-1.28.2 kubectl-1.28.2安装完成后需要把版本锁定防止意外升级导致版本漂移yum install -y yum-plugin-versionlock yum versionlock kubeadm kubelet kubectl然后设置kubelet开机启动先不启动等初始化完成后才会正常运行systemctl enable kubelet4. 使用kubeadm离线初始化集群制品和基础环境都就绪后进入核心的集群初始化环节。这一阶段的操作要注意每一步的校验输出很多坑在输出日志里其实有明确提示。4.1 将镜像tar包导入到containerd离线环境下Crictl的镜像导入方式与docker有很大不同。对containerd来说需要用到ctr命令并且必须指定K8s的命名空间k8s.io否则kubelet无法识别# 在images目录下执行 for img in *.tar; do ctr -nk8s.io images import $img done验证一下镜像是否导入成功crictl images注意crictl默认连接containerd的socket配置一下/etc/crictl.yaml会更顺手runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 10 debug: false4.2 编写离线kubeadm配置文件kubeadm init支持通过配置文件传参离线场景强烈建议用配置文件而不是纯命令行参数因为配置可以保存、review、复用。以下是一个基础的控制平面节点配置apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.10.11 bindPort: 6443 nodeRegistration: criSocket: /run/containerd/containerd.sock --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.28.2 controlPlaneEndpoint: 192.168.10.11:6443 networking: dnsDomain: cluster.local podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12几个关键参数的说明advertiseAddress控制节点监听API请求的IP一定要填内网实际IP不要填默认路由IP。kubernetesVersion必须和本地导入的镜像版本完全一致。podSubnetPod地址段我建议用10.244.0.0/16和Flannel默认保持一致会省很多事。serviceSubnetService虚拟IP段10.96.0.0/12是默认值没有特殊规划可以不变。关于Pod网段的选择有个实际经验开发测试环境经常存在多个集群如果每个集群的Pod网段都相同未来做多集群联邦或者集群迁移时冲突会非常明显。建议从一开始就在内网IP段规划中预留不同集群的不同网段避免后续返工。4.3 初始化控制平面节点在控制节点上执行kubeadm init --config /opt/k8s-offline/configs/kubeadm-config.yaml --upload-certs这一步有几个可能的结局顺利通过或者卡在等待kubelet启动、拉取镜像失败等位置。如果卡住不要反复重试同一命令应该先查kubelet日志journalctl -u kubelet -f初始化成功后会输出一大段提示其中包含加入工作节点的join命令一定保存好。然后按提示配置kubectlmkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config验证控制平面状态kubectl get nodes kubectl get pods -A此时node状态大概率是NotReady原因是还没有安装CNI网络插件这是正常的。4.4 添加Worker节点到集群工作节点只需要安装kubeadm、kubelet和containerd并导入相同的一套镜像然后执行control plane初始化后输出的join命令kubeadm join 192.168.10.11:6443 --token xxxxx --discovery-token-ca-cert-hash sha256:xxxxx如果token过期在控制节点上重新生成kubeadm token create --print-join-command实操心得开发测试环境经常遇到worker节点重新初始化的情况旧的K8s残留目录会导致加入失败。重置节点时执行kubeadm reset -f后记得手动清理/etc/cni/net.d和/var/lib/kubelet等目录。不清理干净新加入节点的CNI配置会乱Pod网络会彻底瘫痪。5. 开发测试常用组件离线安装集群初步跑起来之后离真正能用还有一段距离。这一节覆盖开发测试环境最常用的几个组件的离线安装方式包括CNI网络插件、资源监控、Web管理界面以及离线业务镜像导入能力。5.1 安装CNI网络插件Calico/Flannel没有网络插件集群节点会一直保持NotReady状态。开发测试环境我推荐优先使用Flannel因为配置简单、资源占用低适合性能不高的测试机和虚拟机。Calico则适合需要网络策略NetworkPolicy的测试场景比如你想验证Pod级别的访问控制规则。以Flannel为例先在联网环境准备镜像和yaml文件docker pull flannelcni/flannel:v0.22.0 docker save flannelcni/flannel:v0.22.0 -o /opt/k8s-offline/images/flannel.tar # 下载kube-flannel.yml离线机器上导入镜像并应用ctr -nk8s.io images import /opt/k8s-offline/images/flannel.tar kubectl apply -f /opt/k8s-offline/configs/kube-flannel.yml检查Pod状态kubectl get pods -A | grep flannel kubectl get nodes几分钟后节点应该都变为Ready。如果Calico思路一致提前下载calico.yaml替换其中的镜像地址为本地或内网仓库地址导入镜像后kubectl apply即可。5.2 安装metrics-server实现资源监控开发测试环境里查看Pod和节点的CPU、内存使用情况是一个非常高频的需求kubectl top命令依赖metrics-server。这个组件在离线安装时有一个常见坑默认配置下它要求节点间的kubelet连接必须走TLS证书校验开发测试环境的证书配置很难满足需要给metrics-server加上--kubelet-insecure-tls参数。先下载metrics-server的yaml官方components.yaml修改Deployment部分containers: - args: - --cert-dir/tmp - --secure-port4443 - --kubelet-insecure-tls - --kubelet-preferred-address-typesInternalIP离线机器导入镜像并部署ctr -nk8s.io images import /opt/k8s-offline/images/metrics-server.tar kubectl apply -f /opt/k8s-offline/configs/metrics-server-components.yaml kubectl top nodes5.3 安装Kubernetes Dashboard可视化界面对于开发测试环境Dashboard能明显降低团队的使用门槛。一个没接触过K8s的同事通过网页看Pod日志、看Deployment状态比教他敲kubectl命令要高效得多。先导入Dashboard相关镜像ctr -nk8s.io images import /opt/k8s-offline/images/dashboard.tar ctr -nk8s.io images import /opt/k8s-offline/images/metrics-scraper.tar kubectl apply -f /opt/k8s-offline/configs/dashboard.yaml创建管理员账号并获取登录tokenapiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboardkubectl -n kubernetes-dashboard create token admin-user访问方式上开发测试环境最省事的是把Service改成NodePortkubectl -n kubernetes-dashboard edit svc kubernetes-dashboard # 将type改为NodePort保存后查看端口 kubectl -n kubernetes-dashboard get svc通过节点IP加NodePort就能访问Dashboard这个方式在断网环境里完全够用。5.4 镜像导入的通用能力支撑离线业务部署开发测试环境里K8s集群本身不是目的跑业务才是。很多团队在离线集群上要部署大模型推理服务比如最近很火的DeepSeek 8B、开源数据平台、低代码工具等。这类应用的镜像动辄几个GB到几十GB怎么在离线环境把它变成K8s能用的工作负载本质还是走镜像导入这条路。通用流程是这样的在能联网的环境里docker pull业务镜像然后docker save成tar包传导到离线机器后用ctr命令导入到k8s.io命名空间再接Deployment或Helm Chart部署。业务镜像导入和K8s系统镜像导入在流程上没有任何区别只是体积更大。# 联网机器上 docker pull deepseek-ai/DeepSeek-R1-Distill-Qwen-8B:latest示意 docker save deepseek-ai/DeepSeek-R1-Distill-Qwen-8B -o /opt/k8s-offline/images/deepseek-8b.tar # 离线机器上 ctr -nk8s.io images import /opt/k8s-offline/images/deepseek-8b.tar注意大镜像导入耗时较长ctr命令可能看起来像卡住了实际上是在解包写入。建议先用sha256校验文件确认完整性再导入。K8s侧只要有GPU驱动如果需要就可以通过kubectl apply部署推理服务。6. 常见问题与排障速查表离线部署K8s的坑从操作系统层到Pod运行层都有。我把这几年实际遇到的高频问题整理成一张速查表每个问题都是排查过的不是网上抄来的。问题现象根因分析解决方案kubeadm init卡在等待kubelet启动镜像没导入或cgroup驱动配置错误检查crictl images确认镜像存在核对containerd SystemdCgroup配置初始化后node处于NotReadyCNI网络插件未安装或pause镜像缺失安装Flannel/Calico确认pause镜像存在且镜像tag与k8s版本一致Pod状态一直是ContainerCreatingCNI插件没有就绪或镜像拉取失败kubectl describe pod查看事件确认镜像是否导入到k8s.io命名空间CoreDNS一直CrashLoopBackOff网络插件与Pod网段冲突检查podSubnet配置避免与主机网段重叠kubectl top没有数据metrics-server未安装或安全参数缺失确认metrics-server已启动且配置--kubelet-insecure-tls工作节点join后无法Readytoken过期或CNI配置残留kubeadm token create重新生成kubeadm reset后清理/var/lib/kubelet与/etc/cni/net.dDashboard无法访问Service类型为ClusterIP改为NodePort或用kubectl proxy访问容器内时间不准开发测试环境无NTP外网源集群内搭建内网NTP服务或部署时将宿主时区与time同步挂载进容器6.1 初始化失败镜像拉取是最常见的拦路虎离线机器上执行kubeadm init如果在输出中看到Failed to pull image、EOF等字样不用慌这基本就是两种原因镜像没有导入到containerd或者导入时没有指定k8s.io这个命名空间。有一种情况是镜像明明导入了crictl images也能看到但kubeadm还是提示拉取失败原因是tag不一致。你本地导入的是v1.28.2但kubeadm配置里写的kubernetesVersion是v1.28.1它会按照v1.28.1去找镜像自然找不到。规避方法是先执行一遍kubeadm config images list --image-repository registry.k8s.io --kubernetes-version v1.28.2逐行对比本地crictl images确保tag完全一致再改配置执行init。6.2 节点NotReady的排查思路如果你确认CNI插件已经安装但节点还是NotReady按这个顺序排查先看系统组件Pod是否正常运行再看网络插件Pod日志最后检查主机防火墙和节点IP配置。开发测试环境很多NotReady的根因不是K8s本身而是系统防火墙没有放行Pod网段流量。systemctl status firewalld # 开发测试环境可以直接关闭或者放行必要端口 systemctl disable firewalld --now注意关闭防火墙后要确认主机本身没有单独的安全组或网络安全策略比如虚拟化平台的security group。Pod的Overlay网络走的是VXLAN或host-gw模式如果底层网络策略限制UDP端口flannel流量会被丢弃表现为跨节点Pod不通但单节点内正常。6.3 证书有效期与Token过期问题K8s的kubeadm默认签发的证书有效期是一年。开发测试环境里集群用一年以上很常见一旦证书过期kubectl会直接报证书过期或Unauthorized。解决办法是每年续期一次kubeadm certs renew all systemctl restart kubelet如果是生产级高可用环境还需要替换kubeconfig文件。开发测试环境在证书到期前几天处理就行续期后重启各控制组件通常不会影响已有数据。如果发现apiserver等静态Pod没有被更新可以直接删除对应的Pod让kubelet重建kubectl -n kube-system delete pod kube-apiserver-$(hostname)6.4 大镜像导入变慢与存储空间不足开发测试环境跑大模型相关应用时镜像导入动辄几十GB整个过程对磁盘空间要求很高。ctr导入镜像会先解包到本地再写入到containerd的存储目录因此需要的临时空间是镜像tar包的1.5到2倍。建议先检查磁盘空间df -h /var/lib/containerd如果空间不够先把tar包放在独立磁盘或从共享存储读取导入完成后删除tar包释放空间。另外containerd的snapshotter对空间占用比较敏感如果频繁导入删除大镜像导致空间不回收可以执行gcctr -nk8s.io content gc ctr -nk8s.io snapshots gc这个操作在业务低峰期做gc过程会占用一些CPU和磁盘IO。7. 实操心得与后续扩展建议最后聊一些我自己的经验总结。多次离线部署K8s之后我最大的体会是离线部署最难的不是安装过程本身而是版本一致性管理。镜像版本、kubeadm版本、系统依赖版本、网络插件版本任何一个环节的版本漂移都会导致连锁失败。所以强烈建议把制品清单做成一个版本化文件放进Git仓库每次迭代都记录变更。这样哪怕半年后需要重建一套集群翻一下仓库历史就能按当时的版本完整复原。另外一个实操心得是把重复的安装过程写成脚本。虽然kubeadm命令本身不复杂但准备镜像、导入镜像、配内核参数这些环节完全适合脚本化。建议至少把镜像导入、基础环境配置、离线yum仓库配置这三部分写成Shell脚本传到离线机器上一条命令执行能大幅减少人工操作失误。后续如果有余力可以往这几个方向扩展一是搭建内网Harbor镜像仓库配合containerd的registry配置让离线机器从内网镜像仓库拉取镜像比反复导入tar包更贴近生产使用方式二是引入GitLab Runner实现离线环境下的CI/CD三是把Chart包离线化让团队通过Helm快速部署中间件。这些都是在“离线K8s集群可用”之后开发测试环境真正发挥价值的方向。这套流程做完之后你会发现离线部署K8s没有想象中那么玄学核心就是三件事把依赖准备好、把版本锁住、把日志看仔细。做到这三点任何断网环境里你都能从容地搭出一套可用的Kubernetes开发测试环境。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

网络工程师真实生存指南:稳定性、可扩展性与故障响应 2026/9/16 7:52:10

网络工程师真实生存指南:稳定性、可扩展性与故障响应

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

阅读更多 →
连接中断后如何重启_CANape_XCP_连接 2026/9/16 7:52:10

连接中断后如何重启_CANape_XCP_连接

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

阅读更多 →
ESP32-P4 USB Host鼠标开发实战:HID协议解析与实时轨迹绘图 2026/9/16 7:52:10

ESP32-P4 USB Host鼠标开发实战:HID协议解析与实时轨迹绘图

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

阅读更多 →
别再傻傻等大模型吐完整段话了!一文吃透流式输出与 SSE 2026/9/16 7:52:10

别再傻傻等大模型吐完整段话了!一文吃透流式输出与 SSE

你有没有过这种体验:问 ChatGPT 一个问题,它一个字一个字往外蹦,你却觉得很"爽"?这种"爽感"背后,不是特效,而是一套扎实的工程实现——SSE(Server-Sent Events)…

阅读更多 →
【信息科学与工程学】【通信工程】第三百零六篇 IPv6/SRv6服务链中的学科知识01 2026/9/16 7:52:10

【信息科学与工程学】【通信工程】第三百零六篇 IPv6/SRv6服务链中的学科知识01

一、基础原理与控制(K01–K15,沿用上一版) 编号 类型 领域 学科知识 知识列表和数学建模 关联知识 K01 基础原理 SRv6 路由与网络编程 IPv6、源路由、SR、网络编程 SRH 封装 SID List;SID=Locator+Function+Args;G=(V,E),y{v,i}=1,Σ_i y{v,i}≥1,Σ_{e∈Π}…

阅读更多 →
论文查重技术解析与AI生成内容检测应对策略 2026/9/16 7:49:10

论文查重技术解析与AI生成内容检测应对策略

1. 论文查重的"生死局"现状解析学术圈这两年最让研究生们头疼的,莫过于查重系统的不断升级。去年某高校爆出研究生论文查重率高达78%被退稿的案例,当事人称"连专业术语都被标红"。这背后反映的是查重算法已经从简单的文字比对&#…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞