Das Installieren und Verwalten von Helmdiagrammen kann zu Komplikationen führen, auf die Sie zuvor möglicherweise noch nicht gestoßen sind.
Helm Charts verpackt Anwendungen fĂĽr die Installation in Kubernetes-Clustern. Das Installieren von Helm Chart ist ein bisschen wie das Starten
, daher haben Helm Chart-Entwickler einige der gleichen Probleme wie Entwickler, die Installateure erstellen:
- Welche Annahmen können Sie über die Umgebung treffen, in der Sie installieren?
- Kann die App mit anderen Apps interagieren?
- Welche Konfigurationen sollten dem Benutzer zur VerfĂĽgung stehen und wie sollten sie angeboten werden?
Diese Fragen beziehen sich jedoch auf die Besonderheiten von Helm. Um zu verstehen, warum, beginnen wir mit einem Bild davon, was passiert, wenn der Benutzer startet helm install
. Wir können uns dann ansehen, wie einige der offiziellen Kubernetes-Diagramme diese Probleme angehen .
Bild startenhelm install
Ich möchte MySQL auf meinem Cluster installieren. Ich benötige jedoch nicht die Version von MySQL, stable/MySQL
die in der Datei values.yaml im offiziellen Diagramm-Repository installiert wird . Also, ich meine eigene Datei erstellen values.yaml
namens mysql-values.yaml
mit nur einer Zeile:
imageTag: “5.7.10”
Dann renne ich helm install stable/mysql --values=mysqlvalues.yaml
.
Helm (ignorant-camel
), MySQL . kubectl describe pod ignorant-camel-mysql-5dc6b947b-lf6p8
, imageTag
.
, , imageTag . helm install stabe/mysql --values=mysqlvalues.yaml --dry-run --debug
, Helm Kubernetes, .
Kubernetes , Helm Chart:
├── Chart.yaml ├── README.md ├── templates │ ├── NOTES.txt │ ├── _helpers.tpl │ ├── deployment.yaml │ ├── secrets.yaml │ └── ...more yaml... └── values.yaml
helm install stable/mysql
, values.yaml
Helm (, ) yaml , Kubernetes. helm install stable/mysql
, . , .
, values.yaml
— , , . , values.yaml
, , .
values.yaml
. , , . requirements.yaml
, , . , values.yaml
. , c Helm.
, ,
. , , — Helm Charts.
Helm
, Kubernetes . Helm Chart , , :
• , values.yaml
? , , , ?
• , , , ?
• , , (, )?
• , ?
, Helm Charts. , , , .
, , . Helm, . Helm , . .
, . , , , Helm 3 Lua. .
1.
, env, values.yaml
:
- name: ENV_VAR1 value: {{ .Values.var1 }} - name: ENV_VAR2 value: {{ .Values.var2 }}
values.yaml
--set var1=foo
. , ? , , (, ENV_VAR1
var1
)? , . , , ?
Helm Charts, configmap
. / . configmap, unbound.conf. , . configmap
, :
{{- range .Values.localRecords }} local-data: "{{ .name }} A {{ .ip }}" local-data-ptr: "{{ .ip }} {{ .name }}" {{- end }}
values.yaml localRecords
, :
localRecords: - name: "fake3.host.net" ip: "10.12.10.10" - name: "fake4.host.net" ip: "10.13.10.10"
Sonarqube chart , extraEnv
:
{{- range $key, $value := .Values.extraEnv }} — name: {{ $key }} value: {{ $value }} {{- end }}
values.yaml
, :
extraEnv: - ENV_VAR1: var1 - ENV_VAR2: var2
extraEnv
, . Buildkite , . values.yaml
:
{{- if .Values.extraEnv }} {{ toYaml .Values.extraEnv | indent 12 }} {{- end }}
, , , extraEnv
values.yaml
, (
) (
) , :
extraEnv: — name: ENV_VAR1 value: "var1" — name: ENV_VAR2 value: "var2"
Keycloak :
{{- with .Values.keycloak.extraEnv }} {{ tpl . $ | indent 12 }} {{- end }}
, extraEnv
, tpl
, , . , , :
extraEnv: | — name: KEYCLOAK_LOGLEVEL value: DEBUG — name: HOSTNAME value: {{ .Release.Name }}-keycloak
{{ .Release.Name }}
values.yaml
, , tpl
. , , , ( ). , values.yaml
, .
2.
, Helm, , ( ) . , , .
, , — . , Xray Postgres. , Postgres ( , , ):
{{- if .Values.postgresql.enabled }} — name: POSTGRES_USER value: {{ .Values.postgresql.postgresUser }} — name: POSTGRESS_PASSWORD valueFrom: secretKeyRef: name: {{ .Release.Name }}-postgresql key: postgres-password — name: POSTGRESS_DB value: {{ .Values.postgresql.postgresDatabase }} {{- else }} ...
Xray
, , Postgres. , , ? . ?
extraEnv
, Keycloak. extraEnv
, Postgres, . values.yaml
:
extraEnv: | — name: POSTGRES_USER value: {{ .Values.postgresql.postgresUser }} — name: POSTGRESS_PASSWORD valueFrom: secretKeyRef: name: {{ .Release.Name }}-postgresql key: postgres-password — name: POSTGRESS_DB value: {{ .Values.postgresql.postgresDatabase }}
|
, , tpl
.
, , configmap. — .Files.Get
. , values.yaml, , . , .Files.Get tpl. configmap , :
conf_file1: {{ tpl (.Files.Get "files/conf_file1") . | quote }}
Secret base64:
conf_file1: {{ tpl (.Files.Get "files/conf_file1") . | b64enc | quote }}
{{ (tpl (.Files.Glob "files/*").AsConfig . ) | indent 2 }}
AsSecret
, tpl
. , Glob Get :
{{ range $path, $bytes := .Files.Glob "files/*" }} {{ base $path }}: '{{ tpl ($root.Files.Get $path) . | b64enc }}' {{ end }}
3. -
extraEnv
Keycloak
, , , . , Keycloak Keycloak
, JSON
, Keycloak
. , extraVolumes
:
{{- with .Values.keycloak.extraVolumes }} {{ tpl . $ | indent 8 }} {{- end }}
extraVolumeMounts
:
volumeMounts: - name: scripts mountPath: /scripts {{- with .Values.keycloak.extraVolumeMounts }} {{ tpl . $ | indent 12 }} {{- end }}
extraVolumes: | — name: custom-secret secret: secretName: custom-secret extraVolumeMounts: | - name: custom-secret mountPath: "/realm/" readOnly: true
(volumes) volumeMounts
values.yaml
. , , initContainers
( sidecars
). , , .
Keycloak , preStartScript, :
{{- with .Values.keycloak.preStartScript }} echo 'Running custom pre-start script...' {{ . | indent 4 }} {{- end }}
, , .Values.keycloak.preStartScript
values.yaml
. , , .
4.
Helm, helm create
, (Service), Ingress. Ingress. , . , RabbitMQ, , Ingress :
{{- if .Values.ingress.enabled }} ... {{-end}
, RabbitMQ , (host-based):
rules: {{- if .Values.ingress.hostName }} - host: {{ .Values.ingress.hostName }} http: {{- else }} - http: {{- end }}
RabbitMQ ( else ). , (, RabbitMQ , ):
- path: {{ default "/" .path }} backend: serviceName: {{ template "rabbitmq.fullname" . }} servicePort: {{ .Values.rabbitmq.managerPort }}
, , .
{{- with .Values.ingress.annotations }} annotations: {{ toYaml . | indent 4 }} {{- end }}
values.yaml
, :
annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /
, .yaml , , . , , , . , NGINX :
annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/configuration-snippet: | more_set_headers 'Access-Control-Allow-Origin: $http_origin';
Art of the Helm Chart
Helm Chart , . , , . . , , , .
Es gibt andere Themen, die wir nicht behandelt haben, wie z. B. Tests und Sicherheit. Es war nur ein Blick auf ein bestimmtes Stück der offiziellen Charts. Ich habe versucht, mich auf Muster zu konzentrieren, die ich besonders nützlich finde, um Benutzer dazu zu bringen, mit Ihren Diagrammen das zu tun, was sie wollen. Die offiziellen Kubernetes-Diagramme waren für mich bei der Arbeit an den Helm-Diagrammen für das Aktivitätsprojekt äußerst hilfreich . Hoffentlich hilft die Erklärung in diesem Beitrag anderen, in das offizielle Repo einzutauchen und sich von seinen Charts inspirieren zu lassen.