Korzystanie z wykresu z jednym sterem do wdrażania wielu usług
Jestem nowy w Helm i Kubernetes.
Moim obecnym wymaganiem jest skorzystanie z konfiguracji wielu usług przy użyciu wspólnego wykresu steru.
Oto scenariusz.
Mam wspólny obraz Dockera dla wszystkich usług
dla każdej usługi istnieją różne polecenia do uruchomienia. W sumie istnieje ponad 40 usług.
Przykład
pipenv run python serviceA.py pipenv run python serviceB.py pipenv run python serviceC.py and so on...
Aktualny stan wykresu steru jaki posiadam to
demo-helm
|- Chart.yaml
|- templates
|- deployment.yaml
|- _helpers.tpl
|- values
|- values-serviceA.yaml
|- values-serviceB.yaml
|- values-serviceC.yaml
and so on ...
Teraz, ponieważ chcę używać tego samego schematu steru i wdrażać wiele usług. Jak mam to zrobić?
Użyłem następującego polecenia, helm install demo-helm . -f values/values-serviceA.yaml -f values-serviceB.yaml
ale wdraża ono tylko plik wartości podany na końcu.
Oto moja deployment.yaml
teczka
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
Aktualizacja.
Ponieważ moje wymaganie zostało zaktualizowane, aby dodać wszystkie wartości usług w jednym pliku, mogę to zrobić, wykonując następujące czynności.
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 }}
i 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
Teraz chcę wiedzieć, czy następująca konfiguracja będzie działać ze zmianami, które publikuję poniżej, dla obu 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
i 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 }}
Odpowiedzi
helm install demo-helm . -f values/values-serviceA.yaml -f values-serviceB.yaml
W takim przypadku wartości serviceB zastąpią wartości serviceA. Musisz uruchomić polecenie osobno z inną nazwą wersji w następujący sposób:
helm install demo-helm-A . -f values/values-serviceA.yaml
helm install demo-helm-B . -f values/values-serviceB.yaml
Czy jest jakieś inne podejście, takie jak uruchamianie wszystkiego w pętli, ponieważ jedyną różnicą w każdym z moich plików values.yaml jest sekcja poleceń. Mogę więc dołączyć polecenie do tego samego pliku, jak ten> polecenie:> - ["bash", "-c", "python serviceA.py"]> - ["bash", "-c", "python serviceB. py "]> - [" bash "," -c "," python serviceC.py "] - whoami 20 godzin temu
Tak, możesz napisać dość prosty skrypt bash, który będzie uruchamiał wszystko w pętli:
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
Zamiast command: ["bash", "-c", "python serviceAregion1.py"]
w swoim values/values-service-template.yaml
pliku po prostu wstaw command: {{COMMAND}}
je jako będzie zastępowane dokładną komendą przy każdej iteracji pętli.
Jak {A..Z}
umieścić tam wszystko, czego potrzebujesz w swoim przypadku. Może tak być, {A..K}
jeśli masz tylko usługi nazwane od A
do K
lub {1..40}
jeśli zamiast liter preferujesz wartości liczbowe.
Poniższa sed
komenda będzie zastąpić {{COMMAND}}
fragment w oryginalnej values/values-service-template.yaml
z rzeczywistą polecenia np ["bash", "-c", "python serviceA.py"]
, ["bash", "-c", "python serviceB.py"]
i tak dalej.
sed "s/{{COMMAND}}/[\"bash\", \"-c\", \"python service$i.py\"]/g" values/values-service-template.yaml
Następnie zostanie wyprowadzony ( |
symbol) do:
helm install demo-helm-$i . -f -
gdzie demo-helm-$i
zostanie rozwinięty np. do, demo-helm-A
ale kluczowym elementem jest tutaj -
znak, co oznacza: odczyt ze standardowego wejścia zamiast odczytu z pliku, czego normalnie oczekuje się po -f
fladze.