WEBKT

告别YAML地狱-程序员的Helm Chart极简上手指南

65 0 0 0

告别YAML地狱-程序员的Helm Chart极简上手指南

1. 什么是Helm?

2. 为什么选择Helm?

3. 前提条件

4. 快速开始:一个简单的Web应用

4.1 创建应用镜像

4.2 创建Helm Chart

4.3 Chart目录结构

4.4 修改Chart.yaml

4.5 修改values.yaml

4.6 修改templates/deployment.yaml

4.7 修改templates/service.yaml

5. 安装Chart

5.1 验证安装

5.2 访问应用

6. 升级Chart

6.1 验证升级

7. 回滚Chart

8. 卸载Chart

9. 深入学习:Helm的更多功能

10. 总结

告别YAML地狱-程序员的Helm Chart极简上手指南

YAML文件冗长繁琐,复制粘贴错误频出,更新配置提心吊胆?如果你正在使用Kubernetes,并且深受这些问题困扰,那么Helm Chart就是你的救星。它能将复杂的Kubernetes应用打包成一个易于部署和管理的“软件包”,就像使用npm安装Node.js模块一样简单。

本文面向有一定Kubernetes基础的开发者,旨在用最简洁的方式,让你快速上手Helm,摆脱YAML地狱,提高应用部署效率。我们将通过一个简单的Web应用示例,一步步演示如何创建、安装和升级Helm Chart。

1. 什么是Helm?

Helm是Kubernetes的包管理器。你可以把它想象成Linux的apt、yum,或者Node.js的npm。它允许你:

  • 打包应用: 将Kubernetes的Deployment、Service等资源定义打包成一个Chart。
  • 简化部署: 通过简单的命令,一次性部署整个应用。
  • 版本管理: 跟踪和管理应用的版本,方便回滚。
  • 配置管理: 通过变量配置应用,避免硬编码。
  • 共享应用: 将Chart分享给他人,方便应用复用。

2. 为什么选择Helm?

  • 简化复杂性: 将复杂的Kubernetes配置抽象成易于管理的Chart。
  • 提高效率: 快速部署和升级应用,节省时间和精力。
  • 一致性: 确保应用在不同环境中的一致性。
  • 可重复性: 轻松地在多个集群中部署相同的应用。
  • 协作: 方便团队成员共享和复用应用。

3. 前提条件

  • Kubernetes集群: 你需要一个可用的Kubernetes集群。可以使用Minikube、Kind或者云服务商提供的集群。
  • kubectl: 确保你已经安装并配置了kubectl命令行工具。
  • Helm: 下载并安装Helm客户端。你可以从Helm官方网站获取安装指南。

4. 快速开始:一个简单的Web应用

我们将创建一个简单的Web应用,它包含一个Deployment和一个Service。这个应用会返回一个简单的“Hello, World!”页面。

4.1 创建应用镜像

首先,我们需要一个Docker镜像。创建一个名为app.py的文件,内容如下:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, World!"
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0', port=8080)

创建一个Dockerfile文件:

FROM python:3.9-slim-buster

WORKDIR /app

COPY requirements.txt .  # 先复制依赖文件
RUN pip install -r requirements.txt --no-cache-dir # 安装依赖

COPY app.py .

EXPOSE 8080

CMD ["python", "app.py"]

创建一个requirements.txt文件:

Flask

构建Docker镜像:

docker build -t my-web-app .

将镜像推送到Docker Hub或者你自己的镜像仓库(可选,如果你的Kubernetes集群无法直接访问本地镜像)。

4.2 创建Helm Chart

使用Helm命令创建一个Chart:

helm create my-web-app-chart

这会创建一个名为my-web-app-chart的目录,其中包含Chart的骨架文件。

4.3 Chart目录结构

让我们看一下my-web-app-chart目录的结构:

my-web-app-chart/
├── Chart.yaml # Chart的元数据
├── values.yaml # 默认的配置值
├── templates/ # Kubernetes资源定义的模板
│ ├── deployment.yaml # Deployment的模板
│ ├── service.yaml # Service的模板
│ └── _helpers.tpl # 模板辅助函数
└── NOTES.txt # 安装后的说明

4.4 修改Chart.yaml

编辑Chart.yaml文件,修改Chart的元数据:

