【问题标题】:Kubernetes yaml file not working as a helm templateKubernetes yaml 文件不能用作 helm 模板
【发布时间】: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。

标签: kubernetes cron gitlab kubernetes-helm helmfile


【解决方案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

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

【讨论】:

    猜你喜欢
    • 2018-11-08
    • 1970-01-01
    • 2020-05-27
    • 2017-02-22
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2023-02-03
    • 2019-05-29
    相关资源
    最近更新 更多