Я хочу предварительно заполнить кластер 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, но я не знаю, как это сделать.
Я сделал воспроизведение на Вашей проблеме и нахожу ответ для этого.
я использовал Ваш 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] информация об Управлении потоком (если, еще если, диапазон) может быть найдена здесь .
Я нашел этот пост очень полезным. Мне нужен немного другой вариант использования, которого я не мог достичь на данный момент.
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
, добавив это в начало :{{- $root :=. -}}
, а затем использовал {{ $root.Release.Namespace }}
Изменить 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 }}
Возможно, что поможет кому-то другому.