在 AKS 上使用 Helm 时 Kubernetes NGINX 入口控制器出现故障

在 AKS 上使用 Helm 时 Kubernetes NGINX 入口控制器出现故障

在进行 K8 入口控制器的设置时,该设置已记录在案这里

我无法完成“创建入口控制器”的步骤在 Helm 命令步骤期间将命令置于调试模式,我看到其中一个步骤超时:

预安装失败:等待条件超时

在查看 K8 POD 日志后,我发现 K8 系统由于身份验证错误而无法连接到注册表。出于安全原因,以下输出已被修改,但显示错误

Failed to pull image "myregistry.azurecr.io/jettech/kube-webhook-certgen:v1.5.1@sha256:...90bd8068": [rpc error: code = NotFound desc = failed to pull and unpack image "....azurecr.io/jettech/kube-webhook-certgen@sha256:....9b9e90bd8068": failed to resolve reference "myregistry.azurecr.io/jettech/kube-webhook-certgen@sha256:...190b1dcbcb9b9e90bd8068": ....azurecr.io/jettech/kube-webhook-certgen@sha256:...9b9e90bd8068: not found, rpc error: code = Unknown desc = failed to pull and unpack image "myregistry.azurecr.io/jettech/kube-webhook-certgen@sha256:...dcbcb9b9e90bd8068": failed to resolve reference "myregistry.azurecr.io/jettech/kube-webhook-certgen@sha256:...b9b9e90bd8068": failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized]

我已经根据“az acr import”命令验证了镜像位于容器注册表中,并且如果我使用“kubectl”进行标准 K8 部署,则 k8 能够连接到 acr。我还使用以下命令验证了集群和注册表之间的连接,它按预期工作:

az aks check-acr -n <cluster> -g <rg>  --acr <acr>

仅在使用 helm 命令时才会发生此失败。

编辑

经过进一步研究,我发现了以下文章

https://stackoverflow.com/questions/68949434/installing-nginx-ingress-controller-into-aks-cluster-cant-pull-image-from-azu

看来摘要有问题。我在 helm 命令中添加/替换了以下内容:

--set controller.image.digest="sha256:e9fb216ace49dfa4a5983b183067e97496e7a8b307d2093f4278cd550c303899" \
--set controller.admissionWebhooks.patch.image.digest="sha256:950833e19ade18cd389d647efb88992a7cc077abedef343fa59e012d376d79b7" \

但是,运行修改后的 helm 命令时,POD 处于错误状态,并出现以下错误

unknown flag: --controller-class

我尝试设置环境变量 CONTROLLER_TAG=v1.0.0,如文章中所述,但这没有帮助

另一个解决方案是在命令中设置版本号:3.36.0。此方法可行,但需要降级版本

答案1

在联系了 MS 文档网站反馈后,他们为我提供了针对该文档的以下修复

https://github.com/MicrosoftDocs/azure-docs/issues/80321

回滚并重新应用修改后的更改后,命令成功了。关键是使用 helm uninstall 命令删除 pod:

helm uninstall nginx-ingress --namespace ingress-basic

然后从 ACR 中删除 ACR 存储库:

jettech/kube-webhook-certgen
defaultbackend-amd64
jetstack/cert-manager-controller
jetstack/cert-manager-webhook
jetstack/cert-manager-cainjector

使用“az acr import”命令创建,然后重新运行修改后的命令。

希望有人觉得这个有价值

答案2

暂时禁用 ACR 容器注册表中的身份验证:

az acr update --name my-acr-registry-name --anonymous-pull-enabled true

重新执行 Helm Chart,并在创建控制器时重新启用注册表中的身份验证

az acr update --name my-acr-registry-name --anonymous-pull-enabled false

无需更改版本或其他。这将节省您的时间。对于那些认为将 acr 容器注册表公开 9 秒(入口控制器执行的时间)将引发核战争的人,您可以在 acr 的网络部分中仅将已知网络列入白名单,以防止不良访问

相关内容