microk8s 中的 ErrImagePull

microk8s 中的 ErrImagePull

我正在读《.NET 中的微服务第二版》这本书。在这本书的第三章中,作者尝试在 localhost 上设置一个 microk8s 集群来托管一个 web 服务。Kubernetes 的配置代码如下:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: shopping-cart
spec:
  replicas: 1
  selector:
    matchLabels:
      app: shopping-cart
  template:
    metadata:
      labels:
        app: shopping-cart
    spec:
      containers:
        - name: shopping-cart
          image: your_unique_registry_name.azurecr.io/shopping-cart:1.0.0
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: shopping-cart
spec:
  type: LoadBalancer
  ports:
    - name: shopping-cart
      port: 5000
      targetPort: 80
  selector:
    app: shopping-cart

我发出命令 kubectl apply -f shopping-cart.yaml 当我执行 kubectl get all以查看一切是否运行正常时,我得到以下输出:

姓名 就绪状态 重启年龄
pod/购物车-784b775b94-v5ddl 0/1 ImagePullBackOff 0 25 分钟
pod/购物车-6bd7897fd5-bnlvh 0/1 ImagePullBackOff 0 36 分钟

名称类型集群 IP 外部 IP 端口年龄
服务/kubernetes ClusterIP 10.152.183.1 <无> 443/TCP 13d
服务/购物车 LoadBalancer 10.152.183.254 <待定> 5000:32238/TCP 36m

姓名 已准备好 最新 可用 年龄
部署.apps/购物车 0/1 1 0 36 分钟

姓名 期望 当前 准备年龄
replicaset.apps/shopping-cart-6bd7897fd5 1 1 0 36 分钟
replicaset.apps/shopping-cart-784b775b94 1 1 0 25 分钟

有什么办法可以解决这个问题吗?本书的完整代码位于https://github.com/horsdal/microservices-in-dotnet-book-second-edition查找第 3 章。我使用 Manjaro Linux 进行开发和 .NET 7,该书是为 .NET 5 编写的。此外,尽管它说 ImagePullBackOff 最终它会变成 ErrImagePull,正如帖子标题所说。

我还想添加以下输出:

kubectl describe pod shopping-cart  INT ✘
名称:shopping-cart-784b775b94-v5ddl
命名空间: default
优先级:0
服务帐户:默认
节点:dso-z68xud5b3/192.168.1.9
开始时间:2022 年 12 月 31 日星期六 11:37:04 +0200
标签:app=shopping-cart
                  pod 模板哈希=784b775b94
注释:cni.projectcalico.org/containerID: 2f73bffa63650fc7bf3497b7255172f8d80f7834de0a7e2738e26579006261c2
                  cni.projectcalico.org/podIP: 10.1.59.225/32
                  cni.projectcalico.org/podIPs: 10.1.59.225/32
状态:待定
IP:10.1.59.225
IP地址:
  IP:10.1.59.225
控制者:ReplicaSet/shopping-cart-784b775b94
容器:
  购物车:
    容器编号:   
    图片:your_unique_registry_name.azurecr.io/shopping-cart:1.0.0
    图片编号:       
    端口:80/TCP
    主机端口:0/TCP
    状态:等待
      原因:ImagePullBackOff
    就绪:错误
    重启次数:0
    环境:<无>
    坐骑:
      /var/run/secrets/kubernetes.io/serviceaccount 来自 kube-api-access-6cghz (ro)
状况:
  类型状态
  已初始化 True
  准备错误
  容器就绪错误
  PodScheduled 真
卷:
  kube-api-访问-6cghz:
    类型:投影(包含来自多个来源的注入数据的卷)
    TokenExpirationSeconds:3607
    ConfigMapName:kube-root-ca.crt
    ConfigMap可选:<nil>
    DownwardAPI:true
QoS 等级:尽力而为
节点选择器:<无>
容忍度:node.kubernetes.io/not-ready:NoExecute op=Exists 300 秒
                             node.kubernetes.io/unreachable:NoExecute op=存在 300 秒
事件:
  类型 原因 年龄 来自 消息
  ---- ------ ---- ---- -------
  警告 MissingClusterDNS 3m32s(x71 超过 18m)kubelet pod:“shopping-cart-784b775b94-v5ddl_default(1e24b5d3-d921-45a1-b5ec-2edc35e651e4)”。kubelet 未配置 ClusterDNS IP,无法使用“ClusterFirst”策略创建 Pod。回退到“默认”策略。

