在没使用 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格式的单一文件,方便传输和存储)。
Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有三个重要的概念:Chart 、Repository 和 Release
PS:以 MySQL chart 为例,如果你想在你的集群中运行两个数据库,你可以安装该 chart 两次。每一个数据库都会拥有它自己的 release 和 release name。可以将 release 想象成应用程序发布的版本号。
在 Helm 中有两个主要的组件,即 Helm 客户端和 Tiller 服务器
Helm客户端
是一个供终端用户使用的命令行工具
客户端负责如下的工作:
本地 chart 开发
管理仓库
与 Tiller 服务器交互(发送需要被安装的 charts、请求关于发布版本的信息、请求更新或者卸载已安装的发布版本)
Tiller服务端
Tiller 是 helm 的服务器端,一般运行于 kubernetes 集群之上,定义 tiller 的 ServiceAccount,并通过 ClusterRoleBinding 将其绑定至集群管理员角色 cluster-admin,从而使得它拥有集群级别所有的最高权限
Tiller 服务器负责如下的工作:
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的权限
官方手册:https://helm.sh/zh/docs/
下载二进制 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)
#添加常用的 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
helm show chart stable/mysql #查看指定 chart 的基本信息
helm show all stable/mysql #获取指定 chart 的所有信息
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
#查询所有release
helm ls
helm list
#查看指定的 release 状态
helm status my-redis
helm uninstall my-redis
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软件包:
helm create nginx
tree nginx
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 的时候就自动生成的默认值,你可以根据实际情况进行修改。
vim nginx/Chart.yaml
vim nginx/values.yaml
#检查依赖和模板配置是否正确
helm lint nginx
#打包
helm package nginx
#使用 --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
再次修改values.yaml,测试升级
vim nginx/values.yaml
vim nginx/templates/service.yaml
升级
helm upgrade nginx nginx
#查看指定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 可以使用 harbor 作为本地仓库,将自定义的 chart 推送至 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 的地址是/chartrepo/<项目名称>,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。
#查看仓库地址
helm repo ls
cd /opt/helm
helm push nginx harbor