无法在本地 kubernetes 集群中部署 emissary-ingress。因“验证数据错误:ValidationError(CustomResourceDefinition.spec)”而失败

Posted

技术标签:

【中文标题】无法在本地 kubernetes 集群中部署 emissary-ingress。因“验证数据错误:ValidationError(CustomResourceDefinition.spec)”而失败【英文标题】:Unable to deploy emissary-ingress in local kubernetes cluster. Fails with `error validating data: ValidationError(CustomResourceDefinition.spec)` 【发布时间】:2021-11-25 01:37:16 【问题描述】:

我正在尝试使用 instructions here 安装 emissary-ingress。

它开始失败并出现错误no matches for kind "CustomResourceDefinition" in version "apiextensions.k8s.io/v1beta"。我在 Stack Overflow 上搜索并找到了一个 answer,它说我将 apiextensions.k8s.io/v1beta1 更新为 apiextensions.k8s.io/v1。 它还要求使用我的 kubectl 已经使用的 admissionregistration.k8s.io/v1

当我运行kubectl apply -f filename.yml 命令时,上面的错误消失了,一个新的错误开始出现错误:error validating data: ValidationError(CustomResourceDefinition.spec): unknown field "validation" in io.k8s.apiextensions-apiserver.pkg.apis.apiextensions.v1.CustomResourceDefinitionSpec;

接下来我该怎么做?

我的 kubectl 版本 - 客户端版本:version.InfoMajor:"1", Minor:"21", GitVersion:"v1.21.4", GitCommit:"3cce4a82b44f032d0cd1a1790e6d2f5a55d20aae", GitTreeState:"clean", BuildDate:"2021 -08-11T18:16:05Z",GoVersion:"go1.16.7",编译器:"gc",平台:"windows/amd64" 服务器版本:version.InfoMajor:"1", Minor:"22", GitVersion:"v1.22.2", GitCommit:"8b5a19147530eaac9476b0ab82980b4088bbc1b2", GitTreeState:"clean", BuildDate:"2021-09-15T21:32: 41Z", GoVersion:"go1.16.8", 编译器:"gc", 平台:"linux/amd64"

minikube 版本 - minikube 版本:v1.23.2 提交:0a0ad764652082477c00d51d2475284b5d39ceed

编辑:

自定义资源定义yml文件:here

rbac yml 文件:here

【问题讨论】:

你能分享你的 YAML 文件来看看吗? @VicenteAyala 编辑了帖子以放置指向 yml 的链接 感谢您分享您的 YAML 文件。我已经查看了它们以搜索语法错误,但我没有找到任何人,但我发现当您在 yaml 文件中使用 --- 并且当它编译时,引擎解释为同一个 yaml 文件中的新部署文档。 yaml 文档由--- 分隔,如果任何流(例如文件)包含多个文档,则应使用 yaml.load_all 函数而不是 yaml.load。代码:import yamlstream = open("test", "r") docs = yaml.load_all(stream) for doc in docs: for k,v in doc.items(): print k, "->", v print "\n", 在这里您可以查看有关您的问题的帖子。 ***.com/questions/14359557/… 这些 yaml 文件由 emissary-ingress 提供。我不是在生成它们。因此,必须有意识地分离成不同的部署。 【参考方案1】:

validation 字段已在 apiextensions.k8s.io/v1 中正式弃用。 根据官方 kubernetes 文档,您应该使用 schema 代替 validation. 这是使用schema 而不是validation: 的示例代码

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: crontabs.stable.example.com
spec:
  group: stable.example.com
  versions:
    - name: v1
      served: true
      storage: true
--->  schema:  <---
        # openAPIV3Schema is the schema for validating custom objects.
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                cronSpec:
                  type: string
                  pattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?)4$'
                image:
                  type: string
                replicas:
                  type: integer
                  minimum: 1
                  maximum: 10

【讨论】:

以上是关于无法在本地 kubernetes 集群中部署 emissary-ingress。因“验证数据错误:ValidationError(CustomResourceDefinition.spec)”而失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在本地运行Kubernetes?

赵渝强使用二进制包部署Kubernetes集群

云原生之kubernetes实战在kubernetes集群下部署Rainbond平台

Kubernetes二进制单节点集群部署

安装指定版本的minikube

从本地 Docker For Mac 中部署的服务访问本地 Kafka(包括 Kubernetes 扩展)