Appearance
第一篇:Kubernetes v1.33.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 系统满足以下基础条件:
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 filebash
# 如果当前是 root 用户,切换到普通用户(如 testify)
su - testify
# 确认当前用户
whoami1.3 创建工作目录
bash
# 创建离线包根目录
mkdir -p ~/k8s-offline/v1.33.0
cd ~/k8s-offline/v1.33.0
# 创建子目录
mkdir -p deb-packages/kubernetes deb-packages/cri images manifests1.4 配置 apt 代理(如网络受限)
如果您的网络环境需要通过代理访问外网,请先配置 apt 代理:
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 update1.5 配置 shell 代理环境变量
除了 apt 需要配置代理外,curl、wget、docker 等命令同样需要通过代理访问外网。建议统一配置 shell 代理环境变量。
方式一:临时生效(仅当前会话)
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,每次登录时自动加载:
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 权限写入,更加灵活安全。
验证代理配置是否生效
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注意事项
- 请替换代理地址:将
192.168.0.23:7890替换为您实际可用的代理服务器地址和端口。 - no_proxy 配置:建议将内网域名(如
.aliyuncs.com)加入no_proxy,避免拉取国内镜像时走代理导致速度变慢。 - sudo 命令代理失效:使用
sudo执行命令时,环境变量可能不会继承。如需 sudo 也走代理,可以使用sudo -E保留当前环境变量,或在/etc/environment中配置系统级代理。
1.6 配置 Docker 守护进程代理(重要!)
为什么需要单独配置?
Docker 采用 C/S 架构,守护进程(dockerd)负责拉取镜像,但它不读取 shell 环境变量中的代理配置。因此,即使配置了 ~/.bashrc,docker pull 依然可能超时失败。
配置步骤:
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.io 或 registry-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 安装必要工具
bash
sudo apt-get update
sudo apt-get install -y apt-transport-https curl gnupg wget二、制作 Kubernetes 组件离线包
2.1 添加 Kubernetes apt 源
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 update2.2 下载 Kubernetes 组件及其依赖
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 源
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 update3.2 下载 containerd.io 及依赖
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(用于获取镜像列表)
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 kubectl4.2 安装 Docker(用于拉取和保存镜像)
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 version4.3 拉取 Kubernetes v1.33.0 核心镜像
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-0bash
# 拉取所有镜像
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
done4.4 导出 Kubernetes 核心镜像为 tar 文件
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.tar4.5 拉取并导出 Calico 网络插件镜像
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.tar4.6 拉取并导出 Kubernetes Dashboard 镜像(可选)
可选组件
Kubernetes Dashboard 是官方提供的 Web UI 管理界面,方便通过图形化方式查看和管理集群资源。如果不需要 Web UI,可以跳过此节。
拉取 Dashboard 镜像:
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 文件:
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.tar4.7 拉取并导出常用基础镜像(可选)
可选组件
这些基础镜像用于 Kubernetes 集群部署后的功能验证和日常运维调试。强烈建议包含,方便后续集群验证和问题排查。
拉取常用基础镜像:
bash
# 拉取常用基础镜像
images=(
busybox:1.36.1
nginx:1.31.3
alpine:3.18
)
for image in "${images[@]}"; do
sudo docker pull $image
done导出基础镜像为 tar 文件:
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.tar4.8 修改镜像所有者
bash
# 将 images 目录下所有文件的所有者改为当前用户
sudo chown -R $(whoami):$(whoami) ~/k8s-offline/v1.33.0/images/💡 注意
为了方便当前用户最终对离线包打包,所以需要将其实修改为当前用户的所属。
五、下载 Kubernetes 附加组件配置文件
此步骤将下载集群网络插件 Calico 和可选 Web UI 界面 Kubernetes Dashboard 的配置文件,供离线环境使用。
1. 下载 Calico 网络插件配置文件
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.yaml2. 下载 Kubernetes Dashboard 部署配置文件(可选)
可选组件
如果不需要 Dashboard Web UI,可以跳过此步骤。
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.0 和 kubernetesui/metrics-scraper:v1.0.8 镜像已在 4.6 节 中拉取并导出。此步骤仅下载部署清单,镜像和清单将在离线环境中配合使用。
六、编写离线安装脚本
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七、制作清单(可选)
在打包之前,建议在离线包目录内生成一份文件清单,方便后续核对。这份清单也会被打包进最终的压缩包。
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清单文件,可以一起打包。
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):
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.6 节 Docker 守护进程代理配置是否正确
- 验证代理是否可用:
curl -I -x http://your-proxy:port https://www.google.com - 重启 Docker 服务:
sudo systemctl daemon-reload && sudo systemctl restart docker - 检查 Docker 守护进程环境变量:
sudo systemctl show --property=Environment docker - 确认 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.gz | Kubernetes v1.33.0 完整离线资源包,约 665 MB |
| SHA256 校验和 | k8s-offline-v1.33.0.tar.gz.sha256 | 用于校验离线包完整性,确保文件未被损坏 |
使用建议
- 下载离线包后,建议先使用
sha256sum -c k8s-offline-v1.33.0.tar.gz.sha256校验文件完整性。 - 将压缩包传输至目标内网服务器的
/opt/目录下,然后按照第二篇《内网安装指南》的步骤进行部署。
