我正在阅读“.NET 第二版中的微服务”一书。在本书的第三章中,作者尝试在本地主机上建立一个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
以查看是否一切运行良好时,我得到以下输出:
姓名 READY STATUS RESTARTS AGE pod/shopping-cart-784b775b94-v5ddl 0/1 ImagePullBackOff 0 25m pod/shopping-cart-6bd7897fd5-bnlvh 0/1 ImagePullBackOff 0 36m 名称类型集群 IP 外部 IP 端口年龄 服务/kubernetes ClusterIP 10.152.183.1 <无> 443/TCP 13d 服务/购物车 LoadBalancer 10.152.183.254 <pending> 5000:32238/TCP 36m 姓名准备好最新可用年龄 deployment.apps/购物车 0/1 1 0 36m 姓名 期望的当前准备年龄 replicaset.apps/shopping-cart-6bd7897fd5 1 1 0 36m replicaset.apps/shopping-cart-784b775b94 1 1 0 25m
关于如何解决这个问题的任何想法?这本书的完整代码在https://github.com/horsdal/microservices-in-dotnet-book-second-edition寻找第 3 章。我使用 Manjaro linux 进行开发和.NET 7,这本书是为.NET 5。尽管它说 ImagePullBackOff 最终它变成了 ErrImagePull 正如帖子的标题所说。
我还想添加以下输出:
kubectl describe pod 购物车 INT ✘ 名称:购物车-784b775b94-v5ddl 命名空间:默认 优先级:0 服务帐号:默认 节点:dso-z68xud5b3/192.168.1.9 开始时间:2022 年 12 月 31 日星期六 11:37:04 +0200 标签:app=购物车 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) 状况: 类型状态 初始化为真 准备好 假 ContainersReady 错误 PodScheduled 真 卷: kube-api-access-6cghz: 类型:投影(包含来自多个来源的注入数据的卷) TokenExpirationSeconds:3607 ConfigMap 名称:kube-root-ca.crt ConfigMap可选:<无> 向下API:真 QoS 等级:尽力而为 节点选择器:<无> 容忍度:node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s 事件: 消息类型原因年龄 ---- ------ ---- ---- -------- 警告 MissingClusterDNS 3m32s(x71 超过 18m)kubelet pod:“shopping-cart-784b775b94-v5ddl_default(1e24b5d3-d921-45a1-b5ec-2edc35e651e4)”。kubelet 没有配置 ClusterDNS IP,无法使用“ClusterFirst”策略创建 Pod。回退到“默认”策略。 名称:购物车-6bd7897fd5-bnlvh 命名空间:默认 优先级:0 服务帐号:默认 节点:dso-z68xud5b3/192.168.1.9 开始时间:2022 年 12 月 31 日星期六 11:26:03 +0200 标签:app=购物车 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) 状况: 类型状态 初始化为真 准备好 假 ContainersReady 错误 PodScheduled 真 卷: kube-api-访问-hcmnb: 类型:投影(包含来自多个来源的注入数据的卷) TokenExpirationSeconds:3607 ConfigMap 名称:kube-root-ca.crt ConfigMap可选:<无> 向下API:真 QoS 等级:尽力而为 节点选择器:<无> 容忍度:node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s 事件: 消息类型原因年龄 ---- ------ ---- ---- -------- 警告 MissingClusterDNS 3m24s(x71 超过 18m)kubelet pod:“shopping-cart-6bd7897fd5-bnlvh_default(5309b220-a258-4930-bf64-9b1cf0cbafc7)”。kubelet 没有配置 ClusterDNS IP,无法使用“ClusterFirst”策略创建 Pod。回退到“默认”策略。
不确定书中的内容,但存储库包含所需的所有成分。您可能跳过了一些步骤。您需要以下内容:
your_unique_registry_name.azurecr.io/shopping-cart:1.0.0
在模板YAML 中调用)your_unique_registry_name.azurecr.io
在模板YAML 中调用)该存储库包含一个模板脚本,用于在Microsoft Azure 云上创建容器注册表 (ACR) 和 Kubernetes 集群 (AKS)。或者,任何其他注册表(和 K8s)都可以,甚至是 Docker Hub!您还可以在 MicroK8s 中启用内置容器注册表。
在Azure上创建容器注册中心的相关代码如下:
这些命令需要安装 Azure CLI。
要启用 MicroK8s 容器注册表,请使用此命令,然后按照文档进行操作:
该存储库还包含一个
Dockerfile
用于创建将在 Kubernetes 集群中使用的 Docker 映像的文件。在本地创建映像(使用docker build
适当的参数)后,您必须将其推送 (docker push
) 到您要使用的注册表。无论您选择哪种方式,重要的是在您的 Kubernetes YAML 文件中使用图像的确切名称(包括冒号后面的部分!)。如果你能用
docker pull
这个名字,它很可能在 Kubernetes 中工作。如果你做不到,它几乎肯定不会起作用。如果您决定使用的注册表只能通过凭据访问(通常称为“私有”,需要
docker login
),Kubernetes 也需要这些来拉取镜像。从关于从私有注册表中提取的文档中,使用用户名/电子邮件/密码身份验证的方法是:如果您的注册表使用不同的身份验证方案,事情会更复杂,但该指南提供了解决方案。结果是一个名为 的集群秘密
regcred
。您可以在部署 YAML 中引用此机密: