【问题标题】:Helm 3 chart install error: error validating data: apiVersion not setHelm 3 图表安装错误:验证数据时出错:未设置 apiVersion
【发布时间】:2020-10-26 01:40:18
【问题描述】:

我有一个简单的 helm chart,它将通过 docker desktop 将应用程序部署到我的本地 kubernetes 副本。如果我使用 kubectl 一次部署 yaml 一个文件,则一切正常。但是,当我尝试创建一个 helm 图表以便于部署时,我收到以下错误。

helm 安装演示 WebApi

错误:无法从发布清单构建 kubernetes 对象:错误验证“”:错误验证数据:未设置 apiVersion

错误似乎是说我的一个或多个 YAML 文件中缺少 apiVersion 映射。但是,我所有的文件似乎都有正确的 apiVersions。

文件夹结构

charts
└── WebApi
    ├── Chart.yaml
    └── templates
        ├── deployment.yaml
        ├── ingress.yaml
        └── services.yaml

Chart.yaml

apiVersion: v2
version: 0.1.0
name: WebApi
appVersion: "1.0"
description: A Helm Chart for WebApi
type: application

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-api
  labels:
    app: demo
    tier: demo-api
spec:
  selector:
    matchLabels:
      app: demo
  replicas: 3
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
        - name: demo
          image: demo/image
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
              protocol: TCP
          resources:
            limits:
              memory: "128Mi" #128 MB
              cpu: "200m" #200 millicpu (.2 cpu or 20% of the cpu)
          livenessProbe:
            httpGet:
              path: /swagger/index.html
              port: 80
            initialDelaySeconds: 15
            timeoutSeconds: 2
            periodSeconds: 5
            failureThreshold: 1
          readinessProbe:
            httpGet:
              path: /swagger/index.html
              port: 80

ingress.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: demo
spec:
  rules:
    - host: demo.com
      http:
        paths:
          - backend:
              serviceName: demo
              servicePort: 80

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: demo
  labels:
    app: demo
spec:
  type: ClusterIP
  selector:
    app: demo
  ports:
    - name: http
      port: 80
      targetPort: 80

如您所见,我的所有 YAML 文件都有所需的 apiVersion 映射,但错误仍然显示它们丢失。我需要进行哪些更正才能使其按预期工作?

【问题讨论】:

  • 您的 Helm 图表是什么样的?可以分享一下吗?
  • @Rico 所有值都在上面的 yaml 中
  • 文件结构是否正确?你是怎么创造的?如果您甚至不使用模板,那么使用 Helm 有什么意义?
  • @Rico 抱歉我误解了。请看我上面添加的文件夹结构。
  • 您是否有任何与此安装冲突的现有资源?

标签: kubernetes yaml kubernetes-helm


【解决方案1】:

错误:无法从发布清单构建 kubernetes 对象:错误 验证“”:验证数据时出错:未设置 apiVersion

这个错误意味着安装命令是从错误的目录执行的或者提供了错误的图表路径。

为了安装它,您必须从放置Chart.yaml 的目录执行,或者在helm install 命令中提供该目录的路径作为参数,例如来自WebApi 目录:

helm install webapi .

【讨论】:

  • 不知道为什么这是答案。如果 helm 从不正确的文件夹运行,则会出错 Error: Chart.yaml file is missing
【解决方案2】:

我遇到了同样的错误信息,但不是完全相同的问题。对我来说,问题似乎是在其中一个 helm 模板开始时的评论。看来helm没有很好地处理这个案子。当我将评论向下移动一点时,它起作用了。

【讨论】:

  • 我确认这也是我的解决方案。否决你的人应该解释自己。
  • helm 也不喜欢我的完整注释文件,删除了注释代码,帮助
  • 确实,我也是这样。我在我的一个模板中有评论
  • 很好的答案,解决了我的问题。我对某些错误消息的糟糕程度印象深刻
【解决方案3】:

