我正在读《.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