kubernetes 核心技术-Helm

kubernetes 核心技术-Helm

一、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、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 客户端版本

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命令。

参考:
https://cloud.tencent.com/developer/article/1702139

评论

暂无

添加新评论