在 Ubuntu 24.04 上使用 Docker 部署 Kubernetes 的流程,改造为一个完整的离线安装方案,并详细列出所有需要提前在联网环境中下载的资源。

一、离线安装核心思路与准备工作

离线部署的核心在于资源预下载镜像预拉取。您需要在**一台能访问互联网的服务器(以下简称“下载机”)**上,完成所有依赖包、二进制文件和容器镜像的下载,然后通过移动硬盘、内网文件服务器或离线包的方式,传输到目标生产环境进行安装。

准备工作总览:

  1. 环境一致:确保下载机与目标生产服务器的操作系统版本(Ubuntu 24.04)、架构(amd64)完全一致。
  2. 目录规划:在下载机上创建一个清晰的目录结构,用于分类存放所有离线资源。
  3. 私有镜像仓库(可选但推荐):在内网搭建一个 Docker 私有镜像仓库(如 Harbor),将所有 K8s 镜像推送至私服,然后在离线环境中配置 Docker 从私服拉取镜像,这是最规范的离线方案 。

二、需提前下载的资源清单(在联网下载机上操作)

请按照以下清单,在下载机上创建目录并下载所有文件。

# 1. 创建统一的离线资源目录
mkdir -p ~/k8s-offline-packages/{debs, binaries, images, cri-dockerd, go, configs}
cd ~/k8s-offline-packages
2.1 系统依赖包 (.deb)

这些是 Ubuntu 系统安装 Docker、K8s 等所需的软件包。

# 进入目录
cd debs

# 更新本地包缓存并下载 Docker 相关包
sudo apt-get update
apt-get download \
    docker-ce \
    docker-ce-cli \
    containerd.io \
    docker-buildx-plugin \
    docker-compose-plugin \
    ca-certificates \
    curl \
    gnupg \
    apt-transport-https

# 下载 Kubernetes 组件包 (以 v1.30.0 为例)
apt-get download \
    kubelet=1.30.0-00 \
    kubeadm=1.30.0-00 \
    kubectl=1.30.0-00

# 下载其他工具包
apt-get download \
    ntpdate \
    ipset \
    ipvsadm \
    make \
    gnupg2 \
    software-properties-common

# 查看下载的包
ls -lh *.deb

产出物~/k8s-offline-packages/debs/ 目录下所有的 .deb 文件。

2.2 二进制文件与源码

包括 cri-dockerdGo 语言环境等。

# 进入目录
cd ~/k8s-offline-packages/binaries

# 2.2.1 下载 cri-dockerd 二进制文件 (如果选择不编译)
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.21/cri-dockerd-0.3.21.amd64.tgz

# 2.2.2 下载 Go 语言安装包 (用于编译 cri-dockerd)
cd ../go
wget https://go.dev/dl/go1.25.4.linux-amd64.tar.gz

# 2.2.3 下载 cri-dockerd 源码 (用于编译安装)
cd ../cri-dockerd
git clone https://github.com/Mirantis/cri-dockerd.git
# 或者下载源码压缩包
wget https://github.com/Mirantis/cri-dockerd/archive/refs/tags/v0.3.21.tar.gz -O cri-dockerd-src.tar.gz

产出物cri-dockerd-0.3.21.amd64.tgz, go1.25.4.linux-amd64.tar.gz, cri-dockerd 源码目录或压缩包。

2.3 Kubernetes 核心镜像

这是离线部署最关键的一步。需要在下载机上使用 kubeadm 预拉取所有镜像,并导出为 tar 包或推送到私有仓库。

# 进入目录
cd ~/k8s-offline-packages/images

# 2.3.1 在下载机上安装 kubeadm (仅用于拉取镜像)
sudo apt-get update && sudo apt-get install -y kubeadm=1.30.0-00

# 2.3.2 预拉取所有 kubeadm 所需镜像,使用阿里云镜像加速
sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.30.0

# 2.3.3 将拉取的镜像保存为 tar 文件
sudo docker save -o k8s-images.tar $(sudo docker images --format "{{.Repository}}:{{.Tag}}" | grep google_containers)

# 2.3.4 额外拉取并保存 Flannel 网络插件镜像
sudo docker pull quay.io/flannel/flannel:v0.27.0
sudo docker save -o flannel-image.tar quay.io/flannel/flannel:v0.27.0

# 2.3.5 拉取并保存 pause 镜像 (cri-dockerd 必需)
sudo docker pull registry.aliyuncs.com/google_containers/pause:3.10.1
sudo docker save -o pause-image.tar registry.aliyuncs.com/google_containers/pause:3.10.1

产出物k8s-images.tar, flannel-image.tar, pause-image.tar 等镜像归档文件。

2.4 配置文件

准备离线安装时需要用到的各种配置文件模板。

cd ~/k8s-offline-packages/configs

# 2.4.1 Docker daemon 配置
cat > daemon.json << EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "insecure-registries": ["192.168.1.100:5000"] # 替换为您的私有仓库地址
}
EOF

# 2.4.2 K8s 内核模块加载配置
cat > k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 2.4.3 内核模块配置文件
cat > modules-k8s.conf << EOF
overlay
br_netfilter
EOF

# 2.4.4 cri-dockerd systemd 服务文件 (根据您的安装方式选择)
# 可以从下载的 cri-dockerd 源码中复制:cri-dockerd/packaging/systemd/*.service
cp ../cri-dockerd/cri-dockerd/packaging/systemd/*.service .

产出物:一系列配置文件,如 daemon.json, k8s.conf, cri-docker.service 等。

三、离线环境部署步骤(在目标生产服务器上操作)

假设您已将 ~/k8s-offline-packages 整个目录复制到了目标服务器的 /opt/ 下。

3.1 系统初始化(所有节点执行)
# 1. 禁用交换分区
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab

# 2. 加载内核模块
sudo cp /opt/k8s-offline-packages/configs/modules-k8s.conf /etc/modules-load.d/
sudo modprobe overlay
sudo modprobe br_netfilter

# 3. 配置内核参数
sudo cp /opt/k8s-offline-packages/configs/k8s.conf /etc/sysctl.d/
sudo sysctl --system
3.2 离线安装 Docker
# 1. 安装本地 .deb 包
cd /opt/k8s-offline-packages/debs
sudo dpkg -i *.deb

# 2. 配置 Docker
sudo cp /opt/k8s-offline-packages/configs/daemon.json /etc/docker/
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
3.3 离线安装 cri-dockerd

方案A:使用预编译的二进制文件(推荐)

cd /opt/k8s-offline-packages/binaries
tar zxf cri-dockerd-0.3.21.amd64.tgz
sudo install -o root -g root -m 0755 ./cri-dockerd/cri-dockerd /usr/local/bin/cri-dockerd

# 安装 systemd 服务文件
sudo cp /opt/k8s-offline-packages/configs/cri-docker.service /etc/systemd/system/
sudo cp /opt/k8s-offline-packages/configs/cri-docker.socket /etc/systemd/system/

# 修改服务文件,确保 pause 镜像指向正确的本地tar包或私有仓库
sudo sed -i 's|--pod-infra-container-image=.*|--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10.1|' /etc/systemd/system/cri-docker.service

sudo systemctl daemon-reload
sudo systemctl enable --now cri-docker.service cri-docker.socket
3.4 加载 Docker 镜像
# 导入所有必需的镜像
cd /opt/k8s-offline-packages/images
sudo docker load -i pause-image.tar
sudo docker load -i k8s-images.tar
sudo docker load -i flannel-image.tar

# 验证镜像
sudo docker images | grep -E "(google_containers|flannel|pause)"
3.5 离线安装 Kubernetes 组件
# 1. 安装 kubelet, kubeadm, kubectl
cd /opt/k8s-offline-packages/debs
sudo dpkg -i kubelet_1.30.0-00_amd64.deb kubeadm_1.30.0-00_amd64.deb kubectl_1.30.0-00_amd64.deb
sudo apt-mark hold kubelet kubeadm kubectl

# 2. 启动 kubelet
sudo systemctl enable --now kubelet
3.6 初始化 Master 节点(仅在 Master 执行)
# 1. 初始化集群,指定本地已有的镜像和 cri-socket
sudo kubeadm init \
  --apiserver-advertise-address=<MASTER_IP> \
  --image-repository=registry.aliyuncs.com/google_containers \ # 使用已导入的镜像仓库名
  --cri-socket=unix:///var/run/cri-dockerd.sock \
  --pod-network-cidr=10.244.0.0/16 \
  --upload-certs \
  --ignore-preflight-errors=all # 离线环境可能需忽略 Swap 等错误

# 2. 按照成功后的提示,配置 kubectl 并保存 join 命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 3. 部署 Flannel 网络插件 (使用已导入的镜像)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
3.7 Worker 节点加入集群

在 Worker 节点上重复 3.1 至 3.5 步骤,然后使用 Master 初始化成功后提供的 kubeadm join 命令加入集群,务必加上 --cri-socket 参数

四、离线资源下载清单总表

为方便核对,以下是您需要在联网下载机上准备的完整文件清单:

类别文件/资源存放路径 (在下载机 ~/k8s-offline-packages/下)用途说明
系统包docker-ce*.deb, containerd.io*.debdebs/安装 Docker 引擎
系统包kubelet*.deb, kubeadm*.deb, kubectl*.debdebs/安装 K8s 三件套
系统包ipset*.deb, ipvsadm*.deb, make*.debdebs/安装系统工具
二进制cri-dockerd-0.3.21.amd64.tgzbinaries/CRI 适配器
语言环境go1.25.4.linux-amd64.tar.gzgo/编译环境 (备用)
源码cri-dockerd 源码目录cri-dockerd/编译安装备用
镜像k8s-images.tarimages/K8s 核心组件镜像
镜像flannel-image.tarimages/Flannel 网络插件镜像
镜像pause-image.tarimages/Pod 基础容器镜像
配置daemon.json, k8s.confconfigs/各种服务配置文件
配置cri-docker.service, cri-docker.socketconfigs/cri-dockerd 服务文件

最终操作:将整个 k8s-offline-packages 目录打包 (tar -czvf k8s-offline-full.tar.gz k8s-offline-packages/),传输至内网,即可按照第三部分的步骤在所有目标服务器上进行离线部署。此方案涵盖了从系统配置到集群初始化的全链路离线资源,能有效避免因网络问题导致的安装失败 。


参考来源

更多推荐