推送 docker 镜像和安装 helm 镜像的区别

Difference between pushing a docker image and installing helm image

我需要学习一个 CI 管道,其中有一个步骤用于使用 Docker 文件构建和推送图像,另一个步骤用于创建舵图图像,其中有一个docker 文件创建的图像的定义。在那之后,有一个 CD 管道,其中安装了仅由 helm chart 创建的内容。

直接用Docker文件创建的镜像和helm chart创建的镜像有什么区别?为什么 Docker 图片不够?

努力量

要使用 docker 映像在 Kubernetes 上部署服务,您需要手动创建各种配置文件,例如 deployment.yaml。随着越来越多的服务添加到您的环境中,此类文件不断增加。

在 Helm 图表中,我们可以提供我们希望在 requirements.yaml 文件中部署的所有服务的列表,Helm 将确保使用 deployment.yaml 将所有这些服务部署到目标环境, service.yaml & values.yaml 个文件。

要维护的配置

添加路由、配置映射、机密等配置也变得手动,并且需要在您的服务部署之上进行配置。

例如,如果你想在你的环境中添加一个 Nginx 代理,你需要使用 Nginx 镜像和你的功能服务的所有代理配置单独部署它。

但是对于 Helm 图表,这可以通过在 Helm 图表中的文件 ingress.yaml 上进行配置来实现。

灵活性

使用 docker 图像,我们需要为我们要部署服务的每个环境提供配置。

但是使用 Helm chart,我们可以使用特定于环境的 values.yaml 文件覆盖现有 helm chart 的属性。使用 ArgoCD.

这样的工具会变得更加容易

代码片段:

下面是 deployment.yaml 文件的一个示例,如果我们想使用 docker-image 部署一项服务,我们需要创建该文件。

在线,我还描述了如何使用 requirements.yamlValues.yaml

等不同文件在 Helm 存储库中填充通用 deployment.yaml 模板

deployment.yaml 一项服务

crazy-project/charts/accounts/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: accounts
spec:
  replicas: 1
  selector:
     matchLabels:
       app.kubernetes.io/name: accounts
       app.kubernetes.io/instance: crazy-project
  template:
     metadata:
       labels:
         app.kubernetes.io/name: accounts
         app.kubernetes.io/instance: crazy-project
     spec:
       serviceAccountName: default
       automountServiceAccountToken: true
       imagePullSecrets:
         - name: regcred
       containers:
       - image: "image.registry.host/.../accounts:1.2144.0"   <-- This version can be fetched from 'requirements.yaml'
         name: accounts
         env:      <-- All the environment variables can be fetched from 'Values.yaml'
         - name: CLUSTERNAME
           value: "com.company.cloud"
         - name: DB_URI
           value: "mongodb://connection-string&replicaSet=rs1"
         imagePullPolicy: IfNotPresent
         volumeMounts:
         - name: secretfiles
           mountPath: "/etc/secretFromfiles"
           readOnly: true
         - name: secret-files
           mountPath: "/etc/secretFromfiles"
           readOnly: true
         ports:
         - name: HTTP
           containerPort: 9586
           protocol: TCP
         resources:
           requests:
             memory: 450Mi
             cpu: 250m
           limits:
             memory: 800Mi
             cpu: 1
       volumes:
       - name: secretFromfiles
         secret:
           secretName: secret-from-files
       - name: secretFromValue
         secret:
           secretName: secret-data-vault
           optional: true
           items:...

您在 Helm 图表中的 deployment.yaml 可以是一个通用模板(下面的代码片段),其中使用 values.yaml 文件填充详细信息。

env:
{{- range $key, $value := .Values.global.envVariable.common }}
    - name: {{ $key }}
      value: {{ $value  | quote }}
    {{- end }}

你的 Values.yaml 看起来像这样:

accounts:
  imagePullSecrets:
    - name: regcred
  envVariable:
    service:
      vars:
        spring_data_mongodb_database: accounts_db
        spring_product_name: crazy-project
        ...

您的 requirements.yaml 如下所示。 'dependencies' 是您要部署的服务。

dependencies:
  - name: accounts
    repository: "<your repo>"
    version: "= 1.2144.0"
  - name: rollover
    repository: "<your repo>"
    version: "= 1.2140.0"

下图将帮助您形象化我上面提到的内容: