首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用单舵图部署多个服务

使用单舵图部署多个服务
EN

Stack Overflow用户
提问于 2020-11-26 14:57:07
回答 3查看 8.9K关注 0票数 9

我是新来的掌舵者和库伯内特斯。

我目前的要求是使用通用舵机图表安装多个服务。

这是一个场景。

  1. 我对所有服务都有一个共同的码头形象。
  2. 对于每个服务,有不同的命令要运行。总共有40多个服务. 示例

运行python serviceA.py pipenv运行python serviceB.py pipenv运行python serviceC.py等等。

我所拥有的舵图的当前状态是

代码语言:javascript
复制
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文件

代码语言:javascript
复制
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

代码语言:javascript
复制
{{- 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

代码语言:javascript
复制
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的更改

代码语言:javascript
复制
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

代码语言:javascript
复制
{{- 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 }}
EN

回答 3

Stack Overflow用户

发布于 2022-08-29 07:28:11

我可以建议你尝试一种基于地狱文件的方法。我更喜欢三档的方法。你需要的是:

  • YAML :包含您可能需要用于创建和配置命名空间等的YAML指令。
  • helmfile-backend.yaml:包含需要部署的所有版本(service1,service2 .)
  • helmfile.yaml:指向上述文件的路径(helmfile-init,helmfile-后端YAML文件)
  • 部署规范文件(app_name.json):一个规范文件,包含有关发行版的所有信息(版本名称、命名空间、头盔图表版本、应用程序版本等)。

Helmfile使我的生活在部署多个应用程序时有点轻松。我将在几分钟内用几个例子编辑这个答案。

同时,如果您可以访问机器上的Github,您可以参考官方文档这里蓝皮书

票数 2
EN

Stack Overflow用户

发布于 2020-11-26 15:51:22

代码语言:javascript
复制
helm install demo-helm . -f values/values-serviceA.yaml -f values-serviceB.yaml

当您这样做时,serviceB值将覆盖serviceA值。您需要使用不同的发行版名称单独运行该命令,如下所示:

代码语言:javascript
复制
helm install demo-helm-A . -f values/values-serviceA.yaml
helm install demo-helm-B . -f values/values-serviceB.yaml
票数 0
EN

Stack Overflow用户

发布于 2020-11-27 14:48:10

还有其他方法像我一样在循环中运行所有东西吗?因为每个values.yaml文件中唯一的区别是命令部分。因此,我可以在这个>命令的文件中包含命令:>- "bash“、"-c”、"python serviceA.py“>-- "bash”、"-c“、"python serviceB.py”>-- "bash“、"-c”、"python serviceC.py“-- 20小时前

是的,您可以编写一个相当简单的bash脚本,它将在一个循环中运行所有内容:

代码语言:javascript
复制
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"]文件中放置command: {{COMMAND}},因为它将在循环的每一次迭代中被确切的命令所替代。

至于{A..Z},把你需要的东西放在你的箱子里。如果只有从AK{1..40}命名的服务,而不是字母,则可能是K

下面的sed命令将用实际的命令替换原始values/values-service-template.yaml中的{{COMMAND}}片段,例如["bash", "-c", "python serviceA.py"]["bash", "-c", "python serviceB.py"]等。

代码语言:javascript
复制
sed "s/{{COMMAND}}/[\"bash\", \"-c\", \"python service$i.py\"]/g" values/values-service-template.yaml

然后它将被管道化( |符号)到:

代码语言:javascript
复制
helm install demo-helm-$i . -f -

其中demo-helm-$i将被扩展到demo-helm-A,但是这里的关键元素是-字符,意思是:从标准输入读取,而不是从文件读取,这通常是在-f标志之后预期的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65024441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档