一、Helm 引入
K8S 上的应用对象,都是由特定的资源描述组成,包括 deployment、service 等。都保存各自文件中或者集中写到一个配置文件。然后 kubectl apply –f
部署。
如果应用只由一个或几个这样的服务组成,上面部署方式足够了。而对于一个复杂的应用,会有很多类似上面的资源描述文件,例如微服务架构应用,组成应用的服务可能多达十个,几十个。如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源文件,而这种组织和管理应用的方式就显得力不从心了。且由于缺少对发布过的应用版本管理和控制,使 Kubernetes 上的应用维护和更新等面临诸多的挑战,主要面临以下问题:
- 如何将这些服务作为一个整体管理。
- 这些资源文件如何高效复用。
- 不支持应用级别的版本管理。
二、Helm
Helm 是一个 Kubernetes 的包管理工具
,就像 Linux 下的包管理器,如 yum/apt 等,可以很方便的将之前打包好的 yaml 文件部署到 kubernetes 上。
Helm 有 3 个重要概念:
- helm:一个命令行客户端工具,主要用于 Kubernetes 应用 chart 的创建、打包、发布和管理。
- Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。
- Release:基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个release;将在 k8s 中创建出真实运行的资源对象。
2.1、Helm 作用
使用 helm 可以这些 yaml 文件作为一个整体管理。
实现 yaml 高效复用。
使用 helm 应用级别的版本管理。
2.2、Helm v3 变化
2019 年 11 月 13 日, Helm 团队发布 Helm v3 的第一个稳定版本。该版本主要变化如下:
架构变化:
- 最明显的变化是 Tiller 的删除。
- Release 名称可以在不同命名空间重用。
- 支持将 Chart 推送至 Docker 镜像仓库中。
- 使用 JSONSchema 验证 chart values。
- 其他。
2.3、Helm 客户端安装
1、下载 Helm 安装包
Helm 客户端下载地址:https://github.com/helm/helm/releases
[root@kubernetes-master-001 ~]# cd /data/software/
[root@kubernetes-master-001 /data/software]# wget https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz
2、解压安装包
[root@kubernetes-master-001 /data/software]# tar xf helm-v3.7.1-linux-amd64.tar.gz -C /opt/
[root@kubernetes-master-001 /data/software]# cd /opt/
[root@kubernetes-master-001 /opt]# ll
total 0
drwxr-xr-x 2 3434 3434 50 Oct 14 04:09 linux-amd64
3、配置环境变量
#1.配置环境变量
[root@kubernetes-master-001 /opt]# vim /etc/profile.d/helm.sh
export PATH=/opt/linux-amd64:$PATH
#2.刷新环境变量
[root@kubernetes-master-001 /opt]# source /etc/profile.d/helm.sh
4、验证 helm
[root@kubernetes-master-001 /opt]# helm version
version.BuildInfo{Version:"v3.7.1", GitCommit:"1d11fcb5d3f3bf00dbe6fe31b8412839a96b3dc4", GitTreeState:"clean", GoVersion:"go1.16.9"}
2.4、Helm常用命令
create
创建一个 chart 并指定名字dependency
管理 chart 依赖get
下载一个 release。可用子命令:all、hooks、manifest、notes、valueshistory
获取 release 历史install
安装一个 chartlist
列出 releasepackage
将 chart 目录打包到 chart 存档文件中pull
从远程仓库中下载 chart 并解压到本地 # helm pull stable/mysql -- untarrepo
添加,列出,移除,更新和索引 chart 仓库。可用子命令:add、index、 list、remove、updaterollback
从之前版本回滚search
根据关键字搜索 chart。可用子命令:hub、reposhow
查看 chart 详细信息。可用子命令:all、chart、readme、valuesstatus
显示已命名版本的状态template
本地呈现模板uninstall
卸载一个 releaseupgrade
更新一个 releaseversion
查看 helm 客户端版本
2.5、配置国内chart仓库
1、常用国内仓库
微软仓库(http://mirror.azure.cn/kubernetes/charts/)这个仓库推荐,基本上官网有的 chart 这里都有。
阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts)
官方仓库(https://hub.kubeapps.com/charts/incubator)官方 chart 仓库,国内有点不好使。
2、添加存储库
helm repo add azure http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
[root@kubernetes-master-001 /opt]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "aliyun" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
3、查看配置的存储库
#1.查看配置的存储库
helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#2.查看配置存储库的服务清单
helm search repo stable
4、删除存储库
#1.查看存储库
[root@kubernetes-master-001 /opt]# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#2.删除存储库aliyun
[root@kubernetes-master-001 /opt]# helm repo remove aliyun
"aliyun" has been removed from your repositories
#3.再次查看存储库
[root@kubernetes-master-001 /opt]# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts
2.6、Helm 基本使用
主要三个命令:
- chart install
- chart upgrade
- chart rollback
2.7、使用 helm 部署一个应用
部署 weave 界面
$ export KUBERNETES_MASTER=http://127.0.0.1:8080
$ helm search repo weave
$ helm install k8s-ui azure/weave-scope
$ helm list #列出helm部署应用
$ helm status k8s-ui #查看状态
#如果要浏览器本地访问,需要设置svc为NodePort
部署 mysql
$ helm search repo mysql
$ helm install db azure/mysql #这样不能成功,因为mysql需要pv,所以一直处于pending状态
$ cat pv01.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01
spec:
capacity:
storage: 16Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
nfs:
path: /ifs/kubernetes/pv01
server: 192.168.56.14
$ kubectl apply -f pv01.yml
$ kubectl run mysql-client -it --rm --image=mysql:5.7 -- bash #测试数据库
mysql -h db1-mysql -pdSt9QIYNGF
查看 chart 的 values 和 values 设置
$ helm show values azure/mysql #查看values
$ helm pull azure/mysql --untar #可以直接下载chart之后再看
$ helm install db1 --set persistence.storageClass="managed-nfs-storage" azure/mysql
$ kubectl get secret --namespace default db-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo #获取登陆密码
dSt9QIYNGF
values yaml与set使用:
$ helm pull azure/mysql --untar && cat mysql/values.yml
persistence:
enabled: true
## 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: {}
$ helm install db2 --set persistence.storageClass="managed-nfs-storage" azure/mysql #指定存储类部署
$ vim values.yml
persistence:
enabled: true
storageClass: "managed-nfs-storage"
accessMode: ReadWriteOnce
size: 8Gi
annotations: {}
mysqlUser: ops
mysqlPassword: "Qwer1234@"
mysqlDatabase: "opsDB"
$ helm install db3 azure/mysql -f values.yml # 根据values指定参数创建
$ kubectl exec -it mysql-client -- bash #测试创建信息
root@mysql-client:/# mysql -h db3-mysql -pE1ihmKspOL
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.7.30 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| opsDB |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
创建一个 helm chart
$ cd ~/lesson/helm/
$ helm create mychart
$ tree mychart/
mychart/
├── charts #目录里存放这个chart依赖的所有子chart。
├── Chart.yaml #用于描述这个 Chart的基本信息,包括名字、描述信息以及版本等。
├── templates #目录里面存放所有yaml模板文件。
│ ├── deployment.yaml
│ ├── _helpers.tpl #放置模板助手的地方,可以在整个 chart 中重复使用
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt #用于介绍Chart帮助信息, helm install 部署后展示给用户。例如:如何使用这个 Chart、列出缺省的设置等。
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml #用于存储 templates 目录中模板文件中用到变量的值。
$ helm install web1 mychart #直接部署
打包推送的 charts 仓库共享别人使用。
$ helm package mychart
Successfully packaged chart and saved it to: /root/lesson/helm/mychart-0.1.0.tgz
升级,回滚和删除
发布新版本的chart时,或者当您要更改发布的配置时,可以使用该helm upgrade
命令。
评论