KNative部署yaml填写镜像URL后报ContainerMissing错误如何解决
问题排查与解决步骤
- 首先纠正测试方法错误:容器镜像地址不是HTTP资源链接,无法通过
wget直接下载,你需要用docker/containerd等容器运行时的pull命令测试镜像是否可以正常拉取,用wget测试得到的失败结果不代表镜像本身有问题。 - 确认镜像公开权限
你推送的docker.io/adet4ever/sample-app默认如果是私有状态,K8s集群没有配置对应Docker Hub的镜像拉取Secret的话,会直接拉取失败,触发ContainerMissing错误。你可以登录Docker Hub后台,查看该镜像的可见性设置,改为Public公开后再重新部署测试。 - 确认镜像标签正确性
你推送镜像的时候如果没有指定标签,默认是latest标签,检查你本地推送的镜像标签和yaml中引用的是否一致,如果本地打了其他标签(比如v1),yaml里需要同步写成docker.io/adet4ever/sample-app:v1,否则会拉取不存在的latest标签导致失败。 - 测试集群节点的镜像拉取能力
登录到你的K8s集群的工作节点,手动执行docker pull docker.io/adet4ever/sample-app(如果集群用containerd作为运行时,替换为crictl pull docker.io/adet4ever/sample-app),看是否能正常拉取,如果拉取失败会输出具体错误原因,比如网络不通、认证失败、镜像不存在。 - 配置私有镜像拉取Secret(如果需要保持镜像私有)
如果不想公开镜像,可以在default命名空间下创建Docker Hub认证的Secret:
kubectl create secret docker-registry dockerhub-secret \ --docker-server=docker.io \ --docker-username=<你的Docker Hub用户名> \ --docker-password=<你的Docker Hub密码> \ --docker-email=<你的Docker Hub绑定邮箱>
然后在你的Knative Service yaml中添加imagePullSecrets配置:
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: sample-app namespace: default spec: template: spec: imagePullSecrets: - name: dockerhub-secret containers: - image: docker.io/adet4ever/sample-app env: - name: TARGET value: "Ruby Sample v1"
修改后重新执行kubectl apply -f <你的yaml文件名>即可。
- 验证部署状态
重新部署后执行kubectl get ksvc,看READY列是否变为True,拿到正确的访问URL后再测试访问,404错误是因为对应的Knative Service没有就绪,流量无法转发到正常工作的Pod,镜像拉取问题解决后服务就绪就能正常访问了。
内容的提问来源于stack exchange,提问作者Jamiu Adeleke
相关产品推荐
相关产品推荐

