Verwenden eines einzelnen Helmdiagramms für die Bereitstellung mehrerer Dienste
Ich bin neu in Helm und Kubernetes.
Meine derzeitige Anforderung besteht darin, mehrere Dienste mithilfe einer gemeinsamen Helmkarte einzurichten.
Hier ist das Szenario.
Ich habe ein gemeinsames Docker-Image für alle Dienste
Für jeden der Dienste müssen unterschiedliche Befehle ausgeführt werden. Insgesamt gibt es mehr als 40 Dienste.
Beispiel
pipenv run python serviceA.py pipenv run python serviceB.py pipenv run python serviceC.py and so on...
Der aktuelle Status der Steuerkarte, die ich habe, ist
demo-helm
|- Chart.yaml
|- templates
|- deployment.yaml
|- _helpers.tpl
|- values
|- values-serviceA.yaml
|- values-serviceB.yaml
|- values-serviceC.yaml
and so on ...
Jetzt, da ich das gleiche Helmdiagramm verwenden und mehrere Dienste bereitstellen möchte. Wie soll ich das machen
Ich habe den folgenden Befehl verwendet, helm install demo-helm . -f values/values-serviceA.yaml -f values-serviceB.yaml
aber er führt nur eine Bereitstellung für die am Ende bereitgestellte Wertedatei durch.
Hier ist meine deployment.yaml
Datei
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "helm.fullname" . }}
labels:
{{- include "helm.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "helm.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "helm.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
command: {{- toYaml .Values.command |nindent 12}}
resources:
{{- toYaml .Values.resources | nindent 12 }}
volumeMounts:
- name: secrets
mountPath: "/usr/src/app/config.ini"
subPath: config.ini
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
volumes:
- name: secrets
secret:
secretName: sample-application
defaultMode: 0400
Aktualisieren.
Da meine Anforderung aktualisiert wurde, um alle Werte für Dienste in einer einzigen Datei hinzuzufügen, kann ich dies folgendermaßen tun.
deployment.yaml
{{- range $service, $val := .Values.services }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ $service }} labels: app: {{ .nameOverride }} spec: replicas: {{ .replicaCount }} selector: matchLabels: app: {{ .nameOverride }} template: metadata: labels: app: {{ .nameOverride }} spec: imagePullSecrets: - name: aws-ecr containers: - name: {{ $service }}
image: "image-latest-v3"
imagePullPolicy: IfNotPresent
command: {{- toYaml .command |nindent 12}}
resources:
{{- toYaml .resources | nindent 12 }}
volumeMounts:
- name: secrets
mountPath: "/usr/src/app/config.ini"
subPath: config.ini
volumes:
- name: secrets
secret:
secretName: {{ .secrets }}
defaultMode: 0400
{{- end }}
und values.yaml
services:
#Services for region1
serviceA-region1:
nameOverride: "serviceA-region1"
fullnameOverride: "serviceA-region1"
command: ["bash", "-c", "python serviceAregion1.py"]
secrets: vader-search-region2
resources: {}
replicaCount: 5
#Services for region2
serviceA-region2:
nameOverride: "serviceA-region2"
fullnameOverride: "serviceA-region2"
command: ["bash", "-c", "python serviceAregion2.py"]
secrets: vader-search-region2
resources: {}
replicaCount: 5
Jetzt möchte ich wissen, ob die folgende Konfiguration mit den Änderungen funktioniert, die ich unten für beide veröffentliche values.yaml
services:
region:
#Services for region1
serviceA-region1:
nameOverride: "serviceA-region1"
fullnameOverride: "serviceA-region1"
command: ["bash", "-c", "python serviceAregion1.py"]
secrets: vader-search-region2
resources: {}
replicaCount: 5
region:2
#Services for region2
serviceA-region2:
nameOverride: "serviceA-region2"
fullnameOverride: "serviceA-region2"
command: ["bash", "-c", "python serviceAregion2.py"]
secrets: vader-search-region2
resources: {}
replicaCount: 5
und deployment.yaml
{{- range $region, $val := .Values.services.region }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ $region }}-{{ .nameOverride }} labels: app: {{ .nameOverride }} spec: replicas: {{ .replicaCount }} selector: matchLabels: app: {{ .nameOverride }} template: metadata: labels: app: {{ .nameOverride }} spec: imagePullSecrets: - name: aws-ecr containers: - name: {{ $region }}-{{ .nameOverride }}
image: "image-latest-v3"
imagePullPolicy: IfNotPresent
command: {{- toYaml .command |nindent 12}}
resources:
{{- toYaml .resources | nindent 12 }}
volumeMounts:
- name: secrets
mountPath: "/usr/src/app/config.ini"
subPath: config.ini
volumes:
- name: secrets
secret:
secretName: {{ .secrets }}
defaultMode: 0400
{{- end }}
Antworten
helm install demo-helm . -f values/values-serviceA.yaml -f values-serviceB.yaml
Wenn Ihnen dies gefallen hat, überschreiben die serviceB-Werte die serviceA-Werte. Sie müssen den Befehl wie folgt separat mit einem anderen Versionsnamen ausführen:
helm install demo-helm-A . -f values/values-serviceA.yaml
helm install demo-helm-B . -f values/values-serviceB.yaml
Gibt es einen anderen Ansatz, bei dem ich alles in einer Schleife ausführe, da der einzige Unterschied in jeder meiner Datei values.yaml der Befehlsabschnitt ist? Daher kann ich einen Befehl in dieselbe Datei wie diesen> Befehl aufnehmen:> - ["bash", "-c", "python serviceA.py"]> - ["bash", "-c", "python serviceB". py "]> - [" bash "," -c "," python serviceC.py "] - whoami vor 20 Stunden
Ja, Sie können ein ziemlich einfaches Bash- Skript schreiben, das alles in einer Schleife ausführt:
for i in {A..Z}; do sed "s/{{COMMAND}}/[\"bash\", \"-c\", \"python service$i.py\"]/g" values/values-service-template.yaml | helm install demo-helm-$i . -f - ; done
Anstatt command: ["bash", "-c", "python serviceAregion1.py"]
in Ihre values/values-service-template.yaml
Datei zu setzen command: {{COMMAND}}
, wird sie bei jeder Iteration der Schleife durch den genauen Befehl ersetzt.
{A..Z}
Um dort alles zu platzieren , was Sie in Ihrem Fall brauchen. Dies kann der Fall sein, {A..K}
wenn Sie nur Dienste haben, die von A
bis benannt sind , K
oder {1..40}
wenn Sie anstelle von Buchstaben numerische Werte bevorzugen.
Der folgende sed
Befehl ersetzt {{COMMAND}}
Fragment in Ihrem ursprünglichen values/values-service-template.yaml
mit dem eigentlichen Befehl zB ["bash", "-c", "python serviceA.py"]
, ["bash", "-c", "python serviceB.py"]
und so weiter.
sed "s/{{COMMAND}}/[\"bash\", \"-c\", \"python service$i.py\"]/g" values/values-service-template.yaml
Dann wird es weitergeleitet ( |
Symbol) an:
helm install demo-helm-$i . -f -
wo demo-helm-$i
wird zB erweitert, demo-helm-A
aber das Schlüsselelement hier ist -
Zeichen, was bedeutet: Lesen von der Standardeingabe statt Lesen aus der Datei, was normalerweise nach dem -f
Flag erwartet wird .