我将集群的kubernetes版本更新到1.29,knative版本更新到1.13后,部署knative service总是失败:failed to resolve image to digest,在折腾一段时间后解决了这个问题,那么tag to digest是什么,又该如何解决?
Tag to digest是什么?
参考https://knative.dev/docs/serving/tag-resolution/
最开始docker仓库协议中只有tag的概念,gcr.io/helloworld/v1就是一个tag,拉取时仓库根据tag给你返回镜像。但是使用tag会遇到不一致的问题,如果deployment部署后先只有一个worker上拉取了镜像,然后仓库更新了对应tag的镜像内容,当deployment扩容时,第二个worker拉取的镜像就和第一个worker不一致。
开始是用“immutable tag”解决这个问题,但是客户可能想在不更改tag的情况下滚动更新这个deployment,immutable tag使得客户必须更新tag。
后来用“tag to digest”解决不一致问题,客户端拉取镜像时会获取tag对应的digest,比如taggcr.io/helloworld/v1,对应的digest是gcr.io/helloworld/@sha256:abab,在一次部署中只拉取这个digest镜像,如果仓库更新tag的内容,客户端拉取的也是更新前的内容,这样就保证所有机器有相同的镜像。
Knative为什么报错了?
根据Knative文档,必须加上对仓库的访问权限才能使用tag resolution,DockerHub的文档里有authentication的介绍,报错可能是没有加上对DockerHub仓库的访问权限。
如何解决?
一种是加上authentication,如果没有tag resolution的需求(就是觉得immutable tag方便),可以修改knative配置,不对DockerHub的镜像做tag resolution。
kubectl edit configmap config-deployment -n knative-serving
在data一节下添加一句话 (不要修改_example下的内容):
registries-skipping-tag-resolving: kind.local,ko.local,dev.local,index.docker.io