开始接触Kubernetes的技术人员都知道,如果要在Kubernetes集群中进行部署应用,需要去自己手动去写yaml文件来启动pod,每个应用可能会需要不止一两种的资源类型,如:service/deployment/pod/PV/PVC等等,使得在Kubernetes集群中部署应用很繁琐,要写很多的yaml文件,也成了新一代运维的掉发新方法

当正常使用Kubernetes手动部署一个应用,要去写多个yaml文件去定义资源,如何把这些文件去集中管理,把众多文件作为一个应用去管理,Helm就可以接近这些问题。

介绍

Helm是Kubernetes的包管理器,就像centos的yum,或者ubuntu的apt,这两种是Linux下的包管理工具,Helm和这两种工具类似,应用开发者可以管理应用包之间的依赖关系,发布应用;用户则可以以简单的方式查找、安装、升级、卸载等操作Kubernetes中的应用。

对于应用发布者,可以通过Helm将上面提到的问题,也就是将同一应用的多个yaml文件打包为一个应用,管理依赖关系、版本并发布应用到软件仓库。

对于接触Kubernetes不深的使用者,可以不用去过多的理解yaml的语言结构去手动编写文件,可以通过Helm下载相关应用的chart,并在Kubernetes上部署即可。

Helm还提供了Kubernetes上的软件部署、删除、升级、回滚应用的强大功能。

组件

  • Helm:Kubernetes的应用打包工具,简单理解就是命令行工具。

  • Tiller:Helm的服务端,部署在Kubernetes集群中,用于处理Helm的相关命令。3.0新版已不需要服务端

  • Chart:Helm的打包格式,内部包含了一组相关的Kubernetes资源, 把它想象成Kubernetes对应的Homebrew公式,Apt dpkg,或者是Yum RPM文件。

  • Repoistory:Helm的软件仓库,repository本质上是一个web服务器,该服务器保存了chart软件包以供下载,并有提供一个该repository的chart包的清单文件以供查询。在使用时,Helm可以对接多个不同的Repository。

  • Release:使用helm install命令在Kubernetes集群中安装的Chart成为Release。

需要特别注意的是, Helm中提到的Release和我们通常概念中的版本有所不同,这里的Release可以理解为Helm使用Chart包部署的一个应用实例。

其实Helm中的Release叫做Deployment更合适。估计因为Deployment这个概念已经被Kubernetes使用了,因此Helm才采用了Release这个术语。

安装Helm

安装docker

安装Kubernetes单节点

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

# kubectl taint nodes --all node-role.kubernetes.io/master-

Helm-cli

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

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

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

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

下载helm的安装包

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

# tar zxf helm-v3.4.2-linux-amd64.tar.gz

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

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

# mv linux-amd64/helm /usr/local/bin/helm

Helm-tiller(服务端)

3.0已取消该部分

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]

# 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有强大的搜索命令。可以搜索两类不同资源:

helm search hub

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

# 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客户端的仓库。该命名只搜索本地数据,不需要连接网络。

# 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
指定本地仓库
# helm search repo [仓库名]
仓库模糊查找

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

# 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名称。

现在找一个数据库来部署

[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名称]

# 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

安装方法

本地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 get

查看使用 --set 或者 -f xxx.yaml 传递的应用配置

helm get values [应用名]

helm list

查看发布后的chart

# 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 [发布名称]

# helm status happy-panda
# 输出的内容和刚install结束的内容是一样的

helm show values

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

格式:helm show values [chart名称]

# 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文件覆盖默认配置

# echo '{mariadbUser: user0, mariadbDatabase: user0db}' > config.yaml
# helm install -f config.yaml stable/mariadb --generate-name

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

通过命令行覆盖默认配置

# 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指定的值清空。

实例更改标签选择

# 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名称]

# vim config.yaml 
mariadbUser: cyj
# helm upgrade -f config.yaml happy-panda stable/mariadb
...

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

# helm get values happy-panda
USER-SUPPLIED VALUES:
mariadbUser: cyj

helm rollback

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

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

# 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

# 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 [发布名称]

# helm uninstall happy-panda
release "happy-panda" uninstalled

还有很多命令在使用过程中会遇到的,加油少年~

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0