Helm Переопределить общие значения шаблона - PullRequest
0 голосов
/ 07 марта 2020

Первый день руля здесь. Попытка понять, как создавать общие шаблоны для ресурсов k8s. Допустим, у меня есть 10 заданий cron в одном графике, все они отличаются только по аргументам и именам. На сегодняшний день существует 10 полных манифестов, и 95% контента манифеста равны. Я хочу переместить общую деталь в шаблон и создать 10 манифестов, в которых я буду указывать конкретные c значения для аргументов и имен.

Поэтому я определил шаблон _cron-job.yaml

    {{- define "common.cron-job"}}
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: {{ include "costing-report.name" . }}-bom-{{ .Values.env }}
  labels:
{{ include "costing-report.labels" . | indent 4 }}
spec:
  schedule: "{{ .Values.cronjob.scheduleBom }}"
  suspend: {{ .Values.cronjob.suspendBom }}
  {{- with .Values.cronjob.concurrencyPolicy }}
  concurrencyPolicy: {{ . }}
  {{- end }}
  {{- with .Values.cronjob.failedJobsHistoryLimit }}
  failedJobsHistoryLimit: {{ . }}
  {{- end }}
  {{- with .Values.cronjob.successfulJobsHistoryLimit }}
  successfulJobsHistoryLimit: {{ . }}
  {{- end }}
  jobTemplate:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "costing-report.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      template:
        spec:
          containers:
            - name: {{ .Chart.Name }}
              image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
              imagePullPolicy: {{ .Values.image.pullPolicy }}
              args: ["--report=Bom","--email={{ .Values.configmap.service.email_bom }}"]
              env:
                - name: spring_profiles_active
                  value: "{{ .Values.env }}"
              envFrom:
                - configMapRef:
                    name: {{ include "costing-report.fullname" . }}
                - secretRef:
                    name: {{ .Values.secrets.properties }}
          restartPolicy: Never
          {{- with .Values.imagePullSecrets }}
          imagePullSecrets:
            {{- toYaml . | nindent 8 }}
          {{- end }}    
{{- end -}}

и теперь мне нужно создать манифест задания, который переопределяет имя и аргументы job1.yaml

{{- template "common.cron-job" . -}}
??? override ???
name: {{ include "cost-report.name" . }}-job1-{{ .Values.env }}
jobTemplate:
spec:
  template:
    spec:
      containers:
        args: ["--report=Bom","--email={{ .Values.configmap.service.email_bom }}"]

Есть ли способ сделать это? Я не нашел это в документах руля. Я нашел это https://github.com/helm/charts/tree/master/incubator/common, но оно не сработало и выдало ошибку.

Спасибо.

1 Ответ

1 голос
/ 09 марта 2020

Решение найдено

Опция 1 Пример использования от helm github https://github.com/helm/charts/tree/master/incubator/common Решение основано на слиянии yaml и переопределении значений. Довольно гибкий, позволяет вам определять общие шаблоны и использовать их для составления окончательного манифеста k8s.

Опция 2 Определение общего шаблона и передача параметров с требуемыми значениями. В моем случае это выглядит следующим образом.

_common.cronjob.yaml

{{- define "common.cronjob" -}}
{{- $root := .root -}} 
{{- $name := .name -}} 
{{- $schedule := .schedule -}} 
{{- $suspend := .suspend -}} 
{{- $args := .args -}} 

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: {{ $name }}
  labels:
{{ include "costing-report.labels" $root | indent 4 }}
spec:
  schedule: {{ $schedule }}
  suspend: {{ $suspend }}
  {{- with $root.Values.cronjob.concurrencyPolicy }}
  concurrencyPolicy: {{ . }}
  {{- end }}
  {{- with $root.Values.cronjob.failedJobsHistoryLimit }}
  failedJobsHistoryLimit: {{ . }}
  {{- end }}
  {{- with $root.Values.cronjob.successfulJobsHistoryLimit }}
  successfulJobsHistoryLimit: {{ . }}
  {{- end }}
  jobTemplate:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "costing-report.name" $root }}
        app.kubernetes.io/instance: {{ $root.Release.Name }}
    spec:
      template:
        spec:
          containers:
            - name: {{ $root.Chart.Name }}
              image: "{{ $root.Values.image.repository }}:{{ $root.Values.image.tag }}"
              imagePullPolicy: {{ $root.Values.image.pullPolicy }}
              args: {{ $args }}
              env:
                - name: spring_profiles_active
                  value: "{{ $root.Values.env }}"
              envFrom:
                - configMapRef:
                    name: {{ include "costing-report.fullname" $root }}
                - secretRef:
                    name: {{ $root.Values.secrets.properties }}
          restartPolicy: Never
          {{- with $root.Values.imagePullSecrets }}
          imagePullSecrets:
            {{- toYaml . | nindent 8 }}
          {{- end }}
{{- end -}}

Затем создайте манифест (ы) задания, определите значения для передачи в общий шаблон

bom-cronjob.yaml

{{ $bucket := (printf "%s%s%s" "\"--bucket=ll-costing-report-" .Values.env "\"," )}}
{{ $email := (printf "%s%s%s" "\"--email=" .Values.configmap.service.email_bom "\"") }}
{{ $args := (list "\"--report=Bom\"," "\"--reportType=load\"," "\"--source=bamboorose\"," $bucket "\"--table=COSTING_BOM\"," "\"--ignoreLines=1\"," "\"--truncate=true\"," $email )}}
{{ $name := (printf "%s%s" "costing-report.name-bom-" .Values.env )}}
{{- template "common.cronjob" (dict "root" . "name" $name "schedule" .Values.cronjob.scheduleBom "suspend" .Values.cronjob.suspendBom "args" $args) -}}

Последняя строка делает свое дело. Хитрость в том, что вы можете передать только один аргумент в шаблон, в моем случае это словарь со всеми значениями, которые мне нужны на стороне шаблона. Вы можете опустить определение переменных шаблона и сразу использовать значения dict. Обратите внимание, что я передаю root context (scope) как "root" и префикс. с "root" в шаблоне.

...