Как я могу использовать элементы в одном списке для перебора другого списка в шаблоне Helm

Я хочу предварительно заполнить кластер kubernetes пространствами имен и соответствующими секретами для наших приложений и сервисов. Для этого я хотел бы иметь возможность указать 2 списка, 1 список с секретами и 1 список с пространствами имен. Каждое пространство имен в списке содержит список секретов. Как в этом values.yaml:

secrets:
  - name: secret1
    data: key1
  - name: secret2
    data: key2
  - name: secret3
    data: key3

namespaces:
  - name: app1
    secrets:
      - secret1
      - secret2
  - name: app2
    secrets:
      - secret1
      - secret3

Затем я хочу перебрать пространства имен, чтобы создать пространства имен, например:

{{- range $namespaces := .Values.namespaces }}
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
---
{{- end }}

В этом цикле мне нужен еще один цикл внутри этого цикла, который создает секреты для каждого пространства имен с данными из списка секретов. Примерно так:

{{- range $secrets := .secrets }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ .name }}
  namespace: {{ $namespaces.name }}
type: kubernetes.io/tls
data: $secrets.data
---
{{- end }}

Но если я помещаю этот цикл внутрь цикла пространства имен, он просто создает все секреты в списке секретов во всех пространствах имен. Как я могу сделать так, чтобы цикл создавал только секреты, указанные в списке пространств имен?
Я думаю, что это можно сделать с помощью функции индексации шаблона go, но я не знаю, как это сделать.

0
задан 25 November 2019 в 10:06
2 ответа

Я сделал воспроизведение на Вашей проблеме и нахожу ответ для этого.

Ваш пример

я использовал Ваш yamls для создания пространств имен и изменил второе, таким образом, это - на самом деле работа теперь.

Результат values.yaml

secrets:
  - name: secret1
    data: key1
  - name: secret2
    data: key2
  - name: secret3
    data: key3

namespaces:
  - name: app1
    secrets:
      - secret1
      - secret2
  - name: app2
    secrets:
      - secret1
      - secret3

templates/namespaces.yaml

{{- range $namespaces := .Values.namespaces }}
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
---
{{- end }}

{{- range $namespace := .Values.namespaces }}                                                                               
{{- range $secret := $namespace.secrets }}                                                                                  
---                                                                                                                         
apiVersion: v1                                                                                                              
kind: Secret                                                                                                                
metadata:                                                                                                                   
  name: {{ $secret }}                                                                                                       
  namespace: {{ $namespace.name }}                                                                                          
type: kubernetes.io/tls                                                                                                     
data: $secrets.data                                                                                                         
---                                                                                                                         
{{- end }}                                                                                                                  
{{- end }}

:

COMPUTED VALUES:
namespaces:
- name: app1
  secrets:
  - secret1
  - secret2
- name: app2
  secrets:
  - secret1
  - secret3
secrets:
- data: key1
  name: secret1
- data: key2
  name: secret2
- data: key3
  name: secret3

HOOKS:
MANIFEST:

---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: app1
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: app2
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret1
  namespace: app1                  
type: kubernetes.io/tls
data: $secrets.data
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret2
  namespace: app1                  
type: kubernetes.io/tls
data: $secrets.data
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret1
  namespace: app2                  
type: kubernetes.io/tls
data: $secrets.data
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1
kind: Secret
metadata:
  name: secret3
  namespace: app2                  
type: kubernetes.io/tls
data: $secrets.data

Моя идея сделать это

Вместо того, чтобы создать секреты для пространств имен, сделайте это наоборот, создайте секреты и добавьте пространства имен к ним.

Результат values.yaml

Secret1:
- namespace1
- namespace2

Secret2:
- namespace2

templates/namespaces.yaml

{{- range $namespaces := .Values.namespaces }}
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
---
{{- end }}

templates/secrets.ya ml

{{- range .Values.Secret1 }}
---
apiVersion: v1
data:
  password: MWYyZDFlMmU2N2Rm
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: null
  name: secret1
  namespace: {{ . }}
{{- end}}
{{- range .Values.Secret2 }}
---
apiVersion: v1
data:
  password: MWYyZDFlMmU2N2Rm
  username: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: null
  name: secret2
  namespace: {{ . }}
{{- end}}

:

COMPUTED VALUES:
Secret1:
- namespace1
- namespace2
Secret2:
- namespace2
namespaces:
- name: namespace1
- name: namespace2

HOOKS:
MANIFEST:

---
# Source: mychart/templates/namespaces2.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: namespace1
---
# Source: mychart/templates/namespaces2.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: namespace2
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1                                                                                                              
data:                                                                                                                       
  password: UyFCXCpkJHpEc2I=                                                                                                   
  username: ZGV2dXNlcg==                                                                                                      
