Uso de gráfico de un solo timón para la implementación de múltiples servicios
Soy nuevo en timón y kubernetes.
Mi requisito actual es utilizar la configuración de varios servicios utilizando un gráfico de timón común.
Aquí está el escenario.
Tengo una imagen de Docker común para todos los servicios.
para cada uno de los servicios hay diferentes comandos para ejecutar. En total hay más de 40 servicios.
Ejemplo
pipenv run python serviceA.py pipenv run python serviceB.py pipenv run python serviceC.py and so on...
El estado actual del gráfico de timón que tengo es
demo-helm
|- Chart.yaml
|- templates
|- deployment.yaml
|- _helpers.tpl
|- values
|- values-serviceA.yaml
|- values-serviceB.yaml
|- values-serviceC.yaml
and so on ...
Ahora, dado que quiero usar el mismo gráfico de timón e implementar varios servicios. ¿Cómo debería hacerlo?
Usé el siguiente comando, helm install demo-helm . -f values/values-serviceA.yaml -f values-serviceB.yaml
pero solo realiza una implementación para el archivo de valores proporcionado al final.
Aqui esta mi deployment.yaml
archivo
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
Actualizar.
Dado que mi requisito se ha actualizado para agregar todos los valores de los servicios en un solo archivo, puedo hacerlo siguiendo.
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 }}
y 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
Ahora quiero saber si la siguiente configuración funcionará con los cambios que publico a continuación para ambos 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
y 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 }}
Respuestas
helm install demo-helm . -f values/values-serviceA.yaml -f values-serviceB.yaml
Cuando hizo esto, los valores de serviceB anularán los valores de serviceA. Debe ejecutar el comando por separado con un nombre de versión diferente de la siguiente manera:
helm install demo-helm-A . -f values/values-serviceA.yaml
helm install demo-helm-B . -f values/values-serviceB.yaml
¿Existe algún otro enfoque como si ejecuto todo en un bucle, ya que la única diferencia en cada uno de mis archivos values.yaml es la sección de comandos? Entonces, puedo incluir un comando en el mismo archivo como este> comando:> - ["bash", "-c", "python serviceA.py"]> - ["bash", "-c", "python serviceB. py "]> - [" bash "," -c "," python serviceC.py "] - whoami hace 20 horas
Sí, puede escribir un script bash bastante simple que ejecutará todo en un bucle:
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
En lugar de command: ["bash", "-c", "python serviceAregion1.py"]
en su values/values-service-template.yaml
archivo, simplemente póngalo command: {{COMMAND}}
como será sustituido por el comando exacto con cada iteración del ciclo.
Como para {A..Z}
poner ahí lo que necesites en tu caso. Podría ser {A..K}
si solo tiene servicios nombrados de A
a K
o {1..40}
si en lugar de letras prefiere valores numéricos.
El siguiente sed
comando sustituirá el {{COMMAND}}
fragmento en su original values/values-service-template.yaml
con el comando real ["bash", "-c", "python serviceA.py"]
, por ejemplo , ["bash", "-c", "python serviceB.py"]
y así sucesivamente.
sed "s/{{COMMAND}}/[\"bash\", \"-c\", \"python service$i.py\"]/g" values/values-service-template.yaml
Luego se canalizará ( |
símbolo) a:
helm install demo-helm-$i . -f -
donde demo-helm-$i
se expandirá, por ejemplo, a, demo-helm-A
pero el elemento clave aquí es -
carácter, lo que significa: leer desde la entrada estándar en lugar de leer desde el archivo, que normalmente se espera después de la -f
bandera.