여러 서비스 배포에 단일 helm 차트 사용

Nov 26 2020

나는 helm과 kubernetes를 처음 사용합니다.

내 현재 요구 사항은 공통 helm 차트를 사용하여 여러 서비스 설정을 사용하는 것입니다.

다음은 시나리오입니다.

  1. 모든 서비스에 대한 공통 도커 이미지가 있습니다.

  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 차트를 사용하고 여러 서비스를 배포하려고합니다. 어떻게해야합니까?

다음 명령을 사용 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

최신 정보.

단일 파일에 서비스에 대한 모든 값을 추가하도록 요구 사항이 업데이트되었으므로 다음과 같이 할 수 있습니다.

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 파일의 유일한 차이점은 명령 섹션이기 때문에 모든 것을 루프에서 실행하는 것과 같은 다른 접근 방식이 있습니까? 따라서 다음과 같은 파일에 명령을 포함 할 수 있습니다.> command :>-[ "bash", "-c", "python serviceA.py"]>-[ "bash", "-c", "python serviceB. py "]>-["bash ","-c ","python serviceC.py "] – whoami 20 시간 전

예, 루프에서 모든 것을 실행 하는 매우 간단한 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}from Ato to 라는 이름의 서비스 만 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

그런 다음 다음으로 파이프 ( |symbol)됩니다.

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

곳은 demo-helm-$i에 예를 확장 할 것이다 demo-helm-A그러나 여기에서 중요한 요소이다 -수단이 문자 : 표준 입력 대신에 일반적으로 후 예상되는 파일에서 읽고 읽어 -f플래그.