Utilisation d'un seul diagramme de barre pour le déploiement de plusieurs services

Nov 26 2020

Je suis nouveau dans la barre et les kubernetes.

Mon exigence actuelle est d'utiliser la configuration de plusieurs services en utilisant un diagramme de barre commun.

Voici le scénario.

  1. J'ai une image docker commune pour tous les services

  2. pour chacun des services, il existe différentes commandes à exécuter. Au total, il y a plus de 40 services.

    Exemple

pipenv run python serviceA.py 
pipenv run python serviceB.py 
pipenv run python serviceC.py  
and so on...

L'état actuel du graphique de barre que j'ai est

demo-helm
|- Chart.yaml
|- templates
   |- deployment.yaml
   |- _helpers.tpl
|- values
   |- values-serviceA.yaml
   |- values-serviceB.yaml
   |- values-serviceC.yaml
    and so on ...

Maintenant, puisque je veux utiliser le même graphique de barre et déployer plusieurs services. Comment dois-je le faire?

J'ai utilisé la commande suivante helm install demo-helm . -f values/values-serviceA.yaml -f values-serviceB.yamlmais cela ne fait qu'un déploiement pour le fichier de valeurs fourni à la fin.

Voici mon deployment.yamldossier

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

Mettre à jour.

Étant donné que mon exigence a été mise à jour pour ajouter toutes les valeurs des services dans un seul fichier, je peux le faire en suivant.

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 }}

et 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

Maintenant, je veux savoir si la configuration suivante fonctionnera avec les changements que je publie ci-dessous pour les deux 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

et 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 }}

Réponses

Davy Nov 26 2020 at 22:51
helm install demo-helm . -f values/values-serviceA.yaml -f values-serviceB.yaml

Lorsque vous avez fait cela, les valeurs de serviceB remplaceront les valeurs de serviceA. Vous devez exécuter la commande séparément avec un nom de version différent comme suit:

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

Y a-t-il une autre approche comme je lance tout en boucle puisque la seule différence dans chacun de mes fichiers values.yaml est la section de commande. Ainsi, je peux inclure la commande dans le même fichier comme ceci> commande:> - ["bash", "-c", "python serviceA.py"]> - ["bash", "-c", "python serviceB. py "]> - [" bash "," -c "," python serviceC.py "] - whoami il y a 20 heures

Oui, vous pouvez écrire un script bash assez simple qui exécutera tout en boucle:

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

Au lieu de command: ["bash", "-c", "python serviceAregion1.py"]dans votre values/values-service-template.yamlfichier, mettez simplement command: {{COMMAND}}car il sera remplacé par la commande exacte à chaque itération de la boucle.

Quant à {A..Z}y mettre tout ce dont vous avez besoin dans votre cas. Cela peut être le {A..K}cas si vous n'avez que des services nommés de Aà Kou {1..40}si, au lieu de lettres, vous préférez des valeurs numériques.

La sedcommande suivante remplacera {{COMMAND}}fragment dans votre original values/values-service-template.yamlpar la commande réelle ["bash", "-c", "python serviceA.py"], par exemple , ["bash", "-c", "python serviceB.py"]et ainsi de suite.

sed "s/{{COMMAND}}/[\"bash\", \"-c\", \"python service$i.py\"]/g" values/values-service-template.yaml

Ensuite, il sera redirigé ( |symbole) vers:

helm install demo-helm-$i . -f -

demo-helm-$isera développé par exemple à demo-helm-Amais l'élément clé ici est le -caractère qui signifie: lire à partir de l'entrée standard au lieu de lire à partir d'un fichier, ce qui est normalement attendu après l' -findicateur.