Utilisation d'un seul diagramme de barre pour le déploiement de plusieurs services
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.
J'ai une image docker commune pour tous les services
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.yaml
mais cela ne fait qu'un déploiement pour le fichier de valeurs fourni à la fin.
Voici mon deployment.yaml
dossier
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
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
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.yaml
fichier, 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
à K
ou {1..40}
si, au lieu de lettres, vous préférez des valeurs numériques.
La sed
commande suivante remplacera {{COMMAND}}
fragment dans votre original values/values-service-template.yaml
par 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 -
où demo-helm-$i
sera développé par exemple à demo-helm-A
mais 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' -f
indicateur.