Skip to content

第一篇:Kubernetes v1.33.0 离线安装包制作指南(在线环境篇)

vCenter Server 8.0 安装部署示意图

适用场景与前置说明

项目说明
适用场景在内网或完全断网的生产环境中部署 Kubernetes,需要提前在有网络的环境中制作好完整的离线安装包。
操作机器一台可以访问互联网的 Ubuntu 22.04 机器(可以是个人电脑、云服务器或虚拟机)。
Kubernetes 版本v1.33.0
容器运行时containerd(版本 >= 1.7.25)
网络插件Calico v3.26.0

第一篇目标

有网络的机器上完成以下所有操作,最终打包生成一个 k8s-offline-v1.33.0.tar.gz 离线安装包:

k8s-offline-v1.33.0.tar.gz
├── deb-packages/
│   ├── kubernetes/                 # kubeadm、kubelet、kubectl 及其依赖
│   └── cri/                        # containerd.io、runc 及其依赖
├── images/
│   ├── k8s-images.tar              # Kubernetes 核心镜像
│   ├── calico-images.tar           # Calico 网络插件镜像
│   ├── dashboard-images.tar        # Kubernetes Dashboard 镜像
│   └── base-images.tar             # 常用基础镜像(busybox、nginx、alpine)
├── manifests/
│   ├── calico.yaml                 # Calico 网络插件配置文件
│   └── kubernetes-dashboard.yaml   # Kubernetes Dashboard 部署配置文件
└── install.sh                      # 离线环境一键安装脚本

一、准备工作(在线环境机器)

1.1 操作系统环境检查

确保您的 Ubuntu 22.04 系统满足以下基础条件:

terminal
bash
# 查看操作系统版本
lsb_release -a

# 查看内核版本(建议 5.15+)
uname -r

# 查看磁盘空间(至少需要 5GB 可用空间)
df -h /

1.2 使用普通用户进行操作

重要提示

离线包制作过程中,建议使用普通用户(而非 root)进行操作,避免 apt-get download 出现权限警告:

W: Download is performed unsandboxed as root as file
terminal
bash
# 如果当前是 root 用户,切换到普通用户(如 testify)
su - testify

# 确认当前用户
whoami

1.3 创建工作目录

terminal
bash
# 创建离线包根目录
mkdir -p ~/k8s-offline/v1.33.0
cd ~/k8s-offline/v1.33.0

# 创建子目录
mkdir -p deb-packages/kubernetes deb-packages/cri images manifests

1.4 配置 apt 代理(如网络受限)

如果您的网络环境需要通过代理访问外网,请先配置 apt 代理:

terminal
bash
# 检查代理是否可用(请替换为实际代理地址)
curl -I -x http://192.168.0.23:7890 https://google.com

# 配置持久化代理(可选)
sudo tee /etc/apt/apt.conf.d/99proxy.conf <<EOF
Acquire::http::proxy "http://192.168.0.23:7890";
Acquire::https::proxy "http://192.168.0.23:7890";
EOF

# 更新 apt 缓存
sudo apt-get update

1.5 配置 shell 代理环境变量

除了 apt 需要配置代理外,curlwgetdocker 等命令同样需要通过代理访问外网。建议统一配置 shell 代理环境变量。

方式一:临时生效(仅当前会话)

terminal
bash
export http_proxy=http://192.168.0.23:7890
export https_proxy=http://192.168.0.23:7890
export no_proxy=localhost,127.0.0.1,.local,.aliyuncs.com

方式二:永久生效(推荐)

将代理配置写入 ~/.bashrc,每次登录时自动加载:

terminal
bash
# 使用 tee 追加代理配置到 ~/.bashrc
tee -a ~/.bashrc <<'EOF'

# ============================================
# 代理配置(请替换为实际代理地址)
# ============================================
export http_proxy=http://192.168.0.23:7890
export https_proxy=http://192.168.0.23:7890
export no_proxy=localhost,127.0.0.1,.local,.aliyuncs.com
EOF

# 使配置立即生效
source ~/.bashrc

为什么使用 `tee -a`?

  • tee -a追加内容到文件末尾,不会覆盖已有配置。
  • 配合 <<'EOF' 可以保留变量原样(不展开),写入的内容与代码块中的完全一致。
  • 相比 echo >>tee 支持 sudo 权限写入,更加灵活安全。

验证代理配置是否生效

terminal
bash
# 查看当前代理环境变量
env | grep -i proxy

# 测试代理连通性
curl -I https://www.google.com
# 或使用 wget 测试
wget --spider https://www.google.com

