Verwenden eines einzelnen Helmdiagramms für die Bereitstellung mehrerer Dienste

Nov 26 2020

Ich bin neu in Helm und Kubernetes.

Meine derzeitige Anforderung besteht darin, mehrere Dienste mithilfe einer gemeinsamen Helmkarte einzurichten.

Hier ist das Szenario.

  1. Ich habe ein gemeinsames Docker-Image für alle Dienste

  2. 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.yamlaber er führt nur eine Bereitstellung für die am Ende bereitgestellte Wertedatei durch.

Hier ist meine deployment.yamlDatei

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

Davy Nov 26 2020 at 22:51
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
mario Nov 27 2020 at 21:48

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.yamlDatei 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 Abis benannt sind , Koder {1..40}wenn Sie anstelle von Buchstaben numerische Werte bevorzugen.

Der folgende sedBefehl ersetzt {{COMMAND}}Fragment in Ihrem ursprünglichen values/values-service-template.yamlmit 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-$iwird zB erweitert, demo-helm-Aaber das Schlüsselelement hier ist -Zeichen, was bedeutet: Lesen von der Standardeingabe statt Lesen aus der Datei, was normalerweise nach dem -fFlag erwartet wird .