Helm从入门到实践

2022-11-21 19:20:23 浏览数 (1)

Helm 是 Kubernetes 的软件包管理工具。本文需要读者对 Docker、Kubernetes 等相关知识有一定的了解。 本文将介绍 Helm 中的相关概念和基本工作原理,并通过一些简单的示例来演示如何使用Helm来安装、升级、回滚一个 Kubernetes 应用。

Helm 是什么??

Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。

Helm 解决了什么痛点?

在 Kubernetes中部署一个可以使用的应用,需要涉及到很多的 Kubernetes 资源的共同协作。比如你安装一个 WordPress 博客,用到了一些 Kubernetes (下面全部简称k8s)的一些资源对象,包括 Deployment 用于部署应用、Service 提供服务发现、Secret 配置 WordPress 的用户名和密码,可能还需要 pv 和 pvc 来提供持久化服务。并且 WordPress 数据是存储在mariadb里面的,所以需要 mariadb 启动就绪后才能启动 WordPress。这些 k8s 资源过于分散,不方便进行管理,直接通过 kubectl 来管理一个应用,你会发现这十分蛋疼。 所以总结以上,我们在 k8s 中部署一个应用,通常面临以下几个问题:

  • 如何统一管理、配置和更新这些分散的 k8s 的应用资源文件
  • 如何分发和复用一套应用模板
  • 如何将应用的一系列资源当做一个软件包管理

Helm 相关组件及概念

Helm 包含两个组件,分别是 helm 客户端 和 Tiller 服务器:

  • helm 是一个命令行工具,用于本地开发及管理chart,chart仓库管理等
  • Tiller 是 Helm 的服务端。Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互,根据chart 来生成一个 release 并管理 release
  • chart Helm的打包格式叫做chart,所谓chart就是一系列文件, 它描述了一组相关的 k8s 集群资源
  • release 使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release
  • Repoistory Helm chart 的仓库,Helm 客户端通过 HTTP 协议来访问存储库中 chart 的索引文件和压缩包

Helm 原理

下面两张图描述了 Helm 的几个关键组件 Helm(客户端)、Tiller(服务器)、Repository(Chart 软件仓库)、Chart(软件包)之间的关系以及它们之间如何通信

helm 组件通信

helm 架构

创建release

  • helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
  • helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
  • Tiller 服务端根据 chart 和 values 生成一个 release
  • Tiller 将install release请求直接传递给 kube-apiserver

删除release

  • helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
  • helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
  • Tiller 服务端根据 chart 和 values 生成一个 release
  • Tiller 将delete release请求直接传递给 kube-apiserver

更新release

  • helm 客户端将需要更新的 chart 的 release 名称 chart 结构和 value 信息传给 Tiller
  • Tiller 将收到的信息生成新的 release,并同时更新这个 release 的 history
  • Tiller 将新的 release 传递给 kube-apiserver 进行更新

chart 的基本结构

Helm的打包格式叫做chart,所谓chart就是一系列文件, 它描述了一组相关的 k8s 集群资源。Chart中的文件安装特定的目录结构组织, 最简单的chart 目录如下所示:

  • charts 目录存放依赖的chart
  • Chart.yaml 包含Chart的基本信息,包括chart版本,名称等
  • templates 目录下存放应用一系列 k8s 资源的 yaml 模板
  • _helpers.tpl 此文件中定义一些可重用的模板片断,此文件中的定义在任何资源定义模板中可用
  • NOTES.txt 介绍chart 部署后的帮助信息,如何使用chart等
  • values.yaml 包含了必要的值定义(默认值), 用于存储 templates 目录中模板文件中用到变量的值

helm安装

环境要求

  • 可用的 Kubernetes 集群
  • 正确的可用的 kubectl config

简单做法

只要一个简单的 helm init 命令,就可以自动完成 Tiller 的安装,以及 Helm 本地设置。

安装docker

安装Kubernetes单节点

kubernetes单节点与集群唯一不一样的就是不需要其他node加入集群,然后把master节点的污点去掉,因为默认master是不允许被调度启动pods的

代码语言:javascript复制
# kubectl taint nodes --all node-role.kubernetes.io/master-

Helm-cli

