Helm 包管理器
helm 是 Kubernetes 包管理器(类似于yum apt-get brew 这些工具)
Helm 是查找、分享和使用软件构件 Kubernetes 的最优方式。
Helm 管理名为 chart 的 Kubernetes 包的工具。Helm 可以做以下的事情:
- 从头开始创建新的 chart
- 将 chart 打包成归档(tgz)文件
- 与存储 chart 的仓库进行交互
- 在现有的 Kubernetes 集群中安装和卸载 chart
- 管理与 Helm 一起安装的 chart 的发布周期
Helm 架构
重要概念
- chart: 创建 Kubernetes 应用程序所必需的一组信息。
- config:包含了可以合并到打包的 chart 中的配置信息,用于创建一个可发布的对象。
- release: 是一个与特定配置相结合的 chart 的运行实例。
组件
Helm 客户端 是终端用户的命令行客户端。负责以下内容:
- 本地 chart 开发
- 管理仓库
- 管理发布
- 与 Helm 库建立接口
- 发送安装的 chart
- 发送升级或卸载现有发布的请求
Helm 库 提供执行所有 Helm 操作的逻辑。与 Kubernetes API 服务交互并提供以下功能:
- 结合 chart 和配置来构建版本
- 将 chart 安装到 Kubernetes 中,并提供后续发布对象
- 与 Kubernetes 交互升级和卸载 chart
独立的 Helm 库封装了 Helm 逻辑以便不同的客户端可以使用它。
Helm 版本
- V2版本Helm依赖Tiller组件。Tiller组件用于接收Helm客户端发出的指令,与K8S的API Server交互,完成资源对象的部署和管理。
- V3版本Helm不再使用Tiller组件,而是将API Server交互的功能整合到Helm客户端程序中。
Helm 安装
# https://kubernetes.github.io/ingress-nginx/deploy/#using-helm 官网是这个,下载包国内安装可以参考下面
wget https://mirrors.huaweicloud.com/helm/v3.14.1/helm-v3.14.1-linux-amd64.tar.gz
tar -zxvf helm-v3.14.1-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/
helm version
注: helm 客户端需要下载到安装了 kubectl 并且能执行能正常通过 kubectl 操作 kubernetes 的服务器上, 否则 helm 将不可用
Helm 常用命令
# helm repo add 存储库名 存储库URL
$ helm repo update
# 例如添加阿里云的仓库地址
$ helm repo add repo_name1 https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
# 因为仓库一直在更新,所以最好使用update更新一下
$ helm repo update
# 查看添加的仓库列表
$ helm repo list
# 检索chart 包
$ helm search repo redis
$ helm search hub redis
# repo表示在本地所添加的仓库中进行检索;hub表示在Helm Hub中进行检索。
# 查看helm 包, readme 文件
$ helm show values mychart
# all chart crds readme values
helm 安装redis
# 查看默认仓库
helm repo list
# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add azure http://mirror.azure.cn/kubernetes/charts
# 搜索 redis chart
helm search repo redis
# 查看安装说明
helm show readme bitnami/redis
# 先将 chart 拉到本地
helm pull bitnami/redis
# 解压后,修改 values.yaml 中的参数
tar -zxvf redis-19.3.4.tgz
# 修改 storageClass 为 managed-nfs-storage
# 设置 redis 密码 password
# 修改集群架构 architecture,默认是主从(replication,3个节点),可以修改为 standalone 单机模式
# 修改实例存储大小 persistence.size 为需要的大小
# 修改 service.nodePorts.redis 向外暴露端口,范围 <30000-32767> 修改 service.type 为 NodePort 后自定义port
# 安装操作
# 创建命名空间
kubectl create namespace redis
# 安装
cd ../
helm install redis ./redis -n redis
# 查看 helm 安装列表
helm list
# 查看 redis 命名空间下所有对象信息
kubectl get all -n redis
NAME READY STATUS RESTARTS AGE
pod/redis-master-0 1/1 Running 0 10m
pod/redis-replicas-0 1/1 Running 0 10m
pod/redis-replicas-1 1/1 Running 0 9m20s
pod/redis-replicas-2 1/1 Running 0 7m53s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/redis-headless ClusterIP None <none> 6379/TCP 10m
service/redis-master ClusterIP 10.102.95.15 <none> 6379/TCP 10m
service/redis-replicas ClusterIP 10.104.192.164 <none> 6379/TCP 10m
NAME READY AGE
statefulset.apps/redis-master 1/1 10m
statefulset.apps/redis-replicas 3/3 10m
# 要想升级 chart 可以修改本地的 chart 配置并执行:
# helm upgrade [RELEASE] [CHART] [flags]
helm upgrade redis ./redis
# 使用 helm ls 的命令查看当前运行的 chart 的 release 版本,并使用下面的命令回滚到历史版本:
# helm rollback <RELEASE> [REVISION] [flags]
# 查看历史
helm history redis
# 回退到上一版本
helm rollback redis
# 回退到指定版本
helm rollback redis 1
# 卸载 redis
helm delete redis -n redis
chart 详解
[root@k8s-master ~]# helm create mychart # 创建一个chart 目录,目录结构如下
[root@k8s-master ~]# tree mychart/
mychart/ # Chart 目录
├── charts # 这个 charts 依赖的其他 charts,始终被安装
├── Chart.yaml # 描述这个 Chart 的相关信息、包括名字、描述信息、版本等
├── templates # 模板目录
│ ├── deployment.yaml # deployment 控制器的 Go 模板文件
│ ├── _helpers.tpl # 以 _ 开头的文件不会部署到 k8s 上,可用于定制通用信息
│ ├── hpa.yaml # hpa 的模板文件
│ ├── ingress.yaml # ingress 的模板文件
│ ├── NOTES.txt # Chart 部署到集群后的一些信息,例如:如何使用、列出缺省值
│ ├── serviceaccount.yaml # serviceaccount 的 Go 模板文件
│ ├── service.yaml # service 的 Go 模板文件
│ └── tests # 测试pod目录
│ └── test-connection.yaml # 测试pod的deployment文件
└── values.yaml # 模板的值文件,这些值会在安装时应用到 GO 模板生成部署文件