修复k8s的apiserver无法启动
·
一、准备工作
- 准备一台可以联网的机器(用于下载镜像)
- 确认目标环境架构(如 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)。
三、打包镜像
-
保存镜像为 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 -
传输文件到目标服务器
将生成的
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 集群
-
清理旧状态
如果之前尝试过初始化但未成功,请先清理:
sudo kubeadm reset -f sudo rm -rf /etc/kubernetes/ /var/lib/etcd/ -
执行
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 -
配置 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 -
验证集群状态
确认节点和 Pod 正常启动:
kubectl get nodes kubectl get pods -A
通过以上步骤,你应该能够在完全离线的环境下成功部署一个 Kubernetes 集群,并解决因网络隔离导致的镜像拉取问题。如果有任何一步遇到问题,请提供详细的错误信息以便进一步诊断。
更多推荐
所有评论(0)