기본적으로 애플리케이션 (공용) 당 단일 수신을 사용했지만 최근 요구 사항에 따라 일부 앱에 대해서도 (개인) 엔드 포인트를 노출해야합니다. 즉, 다음과 같은 단일 템플릿이 있습니다.
템플릿 / 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 }}
템플릿 / 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 -}}
values.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을 복제하고 잘 작동하지만 여기 내 질문은-각 수신 및 인증서에 대해 단일 템플릿을 사용하고 조건부 리소스를 만드는 방법이 있습니까?
위에서 언급했듯이 일부 앱에는 내부 수신이 필요하고 일부는 필요하지 않습니다. 내가하고 싶은 것은; 공개 인 그레스 / 인증서를 기본값으로, 비공개로 선택 사항으로 만듭니다. 나는 {{- if .Values.ingress.enabled -}}
수신이 필요한지 확인 하는 옵션을 사용하고 있지만 2 개의 다른 파일에 있습니다.
또한 values.yaml 파일에서 두 개의 다른 블록을 갖는 대신 여러 리소스가 필요한 경우 목록을 사용하는 방법이 있습니까?
이 문제에 접근하는 방법에는 몇 가지가 있습니다.
리소스 당 하나의 파일이 있지만 논리가 약간 중복되는 방식은 합리적으로 일반적인 패턴입니다. 어떤 리소스가 생성되고 있는지 정확히 알 수 있으며 관련된 논리가 적습니다. Go 템플릿 언어는 약간 전문화되어 있으므로 프로젝트에서 작업하는 다른 사람들이 더 쉽게 접근 할 수 있습니다.
함께 결합하려면 몇 가지 옵션이 있습니다. @Matt가 주석에서 언급했듯이 YAML ---
문서 구분 기호로 구분되는 한 동일한 파일에 여러 Kubernetes 리소스를 넣을 수 있습니다 .
{{/* ... 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
구조를 사용하여 이러한 모든 항목을 반복 할 수 있습니다 . 이것은 .
특수 변수를 차용 하므로 임의의 다른 것을 참조하는 .Values
경우 현재 값을 저장해야합니다.
{{- $top := . -}}
{{- $ingress := range .Values.ingresses -}}
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ $ingress.name }}
annotations: {{- $ingress.annotations.toYaml | nindent 4 }}
...
{{ end }}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다