预期输出应包含:

http_proxy=http://192.168.0.23:7890
https_proxy=http://192.168.0.23:7890
no_proxy=localhost,127.0.0.1,.local,.aliyuncs.com

注意事项

  1. 请替换代理地址:将 192.168.0.23:7890 替换为您实际可用的代理服务器地址和端口。
  2. no_proxy 配置:建议将内网域名(如 .aliyuncs.com)加入 no_proxy,避免拉取国内镜像时走代理导致速度变慢。
  3. sudo 命令代理失效:使用 sudo 执行命令时,环境变量可能不会继承。如需 sudo 也走代理,可以使用 sudo -E 保留当前环境变量,或在 /etc/environment 中配置系统级代理。

1.6 配置 Docker 守护进程代理(重要!)

为什么需要单独配置?

Docker 采用 C/S 架构,守护进程dockerd)负责拉取镜像,但它不读取 shell 环境变量中的代理配置。因此,即使配置了 ~/.bashrcdocker pull 依然可能超时失败。

配置步骤

terminal
bash
# 1. 创建 Docker 服务配置目录
sudo mkdir -p /etc/systemd/system/docker.service.d

# 2. 写入代理配置
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<'EOF'
[Service]
Environment="HTTP_PROXY=http://192.168.0.23:7890"
Environment="HTTPS_PROXY=http://192.168.0.23:7890"
Environment="NO_PROXY=localhost,127.0.0.1,.local,.aliyuncs.com"
EOF

配置完成后,docker pull 即可正常拉取镜像。

避坑提醒:NO_PROXY 不要包含 .docker.io

配置 Docker 守护进程代理时,切忌将 .docker.ioregistry-1.docker.io 加入 NO_PROXY,否则 Docker Hub 的流量将不走代理,导致拉取 Calico 等镜像失败。

✅ 正确示例:

bash
Environment="NO_PROXY=localhost,127.0.0.1,.local,.aliyuncs.com"

❌ 错误示例(会导致 Calico 拉取失败):

bash
Environment="NO_PROXY=localhost,127.0.0.1,.local,.aliyuncs.com,.docker.io"

1.7 安装必要工具

terminal
bash
sudo apt-get update
sudo apt-get install -y apt-transport-https curl gnupg wget

二、制作 Kubernetes 组件离线包

2.1 添加 Kubernetes apt 源

terminal
bash
# 1. 创建 keyrings 目录
sudo mkdir -p /etc/apt/keyrings

# 2. 下载并添加 GPG 密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 3. 添加 Kubernetes apt 源
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 4. 更新 apt 缓存
sudo apt-get update

2.2 下载 Kubernetes 组件及其依赖

terminal
bash
# 切换到 Kubernetes deb 包目录
cd ~/k8s-offline/v1.33.0/deb-packages/kubernetes

# 下载核心组件(指定版本)
apt-get download \
  kubelet=1.33.0-1.1 \
  kubeadm=1.33.0-1.1 \
  kubectl=1.33.0-1.1

# 下载依赖包
apt-get download \
  conntrack \
  ebtables \
  socat \
  ethtool \
  ipset \
  nfs-common \
  libseccomp2 \
  libltdl7 \
  libnfsidmap1 \
  libipset13 \
  libtirpc3 \
  libtirpc-common \
  rpcbind \
  keyutils \
  cri-tools \
  kubernetes-cni

# 查看下载结果
ls -lh

如果下载失败

如果遇到 Could not handshake 等网络错误,请检查代理配置是否正确(参考 1.4 节)。

三、制作容器运行时(containerd)离线包

版本要求

Kubernetes v1.33.0 要求 containerd 版本 >= 1.7.25,而 Ubuntu 22.04 官方源默认只能提供 1.7.12。因此,我们需要使用 Docker 官方源提供的最新版本 containerd.io

3.1 添加 Docker 官方 apt 源

terminal
bash
# 1. 添加 Docker 官方 GPG 密钥
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 2. 添加 Docker apt 源(适配 Ubuntu 22.04 jammy)
sudo echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 3. 更新缓存
sudo apt-get update

3.2 下载 containerd.io 及依赖

terminal
bash
# 切换到 CRI deb 包目录
cd ~/k8s-offline/v1.33.0/deb-packages/cri

# 下载 containerd.io(版本 1.7.25)
apt-get download containerd.io=1.7.25-1

# 下载 runc 依赖
apt-get download runc

# 查看下载结果
ls -lh

四、制作容器镜像离线包

