文章目录
一. Helm 概述
1.1 Helm 简介@H_404_75@
在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。 况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm 通过打包的方式,支持发布的版本管理和控制, 很大程度上简化了 Kubernetes 应用的部署和管理。
Helm 本质就是让 K8s 的应用管理(Deployment、Service 等)可配置,可以通过类似于传递环境变量的方式能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml、service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署。
我们可以将Helm看作Kubernetes下的apt-get/yum。Helm是Deis (https://deis.com/) 开发的一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储)。
1.2 Helm重要概念@H_404_75@
Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有三个重要的概念:Chart 、Repository 和 Release
- Chart:Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。
- Repository(仓库):Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
- Release:使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。可以理解为 Helm 使用 Chart 包部署的一个应用实例。一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。
PS:以 MysqL chart 为例,如果你想在你的集群中运行两个数据库,你可以安装该 chart 两次。每一个数据库都会拥有它自己的 release 和 release name。可以将 release 想象成应用程序发布的版本号。
1.3Helm2 组件@H_404_75@
在 Helm 中有两个主要的组件,即 Helm 客户端和 Tiller 服务器
-
本地 chart 开发
-
管理仓库
-
与 Tiller 服务器交互(发送需要被安装的 charts、请求关于发布版本的信息、请求更新或者卸载已安装的发布版本)
-
Tiller服务端
Tiller 是 helm 的服务器端,一般运行于 kubernetes 集群之上,定义 tiller 的 ServiceAccount,并通过 ClusterRoleBinding 将其绑定至集群管理员角色 cluster-admin,从而使得它拥有集群级别所有的最高权限
Tiller 服务器负责如下的工作:
- 监听来自于 Helm 客户端的请求
- 组合 chart 和配置来构建一个发布
- 在 Kubernetes 中安装,并跟踪后续的发布
- 通过与 Kubernetes 交互,更新或者 chart
1.4Helm2 工作原理@H_404_75@
- Chart Install 过程:
- Helm从指定的目录或者tgz文件中解析出Chart结构信息
- Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
- Tiller根据Chart和Values生成一个Release
- Tiller将Release发送给Kubernetes用于生成Release
- Chart Update过程:
- Helm从指定的目录或者tgz文件中解析出Chart结构信息
- Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
- Tiller生成Release并更新指定名称的Release的History
- Tiller将Release发送给Kubernetes用于更新Release
- Chart Rollback过程:
- Helm将要回滚的Release的名称传递给Tiller
- Tiller根据Release的名称查找History
- Tiller从History中获取上一个Release
- Tiller将上一个Release发送给Kubernetes用于替换当前Release
1.5 Helm2与Helm3区别@H_404_75@
Helm2 是 C/S 架构,主要分为客户端 helm 和服务端 Tiller。在 Helm 2 中,Tiller 是作为一个 Deployment 部署在 kube-system 命名空间中,很多情况下,我们会为 Tiller 准备一个 ServiceAccount ,这个 ServiceAccount 通常拥有集群的所有权限。
用户可以使用本地 Helm 命令,自由地连接到 Tiller 中并通过 Tiller 创建、修改、删除任意命名空间下的任意资源。
在 Helm 3 中,Tiller 被移除了。新的 Helm 客户端会像 kubectl 命令一样,读取本地的 kubeconfig 文件,使用我们在 kubeconfig 中预先定义好的权限来进行一系列操作。
Helm3使得我们在使用的时候更加的方便,无需另外为Helm配置任何k8s的权限
二.Helm部署
下载二进制 Helm client 安装包:https://github.com/helm/helm/releases?page=2
我这儿使用的是3.6.0的版本
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm version
#命令补全
source <(helm completion bash)
三.Helm常用命令
3.1 chart仓库管理@H_404_75@
#添加常用的 chart 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo add incubator https://charts.helm.sh/incubator
#更新仓库、列表
helm repo update
helm repo list
#添加常用的 chart 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo add incubator https://charts.helm.sh/incubator
#更新仓库、列表
helm repo update
helm repo list
#查看 stable 仓库可用的 charts 列表,类似于yum list
helm search repo stable
#删除 incubator 仓库
helm repo remove incubator
3.2 查看 chart信息@H_404_75@
helm show chart stable/MysqL #查看指定 chart 的基本信息
helm show all stable/MysqL #获取指定 chart 的所有信息
helm show chart stable/MysqL #查看指定 chart 的基本信息
helm show all stable/MysqL #获取指定 chart 的所有信息
3.3 安装chart@H_404_75@
helm install my-redis bitnami/redis [-n default]
#指定 release 的名字为 my-redis,-n指定部署到k8s的namespace,若不指定则为默认名称空间
helm install bitnami/redis --generate-name
#不指定 release 的名字时,需使用 –generate-name 随机生成一个名字
helm install my-redis bitnami/redis [-n default]
#指定 release 的名字为 my-redis,-n指定部署到k8s的namespace,若不指定则为默认名称空间
helm install bitnami/redis --generate-name
#不指定 release 的名字时,需使用 –generate-name 随机生成一个名字
#查看安装信息
kubectl get pod,svc
3.4 查询release@H_404_75@
#查询所有release
helm ls
helm list
#查看指定的 release 状态
helm status my-redis
#查询所有release
helm ls
helm list
#查看指定的 release 状态
helm status my-redis
3.5 删除 release@H_404_75@
helm uninstall my-redis
helm uninstall my-redis
四.Heml自定义模板
4.1 chart包@H_404_75@
charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s。
mkdir /opt/helm
cd /opt/helm
helm pull stable/MysqL
tar xf MysqL-1.6.9.tgz
yum install -y tree
tree MysqL
可以看到,一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称。
chart 是包含至少两项内容的helm软件包:
- NOTES.txt:chart 的“帮助文本”,在用户运行 helm install 时显示给用户
- deployment.yaml:创建 deployment 的资源清单文件
- service.yaml:为 deployment 创建 service 的资源清单文件
- ingress.yaml: 创建 ingress 对象的资源清单文件
- _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用
4.2 创建自定义chart@H_404_75@
4.2.1 chart文件介绍
helm create Nginx
tree Nginx
helm create Nginx
tree Nginx
查看deploment
cat Nginx/templates/deployment.yaml
在 templates 目录下 yaml 文件模板中的变量(go template语法)的值默认是在 Nginx/values.yaml 中定义的,只需要修改 Nginx/values.yaml 的内容,也就完成了 templates 目录下 yaml 文件的配置。
查看values
cat Nginx/values.yaml | grep repository
以上变量值是在 create chart 的时候就自动生成的默认值,你可以根据实际情况进行修改。
4.2.2 修改 chart
vim Nginx/Chart.yaml
vim Nginx/values.yaml
4.2.3 打包chart
#检查依赖和模板配置是否正确
helm lint Nginx
#打包
helm package Nginx
4.2.4 部署chart
#使用 --dry-run 参数验证 Chart 的配置,并不执行安装
helm install Nginx ./Nginx --dry-run --debug
#安装,若需指定名称空间,使用-n
helm install Nginx ./Nginx-0.1.0.tgz
测试:
需要安装ingress-Nginx,具提操作请看上篇文章
wget https://gitee.com/mirrors/ingress-Nginx/raw/Nginx-0.30.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-Nginx/raw/Nginx-0.30.0/deploy/static/provider/bareMetal/service-nodeport.yaml
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml
编写测试文件
kubectl get pod
kubectl exec -it Nginx-657bdbb8d4-st4x6 bash
echo "this is helm chart" > /usr/share/Nginx/html/index.html
主机域名映射
echo "192.168.48.14 www.xiayan.com" >> /etc/hosts
访问测试:
#获取ingress映射的端口
kubectl get svc -n ingress-Nginx
4.3 升级chart@H_404_75@
再次修改values.yaml,测试升级
vim Nginx/values.yaml
vim Nginx/templates/service.yaml
升级
helm upgrade Nginx Nginx
访问测试:
4.4 回滚@H_404_75@
#查看指定chart的历史版本
helm history Nginx
#回滚到指定版本
helm rollback Nginx 1
#查看指定chart的历史版本
helm history Nginx
#回滚到指定版本
helm rollback Nginx 1
通常情况下,在配置好 templates 目录下的 kubernetes 清单文件后,后续维护一般只需要修改 Chart.yaml 和 values.yaml 即可。
在命令行使用 --set 指定参数来部署(install,upgrade)release
注:此参数值会覆盖掉在 values.yaml 中的值,如需了解其它的预定义变量参数,可查看 helm 官方文档。
helm upgrade Nginx Nginx --set image.tag='1.15'
五.Helm仓库
helm 可以使用 harbor 作为本地仓库,将自定义的 chart 推送至 harbor 仓库。
- 安装harbor
#上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录
cd /opt
cp docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose
tar zxf harbor-offline-installer-v1.9.1.tgz
cd harbor
vim harbor.yml
hostname: 192.168.48.14
harbor_admin_password: Harbor12345
data_volume: /data #数据存储路径,自动创建
chart:
absolute_url: enabled #在chart中启用绝对url
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor #日志路径
#安装带有 Clair service 和 chart 仓库服务的 Harbor
./install.sh --with-clair --with-chartmuseum
安装 push 插件
#在线安装
helm plugin install https://github.com/chartmuseum/helm-push
#离线安装
wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz
mkdir ~/.local/share/helm/plugins/helm-push
tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push
登录 Harbor WEB UI 界面,创建一个新项目
浏览器访问:http://192.168.48.14 ,默认的管理员用户名和密码是 admin/Harbor12345
点击 “+新建项目” 按钮
填写项目名称为 “chart_repo”,访问级别勾选 “公开”,点击 “确定” 按钮,创建新项目
添加仓库
helm repo add harbor http://192.168.48.14/chartrepo/chart_repo --username=admin --password=Harbor12345
#这里的 repo 的地址是<Harbor URL>/chartrepo/<项目名称>,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。
#查看仓库地址
helm repo ls
推送 chart 到 harbor 中
cd /opt/helm
helm push Nginx harbor
在Harbor仓库查看 chart_repo 项目中的 Helm Charts
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。