Helm Client 是用户命令行工具,其主要负责如下:

  • 本地 chart 开发
  • 仓库管理
  • 与 Tiller sever 交互
  • 发送预安装的 chart
  • 查询 release 信息
  • 要求升级或卸载已存在的 release

在安装Helm之前要保证有一个完整的Kubernetes集群在正常运行。

安装方式有很多,具体参考官网安装文档,这里只是tar的安装方法。

下载helm的安装包

在该链接的Installation and Upgrading部分的链接是下载tar.gz包的链接,我这里选则的版本是这个

代码语言:javascript复制
# tar zxf helm-v3.4.2-linux-amd64.tar.gz

安装helm,其实主要就是要这个命令的脚本即可,所以解压缩之后,将helm命令脚本复制到系统中的命令可执行环境变量的目录中即可

大多数情况下,安装只需要简单地获取一个构建好的helm二进制包

代码语言:javascript复制
# mv linux-amd64/helm /usr/local/bin/helm

Helm-tiller(服务端)

Tiller Server是一个部署在Kubernetes集群内部的 server,其与 Helm client、Kubernetes API server 进行交互。Tiller server 主要负责如下:

  • 监听来自 Helm client 的请求
  • 通过 chart 及其配置构建一次发布
  • 安装 chart 到Kubernetes集群,并跟踪随后的发布
  • 通过与Kubernetes交互升级或卸载 chart
  • 简单的说,client 管理 charts,而 server 管理发布 release

本身服务端需要运行命令helm init进行部署安装,但在3.x之后被移除,如果使用的helm版本为2.x,请参考Helm初始化文档

Helm的使用

仓库

helm的使用是需要使用仓库的,就像docker和kubernetes一样,需要从仓库中拉取作者创建好的模板文件为己用

仓库 是归集和分享chart的地方。只针对于Kubernetes包。

添加chart仓库,常见的选择是helm的官方仓库,如下:

格式: ​ 添加:helm repo add [NAME] [URL] ​ 删除: helm repo remove [NAME]

代码语言:javascript复制
# helm repo add stable https://charts.helm.sh/stable
"stable" has been added to your repositories
阿里云:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
微软:http://mirror.azure.cn/kubernetes/charts

helm search

Helm有强大的搜索命令。可以搜索两类不同资源:

helm search hub 搜索 Artifact Hub,该仓库列出了来自不同仓库的大量chart。

代码语言:javascript复制
# helm search hub
URL                                         CHART VERSION                APP VERSION                        DESCRIPTION                                       
https://hub.helm.sh/charts/gabibbo97/389ds  0.1.0                        fedora-32                          389 Directory Server                              
https://hub.helm.sh/charts/aad-pod...        3.0.0                        1.7.1                              Deploy components for aad-pod-identity            
https://hub.helm.sh/charts/arhatdev/abbot   0.1.0                        latest                             Network Manager Living at Edge
# ... and many more

helm search repo 搜索已经(用 helm repo add)加入到本地helm客户端的仓库。该命名只搜索本地数据,不需要连接网络。

代码语言:javascript复制
# helm search repo
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.5            v4.5.0.5                   DEPRECATED A Helm chart for Aerospike in Kubern...
stable/airflow                           7.13.3           1.10.12                    DEPRECATED - please use: https://github.com/air...
# ... and many more

指定本地仓库

代码语言:javascript复制
# helm search repo [仓库名]

仓库模糊查找

Helm搜索使用字符串模糊匹配,因此输入部分名称也可以

代码语言:javascript复制
# helm search repo sql
NAME                           CHART VERSION    APP VERSION    DESCRIPTION                                       
stable/gcloud-sqlproxy         0.6.1            1.11           DEPRECATED Google Cloud SQL Proxy                 
stable/mssql-linux             0.11.4           14.0.3023.8    DEPRECATED - SQL Server 2017 Linux Helm Chart     
stable/mysql                   1.6.9            5.7.30         DEPRECATED - Fast, reliable, scalable, and easy...
# ... and many more

helm install

使用search搜到到可以用包之后,即可使用helm install安装

最简单的方式有两个参数:查找到发布名称和chart名称。

现在找一个数据库来部署