名称:shopping-cart-6bd7897fd5-bnlvh
命名空间: default
优先级:0
服务帐户:默认
节点:dso-z68xud5b3/192.168.1.9
开始时间:2022 年 12 月 31 日星期六 11:26:03 +0200
标签:app=shopping-cart
                  pod 模板哈希=6bd7897fd5
注释:cni.projectcalico.org/containerID: a859a48851ce4eecb8311318cc71b6057fab2ad2c74e5e41b1bff419d3f210ae
                  cni.projectcalico.org/podIP: 10.1.59.224/32
                  cni.projectcalico.org/podIPs: 10.1.59.224/32
状态:待定
IP:10.1.59.224
IP地址:
  IP:10.1.59.224
控制者:ReplicaSet/shopping-cart-6bd7897fd5
容器:
  购物车:
    容器编号:   
    图片:购物车
    图片编号:       
    端口:80/TCP
    主机端口:0/TCP
    状态:等待
      原因:ImagePullBackOff
    就绪:错误
    重启次数:0
    环境:<无>
    坐骑:
      /var/run/secrets/kubernetes.io/serviceaccount 来自 kube-api-access-hcmnb (ro)
状况:
  类型状态
  已初始化 True
  准备错误
  容器就绪错误
  PodScheduled 真
卷:
  kube-api-访问-hcmnb:
    类型:投影(包含来自多个来源的注入数据的卷)
    TokenExpirationSeconds:3607
    ConfigMapName:kube-root-ca.crt
    ConfigMap可选:<nil>
    DownwardAPI:true
QoS 等级:尽力而为
节点选择器:<无>
容忍度:node.kubernetes.io/not-ready:NoExecute op=Exists 300 秒
                             node.kubernetes.io/unreachable:NoExecute op=存在 300 秒
事件:
  类型 原因 年龄 来自 消息
  ---- ------ ---- ---- -------
  警告 MissingClusterDNS 3m24s(x71 超过 18m)kubelet pod:“shopping-cart-6bd7897fd5-bnlvh_default(5309b220-a258-4930-bf64-9b1cf0cbafc7)”。kubelet 未配置 ClusterDNS IP,无法使用“ClusterFirst”策略创建 Pod。回退到“默认”策略。

答案1

不确定书中的内容,但存储库包含所需的所有材料。您可能跳过了一些步骤。您需要以下内容:

  • Docker 镜像(your_unique_registry_name.azurecr.io/shopping-cart:1.0.0模板YAML(YAML)
  • 容器注册表(your_unique_registry_name.azurecr.io模板YAML(YAML)
  • (Kubernetes 集群)

该存储库包含一个模板脚本用于创建两个都Microsoft Azure 云上的容器注册表 (ACR) 和 Kubernetes 集群 (AKS)。或者,任何其他注册表(和 K8s)都可以,甚至是 Docker Hub!您还可以在 MicroK8s 中启用内置容器注册表

在Azure上创建容器注册表的相关代码如下:

az group create --name MicroservicesInDotnet --location northeurope
az acr create --resource-group MicroservicesInDotnet --name YOUR_UNIQUE_REGISTRY_NAME --sku Basic

这些命令需要安装 Azure CLI。

要启用 MicroK8s 容器注册表,请使用此命令,然后按照文档操作

microk8s enable registry

该存储库还包含Dockerfile用于创建要在 Kubernetes 集群内使用的 Docker 镜像。在本地创建镜像(使用docker build适当的参数)后,您必须将其推送 ( docker push) 到要使用的注册表。

无论你选择哪种方式,在 Kubernetes YAML 文件中使用镜像的准确名称(包括冒号后的部分!)都很重要。如果你能用docker pull这个名字,它很可能会在 Kubernetes 中起作用。如果你不能,它几乎肯定不会起作用。

如果你选择的注册表只能通过凭证访问(通常称为“私有”,需要docker login),那么 Kubernetes 也需要这些凭证来拉取镜像。从关于从私人注册中心提取的文档,使用用户名/电子邮件/密码验证的方式是:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

如果您的注册表使用不同的身份验证方案,事情会变得更加复杂,但本指南提供了解决方案。结果是一个名为的集群机密regcred。您可以在部署 YAML 中引用此机密:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: shopping-cart
spec:
  replicas: 1
  selector:
    matchLabels:
      app: shopping-cart
  template:
    metadata:
      labels:
        app: shopping-cart
    spec:
      imagePullSecrets: # <--
        - name: regcred # <--
      containers:
        - name: shopping-cart
          image: your_unique_registry_name.azurecr.io/shopping-cart:1.0.0
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80

相关内容