apiVersion: v2
name: my-web-app-chart
description: A simple web application
type: application
version: 0.1.0
appVersion: "1.0"

4.5 修改values.yaml

values.yaml文件包含Chart的默认配置值。修改values.yaml文件,设置镜像名称、端口等:

replicaCount: 1
image:
repository: your-dockerhub-username/my-web-app # 替换成你的镜像仓库地址
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: "latest"
service:
type: ClusterIP
port: 80

请将your-dockerhub-username/my-web-app替换成你的Docker Hub用户名和镜像名称。

4.6 修改templates/deployment.yaml

templates/deployment.yaml文件定义了Deployment的模板。修改这个文件,使用values.yaml中的配置值:

apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-web-app-chart.fullname" . }}
labels:
{{- include "my-web-app-chart.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "my-web-app-chart.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-web-app-chart.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 8080
protocol: TCP

注意:{{ .Values.image.repository }}{{ .Values.image.tag }}引用了values.yaml文件中的image.repositoryimage.tag配置。

4.7 修改templates/service.yaml

templates/service.yaml文件定义了Service的模板。修改这个文件,使用values.yaml中的配置值:

apiVersion: v1
kind: Service
metadata:
name: {{ include "my-web-app-chart.fullname" . }}
labels:
{{- include "my-web-app-chart.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: 8080
protocol: TCP
name: http
selector:
{{- include "my-web-app-chart.selectorLabels" . | nindent 4 }}

注意:{{ .Values.service.type }}{{ .Values.service.port }}引用了values.yaml文件中的service.typeservice.port配置。

5. 安装Chart

使用Helm命令安装Chart:

helm install my-web-app ./my-web-app-chart

这会将Chart安装到Kubernetes集群中,并创建一个名为my-web-app的Release。

5.1 验证安装

使用kubectl命令验证Deployment和Service是否已成功创建:

kubectl get deployments
kubectl get services

如果一切顺利,你应该能看到名为my-web-app的Deployment和Service。

5.2 访问应用

由于Service的类型是ClusterIP,你需要使用kubectl port-forward命令将Service的端口转发到本地:

kubectl port-forward service/my-web-app 8080:80

然后在浏览器中访问http://localhost:8080,你应该能看到“Hello, World!”页面。

6. 升级Chart

假设我们需要修改应用的镜像版本。修改values.yaml文件,将image.tag修改为1.1

image:
repository: your-dockerhub-username/my-web-app
pullPolicy: IfNotPresent
tag: "1.1" # 修改为1.1

使用Helm命令升级Chart:

helm upgrade my-web-app ./my-web-app-chart

这会将Release升级到新的版本。

6.1 验证升级

使用kubectl命令验证Deployment的镜像是否已成功更新:

kubectl get deployment my-web-app -o yaml | grep image:

如果一切顺利,你应该能看到Deployment的镜像版本已经更新为your-dockerhub-username/my-web-app:1.1

7. 回滚Chart

如果升级后出现问题,可以使用Helm命令回滚到之前的版本:

helm history my-web-app # 查看历史版本
helm rollback my-web-app 1 # 回滚到第一个版本

这会将Release回滚到指定的版本。

8. 卸载Chart

使用Helm命令卸载Chart:

helm uninstall my-web-app

这会删除Release以及所有相关的Kubernetes资源。

9. 深入学习:Helm的更多功能

本文只是Helm的入门指南。Helm还有很多其他强大的功能,例如:

  • 条件语句: 使用if语句根据条件包含或排除资源定义。
  • 循环语句: 使用range语句循环生成资源定义。
  • 模板函数: 使用内置的模板函数或者自定义函数来处理数据。
  • 依赖管理: 使用dependencies字段管理Chart的依赖关系。
  • Chart仓库: 使用Chart仓库分享和复用Chart。

要深入学习Helm,请参考Helm官方文档

10. 总结

Helm Chart是Kubernetes应用部署和管理的利器。通过本文的介绍,你已经掌握了Helm的基本用法。希望你能将Helm应用到实际项目中,提高应用部署效率,告别YAML地狱。

掌握Helm,是成为一名优秀的Kubernetes工程师的必经之路。继续探索Helm的更多功能,你将会发现它能为你的工作带来更多便利。

YAML终结者 Helm ChartKubernetes应用部署

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/9063