複数のサービスの展開に単一のヘルムチャートを使用する

Nov 26 2020

ヘルムとkubernetesは初めてです。

私の現在の要件は、共通のヘルムチャートを使用して複数のサービスをセットアップすることです。

これがシナリオです。

  1. すべてのサービスに共通のDockerイメージがあります

  2. サービスごとに、実行するコマンドが異なります。合計で40以上のサービスがあります。

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

私が持っているヘルムチャートの現状は

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

さて、同じヘルムチャートを使用して複数のサービスをデプロイしたいので。どうすればいいですか?

次のコマンドを使用helm install demo-helm . -f values/values-serviceA.yaml -f values-serviceB.yamlしましたが、最後に提供された値ファイルの展開のみを実行します。

これが私のdeployment.yamlファイルです

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

更新。

サービスのすべての値を1つのファイルに追加するように要件が更新されたので、次の方法でそれを行うことができます。

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

そして 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

次の構成は、両方について以下に投稿する変更で機能するかどうかを知りたいです。 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

そして 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 }}

回答

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

このようにした場合、serviceB値はserviceA値をオーバーライドします。次のように、異なるリリース名でコマンドを個別に実行する必要があります。

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

私のvalues.yamlファイルのそれぞれの唯一の違いはコマンドセクションであるため、すべてをループで実行するような他のアプローチはありますか?したがって、次のように同じファイルにコマンドを含めることができます>コマンド:>-["bash"、 "-c"、 "python serviceA.py"]>-["bash"、 "-c"、 "pythonserviceB。 py "]>-[" bash "、" -c "、" python serviceC.py "] – whoami20時間前

はい、すべてをループで実行する非常に単純なbashスクリプトを作成できます。

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

代わりにcommand: ["bash", "-c", "python serviceAregion1.py"]、あなたの中values/values-service-template.yamlのファイルだけ入れてcommand: {{COMMAND}}、それがループの各反復で正確なコマンドに置換されるように。

{A..Z}あなたがあなたの場合に必要なものは何でもそこに置くことに関して。それはあるかもしれない{A..K}、あなただけの名前のサービスを持っている場合AK、または{1..40}代わりに文字の場合は、数値を好みます。

sedのコマンドは置き換えられます{{COMMAND}}、あなたの元にフラグメントをvalues/values-service-template.yaml実際のコマンドなどで["bash", "-c", "python serviceA.py"]["bash", "-c", "python serviceB.py"]というように。

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

次に、次の場所にパイプされます(|シンボル)。

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

ここdemo-helm-$iで展開されますdemo-helm-Aが、ここでの重要な要素は-文字です。つまり、ファイルから読み取るのではなく、標準入力から読み取るということです。これは通常、-fフラグの後に期待されます。