【问题标题】:Helm Chart iteratively create pods , Containers , ports , serviceHelm Chart 迭代创建 pods , Containers , ports , service
【发布时间】:2021-04-19 10:50:36
【问题描述】:

我有 4 个微服务,它们都有不同的名称、不同的图像以及不同的容器端口和服务端口,我将这段代码作为堆栈溢出的答案之一,现在这段代码正在做的是创建我的 4 个部署它是名称和图像,但我无法根据它们的端口和资源创建 4 个容器。 我的主要目标是创建一个主模板,我可以在其中放置几个​​值,它可以处理新微服务的新清单,而不是单独使用一堆清单。

deployment.yaml
{{ if .Values.componentTests }}
{{- range .Values.componentTests }}
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ . }}
  labels:
    environment: {{ $.Values.environment }}
    app: {{ . }}
    aadpodidbinding: podid-{{ . }}
    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace "+" "_" }}
    release: {{ $.Release.Name }}
    heritage: {{ $.Release.Service }}
spec:
  replicas: {{ $.Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ . }}
  template:
    metadata:
      labels:
        app: {{ . }}
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
        - name: {{ . }}
          image: mycr.azurecr.io/master/{{ . }}:{{ $.Values.image.tag }}
          imagePullPolicy: {{ $.Values.image.pullPolicy }}
          resources:
            {{- range $.Values.high.resources }}
---
{{- end }}
{{- end }}
{{ end }}
values.yaml

replicaCount: 1

image:
#   repository: nginx
  pullPolicy: IfNotPresent
#   # Overrides the image tag whose default is the chart appVersion.
  tag: "latest"
componentTests:
   - service01
   - service02
   - service03
   - service04
environment: QA
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
services:
   - service01
   - service02
   - service03
# serviceAccount:
#   # Specifies whether a service account should be created
#   create: true
#   # Annotations to add to the service account
#   annotations: {}
#   # The name of the service account to use.
#   # If not set and create is true, a name is generated using the fullname template
#   name: ""

podAnnotations: {}

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

# service:
#   type: ClusterIP
#   port: 80

# ingress:
#   enabled: false
#   annotations: {}
#     # kubernetes.io/ingress.class: nginx
#     # kubernetes.io/tls-acme: "true"
#   hosts:
#     - host: chart-example.local
#       paths: []
#   tls: []
#   #  - secretName: chart-example-tls
#   #    hosts:
#   #      - chart-example.local
high:
  resources: 
    requests:
      cpu: 350m
      memory: 800Mi
    limits:
      cpu: 400m
      memory: 850Mi
medium:
  resources: 
    requests:
      cpu: 200m
      memory: 650Mi
    limits:
      cpu: 250m
      memory: 700Mi
low:
  resources:
    requests:
      cpu: 100m
      memory: 500Mi
    limits:
      cpu: 150m
      memory: 550Mi

autoscaling:
  enabled: false
  minReplicas: 2
  maxReplicas: 4
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

tolerations: []
affinity: {}
output

MANIFEST:
---
# Source: test/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: service01
  labels:
    environment: QA
    app: service01
    aadpodidbinding: podid-service01
    chart: test-0.1.1
    release: api
    heritage: Helm
spec:
  replicas: 1
  selector:
    matchLabels:
      app: service01
  template:
    metadata:
      labels:
        app: service01
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
        - name: service01
          image: mycr.azurecr.io/master/service01:latest
          imagePullPolicy: IfNotPresent
          resources:
---
# Source: test/templates/deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: service02
  labels:
    environment: QA
    app: service02
    aadpodidbinding: podid-service02
    chart: test-0.1.1
    release: api
    heritage: Helm
spec:
  replicas: 1
  selector:
    matchLabels:
      app: service02
  template:
    metadata:
      labels:
        app: service02
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
        - name: service02
          image: mycr.azurecr.io/master/service02:latest
          imagePullPolicy: IfNotPresent
          resources:
---
# Source: test/templates/deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: service02-ui
  labels:
    environment: QA
    app: service02-ui
    aadpodidbinding: podid-service02-ui
    chart: test-0.1.1
    release: api
    heritage: Helm
spec:
  replicas: 1
  selector:
    matchLabels:
      app: service02-ui
  template:
    metadata:
      labels:
        app: service02-ui
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
        - name: service02-ui
          image: mycr.azurecr.io/master/service02-ui:latest
          imagePullPolicy: IfNotPresent
          resources:
---
# Source: test/templates/deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: service03
  labels:
    environment: QA
    app: service03
    aadpodidbinding: podid-service03
    chart: test-0.1.1
    release: api
    heritage: Helm
spec:
  replicas: 1
  selector:
    matchLabels:
      app: service03
  template:
    metadata:
      labels:
        app: service03
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
        - name: service03
          image: mycr.azurecr.io/master/service03:latest
          imagePullPolicy: IfNotPresent
          resources:
---
# Source: test/templates/deployment.yaml
service01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: service01
  labels:
    aadpodidbinding: podid-service01
spec:
  replicas: 1
  selector:
    matchLabels:
      app: service01
  template:
    metadata:
      labels:
        app: service01
        aadpodidbinding: podid-service01
      annotations:
        build: "2020102901"
    spec:
      nodeSelector:
        "beta.kubernetes.io/os": linux
      containers:
      - name: service01
        image: mycr.azurecr.io/master/service01:latest
        resources:
          requests:
            cpu: 250m
            memory: "700Mi"
          limits:
            memory: "700Mi"
        ports:
        - containerPort: 7474
        env:
        - name: KEY_VAULT_ID
          value: "key-vault"
        - name: AZURE_ACCOUNT_NAME
          value: "storage"
        readinessProbe:
          httpGet:
            path: /actuator/health
            port: 7474
            scheme: HTTP
            httpHeaders:
            - name: service-id
              value: root
            - name: request-id
              value: healthcheck
          initialDelaySeconds: 60
          periodSeconds: 30
        livenessProbe:
          httpGet:
            path: /actuator/health
            port: 7474
            scheme: HTTP
            httpHeaders:
            - name: service-id
              value: root
            - name: request-id
              value: healthcheck
          initialDelaySeconds: 60
          periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
  name: service01
spec:
  ports:
  - port: 7474
    name: main
#  - port: 9999
#    name: health
  selector:
    app: service01
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: service01
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: service01
  minReplicas: 1
  maxReplicas: 4
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

【问题讨论】:

  • 您遇到了什么问题?您可以使用相同的技术创建匹配的服务,甚至在同一个循环内;只需记住在每个对象声明之前放置 YAML --- 文档开始标记即可。
  • 你就在这里,但看到我附加的输出我希望我的 service01 容器在端口 8080 和 8081 上,service02 容器应该在 7474 和 7171 我无法做到这三个容器和不同的端口我不知道如何组合

标签: azure kubernetes kubernetes-helm azure-aks


【解决方案1】:

我不知道 Helm 图表是在什么背景下创建的,但据我了解,它用于集成测试或类似的东西。它肯定不是您想要用于您的用例的。你最好使用一个 Helm Chart,它只为一个服务生成清单,然后你就可以为你的所有服务重用该 Chart。这意味着您将使用不同的值执行多个helm install,而不是创建所有服务的helm install。对于这样的大图表,您需要在每次添加新服务时更新图表。

你将拥有:

helm install -f service01-values.yaml ./mychart
helm install -f service02-values.yaml ./mychart
helm install -f service03-values.yaml ./mychart
helm install -f service04-values.yaml ./mychart

而不是:

helm install -f values.yaml ./mychart

为此,您需要稍微更改图表并删除循环{{- range .Values.componentTests }}。学习如何构建图表,你想的更简单:Create Your First Helm Chart

【讨论】:

  • 但是我有 10 个微服务,它们都有不同的容器值、端口等。如果你可以看看我的清单 -service01.yaml 这是其中一个,其余的有点不同,我只想要一个部署.yaml 文件,我在其中配置所有 pod 和容器,它应该相应地自动创建值,而不是有 10 个 service-values.yaml 文件,
  • 我不确定你是否理解 Helm 应该如何使用。目标是在您的 Helm 图表中拥有一个部署文件,然后根据您要部署的服务传递值... service-values.yaml 文件仅包含服务之间不同的值。如果您愿意,它可以是命令参数。 Helm 并不是要通过一个 helm install 来部署所有内容,它是一个模板,您可以使用不同的值重用它。如果您不想重用模板,也许您应该查看kustomize.io 之类的东西,以使用一个命令部署所有内容。
猜你喜欢
  • 2022-01-15
  • 2020-12-09
  • 2018-12-04
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
相关资源
最近更新 更多