这里写目录标题
- 什么是Helm
- helm架构
- 重要概念
- 组件
- Helm 客户端
- Helm 库
- 安装heml
- 使用halm快速部署应用
- 添加 helm 仓库
- Helm 的常用命令
- chart 详解
- 目录结构
- Redis chart 实践
- 创建StorageClass制备器,配置NFS动态制备
- 修改 helm 源
- 搜索 redis chart
- 修改配置
- 安装
- 查看安装情况
- 升级和回滚
- 卸载redis
什么是Helm
Kubernetes 包管理器
Helm 是查找、分享和使用软件构件 Kubernetes 的最优方式。
Helm 管理名为 chart 的 Kubernetes 包的工具。Helm 可以做以下的事情:
- 从头开始创建新的 chart
- 将 chart 打包成归档(tgz)文件
- 与存储 chart 的仓库进行交互
- 在现有的 Kubernetes 集群中安装和卸载 chart
- 管理与 Helm 一起安装的 chart 的发布周期
对于Helm,有三个重要的概念:
- chart 创建Kubernetes应用程序所必需的一组信息。
- config 包含了可以合并到打包的chart中的配置信息,用于创建一个可发布的对象。
- release 是一个与特定配置相结合的chart的运行实例。
helm架构
重要概念
- chart
chart 创建 Kubernetes 应用程序所必需的一组信息
- config
config 包含了可以合并到打包的 chart 中的配置信息,用于创建一个可发布的对象。
- release
release 是一个与特定配置相结合的 chart 的运行实例。
组件
Helm 客户端
**Helm 客户端 是终端用户的命令行客户端。负责以下内容:
- 本地 chart 开发
- 管理仓库
- 管理发布
- 与 Helm 库建立接口
- 发送安装的 chart
- 发送升级或卸载现有发布的请求
Helm 库
**Helm 库 提供执行所有 Helm 操作的逻辑。与 Kubernetes API 服务交互并提供以下功能:
- 结合 chart 和配置来构建版本
- 将 chart 安装到 Kubernetes 中,并提供后续发布对象
- 与 Kubernetes 交互升级和卸载 chart
独立的 Helm 库封装了 Helm 逻辑以便不同的客户端可以使用它。
安装heml
helm类似于一个包管理工具,主要是为了解决k8s资源编排文件过多难以维护的问题。
使用halm快速部署应用
- 搜索应用:helm search repo nginx
- 安装应用:helm install nginx_name nginx
- 查看已安装应用:helm list
- 查看应用状态:helm status nginx
#下载二进制文件
[root@k8s-master helm]# wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
--2024-01-04 17:06:53-- https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
正在解析主机 get.helm.sh (get.helm.sh)... 152.199.39.108, 2606:2800:247:1cb7:261b:1f9c:2074:3c
正在连接 get.helm.sh (get.helm.sh)|152.199.39.108|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:12924654 (12M) [application/x-tar]
正在保存至: “helm-v3.2.3-linux-amd64.tar.gz”
100%[====================================================================================================================>] 12,924,654 3.87MB/s 用时 3.2s
2024-01-04 17:06:59 (3.87 MB/s) - 已保存 “helm-v3.2.3-linux-amd64.tar.gz” [12924654/12924654])
[root@k8s-master helm]# ls
helm-v3.2.3-linux-amd64.tar.gz
#解压
[root@k8s-master helm]# tar -zxvf helm-v3.2.3-linux-amd64.tar.gz
linux-amd64/
linux-amd64/README.md
linux-amd64/LICENSE
linux-amd64/helm
[root@k8s-master helm]# ls
helm-v3.2.3-linux-amd64.tar.gz linux-amd64
[root@k8s-master helm]# cd linux-amd64/
[root@k8s-master linux-amd64]# ls
helm LICENSE README.md
[root@k8s-master linux-amd64]# cp helm /usr/local/bin/
[root@k8s-master linux-amd64]# cd ~
[root@k8s-master ~]# pwd
/root
# 输入版本号 安装成功
[root@k8s-master ~]# helm version
version.BuildInfo{Version:"v3.2.3", GitCommit:"8f832046e258e2cb800894579b1b3b50c2d83492", GitTreeState:"clean", GoVersion:"go1.13.12"}
添加 helm 仓库
可以从helm仓库下载东西
# 安装 ingress-nginx
[root@k8s-master ~]# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
"ingress-nginx" has been added to your repositories
#查看仓库列表
[root@k8s-master ~]# helm repo list
NAME URL
ingress-nginx https://kubernetes.github.io/ingress-nginx
# 搜索 ingress-nginx 这是配置好的软件的安装包
[root@k8s-master ~]# helm search repo ingress-nginx
NAME CHART VERSION APP VERSION DESCRIPTION
ingress-nginx/ingress-nginx 4.9.0 1.9.5 Ingress controller for Kubernetes using NGINX a...
Helm 的常用命令
命令 | 描述 |
---|---|
helm search | 使用关键词搜索 chart |
helm pull | 拉取远程仓库中的 chart 到本地 |
helm create | 在本地创建新的 chart。 |
helm dependency | 管理 chart 的依赖。 |
helm install | 安装 chart。 |
helm list | 列出所有的 release。 |
helm lint | 检查 chart 配置是否有误。 |
helm package | 打包本地 chart。 |
helm repo | 列出、增加、更新、删除 chart 仓库。 |
helm rollback | 回滚 release 到历史版本。 |
helm uninstall | 卸载 release。 |
helm upgrade | 升级 release。 |
chart 详解
目录结构
mychart
├── Chart.yaml
├── charts # 该目录保存其他依赖的 chart(子 chart)
├── templates # chart 配置模板,用于渲染最终的 Kubernetes YAML 文件
│ ├── NOTES.txt # 用户运行 helm install 时候的提示信息
│ ├── _helpers.tpl # 用于创建模板时的帮助类
│ ├── deployment.yaml # Kubernetes deployment 配置
│ ├── ingress.yaml # Kubernetes ingress 配置
│ ├── service.yaml # Kubernetes service 配置
│ ├── serviceaccount.yaml # Kubernetes serviceaccount 配置
│ └── tests
│ └── test-connection.yaml
└── values.yaml # 定义 chart 模板中的自定义配置的默认值,可以在执行 helm install 或 helm update 的时候覆盖
Redis chart 实践
创建StorageClass制备器,配置NFS动态制备
1、k8s 中提供了一套自动创建 PV 的机制,就是基于 StorageClass 进行的,通过 StorageClass 可以实现仅仅配置 PVC,然后交由 StorageClass 根据 PVC 的需求动态创建 PV。
2、每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV。
# 在master节点上安装nfs服务,(每个node节点上都安装下nfs,这样的目的是为了node节点可以驱动nfs设备)
[root@k8s-master01 ~]# yum install nfs-utils -y
# 准备共享目录
[root@k8s-master01 ~]# mkdir /nfs_data/rw/
[root@k8s-master01 ~]# mkdir /nfs_data/ro/
# 暴露服务
[root@k8s-master01 ~]# vim /etc/exports
/nfs_data/rw 192.168.18.0/24(rw,sync,no_subtree_check,no_root_squash)
/nfs_data/ro 192.168.18.0/24(ro,sync,no_subtree_check,no_root_squash)
# 启动nfs服务
[root@k8s-master01 ~]# systemctl restart nfs
修改 helm 源
# 查看默认仓库
helm repo list
# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add aliyun https://apphub.aliyuncs.com/stable
helm repo add azure http://mirror.azure.cn/kubernetes/charts
搜索 redis chart
# 搜索 redis chart
helm search repo redis
# 查看安装说明
helm show readme bitnami/redis
修改配置
# 先将 chart 拉到本地
helm pull bitnami/redis
[root@k8s-master k8s]# ls
Affinity helm ingress jobs pic pod-toleration.yaml redis-18.7.1.tgz tolera
# 解压后,修改 values.yaml 中的参数
[root@k8s-master k8s]# tar -xvf redis-18.7.1.tgz
#解压好了创建了一个redis的文件夹
[root@k8s-master k8s]# ls
Affinity helm ingress jobs pic pod-toleration.yaml redis redis-18.7.1.tgz tolera
[root@k8s-master k8s]# cd redis
[root@k8s-master redis]# ls
Chart.lock charts Chart.yaml img README.md templates values.schema.json values.yaml
#修改yaml文件
[root@k8s-master redis]# vi values.yaml
# 修改 storageClass 为 nfs-storage
# 设置 redis 密码 password
# 修改集群架构 architecture,默认是主从(replication,3个节点),可以修改为 standalone 单机模式
# 修改实例存储大小 persistence.size 为需要的大小 1GB
# 修改 service.nodePorts.redis 向外暴露端口,范围 <30000-32767> 可以不修改
# 安装操作
# 创建命名空间
kubectl create namespace redis
# 安装
cd ../
helm install redis ./redis -n redis
helm install redis ./redis -n dev
安装
# 安装操作
# 创建命名空间
kubectl create namespace redis
# 安装
cd ../
helm install redis ./redis -n redis
查看安装情况
# 查看 helm 安装列表
helm list
# 查看 redis 命名空间下所有对象信息
[root@k8s-master k8s]# kubectl get all -n redis
NAME READY STATUS RESTARTS AGE
pod/redis-master-0 0/1 Pending 0 4m39s
pod/redis-replicas-0 0/1 Pending 0 4m39s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/redis-headless ClusterIP None <none> 6379/TCP 4m39s
service/redis-master ClusterIP 10.111.20.39 <none> 6379/TCP 4m39s
service/redis-replicas ClusterIP 10.110.145.172 <none> 6379/TCP 4m39s
NAME READY AGE
statefulset.apps/redis-master 0/1 4m39s
statefulset.apps/redis-replicas 0/3 4m39s
[root@k8s-master k8s]# kubectl get pvc -n redis
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
redis-data-redis-master-0 Pending managed-nfs-storage 5m59s
redis-data-redis-replicas-0 Pending managed-nfs-storage 5m59s
升级和回滚
#升级版本
[root@k8s-master01 redis]# helm upgrade redis ./ -n redis
# 查看历史
helm history redis
# 回退到上一版本
helm rollback redis
# 回退到指定版本
helm rollback redis 3
卸载redis
[root@k8s-master01 redis]# helm delete redis -n redis
kubectl delete pvc redis-data-redis-master-0 -n redis
kubectl delete pvc redis-data-redis-replicas-0 -n redis