k8s 包管理器(Helm)
# Helm 介绍
传统服务部署到 k8s 流程:
1. 拉取代码
2. 打包编译
3. 构建镜像
4. 准备相关的 yaml 文件
5. kubectl apply 部署到 k8s 集群
传统方式部署引发的问题:
1. 随着应用的增多,需要维护大量的 yaml 文件
2. 不能根据一套 yaml 文件来创建多个环境,需要手动进行修改,比如,一般环境都分为 dev,预生产(staging),生产环境,部署完了dev 这套环境,后面再部署预生产,生产环境,还需要复制出2套才行,并手动修改才行。
Helm 是 k8s 的一个包管理工具,它为 k8s 提供了一种管理和标准化的部署方式。在 k8s 生态系统中,Helm 扮演着类似于我们在 Ubuntu 中使用的 apt、CentOS 中使用的 yum 或者 Python 中的 pip 一样,它使用户能够轻松地查找、共享和重复使用复杂的容器化应用程序部署配置。
Helm 的核心概念是图表(Chart),这是一个封装了完整 k8s 应用的软件包。一个 Helm 图表通常包含一组 k8s 资源模板,比如 Deployment、Service、ConfigMap 等,以及用于定制这些资源的参数文件。通过这种方式,Helm 图表可以作为可重用的应用程序模板,允许用户在不同的环境和需求下灵活地部署和管理复杂的应用程序。
# Helm 安装
1. 使用 Helm,需要一个 k8s 集群。对于 Helm 的版本,建议使用 k8s 的最新稳定版, 大多数情况下是倒数第二个次版本。
2. 本地有 kubectl 命令
# 脚本安装
curl -fsSL -o get-helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get-helm.sh
./get-helm.sh
# Helm 核心概念
Charts
# 创建 mychart
helm create mychart
# 查看 mychart 目录结构
tree mychart
mychart/ # chart 包的名称
├── Chart.yaml # 包含 Chart 的元数据,如名称、版本、描述等
├── charts # 包含子 Chart,用于管理依赖关系
├── templates # 模板文件目录,目录里面存放所有 yaml 模板文件,包含了所有部署应用的 yaml 文件
│ ├── NOTES.txt # 存放提示信息的文件,介绍这个 chart 如何使用
│ ├── _helpers.tpl # 定义一些常用的模板函数,这些函数可以在其他模板文件中被调用,从而避免重复代码
│ ├── deployment.yaml # 创建 deployment 对象的模板文件
│ ├── hpa.yaml # Horizontal Pod Autoscaler (HPA) 配置文件,可根据 CPU 使用率或其它指标自动增加或减少 pod 数量
│ ├── ingress.yaml # 定义外部访问集群服务的规则,提供 HTTP/HTTPS 路由到集群内部服务
│ ├── service.yaml # 定义如何访问一组 pod,并为 pod 提供稳定的 IP 地址和 DNS 名称
│ ├── serviceaccount.yaml # 为 pod 中的进程提供身份标识,用于控制 API 访问权限
│ └── tests # 用于测试的文件,测试完部署完 chart 后,可以简单测试下是否部署正常
│ └── test-connection.yaml # 用于测试网络连接和服务可用性
└── values.yaml # 用于渲染模板的文件,定义 templates 目录下的 yaml 文件可能引用到的变量
Release
Release 是一个 Chart 的一个实例。每次使用 helm install 命令部署一个 Chart 时,都会创建一个新的 Release。
Release 包含了部署的配置和状态信息,每个 Release 有一个唯一的名称
# 安装 chart
helm install my-release my-app
# 查看所有 Release
helm list
# 升级 Release
helm upgrade my-release my-app --set replicaCount=2
# 回滚 Release
helm rollback my-release
# 删除 Release
helm delete my-release
Repository
Repository 是存储 Helm Chart 的仓库。可以从这些仓库中下载和安装 Chart。Helm 提供了官方仓库,也可以创建自定义仓库。
操作:
添加仓库:使用 helm repo add 命令添加仓库
更新仓库:使用 helm repo update 命令更新仓库索引
搜索 Chart:使用 helm search repo 命令搜索仓库中的 Chart
# 添加官方 helm 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 更新仓库索引
helm repo update
# 搜索仓库中的 Chart
helm search repo bitnami/nginx
Template
Template 是 Helm 中用于生成 k8s 资源文件的模板。这些模板文件位于 Chart 的 templates/ 目录中,通过 Helm 模板引擎渲染,生成最终的 k8s 资源文件。
特点:
使用 Go 模板语法
可以访问 values.yaml 中的配置值
支持条件语句、循环语句和函数调用
Values
Values 是 Helm 中用于配置 Chart 的值。这些值可以定义在 values.yaml 文件中,也可以在部署时通过命令行参数覆盖。
特点:
values.yaml 文件包含默认配置值
可以在部署时通过 --set 参数覆盖默认值
可以使用 --values 参数指定外部配置文件
# 部署时覆盖默认值
helm install my-release my-app --set replicaCount=2,image.tag=v1.1
# 使用外部配置文件
helm install my-release my-app --values my-values.yaml
Hook
Hook 是 Helm 中用于在部署过程中执行特定操作的机制。Hook 可以在安装、升级、删除等操作的特定阶段执行。
类型:
pre-install :在安装前执行
post-install :在安装后执行
pre-upgrade :在升级前执行
post-upgrade :在升级后执行
pre-delete :在删除前执行
post-delete :在删除后执行
Linting
Linting 是 Helm 中用于检查 Chart 语法和结构的工具。通过 helm lint 命令,可以发现 Chart 中的常见问题。
# 检查 Chart
helm lint my-app
# 常用 Repository
# 添加官方 Helm 仓库
helm repo add stable https://charts.helm.sh/stable
helm repo add incubator https://charts.helm.sh/incubator
# 添加 Bitnami 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 添加 Grafana 仓库
helm repo add grafana https://grafana.github.io/helm-charts
# 添加 Prometheus Community 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helmcharts
# 添加 Ingress Nginx 仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# 添加 Azure 仓库
helm repo add azure https://mirror.azure.cn/kubernetes/charts
# 添加开源社镜像
helm repo add kaiyuanshe http://mirror.kaiyuanshe.cn/kubernetes/charts
# 添加阿里云仓库
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 添加仓库后更新仓库索引
helm repo update
# Helm 实践( 基础操作可参考:https://helm-charts.itboon.top/docs/ )
# 添加 Helm 仓库