4.1 安装 kubeadm(用于获取镜像列表)

terminal
bash
# 安装 kubeadm(仅在当前制作机器上临时安装)
sudo apt-get install -y kubelet=1.33.0-1.1 kubeadm=1.33.0-1.1 kubectl=1.33.0-1.1
sudo apt-mark hold kubelet kubeadm kubectl

4.2 安装 Docker(用于拉取和保存镜像)

terminal
bash
# 安装 Docker
sudo apt-get install -y docker.io

# 启动 Docker 服务
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker

# 验证配置 1.6 配置 Docker 守护进程代理
sudo systemctl show --property=Environment docker

# 验证 Docker 安装
sudo docker version

4.3 拉取 Kubernetes v1.33.0 核心镜像

terminal
bash
# 查看 Kubernetes v1.33.0 所需镜像列表
sudo kubeadm config images list --kubernetes-version=v1.33.0

输出示例:

registry.k8s.io/kube-apiserver:v1.33.0
registry.k8s.io/kube-controller-manager:v1.33.0
registry.k8s.io/kube-scheduler:v1.33.0
registry.k8s.io/kube-proxy:v1.33.0
registry.k8s.io/coredns/coredns:v1.12.0
registry.k8s.io/pause:3.10
registry.k8s.io/etcd:3.5.21-0
terminal
bash
# 拉取所有镜像
images=(
  registry.k8s.io/kube-apiserver:v1.33.0
  registry.k8s.io/kube-controller-manager:v1.33.0
  registry.k8s.io/kube-scheduler:v1.33.0
  registry.k8s.io/kube-proxy:v1.33.0
  registry.k8s.io/coredns/coredns:v1.12.0
  registry.k8s.io/pause:3.10
  registry.k8s.io/etcd:3.5.21-0
)

for image in "${images[@]}"; do
  sudo docker pull $image
done

4.4 导出 Kubernetes 核心镜像为 tar 文件

terminal
bash
cd ~/k8s-offline/v1.33.0/images

sudo docker save -o k8s-images.tar \
  registry.k8s.io/kube-apiserver:v1.33.0 \
  registry.k8s.io/kube-controller-manager:v1.33.0 \
  registry.k8s.io/kube-scheduler:v1.33.0 \
  registry.k8s.io/kube-proxy:v1.33.0 \
  registry.k8s.io/coredns/coredns:v1.12.0 \
  registry.k8s.io/pause:3.10 \
  registry.k8s.io/etcd:3.5.21-0

# 查看导出的文件大小
ls -lh k8s-images.tar

4.5 拉取并导出 Calico 网络插件镜像

terminal
bash
# 拉取 Calico v3.26.0 镜像
images=(
  calico/node:v3.26.0
  calico/cni:v3.26.0
  calico/kube-controllers:v3.26.0
)

for image in "${images[@]}"; do
  sudo docker pull $image
done

# 导出 Calico 镜像
sudo docker save -o calico-images.tar \
  calico/node:v3.26.0 \
  calico/cni:v3.26.0 \
  calico/kube-controllers:v3.26.0

# 查看导出的文件大小
ls -lh calico-images.tar

4.6 拉取并导出 Kubernetes Dashboard 镜像(可选)

可选组件

Kubernetes Dashboard 是官方提供的 Web UI 管理界面,方便通过图形化方式查看和管理集群资源。如果不需要 Web UI,可以跳过此节。

拉取 Dashboard 镜像

terminal
bash
# 拉取 Kubernetes Dashboard v2.7.0 镜像
images=(
  kubernetesui/dashboard:v2.7.0
  kubernetesui/metrics-scraper:v1.0.8
)

for image in "${images[@]}"; do
  sudo docker pull $image
done

导出 Dashboard 镜像为 tar 文件

terminal
bash
cd ~/k8s-offline/v1.33.0/images

sudo docker save -o dashboard-images.tar \
  kubernetesui/dashboard:v2.7.0 \
  kubernetesui/metrics-scraper:v1.0.8

# 查看导出的文件大小
ls -lh dashboard-images.tar

4.7 拉取并导出常用基础镜像(可选)

可选组件

这些基础镜像用于 Kubernetes 集群部署后的功能验证和日常运维调试。强烈建议包含,方便后续集群验证和问题排查。

拉取常用基础镜像

terminal
bash
# 拉取常用基础镜像
images=(
  busybox:1.36.1
  nginx:1.31.3
  alpine:3.18
)

for image in "${images[@]}"; do
  sudo docker pull $image
done

导出基础镜像为 tar 文件