代码语言:javascript复制
[root@t10 ~]# helm search repo mysql
NAME                  CHART VERSION    APP VERSION          DESCRIPTION       
...
stable/mariadb        7.3.14           10.3.22              DEPRECATED Fast, reliable, scalable, and easy t...

发布名称自定义,chart名称为search看到的名称stable/mariadb

格式:helm install [发布名称] [chart名称]

代码语言:javascript复制
# helm install happy-panda stable/mariadb
WARNING: This chart is deprecated
NAME: happy-panda
LAST DEPLOYED: Mon Dec 28 11:23:42 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
This Helm chart is deprecated

Given the `stable` deprecation timeline (https://github.com/helm/charts#deprecation-timeline), the Bitnami maintained Helm chart is now located at bitnami/charts (https://github.com/bitnami/charts/).

The Bitnami repository is already included in the Hubs and we will continue providing the same cadence of updates, support, etc that we've been keeping here these years. Installation instructions are very similar, just adding the _bitnami_ repo and using it during the installation (`bitnami/<chart>` instead of `stable/<chart>`)

​```bash
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm install my-release bitnami/<chart>           # Helm 3
$ helm install --name my-release bitnami/<chart>    # Helm 2
​```

To update an exisiting _stable_ deployment with a chart hosted in the bitnami repository you can execute

​```bash
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm upgrade my-release bitnami/<chart>
​```

Issues and PRs related to the chart itself will be redirected to `bitnami/charts` GitHub repository. In the same way, we'll be happy to answer questions related to this migration process in this issue (https://github.com/helm/charts/issues/20969) created as a common place for discussion.

Please be patient while the chart is being deployed

Tip:

  Watch the deployment status using the command: kubectl get pods -w --namespace default -l release=happy-panda

Services:

  echo Master: happy-panda-mariadb.default.svc.cluster.local:3306
  echo Slave:  happy-panda-mariadb-slave.default.svc.cluster.local:3306

Administrator credentials:

  Username: root
  Password : $(kubectl get secret --namespace default happy-panda-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)

To connect to your database:

  1. Run a pod that you can use as a client:

      kubectl run happy-panda-mariadb-client --rm --tty -i --restart='Never' --image  docker.io/bitnami/mariadb:10.3.22-debian-10-r27 --namespace default --command -- bash

  2. To connect to master service (read/write):

      mysql -h happy-panda-mariadb.default.svc.cluster.local -uroot -p my_database

  3. To connect to slave service (read-only):

      mysql -h happy-panda-mariadb-slave.default.svc.cluster.local -uroot -p my_database

To upgrade this helm chart:

  1. Obtain the password as described on the 'Administrator credentials' section and set the 'rootUser.password' parameter as shown below:

      ROOT_PASSWORD=$(kubectl get secret --namespace default happy-panda-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)
      helm upgrade happy-panda stable/mariadb --set rootUser.password=$ROOT_PASSWORD

现在mariadb的chart已经安装。上述发布的名称是:happy-panda。 (如果想让Helm为你生成一个名称,去掉发布名称并加上–generate-name)

如:helm install stable/mariadb --generate-name

安装方法

代码语言:javascript复制
本地chart包: helm install foo foo-0.1.1.tgz
解压的chart目录: helm install foo path/to/foo
完整URL: helm install foo https://example.com/charts/foo-1.2.3.tgz

helm list

查看发布后的chart

代码语言:javascript复制
# helm list
NAME          NAMESPACE    REVISIO  UPDATED                                    STATUS      CHART             APP VERSION
happy-panda   default      1        2020-12-28 13:10:44.016697442 -0500 EST    deployed    mariadb-7.3.14    10.3.22  

helm status

使用helm status,可以查看chart发布的状态或者配置信息

格式:helm status [发布名称]

代码语言:javascript复制
# helm status happy-panda
# 输出的内容和刚install结束的内容是一样的

helm show values

以上的安装使用了chart的所有默认配置,也可以对配置进行自定义,首先通过helm show values命令查看chart的可配置项

格式:helm show values [chart名称]

代码语言:javascript复制
# helm show values stable/mariadb


## Global Docker image parameters
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
## Current available global Docker image parameters: imageRegistry and imagePullSecrets
##
# global:
#   imageRegistry: myRegistryName
#   imagePullSecrets:
#     - myRegistryKeySecretName
#   storageClass: myStorageClass

## Use an alternate scheduler, e.g. "stork".
## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
##
# schedulerName:

## Bitnami MariaDB image
## ref: https://hub.docker.com/r/bitnami/mariadb/tags/
##
image:
  registry: docker.io
  repository: bitnami/mariadb
  tag: 10.3.22-debian-10-r27
...

通过yaml文件覆盖默认配置

代码语言:javascript复制
# echo '{mariadbUser: user0, mariadbDatabase: user0db}' > config.yaml
# helm install -f config.yaml stable/mariadb --generate-name

mariadbUser和mariadbDatabase分别是mariadb数据库里面的用户和数据库,以上更改意思是创建了数据库新用户user0,和创建了新数据库user0db,且该用户拥有user0db数据库的访问权限。

通过命令行覆盖默认配置

代码语言:javascript复制
# helm install --set name=value stable/mariadb --generate-name
name: value
# 多个值用','分割
# helm install --set a=b,c=d stable/mariadb --generate-name
a: b
c: d
# 负载表达式
# helm install --set outer.inner=value stable/mariadb --generate-name
outer:
  inner: value
# 列表配置
# helm install --set name={a, b, c} stable/mariadb --generate-name
name:
  - a
  - b
  - c
# 数组索引
# helm install --set servers[0].port=80 stable/mariadb --generate-name
servers:
  - port: 80
# 数组索引 负载
# helm install --set servers[0].port=80,servers[0].host=example --generate-name
servers:
  - port: 80
    host: example
# 一个变量多个值
# helm install --set name=value1,value2 --generate-name
name: "value1,value2"

–set指定的值会被helm upgrade运行时–reset-values指定的值清空。

实例更改标签选择

代码语言:javascript复制
# helm install --set nodeSelector."kubernetes.io/role"=master --generate-name
nodeSelector:
  kubernetes.io/role: master

helm upgrade

当chart新版本发布时,或者您想改变发布的配置,可以使用 helm upgrade 命令。

升级采用已有版本并根据您提供的信息进行升级。由于Kubernetes的chart会很大且很复杂,Helm会尝试执行最小增量升级。 这样只会升级自最新版发生改变的部分。

格式和install使用文件替换默认配置的方法类似

格式:helm upgrade -f [yaml文件名] [发布名称] [chart名称]

代码语言:javascript复制
# vim config.yaml 
mariadbUser: cyj
# helm upgrade -f config.yaml happy-panda stable/mariadb
...

查看发布的更新内容是否生效

代码语言:javascript复制
# helm get values happy-panda
USER-SUPPLIED VALUES:
mariadbUser: cyj

helm rollback

如果发现更新出现了问题,可以使用helm rollback进行回滚

通过helm hist [发布名称]查看版本

代码语言:javascript复制
# helm hist happy-panda
REVISION    UPDATED                     STATUS        CHART             APP VERSION    DESCRIPTION     
1           Mon Dec 28 11:23:42 2020    superseded    mariadb-7.3.14    10.3.22        Install complete
2           Mon Dec 28 11:59:13 2020    deployed      mariadb-7.3.14    10.3.22        Upgrade complete

格式:helm rollback [发布名称] REVISION

代码语言:javascript复制
# helm rollback happy-panda 1
Rollback was a success! Happy Helming!
# helm hist happy-panda
REVISION    UPDATED                     STATUS        CHART             APP VERSION    DESCRIPTION     
1           Mon Dec 28 11:23:42 2020    superseded    mariadb-7.3.14    10.3.22        Install complete
2           Mon Dec 28 11:59:13 2020    superseded    mariadb-7.3.14    10.3.22        Upgrade complete
3           Mon Dec 28 12:08:22 2020    deployed      mariadb-7.3.14    10.3.22        Rollback to 1 

helm uninstall

从集群中卸载发布,使用helm uninstall

格式:helm uninstall [发布名称]

代码语言:javascript复制
# helm uninstall happy-panda
release "happy-panda" uninstalled

0 人点赞