OpenShift部署apps.yml报Kind=Template错误是否与K8s版本有关
问题结论
你遇到的报错不是单纯由Kubernetes版本导致的,核心是三类配置与环境兼容问题:
核心原因
- API版本配置错误
Template 是OpenShift专属的自定义资源,不属于Kubernetes原生标准API,且在较新版本的OpenShift中,Template已经从原始的v1API组迁移到了独立的template.openshift.io/v1组,你写的apiVersion: v1自然无法被集群识别。
同样你用到的DeploymentConfig也是OpenShift专属资源,新版本中正确API版本为apps.openshift.io/v1,你填写的v1也不符合规范。 - oc客户端与服务端版本严重不兼容
你本地使用的oc客户端版本为v1.4(对应OpenShift 3.4版本,发布于2017年左右),但集群服务端对应的Kubernetes版本为v1.19(对应OpenShift 4.6版本,和客户端差了6个以上大版本),跨度过大的版本差会导致客户端无法正确识别服务端支持的API资源列表,也会引发资源识别报错。 - 资源使用方式错误
如果你的目标是直接部署Template内包含的应用资源,不能直接用oc apply提交Template文件,需要先通过oc process渲染模板后再提交,否则你只是把Template作为一个配置对象上传到集群,不会生成实际的工作负载。
解决方案
- 首先升级本地oc客户端,下载和集群版本匹配的oc二进制文件,至少保证大版本差不超过2,解决基础兼容问题。
- 修正YAML文件中的API版本配置:
# 修正Template的API版本 apiVersion: template.openshift.io/v1 kind: Template metadata: name: app annotations: description: "App" objects: # 修正DeploymentConfig的API版本 - apiVersion: apps.openshift.io/v1 kind: DeploymentConfig metadata: name: tao-app-deployment labels: version: appV1 app: app spec: replicas: 1 selector: matchLabels: version: appV1 app: tao-app updateStrategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 template: metadata: labels: version: tao-appV1 app: app spec: containers: - name: App image: registry.gitlab.tech.domain/path/path_img/app:latest imagePullPolicy: Always ports: - containerPort: 9000
- 如果需要直接部署模板内的应用,执行命令:
oc process -f apps.yml | oc apply -f - - 如果需要先把Template上传到集群的模板库,执行命令:
oc apply -f apps.yml - 执行前可先运行
oc api-resources | grep -E 'template|deploymentconfig'确认集群已经开启了对应的OpenShift专属API组,若没有返回结果需要联系集群管理员开启对应特性。
内容的提问来源于stack exchange,提问作者Ciocoiu Petrisor
相关产品推荐
相关产品推荐

