前言
使用Kubernetes(k8s)时遇到了镜像拉取的问题,导致Pod沙盒创建失败。错误显示在尝试从k8s.gcr.io拉取pause:3.2镜像时遇到了超时问题,这通常是因为网络问题或者镜像仓库服务器的问题。
错误信息
Failed to create pod sandbox: rpc error: code = Unknown desc = failed to get sandbox image “k8s.gcr.io/pause:3.2”: failed to pull image “k8s.gcr.io/pause:3.2”: failed to pull and unpack image “k8s.gcr.io/pause:3.2”: failed to resolve reference “k8s.gcr.io/pause:3.2”: failed to do request: Head “https://k8s.gcr.io/v2/pause/manifests/3.2”: dial tcp 74.125.204.82:443: i/o timeout
临时解决
拉取镜像,重新tag,国内可以使用阿里云的
# 如果你的k8s使用的事docker客户端
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
# 如果使用containerd自带客户端
crictl pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
ctr -n k8s.io i tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
推荐解决
one(Kubernetes服务无法重启)
如果您的Kubernetes服务无法重启,您可以尝试创建一个DaemonSet来替换使用的镜像。如您所示的YAML配置,您可以定义一个DaemonSet,将Pod的容器镜像更改为可访问的阿里云镜像。这种方法不需要重启Kubernetes服务,而是一次性更新所有节点的Pod
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: example-daemonset
namespace: default
spec:
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- image: k8s.gcr.io/pause:3.2
imagePullPolicy: IfNotPresent
name: example-container
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
updateStrategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
two(Kubernetes服务可以重启)
如果您的Kubernetes服务可以重启,您可以修改Kubelet的启动参数,以直接使用阿里云的镜像。这涉及到编辑Kubelet的配置文件,并更改Pod基础设施容器的镜像路径。然后重启Kubelet服务以应用更改。
在执行这些操作时,请注意:
- 在生产环境中操作前,请确保您理解每个命令的影响
- 备份当前的配置和状态,以防需要回滚或恢复
- 确保遵循您组织的安全和配置管理策略。
最后,添加注解可以帮助其他维护者或团队成员理解配置的原因和更改的上下文,这在团队合作和Kubernetes集群维护中是一个好习惯。
# 查看 kubelet 配置
systemctl status kubelet
cd /var/lib/kubelet/
cp kubeadm-flags.env kubeadm-flags.env.ori
# 把 k8s.gcr.io/pause:3.2 改成 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2"
# 重启 kubelet 服务
systemctl daemon-reload
systemctl restart kubelet
three(containerd需要重启)
建议部署时候进行更改
/etc/containerd/config.toml
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2"
sandbox_image
参数指定了在使用容器时,容器运行时环境(例如 Kubernetes 中的容器)创建一个 “sandbox” 容器所使用的镜像。这个沙箱容器通常是一个基础镜像,用于提供一个隔离的环境来运行其他容器。
在 containerd
和 CRI (Container Runtime Interface)
中,沙箱容器的作用通常是提供容器运行所需的基础网络和存储环境。比如 Kubernetes 在启动 Pod 时,会为每个 Pod 创建一个沙箱容器,确保所有容器可以共享网络、存储等资源。
在这个配置中,sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2"
指定了使用 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
镜像作为沙箱容器的基础镜像。
作用
- 隔离性:沙箱容器保证了容器与容器之间的隔离。
- 网络与存储配置:提供容器间共享网络和存储的基础架构。
- 性能:沙箱容器通常是非常轻量级的镜像,例如
pause
镜像,它不会执行任何实际的应用程序,仅用于保持容器的运行状态。
pause
镜像通常用于此目的,因为它只会保持容器的生命周期,而不会消耗大量资源