Kubernetes yaml 文件不能用作 helm 模板

Posted

技术标签:

【中文标题】Kubernetes yaml 文件不能用作 helm 模板【英文标题】:Kubernetes yaml file not working as a helm template 【发布时间】:2021-10-06 03:51:03 【问题描述】:

我知道这是一个重复的问题,但是我没有得到满足我查询的答案。我正在尝试为 cronjob 部署创建一个掌舵图。我将掌舵图名称保留为 cronjob-example。

现在,当我手动运行命令 helm installhelm upgrade 时,我可以安装或更新 cronjob,但是当我尝试从 CICD 管道执行相同操作时,它会在 @987654323 的第 19 行将文件 YAML 转换为 JSON 时出错@文件。

cronjob.yaml 文件。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  namespace:  .Values.metadata.namespace 
  creationTimestamp:  .Values.metadata.creationTimestamp 
  name:  .Values.name 
spec:
  jobTemplate:
    metadata:
      creationTimestamp:  .Values.metadata.creationTimestamp 
      name:  .Values.name 
    spec:
      template:
        metadata:
          creationTimestamp:  .Values.metadata.creationTimestamp 
        spec:
          imagePullSecrets:
            - name:  .Values.image.imagePullSecrets 
          containers:
          - image:  .Values.image.repository 
            name:  .Chart.Name 
            resources: 
          restartPolicy: OnFailure
  schedule: '*/1 * * * *'
status: 

values.yaml 文件

---
metadata:
  namespace: "K8S_NS"

name: "HELM_APP_NAME"
#name: "cronjob-example"

nodeLabel: agent

image:
  repository: "CI_REGISTRY_IMAGE/CI_COMMIT_REF_SLUG:CI_COMMIT_SHA.CI_PIPELINE_IID"
  pullPolicy: "Always"
  imagePullSecrets: git-image-pull-secret-cron
  creationTimestamp: null

variables:
- name: "TLS_ENV"
  value: "tst"

我想知道为什么当我手动运行它时它会成功,以及为什么它通过 CICD 管道失败。除部署阶段外,一切都在 CICD 管道中正常工作。那里失败了。我所做的只是对手动安装/升级时从 cicd 中先前阶段获得的值进行硬编码。

【问题讨论】:

你是如何在你的 values.yml 中填写占位符的?您能否发布一个示例,生成您的 CI 作业的 values.yml 的外观如何? 我为K8S_NS 类似变量设置了gitlab CICD 变量,CI_REGISTRY_IMAGE 类似变量是gitlab 提供的标准变量。我已经有这种用于部署的实现,现在我想实现它 cronjob。 【参考方案1】:

问题是模板中的这个位置。

- image:  .Values.image.repository 

repository: "CI_REGISTRY_IMAGE /CI_COMMIT_REF_SLUG:CI_COMMIT_SHA.CI_PIPELINE_IID" 的替换值导致无效值。

【讨论】:

这些是 gitlab 提供的标准变量。请看看这个 --> docs.gitlab.com/ee/ci/variables/predefined_variables.html @ShaileshSutar 我明白这一点。但是如果没有某种逻辑,这些将不会神奇地填充到您的 values.yml 中。那么您是否设置了一种机制将这些放入您的 values.yaml 中? 谢谢 Lukas 和 Harsh。我弄清楚我的问题是什么。我们在部署中使用 j2 模板。 values.yaml 实际上是一个类似于 values.yaml.j2 的 j2 模板,它执行所有占位符替换。该文件刚刚命名为 values.yaml。我需要那个文件是 values.yaml.j2【参考方案2】:

正如你提到的,第 19 行存在问题

- image:  .Values.image.repository 

您在本地尝试时可能会给出正确的值,并检查在 CI 期间传递了哪些值

repository: "CI_REGISTRY_IMAGE /CI_COMMIT_REF_SLUG:CI_COMMIT_SHA.CI_PIPELINE_IID"

如果你想调试更多你也可以尝试

helm install --dry-run --debughelm template --debug

这是让服务器呈现您的模板,然后返回生成的清单文件的好方法。

【讨论】:

以上是关于Kubernetes yaml 文件不能用作 helm 模板的主要内容,如果未能解决你的问题,请参考以下文章

kubernetes(K8S)集群yaml常见用法

四kubernetes集群YAML文件

Kubernetes - YAML文件解读

Kubernetes之yaml文件详解(汇总-详细)

解读kubernetes集群常用资源yaml文件

Kubernetes 仪表板部署 YAML 文件链接已损坏