ITPub博客

首页 > 数据库 > 数据库开发技术 > Helm chart 实践

Helm chart 实践

原创 数据库开发技术 作者:五分钟学SRE 时间:2024-03-18 09:05:00 0 删除 编辑

Helm Chart

     Helm chart是一个软件包,其中包含将应用程序部署到Kubernetes集群的所有必要资源。这包括用于部署、服务、秘密和配置映射的YAML配置文件,这些配置文件定义了应用程序的所需状态。

    上一篇文章我们介绍了helm的架构与安装,这篇文章让我们详细的深入了解helm chart使用。我们先看一个示例并自行部署一个chart。将深入研究 Helm 结构目录和文件。将修改在上一步中创建的图表。

创建一个helm chart

helm create five_minute_learn

可以看到helm chart 的目录结构

-> % tree -a five_minute_learnfive_minute_learn├── .helmignore├── Chart.yaml├── charts├── templates│   ├── NOTES.txt│   ├── _helpers.tpl│   ├── deployment.yaml│   ├── hpa.yaml│   ├── ingress.yaml│   ├── service.yaml│   ├── serviceaccount.yaml│   └── tests│       └── test-connection.yaml└── values.yaml

Helm Chart 中的每个文件和目录并了解其重要性。

  1. .helmignore:这是一个隐藏文件,因此我们无法在图表结构中看到它。从目录内运行 ls -a 命令来检查它。它用于定义我们不想包含在 Helm Chart 中的所有文件。

  2. Chart.yaml:包含图表的基本信息。

  3. Charts:这是一个空目录。我们可以在此处添加主图表所依赖的任何图表结构。

  4. templates:这是一个包含构建应用程序的所有 Kubernetes 清单文件的目录。默认情况下,helm 创建了deployment.yaml、service.yaml、hpa.yaml、ingress.yaml、serviceaccount.yaml清单文件。我们可以根据需要修改和覆盖这些文件。我们甚至可以添加其他 Kubernetes 对象的清单文件。这些清单文件可以被模板化以访问values.yaml文件中的值。

  5. templates/NOTES.txt:这是一个纯文本文件,在成功部署图表后打印出来。

  6. templates/_helpers.tpl:该文件包含多个方法和子模板。它有助于保持我们的图表井井有条,并避免在多个地方重复相同的代码。

  7. templates/tests/:我们可以在图表中定义测试,以验证图表在安装后是否按预期工作。

  8. value.yaml:此文件包含模板目录中清单文件的值。例如镜像名称、副本数量、HPA值等。我们可以根据环境创建不同的values.yaml文件并更改值。

实例图片 - 互联网获取


Chart.yaml

    我们看下与chart相关的所有信息,例如图表的名称和类型、图表的一些描述、版本等。

apiVersion: v2name: five_minute_learndescription: A Helm chart for Kubernetes
# A chart can be either an 'application' or a 'library' chart.## Application charts are a collection of templates that can be packaged into versioned archives# to be deployed.## Library charts provide useful utilities or functions for the chart developer. They're included as# a dependency of application charts to inject those utilities and functions into the rendering# pipeline. Library charts do not define any templates and therefore cannot be deployed.type: application
# This is the chart version. This version number should be incremented each time you make changes# to the chart and its templates, including the app version.# Versions are expected to follow Semantic Versioning (https://semver.org/)version: 0.1.0
# This is the version number of the application being deployed. This version number should be# incremented each time you make changes to the application. Versions are not expected to# follow Semantic Versioning. They should reflect the version the application is using.# It is recommended to use it with quotes.appVersion: "1.16.0"

一一查看每个字段:

  1. apiVersion:指图表 API 版本。v2 是 Helm 3 版本的当前 apiVersion。

  2. name:该字段指的是图表的名称。

  3. description:有关舵图的一行详细信息。

  4. type:有 2 种chart类型选项:application and library。application是指我们部署在 Kubernetes 上的chart。library是指可重复使用的chart,可以与其他chart一起使用。

  5. version:它指的是我们图表的版本。

  6. appVersion:它描述了我们应用程序的版本号。

