Несколько ресурсов с использованием одного шаблона HELM - PullRequest
0 голосов
/ 25 марта 2020

Мы использовали один вход для каждого приложения (publi c) по умолчанию, но с недавним требованием нам необходимо предоставить (частную) конечную точку также для некоторых приложений. Это означает, что у нас был один шаблон, который выглядит следующим образом:

templates / ingress.yaml

{{- if .Values.ingress.enabled -}}
{{- $fullName := include "app.fullname" . -}}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ $fullName }}
  labels:
{{ include "app.labels" . | indent 4 }}
  {{- with .Values.ingress.annotations }}
  annotations:
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
{{- if .Values.ingress.tls }}
  tls:
  {{- range .Values.ingress.tls }}
    - hosts:
      {{- range .hosts }}
        - {{ . | quote }}
      {{- end }}
      secretName: {{ .secretName }}
  {{- end }}
{{- end }}
  rules:
  {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
        {{- range .paths }}
          - path: {{ . }}
            backend:
              serviceName: {{ $fullName }}
              servicePort: http
        {{- end }}
  {{- end }}
{{- end }}

templates / cert.yaml

{{- if .Values.ingress.tls -}}
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
  name: {{ .Values.ingress.name }}
  namespace: {{ .Values.ingress.namespace }}
spec:
{{- range .Values.ingress.tls }}
  secretName: {{ .secretName }}
  duration: 24h
  renewBefore: 12h
  issuerRef:
    name: {{ .issuerRef.name }}
    kind: {{ .issuerRef.kind }}
  dnsNames: 
    {{- range .hosts }}
        - {{ . | quote }}
    {{- end }}
{{- end -}}
{{- end -}}

И значения. yaml выглядит так:

ingress:
  enabled: true
  name: apps-ingress
  namespace: app1-namespace
  annotations:
    kubernetes.io/ingress.class: hybrid-external
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
  hosts:
    - host: apps.test.cluster
      paths:
        - /
  tls:
    - secretName: app1-tls
      issuerRef: 
        name: vault-issuer
        kind: ClusterIssuer
      hosts:
        - "apps.test.cluster"

Итак, чтобы приспособить новую настройку. Я добавил следующий блок в файл values.yaml.

ingress-private:
  enabled: true
  name: apps-ingress-private
  namespace: app1-namespace
  annotations:
    kubernetes.io/ingress.class: hybrid-internal
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
  hosts:
    - host: apps.internal.test.cluster
      paths:
        - /
  tls:
    - secretName: app1-tls
      issuerRef: 
        name: vault-issuer
        kind: ClusterIssuer
      hosts:
        - "apps.internal.test.cluster"

И продублировал оба шаблона, т.е. templates / ingress-private.yaml и templates / certs-private.yaml, и работает нормально, но мой вопрос здесь Есть ли способ использовать один шаблон для каждого входа и сертификата и создать условный ресурс?

Как я упоминал выше, некоторые приложения нуждаются во внутреннем входе, а некоторые нет. То, что я хочу сделать, это; сделать publi c ingress / certs по умолчанию и private как необязательное. я использовал опцию {{- if .Values.ingress.enabled -}}, чтобы проверить, требуется ли вход, но в 2 разных файлах.

Кроме того, в файле values.yaml вместо двух разных блоков есть способ использовать список, если несколько ресурсы требуются?

1 Ответ

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

Существует несколько способов решения этой проблемы.

То, как вы сейчас это делаете, с одним файлом на ресурс, но с некоторым дублированием логики c, является достаточно распространенной моделью. Совершенно ясно, какие именно ресурсы создаются, и меньше логики c. Язык шаблонов Go немного специализирован, поэтому он может быть более доступным для других людей, работающих над вашим проектом.

Если вы хотите объединить все вместе, есть несколько вариантов. Как отмечает @Matt в своем комментарии, вы можете поместить несколько ресурсов Kubernetes в один файл, если они разделены разделителем документов YAML ---.

{{/* ... arbitrary templating logic ... */}}
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ $fullName }}
...
{{/* ... more logic ... */}}
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ $fullName }}-private
...

Единственное, что здесь имеет значение, это что выходные данные шаблона являются действительным файлом YAML с несколькими документами. Вы можете использовать команду helm template, чтобы посмотреть, что получится без фактической отправки в кластер.

Этот подход хорошо сочетается с наличием списка правил конфигурации в файле YAML

ingresses:
  - name: apps-ingress
    annotations:
      kubernetes.io/ingress.class: hybrid-external
      nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
  - name: apps-ingress-private
    annotations:
      kubernetes.io/ingress.class: hybrid-internal
      nginx.ingress.kubernetes.io/backend-protocol: "HTTP"

Вы можете использовать Go шаблон range конструкцию для l oop по всем этим. Обратите внимание, что это заимствует специальную переменную ., поэтому, если вы ссылаетесь на произвольные другие вещи в .Values, вам необходимо сохранить текущее значение.

{{- $top := . -}}
{{- $ingress := range .Values.ingresses -}}
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ $ingress.name }}
  annotations: {{- $ingress.annotations.toYaml | nindent 4 }}
...
{{ end }}
...