Knative Service部署失败:报RevisionMissing与ProgressDeadlineExceeded错误
Knative服务重新部署失败:Revision资源未注册问题排查与解决
问题详情
迭代Knative服务的代码/Docker镜像后,按以下步骤重新部署:
- 推送新Docker镜像到私有仓库
- 更新服务YAML文件中的镜像版本(完整YAML见下方)
- 执行命令删除旧服务:
kubectl -n myspacename delete -f myservicename.yaml - 执行命令重新创建服务:
kubectl -n myspacename apply -f myservicename.yaml
部署后服务状态异常:
- 初始阶段:
READY = Unknown,REASON = RevisionMissing - 一段时间后:
READY = False,REASON = ProgressDeadlineExceeded
查看Revision日志时得到报错:
no kind "Revision" is registered for version "serving.knative.dev/v1" in scheme "pkg/scheme/scheme.go:28"
服务YAML文件:
--- apiVersion: serving.knative.dev/v1 kind: Service metadata: name: myservicename namespace: myspacename spec: template: metadata: annotations: autoscaling.knative.dev/class: kpa.autoscaling.knative.dev autoscaling.knative.dev/metric: concurrency autoscaling.knative.dev/target: '1' autoscaling.knative.dev/minScale: '0' autoscaling.knative.dev/maxScale: '5' autoscaling.knative.dev/scaleDownDelay: 60s autoscaling.knative.dev/window: 600s spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule volumes: - name: nfs-volume persistentVolumeClaim: claimName: myspacename-models-pvc imagePullSecrets: - name: myrobotaccount-pull-secret containers: - name: myservicename image: quay.company.com/project/myservicename:0.4.0 ports: - containerPort: 5000 name: user-port protocol: TCP resources: limits: cpu: "4" memory: 36Gi nvidia.com/gpu: 1 requests: cpu: "2" memory: 32Gi volumeMounts: - name: nfs-volume mountPath: /tmp/static/ securityContext: privileged: true env: - name: CLOUD_STORAGE_PASSWORD valueFrom: secretKeyRef: name: myservicename-cloud-storage-password key: key envFrom: - configMapRef: name: myservicename-config
问题根源
报错核心是Knative Serving控制器无法识别serving.knative.dev/v1版本的Revision资源,常见原因包括:
- 集群安装的Knative Serving版本过低,不支持v1 API版本(v0.19之前的版本默认使用v1beta1)
- Knative Serving的CRD未正确安装或损坏,导致Revision资源无法被集群识别
- 手动删除服务的操作残留了异常资源,干扰了新服务的创建流程
修复方案
1. 检查并对齐Knative版本兼容性
先查看当前集群的Knative Serving版本:
kubectl get namespace knative-serving -o jsonpath='{.metadata.labels.serving\.knative\.dev/release}'
- 如果版本低于v0.19:
- 要么升级Knative Serving到支持v1 API的稳定版本
- 要么修改YAML中的
apiVersion为serving.knative.dev/v1beta1,同时调整对应字段(比如v1beta1中部分字段命名有差异)
2. 验证并修复Knative CRD
检查Revision对应的CRD是否存在:
kubectl get crd revisions.serving.knative.dev
- 若CRD不存在,重新安装对应版本的Knative Serving CRD和核心组件:
# 替换为你需要的Knative版本,示例为v1.12.0 kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.12.0/serving-crds.yaml kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.12.0/serving-core.yaml - 若CRD存在但状态异常,先删除再重新安装:
kubectl delete crd revisions.serving.knative.dev kubectl apply -f https://github.com/knative/serving/releases/download/knative-v1.12.0/serving-crds.yaml
3. 优化部署流程,避免资源残留
Knative支持滚动更新,无需删除旧服务,直接应用更新后的YAML即可:
kubectl -n myspacename apply -f myservicename.yaml
如果之前删除服务导致资源残留,先清理再重新部署:
kubectl -n myspacename delete revisions.serving.knative.dev --all kubectl -n myspacename apply -f myservicename.yaml
4. 排查控制器日志
查看Knative Serving控制器的日志,确认是否有其他潜在问题:
kubectl logs -n knative-serving deployment/controller
根据日志中的其他错误信息针对性修复(比如权限问题、存储卷挂载失败等)
验证修复
重新部署后,检查服务状态:
kubectl -n myspacename get ksvc myservicename
当状态显示READY=True时,说明服务部署成功,可访问服务地址验证功能正常。
内容的提问来源于stack exchange,提问作者Alexis.Rolland
相关产品推荐
相关产品推荐