除此之外,还有一些其他字段,例如维护者、依赖项、图标等。

templates

    我们之前讨论过 templates 文件夹,其中包含一些常用资源的模板化 Kubernetes 清单文件。但是,我们的应用程序中可能需要一些其他资源,我们必须将其创建为模板。我们还可以删除不需要的资源。

    现在,我们将使用 2 个资源:部署和服务。因此,让我们删除其他文件和文件夹。我们的文件夹将如下所示:

-> % tree templatestemplates├── _helpers.tpl├── deployment.yaml└── service.yaml

    我们还可以根据需要删除或添加清单文件中的字段。所以我们的deployment.yaml和service.yaml将如下所示:

deployment.yaml

apiVersion: apps/v1 kind: Deploymentmetadata: name: {{ include "five_minute_learn.fullname" . }}labels:  {{- include "five_minute_learn.labels" . | nindent 4 }}spec:replicas: {{ .Values.replicaCount }}selector:  matchLabels:    {{- include "five_minute_learn.selectorLabels" . | nindent 6 }}template:  metadata:    {{- with .Values.podAnnotations }}    annotations:      {{- toYaml . | nindent 8 }}    {{- end }}    labels:      {{- include "five_minute_learn.selectorLabels" . | nindent 8 }}  spec:    containers:      - name: {{ .Chart.Name }}        image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"        imagePullPolicy: {{ .Values.image.pullPolicy }}        ports:          - name: http            containerPort: 80            protocol: TCP


service.yaml

apiVersion: v1 kind: Servicemetadata: name: {{ include "five_minute_learn.fullname" . }}labels:  {{- include "five_minute_learn.labels" . | nindent 4 }}spec:type: {{ .Values.service.type }}ports:  - port: {{ .Values.service.port }}    targetPort: {{ .Values.service.targetPort }}    protocol: TCP    name: {{ .Values.service.name }}selector:  {{- include "five_minute_learn.selectorLabels" . | nindent 4 }}

我们对 Kubernetes 对象清单文件进行模板化,以便我们可以通过使用每个环境的值文件动态为其分配值,从而在多个环境中重用它们。让我们了解一下这些模板。

Helm 使用模板指令,我们在大括号内提供对象参数。

{{ .Object.Parameter }}

我们可以使用不同的对象。在我们的模板中,我们使用chart和值。我们提到了 Chart 对象,用于使用Chart.yaml中定义的参数,以及value.yaml的 Values 对象。

例如,在deployment.yaml文件中:

对于代码片段{{ .Values.replicaCount }}, Helm 将检查values.yaml文件,找到replicaCount参数,获取它的值,然后在deployment.yaml文件中渲染。类似地,对于代码片段{{ .Chart.Name }},它将检查Chart.yaml文件,找到Name参数,并获取它的值。

我们还可以看到一个片段{{ include “five_minute_learn.fullname” 。}},这里我们使用了 include 关键字。使用它,我们要求 Helm 检查_helpers.tpl定义了一些默认模板的文件并从那里获取值。five_minute_learn.fullname 因此它将根据那里的定义检查并获取值。

Values.yaml

value.yaml文件是一个配置文件,用于设置各种参数的默认值。该文件中的所有值都将替换为我们在模板中使用的模板指令。

该文件的结构为键值对,其中键表示 Kubernetes 对象的字段。让我们将默认的values.yaml内容替换为以下内容。

replicaCount: 2image: repository: nginxtag: "1.25.3"pullPolicy: Always
service: name: nginx-servicetype: ClusterIPport: 80targetPort: 8080

使用 Helm Chart 中的 values 文件来根据环境配置不同的值,例如在不同的环境中设置不同的 pod 副本数量。可以按照以下方式组织的 values 文件:

  • values-dev.yaml: 开发环境的配置。

  • values-qa.yaml: QA 环境的配置。

  • values-uat.yaml: UAT 环境的配置。

  • values-prod.yaml: 生产环境的配置。