kind: Secret                                                                                                                
metadata:                                                                                                                   
  creationTimestamp: null                                                                                                   
  name: secret1                                                                                                             
  namespace: namespace2
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1                                                                                                              
data:                                                                                                                       
  password: ZGV2dXNlcg==                                                                                              
  username: UyFCXCpkJHpEc2I=                                                                                                    
kind: Secret                                                                                                                
metadata:                                                                                                                   
  creationTimestamp: null                                                                                                   
  name: secret2                                                                                                             
  namespace: namespace2
---
# Source: mychart/templates/namespaces.yaml
apiVersion: v1                                                                                                              
data:                                                                                                                       
  password: UyFCXCpkJHpEc2I=                                                                                                   
  username: ZGV2dXNlcg==                                                                                                      
kind: Secret                                                                                                                
metadata:                                                                                                                   
  creationTimestamp: null                                                                                                   
  name: secret1                                                                                                             
  namespace: namespace1
[еще 1120] информация об Управлении потоком (если, еще если, диапазон) может быть найдена здесь .

0
ответ дан 4 December 2019 в 23:43

Я нашел этот пост очень полезным. Мне нужен немного другой вариант использования, которого я не мог достичь на данный момент.

Values.yaml

    customCerts:
  - name: test
    secrets:
      tls.crt: |
        -----BEGIN CERTIFICATE-----
        xxxx
        -----END CERTIFICATE-----
      tls.key: |
        -----BEGIN RSA PRIVATE KEY-----
        xxxx
        -----END RSA PRIVATE KEY-----
  - name: test2
    secrets:
      tls.crt: |
        -----BEGIN CERTIFICATE-----
        xxxx
        -----END CERTIFICATE-----
      tls.key: |
        -----BEGIN RSA PRIVATE KEY-----
        xxxx
        -----END RSA PRIVATE KEY-----

Secret.yaml

{{- range $customCerts :=.Values.customCerts }}
---
apiVersion: v1
kind: Secret
metadata:
  name: {{.name }}
  namespace: {{.Release.Namespace }}
stringData:
  {{.secrets  | indent 2 }}
---
{{- end }}

У меня 2 проблемы:

  • .Release.Namespace не работает внутри {{ диапазона }}
  • Мне не удается получить секрет с помощью {{.secrets }}

Изменить:

Я исправил проблему с .Release.Namespace, добавив это в начало :{{- $root :=. -}} , а затем использовал {{ $root.Release.Namespace }}

  • . Но я все еще не мог заполнить секрет с помощью tls.key и tls.crt записи

Изменить 2:

теперь я могу перечислить секреты, но я не могу удалить '|' символ:

values.yaml:

customCerts:
  - name: test
    secrets: |
      tls.crt: |
        -----BEGIN CERTIFICATE-----
        xxxx
        -----END CERTIFICATE-----
      tls.key: |
        -----BEGIN RSA PRIVATE KEY-----
        xxxx
        -----END RSA PRIVATE KEY-----
  - name: test2
    secrets: |
      tls.crt: |
        -----BEGIN CERTIFICATE-----
        xxxx
        -----END CERTIFICATE-----
      tls.key: |
        -----BEGIN RSA PRIVATE KEY-----
        xxxx
        -----END RSA PRIVATE KEY-----

secrets.yaml:

{{- $root :=. -}}
{{- range $customCerts :=.Values.customCerts }}
---
apiVersion: v1
kind: Secret
metadata:
  name: {{.name }}
  namespace: {{ $root.Release.Namespace }}
stringData:
  {{ toYaml.secrets }}
---
{{- end }}

Вывод:

# Source: ciam-app/templates/secretsCustomCerts.yaml
apiVersion: v1
kind: Secret
metadata:
  name: test
  namespace: qbel1-ciam
stringData:
  |
  tls.crt: |
    -----BEGIN CERTIFICATE-----
    xxxx
    -----END CERTIFICATE-----
  tls.key: |
    -----BEGIN RSA PRIVATE KEY-----
    xxxx
    -----END RSA PRIVATE KEY-----
---
# Source: ciam-app/templates/secretsCustomCerts.yaml
---
apiVersion: v1
kind: Secret
metadata:
  name: test2
  namespace: qbel1-ciam
stringData:
  |
  tls.crt: |
    -----BEGIN CERTIFICATE-----
    xxxx
    -----END CERTIFICATE-----
  tls.key: |
    -----BEGIN RSA PRIVATE KEY-----
    xxxx
    -----END RSA PRIVATE KEY-----

Я не могу избавиться от |послеstringData

Редактировать 3:

Наконец-то я нашел способ:

  {{ toYaml.secrets | trimPrefix "|" | trim }}

Возможно, что поможет кому-то другому.

0
ответ дан 28 October 2021 в 08:40

Теги

Похожие вопросы