离线环境 kubeadm 部署:镜像清单、导入与 containerd 配置
操作环境:内网节点与题 1 相同,离线包已导入 /opt/offline-k8s/。
对接原理:kubelet 建 Pod 前查 containerd 本地镜像缓存(k8s.io 命名空间),命中则不触发网络拉取;因此离线部署 = 镜像名与组件期望完全一致 + sandbox_image 指向本地镜像。
详细步骤:
bash
暗色复制
1# ===== 联网端(与内网同版本系统)===== 2# 1. 生成并核对镜像清单 3kubeadm config images list \ 4 --kubernetes-version=v1.28.15 \ 5 --image-repository=registry.aliyuncs.com/google_containers 6# 清单含:kube-apiserver / kube-controller-manager / kube-scheduler / kube-proxy 7# pause:3.9 / etcd:3.5.9-0 / coredns:v1.10.1 8 9# 2. 拉取并导出(含 CNI 与测试镜像) 10kubeadm config images pull --kubernetes-version=v1.28.15 \ 11 --image-repository=registry.aliyuncs.com/google_containers 12ctr -n k8s.io images pull docker.io/calico/cni:v3.27.4 # 按所选 CNI 补充 13ctr -n k8s.io images pull docker.io/library/nginx:1.25.3 14ctr -n k8s.io images export k8s-images.tar $(ctr -n k8s.io images ls -q) 15sha256sum k8s-images.tar 16 17# ===== 内网节点 ===== 18# 3. 校验并导入 19sha256sum -c k8s-images.tar.sha256 20ctr -n k8s.io images import k8s-images.tar 21 22# 4. containerd 配置修改(sandbox_image 指向本地镜像) 23sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"|' \ 24 /etc/containerd/config.toml 25systemctl restart containerd 26 27# 5. 正常 init(imageRepository 必须与镜像前缀一致) 28kubeadm init --kubernetes-version=v1.28.15 \ 29 --image-repository=registry.aliyuncs.com/google_containers \ 30 --pod-network-cidr=10.244.0.0/16验证流程:
bash
暗色复制
1crictl images # 全部组件镜像在列 2ctr -n k8s.io images ls | grep pause # pause 镜像存在于 k8s.io 命名空间 3kubectl get pods -n kube-system # 无 ImagePull 相关事件排错:导入后 kubelet 仍尝试拉镜像 → 对比crictl images名称与--image-repository前缀是否逐字一致(含端口、子路径);只导入了 default 命名空间 → 重加-n k8s.io导入。