Helm Charts 保姆级入门教程_helm chart 语法详解,2024年最新面试字节跳动两轮后被完虐

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

| |-- _helpers.tpl
| |-- deployment.yaml
| |-- configmap.yaml
| |-- ingress.yaml
| |-- service.yaml
| -- tests | – test-connection.yaml
`-- values.yaml

如您所见,部署 YAML 文件是模板目录的一部分(以粗体突出显示),并且有特定于 helm 的文件和文件夹。让我们看一下 helm chart 中的每个文件和目录,并了解它们的重要性。

  1. **.helmignore:**它用于定义我们不想包含在 helm 图表中的所有文件。它的工作方式与 .gitignore文件类似。
  2. **Chart.yaml:**它包含有关 helm chart 的信息,如版本、名称、描述等。
  3. values.yaml:在此文件中,我们定义 YAML 模板的值。例如,映像名称、副本计数、HPA 值等。正如我们之前所解释的,每个环境中只有文件会更改。此外,您可以动态覆盖这些值,也可以在安装 chart 时使用命令覆盖这些值。values.yaml``--values``--set
  4. **charts:**如果我们的主图表对其他图表有一定的依赖性,我们可以在此目录中添加另一个图表的结构。默认情况下,此目录为空。
  5. **templates:**此目录包含构成应用程序的所有 Kubernetes 清单文件。可以将这些清单文件模板化,以访问 values.yaml 文件中的值。Helm 为 Kubernetes 对象创建了一些默认模板,如 deployment.yaml、service.yaml 等,我们可以直接使用、修改或覆盖我们的文件。
  6. **templates/NOTES.txt:**这是一个纯文本文件,在成功部署图表后打印出来。
  7. **templates/_helpers.tpl:**该文件包含多个方法和子模板。这些文件不会呈现给 Kubernetes 对象定义,但在其他图表模板中的任何地方都可以使用。
  8. **emplates/tests/:**我们可以在图表中定义测试,以验证您的图表在安装时是否按预期工作。

Helm Chart 教程 GitHub 存储库

本 Helm Chart 教程中使用的示例 helm chart 和清单托管在 Helm Chart Github 存储库中。您可以克隆它并使用它来遵循指南。

git clone https://github.com/techiescamp/helm-tutorial.git

从头开始创建 Helm 图表

为了亲身体验 helm chart 的创建,让我们从头开始创建一个 Nginx helm chart

执行以下命令以创建图表样板。它创建一个具有默认文件和文件夹名称的图表。nginx-chart

helm create nginx-chart

如果检查创建的图表,它将包含以下文件和目录。

nginx-chart
│ ├── Chart.yaml
│ ├── charts
│ ├── templates
│ │ ├── NOTES.txt
│ │ ├── _helpers.tpl
│ │ ├── deployment.yaml
│ │ ├── hpa.yaml
│ │ ├── ingress.yaml
│ │ ├── service.yaml
│ │ ├── serviceaccount.yaml
│ │ └── tests
│ │ └── test-connection.yaml
│ └── values.yaml

cd 进入生成的图表目录。

cd nginx-chart

我们将根据部署要求逐个编辑文件

Chart.yaml

如上所述,我们将图表的详细信息存档。将 的默认内容替换为以下内容。Chart.yaml``chart.yaml

apiVersion: v2
name: nginx-chart
description: My First Helm Chart
type: application
version: 0.1.0
appVersion: “1.0.0”
maintainers:

  • email: contact@devopscube.com
    name: devopscube
  1. apiVersion:这表示图表 API 版本。v2 用于 Helm 3,v1 用于以前的版本。
  2. **name:**表示图表的名称。
  3. **description:**表示 helm 图表的描述。
  4. Type:图表类型可以是“应用程序”或“”。应用程序图表是您在 Kubernetes 上部署的内容。库图表是可重复使用的图表,可与其他图表一起使用。编程中类似的库概念。
  5. version:图表版本
  6. appVersion:这表示我们应用程序(Nginx)的版本号。
  7. maintainers**:**有关图表所有者的信息。

每次对应用程序进行更改时,version``appVersion应该递增。还有一些其他字段,如dependencies,icons 等。

templates

Helm 创建的目录中有多个文件。在我们的例子中,我们将进行简单的 Kubernetes Nginx 部署。templates

从模板目录中删除所有默认文件。

rm -rf templates/*

我们将添加我们的 Nginx YAML 文件并将它们更改为模板,以便更好地理解。

创建一个文件并复制以下内容。deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:

  • name: nginx
    image: “nginx:1.16.0”
    imagePullPolicy: IfNotPresent
    ports:
  • name: http
    containerPort: 80
    protocol: TCP

上面的 YAML 文件,则值是静态的。helm chart 的想法是将 YAML 文件模板化,以便我们可以通过动态地为它们分配值来在多个环境中重用它们。

要对值进行模板化,只需在大括号内添加 object 参数,如下所示。它被称为模板指令,语法特定于 Go 模板

{{ .Object.Parameter }}

首先,让我们了解什么是对象。以下是我们将在此示例中使用的三个对象。

  1. 发布:每个 helm 图表都将使用发布名称进行部署。如果要使用发布名称或访问模板中与发布相关的动态值,可以使用发布对象。
  2. 图表:如果要使用 chart.yaml 中提到的任何值,可以使用图表对象。
  3. values.yaml 文件中的所有参数都可以使用 Values 对象进行访问。

要了解有关支持的对象的更多信息,请查看 Helm 内置对象文档。

下图显示了如何在模板中替换内置对象。

helm 模板指令替换工作流

首先,您需要弄清楚哪些值可以更改或要模板化哪些值。我正在选择名称、副本、容器名称、图像和 imagePullPolicy,我在 YAML 文件中以粗体突出显示了它们。

  1. **name: :**我们每次都需要更改部署名称,因为 Helm 不允许我们安装具有相同名称的版本。因此,我们将使用发布名称模板化部署名称,并随之插值 -nginx。现在,如果我们使用名称 frontend 创建发布,则部署名称将为 frontend-nginx。这样,我们将有保证的唯一名称。name: {{ .Release.Name }}-nginx
  2. container name: :对于容器名称,我们将使用 Chart 对象,并使用 chart.yaml 中的图表名称作为容器名称。{{ .Chart.Name }}
  3. **Replicas:**我们将从 values.yaml文件中访问副本值。{{ .Values.replicaCount }}
  4. image: 在这里,我们在一行中使用多个模板指令,并从 Values 文件中访问映像键下的存储库和标记信息。"{{ .Values.image.repository }}:{{ .Values.image.tag }}"

同样,您可以在 YAML 文件中模板化所需的值。

这是应用模板后的最终 deployment.yaml 文件。模板化部分以粗体突出显示。将部署文件内容替换为以下内容。

apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-nginx
labels:
app: nginx
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:

  • name: {{ .Chart.Name }}
    image: “{{ .Values.image.repository }}:{{ .Values.image.tag }}”
    imagePullPolicy: {{ .Values.image.pullPolicy }}
    ports:
  • name: http
    containerPort: 80
    protocol: TCP

创建文件并复制以下内容。**service.yaml**

apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-service
spec:
selector:
app.kubernetes.io/instance: {{ .Release.Name }}
type: {{ .Values.service.type }}
ports:

  • protocol: {{ .Values.service.protocol | default “TCP” }}
    port: {{ .Values.service.port }}
    targetPort: {{ .Values.service.targetPort }}

协议模板指令中,您可以看到一个管道。它用于将协议的默认值定义为 TCP。因此,这意味着我们不会在 **values.yaml**文件中定义协议值,或者如果它为空,它将采用 TCP 作为协议的值。( | )

创建一个**configmap.yaml**,并在其中添加以下内容。在这里,我们将默认的 Nginx index.html 页面替换为自定义 HTML 页面。此外,我们还添加了一个模板指令来替换 HTML 中的环境名称。

apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-index-html-configmap
namespace: default
data:
index.html: |

Welcome

Hi! I got deployed in {{ .Values.env.name }} Environment using Helm Chart

values.yaml

该文件包含我们在模板中使用的模板指令中需要替换的所有值。例如,template 包含一个模板指令,用于从 values.yaml 文件中获取映像存储库、标记和 pullPolicy。如果检查以下 values.yaml 文件,则在映像键下嵌套了 repository、tag 和 pullPolicy 键值对。这就是我们使用 Values.image.repository 的原因values.yaml``deployment.yaml

现在,将默认值 values.yaml 内容替换为以下内容。

replicaCount: 2

image:
repository: nginx
tag: “1.16.0”
pullPolicy: IfNotPresent

service:
name: nginx-service
type: ClusterIP
port: 80
targetPort: 9000

env:
name: dev

现在我们已经准备好了 Nginx helm chart,最终的 helm chart 结构如下所示。

nginx-chart
├── Chart.yaml
├── charts
├── templates
│ ├── configmap.yaml
│ ├── deployment.yaml
│ └── service.yaml
└── values.yaml

验证 Helm Chart

现在,为了确保我们的图表有效并且所有缩进都很好,我们可以运行以下命令。确保您位于图表目录中。

helm lint .

如果您从 nginx-chart 目录外部执行它,请提供 **nginx-chart**的完整路径

helm lint /path/to/nginx-chart

如果没有错误或问题,它将显示此结果

==> Linting ./nginx
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, 0 chart(s) failed

若要验证模板中的值是否被替换,可以使用以下命令呈现具有值的模板化 YAML 文件。它将生成并显示所有带有替换值的清单文件。

helm template .

我们也可以使用命令来检查。这将假装将图表安装到集群中,如果存在问题,它将显示错误。--dry-run

helm install --dry-run my-release nginx-chart

如果一切正常,您将看到将部署到群集中的清单输出。

部署 Helm Chart

部署图表时,Helm 将从文件中读取图表和配置值,并生成清单文件。然后它会将这些文件发送到 Kubernetes API 服务器,Kubernetes 将在集群中创建请求的资源。values.yaml

现在我们准备安装图表了。

执行以下命令,其中 is release name 和 is the chart name。它将 nginx-chart 安装在默认命名空间中

helm install frontend nginx-chart

您将看到如下所示的输出。

NAME: frontend
LAST DEPLOYED: Tue Dec 13 10:15:56 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

现在,您可以使用以下命令检查版本列表:

helm list

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
nx-chart

您将看到如下所示的输出。

NAME: frontend
LAST DEPLOYED: Tue Dec 13 10:15:56 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

现在,您可以使用以下命令检查版本列表:

helm list

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-5aIacKMe-1713318474546)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值