複数のサービスの展開に単一のヘルムチャートを使用する
ヘルムとkubernetesは初めてです。
私の現在の要件は、共通のヘルムチャートを使用して複数のサービスをセットアップすることです。
これがシナリオです。
すべてのサービスに共通のDockerイメージがあります
サービスごとに、実行するコマンドが異なります。合計で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 }}
回答
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
私の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}
、あなただけの名前のサービスを持っている場合A
にK
、または{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
フラグの後に期待されます。