我有一个简单的 helm chart,它将通过 docker desktop 将应用程序部署到我的本地 kubernetes 副本。如果我使用 kubectl 一次部署一个 yaml 文件,一切正常。但是,当我尝试创建一个 helm chart 以便于部署时,出现以下错误。
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
部署.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 模板开头的评论。看来 helm 没有很好地处理这种情况。当我将评论向下移动一点时它起作用了。
我运行
helm install anyname1 . --dry-run --debug
并收到难以理解的错误消息。
然后我跑helm template -f values.yaml . > deployChart.yaml
我在生成的文件中看到了一些奇怪的字符。
我的错误:我使用 VS(visual studio)在模板中创建了一个附加文件“cronJob.yaml”并添加了我的内容......我认为 helm 与 OS-windows 编码不兼容 - 不知何故 - 无论如何我希望这有帮助。
我的解决方案:我复制了一个现有文件,然后重命名它,然后粘贴我的内容。
在我的例子中,我在模板目录中添加了 .json 文件。
我运行了
helm template -f values.yaml . > deployChart.yaml
,发现json文件内容存在于deployChart.yaml
中。
将 .json 文件移出模板目录可解决问题。
我在使用 Azure DevSpaces(反过来使用 helm 进行工作负载部署)时遇到了这个错误。结果我的一些模板文件有 UTF-8 BOM,helm(在 DevSpaces 中)无法处理它,尽管本地安装的 helm 客户端能够很好地解析模板。我删除了 BOM 并解决了 DevSpaces 中的问题。
对于我的案例,删除模板文件夹中的自述文件解决了问题。
我遇到了同样的问题。我在添加到模板文件夹的 yml 文件之一中缺少
a
中的 apiVersion
。打字错误但值得检查。
我附上了图书馆图表。 Helm 创建了导致错误的 Chart.lock 文件。
解决方案: 使用以下命令在图表目录中创建 .helmignore 文件:
Chart.lock
测试!
$ 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 install --debug --dry-run test-app k8s-helm/
请查看charts->template path下的NOTES.txt文件。 解决方案:文件名区分大小写,不应该以 Notes.txt 的形式提供,大写字母是必须的,因为 helm 将尝试解释该文件并尝试为 kubernetes 生成对象。
所有不是 yaml 清单的模板都应该以
underscore
字符开头
Most files in templates/ are treated as if they contain Kubernetes manifests
The NOTES.txt is one exception
But files whose name begins with an underscore (_) are assumed to not have a manifest inside. These files are not rendered to Kubernetes object definitions, but are available everywhere within other chart templates for use.
https://helm.sh/docs/chart_template_guide/named_templates/#partials-and-_-files
错误:无法从发布清单构建 kubernetes 对象:错误 验证“”:错误验证数据:未设置 apiVersion
此错误表示安装命令是从错误的目录执行的或提供了错误的图表路径。
为了安装它,您必须从
Chart.yaml
所在的目录执行,或者在 helm install
命令中提供该目录的路径作为参数,例如 WebApi
目录:
helm install webapi .