在掌舵模板中,我如何使用 1 个列表中的项目来迭代另一个列表

rin*_*ini 2 kubernetes go 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
Run Code Online (Sandbox Code Playgroud)

然后我想遍历命名空间以创建命名空间,例如:

{{- range $namespaces := .Values.namespaces }}
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
---
{{- end }}
Run Code Online (Sandbox Code Playgroud)

在那个循环中,我想要在这个循环中使用另一个循环,用秘密列表中的数据创建每个命名空间的秘密。有点像这样:

{{- range $secrets := .secrets }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ .name }}
  namespace: {{ $namespaces.name }}
type: kubernetes.io/tls
data: $secrets.data
---
{{- end }}
Run Code Online (Sandbox Code Playgroud)

但是如果我将该循环放在命名空间循环中,它只会在所有命名空间的秘密列表中创建所有秘密。我怎样才能让循环只创建命名空间列表中指定的秘密?
我认为可以用 go 模板索引函数来完成,但我不知道如何。

小智 7

我已经复制了您的问题并找到了答案。

你的榜样

我使用你的 yamls 来创建命名空间并更改了第二个命名空间,因此现在它实际上可以工作了。

值.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
Run Code Online (Sandbox Code Playgroud)

模板/命名空间.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 }}
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

我这样做的想法

与其为命名空间创建机密,不如反过来,创建机密并向其添加命名空间。

值.yaml

Secret1:
- namespace1
- namespace2

Secret2:
- namespace2
Run Code Online (Sandbox Code Playgroud)

模板/命名空间.yaml

{{- range $namespaces := .Values.namespaces }}
apiVersion: v1
kind: Namespace
metadata:
  name: {{ $namespaces.name }}
---
{{- end }}
Run Code Online (Sandbox Code Playgroud)

模板/secrets.yaml

{{- 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}}
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

可以在此处找到有关 Flow Control(if,else if,range) 的更多信息。