推送 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.yaml
和 Values.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"
下图将帮助您形象化我上面提到的内容:
我需要学习一个 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.yaml
和 Values.yaml
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"
下图将帮助您形象化我上面提到的内容: