概述
Kubernetes 上的应用对象,都是由特定的资源描述组成,包括 Deployment、Service 等,都保存在各自的文件中或者集中写在一个配置文件,然后通过 kubectl apply -f
部署。
如果应用只由一个或几个这样的服务组成,上面的部署方式就足够了。
但是对于一个复杂的应用,会有很多类似上面的资源描述文件,如:微服务架构应用,组成应用的服务可能多达几十、上百个,如果有更新或回滚应用的需求,可能要修改和维护所涉及到大量的资源文件,而这种组织和管理应用的方式就显得力不从心了。并且由于缺少对发布过的应用进行版本管理和控制,使得 Kubernetes 上的应用维护和更新面临诸多的挑战,主要面临以下的问题:
-
- ① 如何将这些服务作为一个整体管理?
-
- ② 这些资源文件如何高效复用?
-
- ③ 应用级别的版本如何管理?
Helm 是 Kubernetes 的包管理工具,就像 Linux 下的包管理器,如:yum、apt 等,可以很方便的将之前打包好的 yaml 文件部署到 Kubernetes 上。
Helm 可以做以下的事情:
- 从头开始创建新的 chart
- 将 chart 打包成归档(tgz)文件
- 与存储 chart 的仓库进行交互
- 在现有的 Kubernetes 集群中安装和卸载 chart
- 管理与 Helm 一起安装的 chart 的发布周期
Helm 的三大概念
Chart
代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物。Repository(仓库)
是用来存放和共享 charts 的地方。它就像 Perl 的 CPAN 档案库网络 或是 Fedora 的 软件包仓库,只不过它是供 Kubernetes 包所使用的。Release
是运行在 Kubernetes 集群中的 chart 的实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release 。以 MySQL chart为例,如果你想在你的集群中运行两个数据库,你可以安装该 chart 两次。每一个数据库都会拥有它自己的 release 和 release name 。
Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。
可以类比 Docker 来理解,Chart 就类似于 Docker 中的镜像(Docker 中的镜像就是一系列文件的集合,Chart 也是一系列文件的集合),Repository(仓库)就类似于 Docker Hub,Release 就类似于 Docker 中的容器(可以根据镜像 run 多个容器)。
Helm 的安装
使用 Helm ,需要一个 Kubernetes 集群。对于 Helm 的最新版本,我们建议使用 Kubernetes 的最新稳定版, 在大多数情况下,它是倒数第二个次版本。
查看 Helm 和对应支持的 Kubernetes 版本:
下载额二进制文件:
wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
解压文件:
tar -zxvf helm-v3.10.2-linux-amd64.tar.gz
将解压目录下的 helm 程序移动到 usr/local/bin/helm:
mv linux-amd64/helm /usr/local/bin/helm
helm 命令补全:
helm completion bash | sudo tee /etc/bash_completion.d/helm > /dev/null
source /usr/share/bash-completion/bash_completion
添加阿里云 helm 仓库:
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
仓库管理
常用仓库:
-
微软仓库:http://mirror.azure.cn/kubernetes/charts,推荐。
-
阿里云仓库:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts。
添加 chart 仓库:
helm repo add 仓库名 仓库URL地址
# 如下
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
查看 chart 仓库列表:
helm repo list
# 如下
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
ingress-nginx https://kubernetes.github.io/ingress-nginx
从 chart 仓库中更新本地可用 chart 的信息:
helm repo update
# 更新从各自chart仓库中获取的有关 chart 的最新信息。信息会缓存在本地,被诸如 'helm search' 等命令使用。
删除 Chart 仓库:
helm repo remove 仓库名
# 如下
helm repo remove aliyun
Helm 的常用命令
命令 | 描述 |
---|---|
create | 创建一个chart并指定名字 |
dependency | 管理chart依赖 |
get | 下载一个release。可用的子命令:all、hooks、manifest、notes、values。 |
history | 获取release历史。 |
install | 安装一个chart。 |
list | 列出release。 |
package | 将chart目录打包到chart存档文件中。 |
pull | 从远程仓库中下载chart并解压到本地。比如:helm install stable/mysql --untar。 |
repo | 添加、列出、移除、更新和索引chart仓库。可用的子命令:add、index、list、remove、update。 |
rollback | 从之前的版本回退。 |
search | 根据关键字搜索chart。可用的子命令:all、chart、readme、values。 |
show | 查看chart的详细信息。可用的子命令:all、chart、readme、values。 |
status | 显示已命名版本的状态。 |
template | 本地呈现模板。 |
uninstall | 卸载一个release。 |
upgrade | 更新一个release。 |
version | 查看Helm客户端版本。 |
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 实践
- 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
- 搜索 redis chart
helm search repo redis
# 结果如下
NAME CHART VERSION APP VERSION DESCRIPTION
aliyun/redis 1.1.15 4.0.8 Open source, advanced key-value store. It is of...
aliyun/redis-ha 2.0.1 Highly available Redis cluster with multiple se...
bitnami/redis 18.0.1 7.2.0 Redis(R) is an open source, advanced key-value ...
bitnami/redis-cluster 9.0.1 7.2.0 Redis(R) is an open source, scalable, distribut...
stable/prometheus-redis-exporter 3.5.1 1.3.4 DEPRECATED Prometheus exporter for Redis metrics
stable/redis 10.5.7 5.0.7 DEPRECATED Open source, advanced key-value stor...
stable/redis-ha 4.4.6 5.0.6 DEPRECATED - Highly available Kubernetes implem...
aliyun/sensu 0.2.0 Sensu monitoring framework backed by the Redis ...
stable/sensu 0.2.5 0.28 DEPRECATED Sensu monitoring framework backed by...
DEPRECATED版本的一般是废弃的,不使用。
查看安装说明
helm show readme bitnami/redis
- 拉取chart并解压
helm pull bitnami/redis
tar -xvf redis-17.4.3.tgz
- 修改配置
修改 storageClass 为 managed-nfs-storage
设置 redis 密码 password
修改集群架构 architecture,默认是主从(replication,3个节点),可以修改为 standalone 单机模式
修改实例存储大小 persistence.size 为需要的大小
修改 service.nodePorts.redis 向外暴露端口,范围 <30000-32767>
- 创建命名空间
给他一个单独命名空间(方便管理,实际生产看情况):
kubectl create namespace redis
- 安装
cd ../
helm install redis ./redis -n redis
- 查看安装情况
# 查看 helm 安装列表
helm list
# 查看 redis 命名空间下所有对象信息
kubectl get all -n redis
- 卸载
helm delete redis -n redis
升级回滚
要想升级 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 3