离线环境下多Linux发行版k8s集群部署与镜像管理全攻略

一、离线部署场景与挑战分析

在金融、政务等对数据安全要求极高的行业,生产环境通常采用物理隔离或逻辑隔离的离线网络架构。此类场景下部署k8s集群面临三大核心挑战:

  1. 网络访问限制:无法直接连接互联网下载依赖组件
  2. 版本兼容性:不同Linux发行版对k8s组件的依赖差异
  3. 镜像管理复杂度:需构建完整的镜像仓库与同步机制

主流解决方案包括搭建本地镜像仓库(如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

  1. #### 2. 依赖组件安装
  2. - **容器运行时**:推荐containerd 1.6+版本
  3. ```bash
  4. # 安装containerd(以RockyLinux为例)
  5. dnf install -y containerd
  6. systemctl enable containerd
  7. systemctl start containerd
  8. # 配置containerd(生成默认配置)
  9. mkdir -p /etc/containerd
  10. containerd config default > /etc/containerd/config.toml
  11. # 修改配置启用systemd cgroup驱动
  12. sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
  13. systemctl restart containerd
  • 网络组件:Calico或Cilium(需提前下载离线包)

三、k8s组件镜像管理方案

1. 镜像仓库搭建

推荐使用Harbor 2.x版本,其支持:

  • 多级镜像仓库管理
  • 镜像复制与同步
  • 细粒度访问控制

部署步骤:

  1. # 安装docker-compose(离线环境需提前准备二进制包)
  2. curl -L https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
  3. chmod +x /usr/local/bin/docker-compose
  4. # 获取Harbor离线安装包
  5. # 实际部署时需从官方渠道获取离线包
  6. tar xvf harbor-offline-installer-v2.7.0.tgz
  7. cd harbor
  8. # 修改harbor.yml配置
  9. vim harbor.yml
  10. # 关键配置项:
  11. hostname: registry.local
  12. http:
  13. port: 80
  14. # 生成自签名证书(生产环境建议使用CA证书)
  15. mkdir -p cert
  16. openssl req -newkey rsa:4096 -nodes -sha256 -keyout cert/domain.key -x509 -days 365 -out cert/domain.crt -subj "/CN=registry.local"
  17. # 启动服务
  18. ./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实现增量同步

示例同步脚本:

  1. #!/bin/bash
  2. # 定义镜像列表
  3. IMAGES=(
  4. "registry.k8s.io/kube-apiserver:v1.26.0"
  5. "registry.k8s.io/kube-controller-manager:v1.26.0"
  6. "registry.k8s.io/kube-scheduler:v1.26.0"
  7. "registry.k8s.io/kube-proxy:v1.26.0"
  8. "registry.k8s.io/pause:3.9"
  9. "docker.io/calico/node:v3.25.0"
  10. )
  11. # 同步到本地仓库
  12. LOCAL_REGISTRY="registry.local/library"
  13. for image in "${IMAGES[@]}"; do
  14. # 提取镜像名和标签
  15. full_name=$(echo $image | awk -F'/' '{print $NF}')
  16. repo=$(echo $full_name | awk -F':' '{print $1}')
  17. tag=$(echo $full_name | awk -F':' '{print $2}')
  18. # 使用skopeo同步
  19. skopeo copy docker://$image docker://$LOCAL_REGISTRY/$repo:$tag --src-tls-verify=false --dest-tls-verify=false
  20. done

四、集群部署实战流程

1. 初始化控制平面节点

  1. # 下载kubeadm离线包(需提前准备)
  2. # 实际部署时需包含kubeadm、kubelet、kubectl二进制文件
  3. # 初始化集群(使用本地镜像)
  4. kubeadm init --image-repository registry.local/library \
  5. --kubernetes-version v1.26.0 \
  6. --control-plane-endpoint "192.168.1.100:6443" \
  7. --pod-network-cidr=10.244.0.0/16 \
  8. --service-cidr=10.96.0.0/12 \
  9. --upload-certs
  10. # 配置kubectl
  11. mkdir -p $HOME/.kube
  12. cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  13. chown $(id -u):$(id -g) $HOME/.kube/config

2. 加入工作节点

  1. # 在控制平面节点获取join命令
  2. kubeadm token create --print-join-command > join-command.sh
  3. # 将join-command.sh和必要的证书文件传输到工作节点后执行
  4. # 工作节点执行示例:
  5. sh join-command.sh --image-repository registry.local/library

3. 网络插件部署

以Calico为例:

  1. # 下载calico.yaml(需提前准备离线文件)
  2. # 修改镜像地址为本地仓库
  3. sed -i 's|docker.io/calico/|registry.local/library/calico/|g' calico.yaml
  4. # 应用配置
  5. kubectl apply -f calico.yaml

五、验证与运维要点

  1. 集群状态检查

    1. kubectl get nodes
    2. kubectl get pods -A
    3. kubectl cluster-info
  2. 镜像仓库监控

  • 配置Harbor的日志收集与告警
  • 定期检查磁盘空间使用情况
  • 建立镜像备份机制
  1. 升级策略
  • 采用蓝绿部署方式升级组件
  • 提前在测试环境验证镜像兼容性
  • 维护完整的版本变更记录

六、常见问题处理

  1. 镜像拉取失败

    • 检查镜像仓库可达性
    • 验证镜像命名规范
    • 确认节点时间同步状态
  2. 证书过期问题

    • 建立证书轮换机制
    • 使用自动化工具管理证书生命周期
  3. 网络连通性故障

    • 检查Calico/Cilium的PodCIDR配置
    • 验证CNI插件日志
    • 使用iproute2工具排查网络命名空间

通过系统化的离线部署方案,开发者可在完全隔离的网络环境中构建高可用的k8s集群。关键成功要素包括:完善的镜像管理策略、标准化的部署流程、自动化的运维工具链。建议结合CI/CD流水线实现部署流程的自动化,进一步提升交付效率与质量。