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

helm upgrade --install nginx --namespace chart-demo --create-namespace bitnami/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 并解压对应压缩包

vim values.yaml(设置连接数据库的密码)

# 查看并配置 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
pv.yml

# 查看并配置 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
pvc.yml

 

# 安装 mariadb-galera

helm install mydb ./mariadb-galera \
--set persistence.storageClass="" \
--set persistence.size=5Gi \
--set persistence.accessModes={ReadWriteMany} \
--set persistence.existingClaim="pvc01"

 

 

 

 

posted @ 2025-05-05 12:06  demoduan  阅读(427)  评论(0)    收藏  举报