一、离线部署场景与挑战分析
在金融、政务等对数据安全要求极高的行业,生产环境通常采用物理隔离或逻辑隔离的离线网络架构。此类场景下部署k8s集群面临三大核心挑战:
- 网络访问限制:无法直接连接互联网下载依赖组件
- 版本兼容性:不同Linux发行版对k8s组件的依赖差异
- 镜像管理复杂度:需构建完整的镜像仓库与同步机制
主流解决方案包括搭建本地镜像仓库(如Harbor)、使用离线安装包(如kubeadm offline packages)或通过代理服务器实现选择性网络穿透。本文重点介绍基于本地镜像仓库的标准化部署方案。
二、环境准备阶段技术要点
1. 基础系统要求
- 发行版选择:推荐使用RockyLinux 8.x/9.x、AlmaLinux 8.x/9.x、Kylin V10 SP2、openEuler 22.03 LTS等稳定版本
- 系统参数配置:
```bash
禁用SELinux(临时生效)
setenforce 0
永久禁用需修改/etc/selinux/config
sed -i ‘s/^SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
关闭swap分区
swapoff -a
sed -i ‘/ swap / s/^(.*)$/#\1/g’ /etc/fstab
配置内核参数
cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
sysctl —system
#### 2. 依赖组件安装- **容器运行时**:推荐containerd 1.6+版本```bash# 安装containerd(以RockyLinux为例)dnf install -y containerdsystemctl enable containerdsystemctl start containerd# 配置containerd(生成默认配置)mkdir -p /etc/containerdcontainerd config default > /etc/containerd/config.toml# 修改配置启用systemd cgroup驱动sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.tomlsystemctl restart containerd
- 网络组件:Calico或Cilium(需提前下载离线包)
三、k8s组件镜像管理方案
1. 镜像仓库搭建
推荐使用Harbor 2.x版本,其支持:
- 多级镜像仓库管理
- 镜像复制与同步
- 细粒度访问控制
部署步骤:
# 安装docker-compose(离线环境需提前准备二进制包)curl -L https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-compose# 获取Harbor离线安装包# 实际部署时需从官方渠道获取离线包tar xvf harbor-offline-installer-v2.7.0.tgzcd harbor# 修改harbor.yml配置vim harbor.yml# 关键配置项:hostname: registry.localhttp:port: 80# 生成自签名证书(生产环境建议使用CA证书)mkdir -p certopenssl req -newkey rsa:4096 -nodes -sha256 -keyout cert/domain.key -x509 -days 365 -out cert/domain.crt -subj "/CN=registry.local"# 启动服务./install.sh
2. 镜像同步策略
-
基础镜像集:
- k8s组件:kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、etcd
- 核心插件:coredns、calico-node、calico-kube-controllers
- 运行时:pause、nginx-ingress-controller
-
同步工具选择:
- Skopeo:适合单镜像操作
- Reg:支持批量同步
- 自定义脚本:结合crane实现增量同步
示例同步脚本:
#!/bin/bash# 定义镜像列表IMAGES=("registry.k8s.io/kube-apiserver:v1.26.0""registry.k8s.io/kube-controller-manager:v1.26.0""registry.k8s.io/kube-scheduler:v1.26.0""registry.k8s.io/kube-proxy:v1.26.0""registry.k8s.io/pause:3.9""docker.io/calico/node:v3.25.0")# 同步到本地仓库LOCAL_REGISTRY="registry.local/library"for image in "${IMAGES[@]}"; do# 提取镜像名和标签full_name=$(echo $image | awk -F'/' '{print $NF}')repo=$(echo $full_name | awk -F':' '{print $1}')tag=$(echo $full_name | awk -F':' '{print $2}')# 使用skopeo同步skopeo copy docker://$image docker://$LOCAL_REGISTRY/$repo:$tag --src-tls-verify=false --dest-tls-verify=falsedone
四、集群部署实战流程
1. 初始化控制平面节点
# 下载kubeadm离线包(需提前准备)# 实际部署时需包含kubeadm、kubelet、kubectl二进制文件# 初始化集群(使用本地镜像)kubeadm init --image-repository registry.local/library \--kubernetes-version v1.26.0 \--control-plane-endpoint "192.168.1.100:6443" \--pod-network-cidr=10.244.0.0/16 \--service-cidr=10.96.0.0/12 \--upload-certs# 配置kubectlmkdir -p $HOME/.kubecp -i /etc/kubernetes/admin.conf $HOME/.kube/configchown $(id -u):$(id -g) $HOME/.kube/config
2. 加入工作节点
# 在控制平面节点获取join命令kubeadm token create --print-join-command > join-command.sh# 将join-command.sh和必要的证书文件传输到工作节点后执行# 工作节点执行示例:sh join-command.sh --image-repository registry.local/library
3. 网络插件部署
以Calico为例:
# 下载calico.yaml(需提前准备离线文件)# 修改镜像地址为本地仓库sed -i 's|docker.io/calico/|registry.local/library/calico/|g' calico.yaml# 应用配置kubectl apply -f calico.yaml
五、验证与运维要点
-
集群状态检查:
kubectl get nodeskubectl get pods -Akubectl cluster-info
-
镜像仓库监控:
- 配置Harbor的日志收集与告警
- 定期检查磁盘空间使用情况
- 建立镜像备份机制
- 升级策略:
- 采用蓝绿部署方式升级组件
- 提前在测试环境验证镜像兼容性
- 维护完整的版本变更记录
六、常见问题处理
-
镜像拉取失败:
- 检查镜像仓库可达性
- 验证镜像命名规范
- 确认节点时间同步状态
-
证书过期问题:
- 建立证书轮换机制
- 使用自动化工具管理证书生命周期
-
网络连通性故障:
- 检查Calico/Cilium的PodCIDR配置
- 验证CNI插件日志
- 使用iproute2工具排查网络命名空间
通过系统化的离线部署方案,开发者可在完全隔离的网络环境中构建高可用的k8s集群。关键成功要素包括:完善的镜像管理策略、标准化的部署流程、自动化的运维工具链。建议结合CI/CD流水线实现部署流程的自动化,进一步提升交付效率与质量。