# 部署 nginx

# 部署 redis
helm upgrade --install redis \
--namespace chart-demo \
--create-namespace \
--set master.persistence.enabled="false" \
--set replica.replicaCount="1" \
--set replica.persistence.enabled="false" \
bitnami/redis

# 删除 chart 和 namespace
helm uninstall nginx --namespace chart-demo
helm uninstall redis --namespace chart-demo
kubectl delete ns chart-demo
# 部署 Mariadb galera 多主集群(可参考:https://helm-charts.itboon.top/docs/bitnami/mariadb-galera/?h=mariadb)
# 下载 chart 并解压对应压缩包


# 查看并配置 pv
1 apiVersion: v1 2 kind: PersistentVolume 3 metadata: 4 name: nfs-pv1 5 spec: 6 capacity: 7 storage: 5Gi 8 volumeMode: Filesystem 9 accessModes: 10 - ReadWriteMany 11 persistentVolumeReclaimPolicy: Retain 12 nfs: 13 path: /k8s-data/pv1 14 server: 192.168.121.240 15 16 --- 17 18 apiVersion: v1 19 kind: PersistentVolume 20 metadata: 21 name: nfs-pv2 22 spec: 23 capacity: 24 storage: 10Gi 25 volumeMode: Filesystem 26 accessModes: 27 - ReadWriteMany 28 persistentVolumeReclaimPolicy: Retain 29 nfs: 30 path: /k8s-data/pv2 31 server: 192.168.121.240

# 查看并配置 pvc
1 apiVersion: v1 2 kind: PersistentVolumeClaim 3 metadata: 4 name: pvc01 5 spec: 6 storageClassName: "" 7 accessModes: 8 - ReadWriteMany 9 resources: 10 requests: 11 storage: 5Gi
# 安装 mariadb-galera

浙公网安备 33010602011771号