Helm 是 Deis 开发的一个用于Kubernetes
应用的包管理工具,主要用来管理 Charts
。有点相似 CentOS 中的 yum包管理工具。能够很方便的将以前打包的好的yaml
文件部署到Kubernetes
上。html
kubernetes上的应用对象,都是由特定的资源描述组成,包括deployment
、service
等,都保存各自文件中或集中写到一个配置文件中,而后经过kubectl apply -f ...
进行部署。node
若是应用只是一个或几个这样的服务组成,上面的部署方式足够了。而对于一个复杂的应用,会有不少相似上面的资源文件,例如为服务架构应用,组成应用的服务可能多达十个,几十个。若是有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源文件,而这种组织和管理应用的方式就显得力不从心。且因为缺乏对发布过的应用版本管理和空置,使Kubernetes
上的应用和更新等面临诸多的挑战。主要面临如下几个问题:mysql
kubernetes
应用配置文件。kubernetes
的应用配置。
✏️ helmlinux
Helm是一个命令行下的客户端工具,主要用于kubernetes
应用程序Chart
的建立、打包、发布和管理nginx
✏️ Tillerweb
Tiller 是 Helm 的服务端,部署在Kubernetes
集群中,Tiller 用于接收 Helm 的请求,并根据 Chart 生成 kubernetes 的部署文件(Helm称为Release),而后提交给 Kubernetes 建立应用,Tiller 还提供了 Release 的升级、删除、回滚等一系列功能sql
✏️ Chart数据库
Helm 的软件包,采用 TAR 格式,相似于 yum 的 rpm包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件json
✏️ Releaseubuntu
基于 Chart 部署实体,一个 chart 被 helm 运行后将会生成对应的一个 release;将在 kubernetes 中建立出真实运行的资源对象。
✏️ Repoistory
Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,而且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 能够同时管理多个不一样的 Repository。
下图描述了 Helm 的几个关键组件 Helm(客户端)、Tiller(服务器)、Repository(Chart软件仓库)、Chart(软件包)之间的关系。
Chart Install 过程
Chart Update 过程
Chart Rollback 过程
Chart 处理依赖说明
Tiller 在处理 Chart 时,直接将 Chart 以及其依赖的全部 Charts 合并为一个 Release,同时传递给 Kubernetes。所以 Tiller 并不负责管理依赖之间的启动顺序。Chart 中的应用须要可以自行处理依赖关系。
Helm2时期,添加了Tiller组件和GRPC来处理Helm chart的安装和管理,呈现chart并将它们推送到Kubernetes API服务器,2019年11月13日,Helm 团队发布了 Helm v3
的第一个稳定版本
架构变化
很明显从helm v3
移除了 Tiller
Helm 3新特性
Release
名称能够在不一样命名空间重用
支持将 Chart 推送至 Docker 镜像仓库中
使用JSONSchema验证chart values
其余特性以下
为了更好地协调其余包管理者的措辞 Helm CLI
个别改名
helm delete` 改名为 `helm uninstall helm inspect` 改名为 `helm show helm fetch` 改名为 `helm pull 但以上旧的命令当前仍能使用
移除了用于本地临时搭建 Chart Repository
的 helm serve
命令。
自动建立名称空间
在不存在的命名空间中建立发行版时,Helm 2建立了命名空间。Helm 3遵循其余Kubernetes对象的行为,若是命名空间不存在则返回错误。
再也不须要requirements.yaml
, 依赖关系是直接在chart.yaml
中定义。
helm 部署方式有不少,能够参考官方文档
1.下载helm
# wget https://mirrors.huaweicloud.com/helm/v2.16.9/helm-v2.16.9-linux-amd64.tar.gz
2.安装配置
# tar xvzf helm-v2.16.9-linux-amd64.tar.gz # cp -av linux-amd64/helm /usr/bin/ # cp -av linux-amd64/tiller /usr/bin/
3.指定配置文件(此步骤视状况而定,好比rke部署的k8s集群则须要;kubeadm部署的集群默认在master节点则不须要)
# vim /root/.bashrc alias helm='helm --kubeconfig /home/rancher/kube_config_cluster.yml' # source /root/.bashrc
4.在kube-system命名空间中建立serviceaccount
# kubectl create serviceaccount --namespace kube-system tiller
5.建立ClousterRoleBinding以授予tiller帐户对集群的访问权限
# kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts --namespace=kube-system:tiller
6.安装helm server(tiller),注意保持版本号相同
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.16.9 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts --force-upgrade
7.查看tiller服务是否正常运行
# kubectl get pod -n kube-system -l app=helm NAME READY STATUS RESTARTS AGE tiller-deploy-79f8998f84-85lwq 1/1 Running 0 45s
8.查看版本(注意:client和server版本必需要保持一致)
# helm version Client: &version.Version{SemVer:"v2.16.9", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.16.9", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
补充:若是须要在kubernetes
中卸载已部署的 Tiller, 可以使用以下命令进行卸载
# helm reset
helm v3
已经移除了tiller
,因此只须要部署helm客户端便可,即解压软件移动命令便可
# wget https://mirrors.huaweicloud.com/helm/v3.2.1/helm-v3.2.1-linux-amd64.tar.gz # tar xvzf helm-v3.2.1-linux-amd64.tar.gz # cp -av linux-adm64/helm /usr/bin/
命令 | 描述 |
---|---|
create | 建立一个chart并指定名字 |
dependency | 管理chart依赖 |
get | 下载一个release。可用子命令:all、hooks、manifest、notes、values |
history | 获取release历史 |
install | 安装一个chart |
list | 列出release |
package | 将chart目录打包到chart存档文件中 |
pull | 从远程仓库中下载chart并解压到本地 # helm pull stable/mysql --untar |
repo | 添加,列出,移除,更新和索引chart仓库。可用子命令:add、index、list、remove、update |
rollback | 从以前版本回滚 |
search | 根据关键字搜索chart。可用子命令:hub、repo |
show | 查看chart详细信息。可用子命令:all、chart、readme、values |
status | 显示已命名版本的状态 |
template | 本地呈现模板 |
uninstall | 卸载一个release |
upgrade | 更新一个release |
version | 查看helm客户端版本 |
经常使用仓库以下:
✏️ 添加仓库
添加微软仓库为 stable # helm repo add stable http://mirror.azure.cn/kubernetes/charts "stable" has been added to your repositories 添加阿里云仓库为 aliyun # helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts "aliyun" has been added to your repositories
✏️ 查看仓库
# helm repo list NAME URL stable http://mirror.azure.cn/kubernetes/charts aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
✏️ 查看一个仓库中全部的包
# helm search repo stable NAME CHART VERSION APP VERSION DESCRIPTION stable/acs-engine-autoscaler 2.2.2 2.1.1 DEPRECATED Scales worker nodes within agent pools stable/aerospike 0.3.2 v4.5.0.5 A Helm chart for Aerospike in Kubernetes stable/airflow 7.1.5 1.10.10 Airflow is a platform to programmatically autho... stable/ambassador 5.3.2 0.86.1 DEPRECATED A Helm chart for Datawire Ambassador stable/anchore-engine 1.6.9 0.7.2 Anchore container analysis and policy evaluatio...
✏️ 删除仓库
# helm repo remove aliyun "aliyun" has been removed from your repositories
这里示例经过helm部署一个MySQL进行示例
1.查找 chart
:
# helm search repo mysql NAME CHART VERSION APP VERSION DESCRIPTION stable/mysql 1.6.4 5.7.30 Fast, reliable, scalable, and easy to use open-... ......
2.查看下这个chart
的变量信息,这里将变量文件保存到本地,进行修改后再使用,这里咱们将persistence
中enabled
改成false
,表示不适用存储卷,查看变量文件能够发现会自动绑定pvc
,可是这里没有提早准备pv
,若是不修改也能够,先建立一个pv便可。
# helm show values stable/mysql > values.yaml # vim values.yaml persistence: enabled: false # 修改成false ## database data Persistent Volume Storage Class ## If defined, storageClassName: <storageClass> ## If set to "-", storageClassName: "", which disables dynamic provisioning ## If undefined (the default) or set to null, no storageClassName spec is ## set, choosing the default provisioner. (gp2 on AWS, standard on ## GKE, AWS & OpenStack) ## # storageClass: "-" accessMode: ReadWriteOnce size: 8Gi annotations: {}
3.经过helm install
进行安装,这里因为修改了values
,因此经过-f
指定了本地的values.yaml
文件
# helm install my-mysql -f values.yaml stable/mysql NAME: my-mysql LAST DEPLOYED: Sun Jun 21 13:35:04 2020 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: MySQL can be accessed via port 3306 on the following DNS name from within your cluster: my-mysql.default.svc.cluster.local To get your root password run: MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo) To connect to your database: 1. Run an Ubuntu pod that you can use as a client: kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il 2. Install the mysql client: $ apt-get update && apt-get install mysql-client -y 3. Connect using the mysql cli, then provide your password: $ mysql -h my-mysql -p To connect to your database directly from outside the K8s cluster: MYSQL_HOST=127.0.0.1 MYSQL_PORT=3306 # Execute the following command to route the connection: kubectl port-forward svc/my-mysql 3306 mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
4.查看状态
# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION my-mysql default 1 2020-06-21 13:38:32.133419251 +0800 CST deployed mysql-1.6.4 5.7.30 查看发布状态 # helm status my-mysql 查看pod状态 # kubectl get pods NAME READY STATUS RESTARTS AGE my-mysql-7557c5798c-lvshx 1/1 Running 0 35s
5.根据上面提示的查看密码,进行链接MySQL进行测试
# kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo i8MgJpwwZe # kubectl exec -it my-mysql-7557c5798c-lvshx -- mysql -u root -pi8MgJpwwZe ...... Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
上面变示例了经过helm部署一个应用(MySQL)。咱们也能够进行自行构建Chart
进行部署。
Chart 目录结构说明
mychart/ ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── hpa.yaml │ ├── ingress.yaml │ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml
📝 示例
1.首先经过create生成chart模板样式,进行修改便可,这里采用彻底自定义,因此咱们将用不到的yaml文件进行删除
# helm create mychart Creating mychart # tree mychart/ mychart/ ├── charts ├── Chart.yaml ├── templates └── values.yaml 2 directories, 2 files
2.修改Chart.yaml文件,定义版本和名字等
# cd mychart/ # vim Chart.yaml apiVersion: v2 name: mychart description: A Helm chart for Kubernetes type: application version: 0.1.0 appVersion: 1.16.0
3.这里部署经过部署一个web站点nginx进行示例,首先经过kubectl create 生产一个deployment 模板进行修改,下面yaml文件中将 副本数(replicas)、name、image定义为了变量进行传递
# kubectl create deployment deployment --image=nginx:1.12 --dry-run -o yaml > templates/deployment.yaml # vim templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: deployment name: {{ .Values.Name }} spec: replicas: {{ .Values.replicas }} selector: matchLabels: app: deployment template: metadata: labels: app: deployment spec: containers: - image: {{ .Values.image }} name: nginx
4.编写变量文件
# vim values.yaml Name: mychart-deploy-demo replicas: 3 image: nginx:1.18.0
其实上面这两个文件的内容就已经算是一个能够安装的chart包了。
5.进行安装
# helm install web mychart/ NAME: web LAST DEPLOYED: Sun Jun 21 17:50:53 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None # helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION my-mysql default 1 2020-06-21 17:15:24.316454342 +0800 CST deployed mysql-1.6.4 5.7.30 # kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mychart-deploy-demo-8475948ddd-565kk 1/1 Running 0 11s 10.244.1.35 k8s-node1 <none> <none> mychart-deploy-demo-8475948ddd-6d69h 1/1 Running 0 11s 10.244.2.33 k8s-node2 <none> <none> mychart-deploy-demo-8475948ddd-gvqqv 1/1 Running 0 11s 10.244.2.32 k8s-node2 <none> <none>
1.首先进行访问测试,能够看到访问结果nginx版本为1.18.0
# curl -I 10.244.1.35 HTTP/1.1 200 OK Server: nginx/1.18.0 Date: Sun, 21 Jun 2020 10:15:08 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 21 Apr 2020 12:43:12 GMT Connection: keep-alive ETag: "5e9eea60-264" Accept-Ranges: bytes
2.发布新版本的chart时,或者当要更改发布的配置时,可使用helm upgrade
命令,好比这里升级镜像为1.19.0
# helm upgrade --set image=nginx:1.19.0 web mychart Release "web" has been upgraded. Happy Helming! NAME: web LAST DEPLOYED: Sun Jun 21 18:20:10 2020 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None # kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mychart-deploy-demo-59fc9f9c7f-kk5mq 1/1 Running 0 15s 10.244.2.35 k8s-node2 <none> <none> mychart-deploy-demo-59fc9f9c7f-w94zq 1/1 Running 0 12s 10.244.2.36 k8s-node2 <none> <none> mychart-deploy-demo-59fc9f9c7f-x2pxg 1/1 Running 0 14s 10.244.1.39 k8s-node1 <none> <none> 访问测试 # curl -I 10.244.1.39 HTTP/1.1 200 OK Server: nginx/1.19.0 Date: Sun, 21 Jun 2020 10:26:16 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 26 May 2020 15:00:20 GMT Connection: keep-alive ETag: "5ecd2f04-264" Accept-Ranges: bytes
能够看到已经升级镜像版本为1.19.0版本,若是有大量的改动,那么能够修改values文件,而后经过以下命令进行更新
# helm upgrade -f values.yaml web mychart
若是在发布后没有达到预期的效果,则可使用helm rollback
回滚到以前的版本。经过helm history
命令能够查看发布版本记录
# helm history web REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Sun Jun 21 18:24:41 2020 superseded mychart-0.1.0 1.16.0 Install complete 2 Sun Jun 21 18:25:27 2020 deployed mychart-0.1.0 1.16.0 Upgrade complete
好比这里咱们要回滚到第一个版本:
# helm rollback web 1 Rollback was a success! Happy Helming!
在经过helm history
命令进行查看,能够看到后面的 DESCRIPTION还有详细版本说明。
# helm history web REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Sun Jun 21 18:24:41 2020 superseded mychart-0.1.0 1.16.0 Install complete 2 Sun Jun 21 18:25:27 2020 superseded mychart-0.1.0 1.16.0 Upgrade complete 3 Sun Jun 21 18:30:52 2020 deployed mychart-0.1.0 1.16.0 Rollback to 1
还能够经过helm get manifest
命令查看模板被渲染事后的资源文件
# helm get manifest web --- # Source: mychart/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: deployment name: mychart-deploy-demo spec: replicas: 3 selector: matchLabels: app: deployment template: metadata: labels: app: deployment spec: containers: - image: nginx:1.18.0 name: nginx
若是咱们须要将构建的Chart打包保存,并推送到charts仓库共享别人使用,则能够经过helm package
命令进行打包
# helm package mychart/ Successfully packaged chart and saved it to: /root/helm/mychart-0.1.0.tgz
有时候咱们须要安装应用,可是默认的chart的一些参数并非咱们须要的,这时候则须要咱们自定义参数传给已有的 chart 进行安装应用。示例,下面将进行自定义安装MySQL
# helm show values stable/mysql ...... ## Specify password for root user ## ## Default: random 10 character string # mysqlRootPassword: testing ## Create a database user ## # mysqlUser: ## Default: random 10 character string # mysqlPassword: ## Allow unauthenticated access, uncomment to enable ## # mysqlAllowEmptyPassword: true ## Create a database ## # mysqlDatabase: ...... persistence: enabled: true ......
在安装过程当中传递配置数据的方式有两种:
经过上面查看默认的变量中,咱们进行自定义MySQL root用户密码,并安装完成自动建立一个应用用户及设置密码,并建立一个应用数据库helm;同事设定了不启用persistence
# vim mysql_values.yaml mysqlRootPassword: te123 mysqlUser: helm mysqlPassword: helm123 mysqlDatabase: helm persistence: enabled: false
# helm install --set mysqlRootPassword=te123,mysqlUser=helm,mysqlPassword=helm123,mysqlDatabase=helm,persistence.enabled=false mysql-test stable/mysql
更多values yaml与set使用对应以下: