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

Yon*_*Nir 8 docker dockerfile kubernetes-helm

我需要学习一个 CI 管道,其中有一个步骤是使用 Dockerfile 构建和推送图像,另一个步骤是创建 helm 图表图像,其中有由 docker 文件创建的图像的定义。之后,有一个 CD 管道,其中仅安装由 Helm Chart 创建的内容。

通过 Dockerfile 直接创建的镜像与通过 helm Chart 创建的镜像有什么区别?为什么 Docker 镜像不够用?

Dha*_*ria 16

量力而行

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

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

要维护的配置

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

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

但对于 Helm 图表,这可以通过在 Helm 图表中仅配置一个文件来实现:ingress.yaml

灵活性

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

但是使用 Helm Chart,我们可以使用特定于环境的文件覆盖现有 Helm Chart 的属性values.yaml。使用诸如 之类的工具,这变得更加容易ArgoCD

代码片段:

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

内联中,我还描述了如何使用不同的文件(如和)deployment.yaml在 Helm 存储库中填充通用模板requirements.yamlValues.yaml

一项服务的部署.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:...
Run Code Online (Sandbox Code Playgroud)

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

env:
{{- range $key, $value := .Values.global.envVariable.common }}
    - name: {{ $key }}
      value: {{ $value  | quote }}
    {{- end }}
Run Code Online (Sandbox Code Playgroud)

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

accounts:
  imagePullSecrets:
    - name: regcred
  envVariable:
    service:
      vars:
        spring_data_mongodb_database: accounts_db
        spring_product_name: crazy-project
        ...
Run Code Online (Sandbox Code Playgroud)

你的requirements.yaml会像下面这样。“依赖项”是您希望部署的服务。

dependencies:
  - name: accounts
    repository: "<your repo>"
    version: "= 1.2144.0"
  - name: rollover
    repository: "<your repo>"
    version: "= 1.2140.0"
Run Code Online (Sandbox Code Playgroud)

下图将帮助您直观地了解我上面提到的内容:

Docker 镜像与 Helm 图表