terminal
bash
cd ~/k8s-offline/v1.33.0/images

sudo docker save -o base-images.tar \
  busybox:1.36.1 \
  nginx:1.31.3 \
  alpine:3.18

# 查看导出的文件大小
ls -lh base-images.tar

4.8 修改镜像所有者

bash
# 将 images 目录下所有文件的所有者改为当前用户
sudo chown -R $(whoami):$(whoami) ~/k8s-offline/v1.33.0/images/

💡 注意

为了方便当前用户最终对离线包打包,所以需要将其实修改为当前用户的所属。

五、下载 Kubernetes 附加组件配置文件

此步骤将下载集群网络插件 Calico 和可选 Web UI 界面 Kubernetes Dashboard 的配置文件,供离线环境使用。

1. 下载 Calico 网络插件配置文件

terminal
bash
cd ~/k8s-offline/v1.33.0/manifests

# 下载 Calico v3.26.0 配置文件
wget -c https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/calico.yaml -O calico.yaml

# 验证文件下载成功
head -n 5 calico.yaml

2. 下载 Kubernetes Dashboard 部署配置文件(可选)

可选组件

如果不需要 Dashboard Web UI,可以跳过此步骤。

terminal
bash
cd ~/k8s-offline/v1.33.0/manifests

# 下载 Kubernetes Dashboard v2.7.0 部署清单
wget -c https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml -O kubernetes-dashboard.yaml

# 验证文件下载成功
head -n 5 kubernetes-dashboard.yaml

关于 Dashboard 镜像

Dashboard 所需的 kubernetesui/dashboard:v2.7.0kubernetesui/metrics-scraper:v1.0.8 镜像已在 4.6 节 中拉取并导出。此步骤仅下载部署清单,镜像和清单将在离线环境中配合使用。

六、编写离线安装脚本

terminal
bash
cd ~/k8s-offline/v1.33.0

cat > install.sh << 'EOF'
#!/bin/bash

set -e

echo "========================================="
echo "  Kubernetes v1.33.0 离线安装脚本"
echo "  适用于 Ubuntu 22.04 + containerd"
echo "========================================="

# 1. 安装 Kubernetes 组件
echo "[1/8] 安装 Kubernetes 组件..."
sudo dpkg -i ./deb-packages/kubernetes/*.deb

# 2. 安装 containerd 运行时
echo "[2/8] 安装 containerd 运行时..."
sudo dpkg -i ./deb-packages/cri/*.deb

# 3. 启动 containerd 服务
echo "[3/8] 启动 containerd 服务..."
sudo systemctl enable containerd
sudo systemctl start containerd

# 4. 加载 Kubernetes 镜像到 containerd
echo "[4/8] 加载 Kubernetes 镜像..."
sudo ctr -n=k8s.io images import ./images/k8s-images.tar

# 5. 加载 Calico 镜像到 containerd
echo "[5/8] 加载 Calico 镜像..."
sudo ctr -n=k8s.io images import ./images/calico-images.tar

# 6. 加载 Dashboard 镜像到 containerd(可选)
if [ -f ./images/dashboard-images.tar ]; then
  echo "[6/8] 加载 Dashboard 镜像..."
  sudo ctr -n=k8s.io images import ./images/dashboard-images.tar
else
  echo "[6/8] 跳过 Dashboard 镜像(文件不存在)..."
fi

# 7. 加载基础镜像到 containerd(可选)
if [ -f ./images/base-images.tar ]; then
  echo "[7/8] 加载基础镜像..."
  sudo ctr -n=k8s.io images import ./images/base-images.tar
else
  echo "[7/8] 跳过基础镜像(文件不存在)..."
fi

# 8. 锁定 Kubernetes 版本(防止自动升级)
echo "[8/8] 锁定 Kubernetes 版本..."
sudo apt-mark hold kubelet kubeadm kubectl

echo "========================================="
echo "  所有组件安装完成!"
echo "  接下来请按顺序执行:"
echo "  1. 配置 containerd(参考文档)"
echo "  2. kubeadm init 初始化集群"
echo "  3. 部署 Dashboard(如需要)"
echo "========================================="
EOF

# 添加可执行权限
chmod +x install.sh

七、制作清单(可选)

在打包之前,建议在离线包目录内生成一份文件清单,方便后续核对。这份清单也会被打包进最终的压缩包。

terminal
bash
# 进入离线包根目录
cd ~/k8s-offline/v1.33.0

# 生成清单文件到当前目录
cat > manifest.txt <<EOF
========================================
Kubernetes v1.33.0 离线安装包清单
生成时间: $(date)
========================================

一、Deb 软件包 (deb-packages/)

Kubernetes 组件 (deb-packages/kubernetes/):
$(ls -1 deb-packages/kubernetes/)

containerd 组件 (deb-packages/cri/):
$(ls -1 deb-packages/cri/)

二、容器镜像 (images/)
$(ls -lh images/*.tar | awk '{print $9, $5}')

三、配置文件 (manifests/)
$(ls -1 manifests/)

四、安装脚本
install.sh

========================================
EOF

# 查看生成的清单内容
cat manifest.txt

八、打包所有离线资源

此时,v1.33.0 目录下已包含所有离线资源文件和刚生成的 manifest.txt 清单文件,可以一起打包。

terminal
bash
cd ~/k8s-offline

# 打包(使用普通用户权限),注意源路径为 v1.33.0 目录,对 tar 包中的最终目录进行了重命名
tar -zcvf k8s-offline-v1.33.0.tar.gz --transform='s/v1.33.0/k8s-offline-v1.33.0/' ./v1.33.0

# 查看打包结果
ls -lh k8s-offline-v1.33.0.tar.gz

提示

打包后的文件通常约 665 MB,具体大小取决于包含的镜像数量。现在,压缩包内已自带清单文件。

九、传输离线包到目标服务器

k8s-offline-v1.33.0.tar.gz 传输到所有三台内网服务器(master、node1、node2):

terminal
bash
# 示例:使用 scp 传输到所有节点
scp k8s-offline-v1.33.0.tar.gz [email protected]:/tmp/
scp k8s-offline-v1.33.0.tar.gz [email protected]:/tmp/
scp k8s-offline-v1.33.0.tar.gz [email protected]:/tmp/

提示

如果文件较大,可以考虑使用 U 盘、内网共享存储或其他高速传输方式。

附录:常见问题

Q1: apt-get download 报错 "Unable to locate package"

原因:未正确添加对应的 apt 源或未执行 apt-get update

解决:检查 /etc/apt/sources.list.d/ 目录下是否存在对应的源文件,并执行 sudo apt-get update

Q2: docker pull 镜像失败

原因:Docker 守护进程未正确配置代理或代理地址不可用。

解决

  1. 检查 1.6 节 Docker 守护进程代理配置是否正确
  2. 验证代理是否可用:curl -I -x http://your-proxy:port https://www.google.com
  3. 重启 Docker 服务:sudo systemctl daemon-reload && sudo systemctl restart docker
  4. 检查 Docker 守护进程环境变量:sudo systemctl show --property=Environment docker
  5. 确认 NO_PROXY 中没有包含 .docker.io(参考 1.6 节避坑提醒)

Q3: 打包后的文件太大

原因:镜像文件体积较大。

解决:正常情况下的镜像 tar 包约 665 MB,属于正常范围。如果空间不足,可以考虑清理不必要的镜像或使用压缩率更高的打包方式(如 xz)。

下一篇预告

《Kubernetes v1.33.0 三节点集群离线安装指南(内网环境篇)》 将包含:

  • 三台服务器的前置准备(静态 IP、主机名、/etc/hosts 互通)
  • 解压离线安装包并执行安装脚本
  • containerd 配置与沙箱镜像校正
  • kubeadm 初始化控制平面
  • Calico 网络插件安装
  • 工作节点加入集群
  • 集群状态全面验证

📌 第一篇到此结束,所有命令均已在 Ubuntu 22.04 环境下验证通过。请按顺序执行,确保离线包制作成功。如有任何问题,欢迎查阅文档中的常见问题章节。

附件:资源下载

若您不想自行制作离线包,可直接下载已制作好的完整离线资源包,包含本文档所述的全部 deb 包、容器镜像、配置文件和安装脚本。

资源下载链接说明
离线包文件k8s-offline-v1.33.0.tar.gzKubernetes v1.33.0 完整离线资源包,约 665 MB
SHA256 校验和k8s-offline-v1.33.0.tar.gz.sha256用于校验离线包完整性,确保文件未被损坏

使用建议

  1. 下载离线包后,建议先使用 sha256sum -c k8s-offline-v1.33.0.tar.gz.sha256 校验文件完整性。
  2. 将压缩包传输至目标内网服务器的 /opt/ 目录下,然后按照第二篇《内网安装指南》的步骤进行部署。
最后更新2026/08/16 19:20
如果你觉得这篇文章有帮助,或者想聊聊技术、工作,欢迎通过下面方式联系我:
contact fishfinal