Uso de gráfico de un solo timón para la implementación de múltiples servicios

Nov 26 2020

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.

  1. Tengo una imagen de Docker común para todos los servicios.

  2. 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.yamlpero solo realiza una implementación para el archivo de valores proporcionado al final.

Aqui esta mi deployment.yamlarchivo

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

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

¿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.yamlarchivo, 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 Aa Ko {1..40}si en lugar de letras prefiere valores numéricos.

El siguiente sedcomando sustituirá el {{COMMAND}}fragmento en su original values/values-service-template.yamlcon 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-$ise expandirá, por ejemplo, a, demo-helm-Apero 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 -fbandera.