我运行helm install anyname1 . --dry-run --debug 并收到难以理解的错误消息。 然后我运行helm template -f values.yaml . > deployChart.yaml 我在生成的文件中看到了一些奇怪的字符。

我的错误:我使用 VS(Visual Studio)在模板内创建了一个附加文件“cronJob.yaml”并添加了我的内容......我认为 helm 不兼容 - 不知何故 - 与 OS-windows 编码......无论如何我希望这会有所帮助。

我的解决方案:我复制了一个现有文件,然后将其重命名,然后粘贴了我的内容。

【讨论】:

    【解决方案4】:

    我在使用 Azure DevSpaces(又使用 helm 进行工作负载部署)时遇到了这个错误。原来我的一些模板文件有 UTF-8 BOM 并且 helm(在 DevSpaces 中)无法处理它,尽管本地安装的 helm 客户端能够很好地解析模板。我删除了 BOM 并解决了 DevSpaces 中的问题。

    【讨论】:

    • 这帮助我解决了这个问题。当我在 notepad++ 中打开受影响的 yaml 文件时,编码设置为 UTF-8 BOM,当我将其改回 UTF-8 时,一切正常。
    【解决方案5】:

    我遇到了同样的问题。我在添加到模板文件夹的 yml 文件之一中缺少来自 apiVersiona。一个错字,但值得检查。

    【讨论】:

      【解决方案6】:

      我有同样的错误信息。但是我的模板生成了损坏的输出。

      我通过运行第一次查看helm template . 来解决此问题,这会生成供审查的输出。问题是---apiVersion: v2 位于生成图表的顶部。三个连字符 --- 不是有意的。

      要解决此问题,请将我生成的图表文件底部的 {{- end -}} 更改为 {{ end }}。这允许在多图表生成的模板上换行。

      【讨论】:

        【解决方案7】:

        在我的例子中,我在模板目录中添加了 .json 文件。
        我跑了helm template -f values.yaml . > deployChart.yaml,发现deployChart.yaml中存在json文件内容。

        将 .json 文件移到模板目录之外解决问题。

        【讨论】:

        • 谢谢,这至少对我来说是正确的答案。
        【解决方案8】:

        对于我的情况,删除模板文件夹中的自述文件解决了问题。

        【讨论】:

          【解决方案9】:

          我包括了一个图书馆图表。 Helm 创建了导致错误的 Chart.lock 文件。

          解决方案: 在图表目录中创建 .helmignore 文件:

          Chart.lock
          

          【讨论】:

            【解决方案10】:

            测试!

            $ helm create k8s-helm
            
            $ helm lint k8s-helm/
            ==> Linting k8s-helm/
            [INFO] Chart.yaml: icon is recommended
            
            1 chart(s) linted, 0 chart(s) failed
            
            $ kubectl apply -f k8s-helm/ --dry-run=client
            error validating "k8s-helm/Chart.yaml": error validating data: kind not set; if you choose to ignore these errors, turn validation off with --validate=false
            error validating "k8s-helm/values.yaml": error validating data: [apiVersion not set, kind not set]; if you choose to ignore these errors, turn validation off with --validate=false
            

            Linter 没有发现任何错误,但验证存在问题。怎么样?

            Helm 发射!

            $ helm install --debug --dry-run test-app k8s-helm/
            

            【讨论】:

            • 嗨,迈克,欢迎来到社区并感谢您的回答。您能否添加更多信息以澄清您的答案,以便更容易理解?
            • 嗨@Rick!你有什么困难?在我的回答中,我证明了在使用 helm 时我们可能会在应用程序的启动选项中出错:部署 helm 模板只能使用 helm 命令,而不是 kubectl。
            • 嘿,我们通常会尝试在解释为什么而不仅仅是如何的裸命令之外添加一些支持信息。您当然不必这样做,但可以使您的回答更好地理解。
            猜你喜欢
            • 2020-10-15
            • 2019-11-13
            • 2020-02-19
            • 2015-12-16
            • 1970-01-01
            • 2020-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多