前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Helm chart 实践

Helm chart 实践

作者头像
五分钟学SRE
发布2024-03-22 15:07:25
3540
发布2024-03-22 15:07:25
举报
文章被收录于专栏:五分钟学SRE

Helm Chart

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

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

创建一个helm chart

代码语言:javascript
复制
helm create five_minute_learn

可以看到helm chart 的目录结构

代码语言:javascript
复制
代码语言:javascript
复制
-> % tree -a five_minute_learn
five_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
代码语言:javascript
复制

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

  1. .helmignore:这是一个隐藏文件,因此我们无法在图表结构中看到它。从目录内运行 ls -a 命令来检查它。它用于定义我们不想包含在 Helm Chart 中的所有文件。
  2. Chart.yaml:包含图表的基本信息。
  3. Charts:这是一个空目录。我们可以在此处添加主图表所依赖的任何图表结构。
  4. templates:这是一个包含构建应用程序的所有 Kubernetes 清单文件的目录。默认情况下,helm 创建了deployment.yamlservice.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相关的所有信息,例如图表的名称和类型、图表的一些描述、版本等。

代码语言:javascript
复制
apiVersion: v2
name: five_minute_learn
description: 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 个资源:部署和服务。因此,让我们删除其他文件和文件夹。我们的文件夹将如下所示:

代码语言:javascript
复制
-> % tree templates
templates
├── _helpers.tpl
├── deployment.yaml
└── service.yaml

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

deployment.yaml

代码语言:javascript
复制
apiVersion: apps/v1 
kind: Deployment
metadata: 
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

代码语言:javascript
复制
apiVersion: v1 
kind: Service
metadata: 
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 使用模板指令,我们在大括号内提供对象参数。

代码语言:javascript
复制
{{ .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内容替换为以下内容。

代码语言:javascript
复制
代码语言:javascript
复制
replicaCount: 2
image: 
repository: nginx
tag: "1.25.3"
pullPolicy: Always

service: 
name: nginx-service
type: ClusterIP
port: 80
targetPort: 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 文件,例如:

代码语言:javascript
复制
helm install my-chart . -f values-dev.yaml  # 在 dev 环境使用 dev 的 values 文件

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

验证 Helm Chart

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

1. helm lint:

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

代码语言:javascript
复制
 helm lint 

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

代码语言:javascript
复制
➜  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 :

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

代码语言:javascript
复制
 helm template  

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

代码语言:javascript
复制
# Source: five_minute_learn/templates/service.yaml
# Service 部署配置
apiVersion: v1
kind: Service
metadata:
  # 服务元数据
  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: Helm
spec:
  # 服务类型为 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/v1
kind: Deployment
metadata:
  # 部署元数据
  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: Helm
spec:
  # 副本数为 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

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

代码语言:javascript
复制
helm install --dry-run <release-name> <chart-name>

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学SRE 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Helm Chart
    • 创建一个helm chart
      • Chart.yaml
        • templates
          • deployment.yaml
            • 例如,在deployment.yaml文件中:
          • Values.yaml
            • 验证 Helm Chart
              • 1. helm lint:
              • 2.helm template :
              • 3. helm install --dry-run
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档