一、准备工作

  1. 准备一台可以联网的机器(用于下载镜像)
  2. 确认目标环境架构(如 ARM64)

二、下载所需镜像

对于 Kubernetes v1.20 和 containerd,你需要以下基础镜像:

  • pause 镜像(不同架构版本)
  • Kubernetes 控制平面组件镜像(apiserver, controller-manager, scheduler)
  • CoreDNS
  • Etcd
获取镜像列表

在联网机器上运行以下命令获取 kubeadm 所需的所有镜像列表:

kubeadm config images list --kubernetes-version=v1.20.0

然后根据输出结果拉取相应的镜像。例如

docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.20.0
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.20.0
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.20.0
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.20.0
docker pull registry.aliyuncs.com/google_containers/pause:3.2
docker pull registry.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.aliyuncs.com/google_containers/coredns:1.7.0

注意:根据你的架构选择正确的 pause 镜像(比如 ARM64)。

三、打包镜像

  1. 保存镜像为 tar 文件

     

    使用 Docker 的 save 命令来打包这些镜像:

    docker save -o kube_images.tar \
      registry.aliyuncs.com/google_containers/kube-apiserver:v1.20.0 \
      registry.aliyuncs.com/google_containers/kube-controller-manager:v1.20.0 \
      registry.aliyuncs.com/google_containers/kube-scheduler:v1.20.0 \
      registry.aliyuncs.com/google_containers/kube-proxy:v1.20.0 \
      registry.aliyuncs.com/google_containers/pause:3.2 \
      registry.aliyuncs.com/google_containers/etcd:3.4.13-0 \
      registry.aliyuncs.com/google_containers/coredns:1.7.0
  2. 传输文件到目标服务器

     

    将生成的 kube_images.tar 文件传输到你的目标服务器(可以通过 SCP 或其他方式)。

四、导入镜像到离线环境

在目标服务器上执行以下命令导入镜像

sudo ctr -n k8s.io images import ~/path/to/kube_images.tar

确保所有需要的镜像都已成功导入:

sudo ctr -n k8s.io images list | grep -E "(kube-apiserver|kube-controller-manager|kube-scheduler|kube-proxy|pause|etcd|coredns)"

五、处理 pause 镜像标签问题

由于 kubeadm init 可能会尝试拉取 registry.k8s.io/pause:3.6,而你只有 registry.aliyuncs.com/google_containers/pause:3.2,因此需要给这个镜像打一个新的标签:

sudo ctr -n k8s.io images tag \
  registry.aliyuncs.com/google_containers/pause:3.2 \
  registry.k8s.io/pause:3.6

六、初始化 Kubernetes 集群

  1. 清理旧状态

     

    如果之前尝试过初始化但未成功,请先清理:

    sudo kubeadm reset -f
    sudo rm -rf /etc/kubernetes/ /var/lib/etcd/
  2. 执行 kubeadm init

     

    使用阿里云镜像仓库进行初始化:

    sudo kubeadm init \
      --cri-socket=unix:///run/containerd/containerd.sock \
      --image-repository=registry.aliyuncs.com/google_containers \
      --kubernetes-version=v1.20.0 \
      --pod-network-cidr=10.244.0.0/16 \
      --ignore-preflight-errors=SystemVerification
  3. 配置 kubectl

     

    按照提示设置 kubectl

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  4. 验证集群状态

     

    确认节点和 Pod 正常启动:

    kubectl get nodes
    kubectl get pods -A

通过以上步骤,你应该能够在完全离线的环境下成功部署一个 Kubernetes 集群,并解决因网络隔离导致的镜像拉取问题。如果有任何一步遇到问题,请提供详细的错误信息以便进一步诊断。

更多推荐