每个文件中可以包含不同的配置,例如 pod 副本数量 (replicaCount)、资源限制 (resources) 等。例如,对于不同的环境,可以在相应的 values 文件中设置不同的 replicaCount 值。

可以使用 Helm 命令来指定要使用的 values 文件,例如:

helm install my-chart . -f values-dev.yaml  # 在 dev 环境使用 dev 的 values 文件

这样,Helm 将根据指定的 values 文件为的应用程序设置配置,并在 Kubernetes 集群中部署相应的资源。这样可以方便地在不同环境中部署相同的 Helm Chart,并根据需要自定义配置。


验证 Helm Chart

为了在实际部署之前验证我们的 helm 图表,helm 提供了多个命令。使用这些命令,我们可以检查所有内容是否就位且正确。

1. helm lint:

    此命令运行一系列测试来验证图表是否有效并且所有缩进都正常。如果图表中出现任何问题,它会抛出错误。

 helm lint 


让我们针对我们的图表运行此命令。

➜  helm lint five_minute_learn/
==> Linting five_minute_learn/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed

我们可以看到它成功运行并且图表中没有错误。

2.helm template :

此命令检查模板中的值是否被替换。它将生成并显示带有替换值的所有清单文件。

 helm template  

如果运行此命令,将得到以下输出。

# Source: five_minute_learn/templates/service.yaml# Service 部署配置apiVersion: v1kind: Servicemetadata:  # 服务元数据  name: release-name-five_minute_learn  labels:    # 标签    helm.sh/chart: five_minute_learn-0.1.0    app.kubernetes.io/name: five_minute_learn    app.kubernetes.io/instance: release-name    app.kubernetes.io/version: "1.0.0"    app.kubernetes.io/managed-by: Helmspec:  # 服务类型为 ClusterIP  type: ClusterIP  ports:    # 端口映射    - port: 80      targetPort: 8080      protocol: TCP      name: nginx-service  selector:    # 选择器    app.kubernetes.io/name: five_minute_learn    app.kubernetes.io/instance: release-name---# Source: five_minute_learn/templates/deployment.yaml# Deployment 部署配置apiVersion: apps/v1kind: Deploymentmetadata:  # 部署元数据  name: release-name-five_minute_learn  labels:    # 标签    helm.sh/chart: five_minute_learn-0.1.0    app.kubernetes.io/name: five_minute_learn    app.kubernetes.io/instance: release-name    app.kubernetes.io/version: "1.0.0"    app.kubernetes.io/managed-by: Helmspec:  # 副本数为 2  replicas: 2  selector:    matchLabels:      # 选择器匹配标签      app.kubernetes.io/name: five_minute_learn      app.kubernetes.io/instance: release-name  template:    metadata:      labels:        # 模板标签        app.kubernetes.io/name: five_minute_learn        app.kubernetes.io/instance: release-name    spec:      containers:        - name: five_minute_learn          image: "nginx:1.25.3"          imagePullPolicy: Always          ports:            - name: http              containerPort: 80              protocol: TCP

部署时,release-name将被我们通过 helm 命令提供的release 名称覆盖。

3. helm install --dry-run

此命令会试运行清单的安装并检查所有模板是否正常工作。如果出现任何问题,它会抛出错误。如果一切顺利,那么将看到将部署到集群中的清单输出。

helm install --dry-run <release-name> <chart-name>

这篇文章我们介绍了helm chart的配置,与基础概念,下一篇章我们将实践使用helm chart部署,管理 k8s服务,这里需要我们先搭建后自己的k8s 集群,将会推出最新的文章介绍k8s 的部署。


原文作者:五分钟学SRE;如有侵权,请联系管理员删除。

上一篇: Helm 背景介绍
请登录后发表评论 登录
全部评论

注册时间:2021-11-23

  • 博文量
    81
  • 访问量
    38724