1. 离线部署Kubernetes的常见痛点
在企业内部网络环境中部署Kubernetes集群时,最让人头疼的就是各种依赖缺失问题。我最近在一个金融客户现场就遇到了这样的场景:他们的生产环境完全隔离外网,使用Kubeeasy工具部署Kubernetes v1.25.2时,接连报出libseccomp缺失、sshpass命令找不到等错误。这种离线环境下的部署就像在黑暗房间里拼乐高,缺了任何一个小零件都会导致整个工程停滞。
离线部署的典型报错可以分为三类:首先是基础依赖缺失,比如libseccomp这种安全组件;其次是工具链不完整,像sshpass这种远程管理工具;最后是配置问题,比如yum源指向错误。这些问题的共同特点是:在联网环境下可能自动解决,但在隔离网络中需要手动处理。根据我的经验,90%的离线部署失败都源于这些基础环境问题。
2. 准备工作与环境检查
2.1 节点规划建议
在生产环境中,我建议至少准备3个节点(1个master+2个worker)。以下是经过验证的节点配置方案:
| 节点类型 | CPU | 内存 | 磁盘 | 推荐数量 |
|---|---|---|---|---|
| 控制平面节点 | 4核 | 8GB | 100GB | 奇数个 |
| 工作节点 | 8核 | 16GB | 200GB | 按需扩展 |
对于测试环境,可以使用2节点部署(1master+1worker)。但要注意master节点需要配置至少2核CPU和4GB内存,否则kube-apiserver可能无法正常启动。
2.2 离线资源准备
将安装包chinaskills_cloud_paas_v2.1.iso下载到master节点后,需要执行以下操作:
# 创建挂载点并解压 mkdir -p /opt/k8s_packages mount chinaskills_cloud_paas_v2.1.iso /mnt/ cp -rf /mnt/* /opt/k8s_packages/ umount /mnt/ # 移动kubeeasy工具到PATH mv /opt/k8s_packages/kubeeasy-v2.0 /usr/local/bin/kubeeasy chmod +x /usr/local/bin/kubeeasy这里有个容易踩坑的点:ISO文件挂载后是只读的,直接修改会报错。必须先复制到本地目录再操作。
3. 依赖缺失问题全解
3.1 libseccomp报错分析
当看到如下报错时:
Error: Package: docker-ce-24.0.5-1.el7.x86_64 Requires: libseccomp >= 2.3这说明系统缺少容器运行时所需的安全组件。libseccomp是Linux内核的安全模块,用于限制容器内进程的系统调用。解决方法如下:
# 配置本地yum源 cat > /etc/yum.repos.d/local.repo <<EOF [local] name=Local Repository baseurl=file:///opt/k8s_packages/CentOS enabled=1 gpgcheck=0 EOF # 安装libseccomp yum install -y libseccomp libseccomp-devel3.2 sshpass命令缺失
Kubeeasy使用sshpass实现节点间的免密通信,如果报错"kubeeasy: line 255: sshpass: command not found",需要手动安装:
# 从离线包中安装 rpm -ivh /opt/k8s_packages/sshpass-1.06-2.el7.x86_64.rpm # 或者编译安装 tar -xzf sshpass-1.06.tar.gz cd sshpass-1.06 ./configure make install4. 集群部署实战
4.1 解决依赖问题后的安装
完成上述准备后,执行集群部署命令:
kubeeasy install kubernetes \ --master 192.168.100.10 \ --worker 192.168.100.20 \ --user root \ --password your_password \ --version 1.25.2 \ --offline-file /opt/k8s_packages/kubeeasy.tar.gz这里有几个关键参数需要注意:
--offline-file必须指向正确的离线包路径- 密码中包含特殊字符时需要转义
- 版本号必须完整指定(v1.25.2不能简写为1.25)
4.2 网络插件选择
Kubeeasy默认安装flannel网络插件,如果需要Calico,可以手动部署:
kubectl apply -f /opt/k8s_packages/calico.yaml在离线环境中,需要提前将calico镜像导入本地仓库:
ctr -n=k8s.io images import calico.tar5. 组件安装与验证
5.1 Dashboard部署
虽然Kubeeasy会自动安装Dashboard,但访问需要创建admin-user:
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard EOF获取访问token:
kubectl -n kubernetes-dashboard \ get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") \ -o go-template="{{.data.token | base64decode}}"5.2 存储方案配置
对于生产环境,建议配置NFS作为持久化存储:
yum install -y nfs-utils systemctl enable --now nfs-server # 配置共享目录 echo "/data *(rw,sync,no_root_squash)" >> /etc/exports exportfs -r然后在Kubernetes中部署NFS Provisioner:
kubectl apply -f /opt/k8s_packages/nfs-provisioner.yaml6. 排错技巧总结
当部署过程中出现问题时,按这个顺序检查:
- 查看kubeeasy日志:
tail -f /var/log/kubeinstall.log - 检查容器运行时状态:
ctr -n=k8s.io tasks ls - 验证网络连通性:
kubectl get pods -n kube-system - 检查资源使用:
kubectl top nodes
对于常见的镜像拉取失败问题,可以手动导入:
ctr -n=k8s.io images import pause.tar记得每次操作前备份关键配置文件,特别是/etc/kubernetes目录下的内容。