Helm简介
Helm
是一个可简化Kubernetes
应用程序安装和管理的工具。Helm
可以理解为Kubernetes
的apt/yum/homebrew
。
此文档使用的是Helm的v3
版本。如果我们使用的是Helm v2
,请转到helm-v2分支。请参阅“Helm状态”以获取有关不同Helm
版本的更多详细信息。
Helm状态
Helm v3
于2019年11月发布。新老版本的接口非常相似,但是Helm
的体系结构和内部架构发生了重大变化。有关更多详细信息,请查看Helm 3中的内容。
Helm v2
计划支持1年“维护模式”。它指出以下内容:
- 6个月的bug修复,直到2020年5月13日
- 6个月的安全修复,直到2020年11月13日
- 2020年11月13日开始,对Helm v2的支持将终止
为什么使用Helm
Helm
通常被称为Kubernetes
应用程序包管理器。那么,使用Helm
而不直接使用kubectl
有什么好处呢?
目标
这些实验提供了关于使用Helm
优于直接通过Kubectl
使用Kubernetes
的优势的见解。后续的几个实验都分为两种情况:第一种情况提供了如何使用kubectl
执行任务的示例;第二种情况提供了使用Helm
的示例。完成所有实验后,我们可以:
- 了解
Helm
的核心概念 - 了解使用
Helm
而非直接使用Kubernetes
进行部署的优势:- 应用管理
- 更新
- 配置
- 修订管理
- 储存库和Chart图表共享
前提
- 有一个正在运行的
Kubernetes
集群。有关创建集群的详细信息,请参阅《 IBM Cloud Kubernetes服务或Kubernetes入门指南》。 - 已通过
Kubernetes
集群安装并初始化了Helm
。有关Helm
入门,请参阅在IBM Cloud Kubernetes Service上安装Helm或《 Helm快速入门指南》。
Helm概览
Helm
是可简化Kubernetes
应用程序安装和管理的工具。它使用一种称为“Chart”的打包格式,该格式是描述Kubernetes
资源的文件的集合。它可以在任何地方(笔记本电脑,CI/CD等)运行,并且可用于各种操作系统,例如OSX,Linux和Windows
。
Helm 3
从Helm 2客户端-服务器架构转向了客户端架构。客户端仍称为helm
,并且有一个改进的Go
库,该库封装了Helm
逻辑,以便可以由不同的客户端使用。客户端是一个CLI
,用户可以与它进行交互以执行不同的操作,例如安装/升级/删除等。客户端与Kubernetes API
服务器和Chart
存储库进行交互。它将Helm
模板文件渲染为Kubernetes
清单文件,用于通过Kubernetes API
在Kubernetes
集群上执行操作。有关更多详细信息,请参见Helm架构。
Chart被组织为目录内文件的集合,其中目录名是Chart
的名称。它包含模板YAML
文件,这些模板有助于在运行时提供配置值,并且无需修改YAML
文件。这些模板基于Go模板语言,Sprig lib中的功能和其他专用功能提供了编程逻辑。
Chart
存储库是可以存储和共享打包的Chart
的位置。这类似于Docker
中的镜像存储库。有关更多详细信息,请参考《Chart存储库指南》。
Helm概念
Helm
术语:
- Chart - 包含在Kubernetes集群中运行的应用程序,工具或服务所需的所有资源定义。Chart基本上是预先配置的Kubernetes资源的软件包。
- Config - 包含可合并到Chart中以创建可发布对象的配置信息。
- helm - helm客户端。它将Chart呈现为清单文件。它直接与Kubernetes API服务器交互以安装,升级,查询和删除Kubernetes资源。
- Release - 在Kubernetes集群中运行的Chart实例。
- Repository - 存储Chart的仓库,可以与他人共享。
Lab0 安装Helm
可以从源代码或预构建的二进制发行版中安装Helm客户端(helm
)。在本实验中,我们将使用Helm
社区的预构建二进制发行版(Linux amd64)。有关更多详细信息,请参阅Helm安装文档。
前提依赖
Kubernete
s集群
安装Helm客户端
- 下载适用于环境的最新版本的
Helm v3
,以下步骤适用于Linux amd64
,请根据环境调整示例。 - 解压:
$ tar -zxvf helm-v3.<x>.<y>-linux-amd64.tgz
。 - 在解压后的目录中找到
helm
二进制文件,并将其移至所需位置:mv linux-amd64/helm /usr/local/bin/helm
。最好是将复制到的位置设置到path
环境变量,因为它避免了必须对helm
命令进行路径设置。 - 现在已安装了
Helm
客户端,可以使用helm help
命令对其进行测试。
结论
现在可以开始使用Helm
了。
Lab1 使用Helm部署应用
让我们研究一下Helm
如何使用Chart
来简化部署。我们首先使用kubectl
将应用程序部署到Kubernetes
集群,然后展示如何通过使用Helm
部署同一应用程序。
该应用程序是Guestbook App,它是一个多层级的Web
应用程序。
场景1: 使用kubectl部署应用
在本部分的实验中,我们将使用Kubernetes
客户端kubectl
部署应用程序。使用该应用程序的版本1进行部署。
如果已经从kube101安装了guestbook
应用程序,请跳过本节,转到场景2中的helm
示例。
克隆Guestbook App
存储库以获取文件:
1 | git clone https://github.com/IBM/guestbook.git |
使用克隆的
Git
库中的配置文件来部署容器,并使用以下命令为它们创建服务:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19cd guestbook/v1
kubectl create -f redis-master-deployment.yaml
deployment.apps/redis-master created
kubectl create -f redis-master-service.yaml
service/redis-master created
kubectl create -f redis-slave-deployment.yaml
deployment.apps/redis-slave created
kubectl create -f redis-slave-service.yaml
service/redis-slave created
kubectl create -f guestbook-deployment.yaml
deployment.apps/guestbook-v1 created
kubectl create -f guestbook-service.yaml
service/guestbook created有关更多详细信息,请参阅README。
查看
guestbook
:现在,我们可以通过在浏览器中打开刚创建的留言簿来玩(可能需要一些时间才能显示出来)。
本地主机:如果我们在本地运行
Kubernetes
,请在浏览器中导航至http://localhost:3000
以查看留言簿。远程主机:
要查看远程主机上的留言簿,请在
$ kubectl get services
输出的EXTERNAL-IP和PORTS列中找到负载均衡器的外部IP和端口。1
2
3
4
5
6kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
guestbook LoadBalancer 172.21.252.107 50.23.5.136 3000:31367/TCP
redis-master ClusterIP 172.21.97.222 <none> 6379/TCP
redis-slave ClusterIP 172.21.43.70 <none> 6379/TCP
.........在这种情况下,URL为
http://50.23.5.136:31367
。注意:如果未分配外部
IP
,则可以使用以下命令获取外部IP
:1
2
3kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
10.47.122.98 Ready <none> 1h v1.10.11+IKS 173.193.92.112 Ubuntu 16.04.5 LTS 4.4.0-141-generic docker://18.6.1在这种情况下,URL为
http://173.193.92.112:31367
。WW在浏览器中导航到给定的输出(例如http://50.23.5.136:31367
)。应该看到浏览器显示如下:
场景2: 使用Helm部署应用
在实验的这一部分,我们将使用Helm
部署应用程序。我们将设置guestbook-demo
的发行版名称,以使其与之前的部署区分开。可在此处获得Helm chart
。克隆Helm 101
存储库以获取文件:
1 | git clone https://github.com/IBM/helm101 |
Chart
被定义为描述一组相关的Kubernetes
资源的文件的集合。我们先查看文件,然后再安装。guestbook
的chart
文件如下:
1 | . |
注意:上面显示的模板文件将被传递到
Kubernetes
清单文件中,然后再传递给Kubernetes API
服务器。因此,它们映射到我们在使用kubectl
时部署的清单文件(不包含README
和NOTES
)。
让我们继续并立即安装chart
。如果helm-demo
命名空间不存在,则需要使用以下命令创建它:
1 | kubectl create namespace helm-demo |
- 将应用程序作为
Helm chart
安装:
1 | cd helm101/charts |
我们应该看到类似于以下内容的输出:
1 | NAME: guestbook-demo |
该chart
的安装将执行Redis
主服务器和从服务器以及guestbook
应用的Kubernetes
部署和服务创建。这是因为该chart
是描述一组相关的Kubernetes
资源的文件的集合,并且Helm
通过Kubernetes API
管理这些资源的创建。
查看部署状态:
1 | kubectl get deployment guestbook-demo --namespace helm-dem |
查看pod
状态:
1 | kubectl get pods --namespace helm-demo |
查看service
状态:
1 | kubectl get services --namespace helm-demo |
查看留言簿:
现在,我们可以通过在浏览器中打开刚创建的留言簿来玩(可能需要一些时间才能显示出来)。
本地主机:如果我们在本地运行
Kubernetes
,请在浏览器中导航至http://localhost:3000
以查看留言簿。远程主机:
要查看远程主机上的留言簿,请在
$ kubectl get services
输出的EXTERNAL-IP和PORTS列中找到负载均衡器的外部IP
和端口。1
2
3export SERVICE_IP=$(kubectl get svc --namespace helm-demo guestbook-demo -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo http://$SERVICE_IP
http://50.23.5.136
在这种情况下,URL为http://50.23.5.136:31367
。
注意:如果未分配外部IP
,则可以使用以下命令获取外部IP
:
1 | kubectl get nodes -o wide |
- 在这种情况下,URL为`http://173.193.92.112:31367`。在浏览器中导航到给定的输出(例如`http://50.23.5.136:31367`)。应该看到浏览器显示如下:
![guestbook-page](https://gitee.com/lyyao09/cdn/raw/master/k8s/Helm101/guestbook-page.png)
结论
恭喜,我们现在已经通过两种不同的方法将应用程序部署到Kubernetes
。从本实验中,我们可以看到,与使用kubectl
相比,使用Helm
所需的命令更少,思考的时间也更少(通过提供chart
路径而不是单个文件)。 Helm
的应用程序管理为用户提供了这种简单性。
Lab2 使用Helm更新应用
在Lab1
中,我们使用Helm
安装了guestbook
示例应用程序,并看到了相较于kubectl
的优势。我们可能认为自己已经足够了解使用Helm
。但是chart
的更新或修改呢?我们如何更新和修改正在运行的应用?
在本实验中,我们将研究chart
更改后如何更新正在运行的应用程序。为了说明这一点,我们将通过以下方式对原始留言簿的chart
进行更改:
- 删除
Redis
从节点并改为仅使用内存数据库 - 将类型从
LoadBalancer
更改为NodePort
虽然是修改,但是本实验的目的是展示如何使用Kubernetes
和Helm
更新应用。那么,这样做有多容易呢?让我们继续看看。
场景1: 使用kubectl更新应用
在本部分的实验中,我们将直接使用Kubernetes
更新以前部署的应用程序Guestbook。
- 这是一个可选步骤,从技术上讲,更新正在运行的应用程序不是必需的。进行此步骤的原因是“整理”-我们要为已部署的当前配置获取正确的文件。这样可以避免在以后进行更新甚至回滚时犯错误。在此更新的配置中,我们删除了
Redis
从节点。要使目录与配置匹配,请移动/存档或仅从来文件夹中删除Redis
从属文件:
1 | cd guestbook/v1 |
注意:如果需要,可以稍后使用git checkout-
命令来还原这些文件。
- 删除
Redis
从节点的Service
和Pod
:
1 | kubectl delete svc redis-slave --namespace default |
- 将
Guestbook
服务的yaml
从LoadBalancer
更新为NodePort
类型:
1 | sed -i.bak 's/LoadBalancer/NodePort/g' guestbook-service.yaml |
- 删除
Guestbook
运行时服务
1 | kubectl delete svc guestbook --namespace default |
- 重新创建具有
NodePort
类型的服务:
1 | kubectl create -f guestbook-service.yaml |
- 使用以下命令检查更新:
1 | kubectl get all --namespace default |
注意:服务类型已更改(更改为
NodePor
),并且已为留言簿服务分配了新端口(在此输出情况下为31989
)。所有redis-slave
资源均已删除。
- 获取节点的公共
IP
,并重新访问应用提供的服务:
1 | kubectl get nodes -o wide |
场景2: 使用Helm更新应用
在本节中,我们将使用Helm
更新以前部署的guestbook-demo
应用程序。
在开始之前,让我们花几分钟看一下Helm
与直接使用Kubernetes
相比如何简化流程。 Helm
使用模板语言为chart
提供了极大的灵活性和强大的功能,从而为chart
用户消除了复杂性。在留言簿示例中,我们将使用以下模板功能:
- Values:提供访问传递到
chart
中的值的对象。例如在guestbook-service
中,它包含以下类型:.Values.service.type
。此行提供了在升级或安装期间设置服务类型的功能。 - 控制结构:在模板中也称为“动作”,控制结构使模板能够控制生成的流程。一个例子是在
redis-slave-service
中,它包含行-if .Values.redis.slaveEnabled-
。该行允许我们在升级或安装期间启用/禁用REDIS
主/从。
如下所示,完整的redis-slave-service.yaml
演示了在禁用slaveEnabled
标志时文件如何变得冗余以及如何设置端口值。其他chart
文件中还有更多的模板功能示例。
1 | {{- if .Values.redis.slaveEnabled -}} |
1.
1 | helm list -n helm-demo |
请注意,我们指定了名称空间。如果未指定,它将使用当前的名称空间上下文。我们应该看到类似于以下内容的输出:
1 | helm list -n helm-demo |
list
命令提供已部署chart
(发行版)的列表,其中提供了chart
版本,名称空间,更新(修订)数量等信息。
- 我们更新应用程序:
1 | cd helm101/charts |
Helm
升级将采用现有版本,并根据提供的信息对其进行升级。我们应该看到类似于以下内容的输出:
1 | helm upgrade guestbook-demo ./guestbook --set redis.slaveEnabled=false,service.type=NodePort --namespace helm-demo |
upgrade
命令将应用程序升级到chart的指定版本,删除redis-slave
资源,并将应用程序service.type
更新为NodePort
。
使用kubectl get all --namespace helm-demo
获取更新内容:
1 | kubectl get all --namespace helm-demo |
注意:服务类型已更改(更改为
NodePort
),并且已为留言簿服务分配了新端口(在此输出情况下为31202
)。所有redis-slave
资源均已删除。
当我们使用helm list -n helm-demo
命令检查Helm版本时,可以看到revision
和日期已更新:
1 | helm list -n helm-demo |
获取节点的公共IP
,并重新访问应用提供的服务:
1 | kubectl get nodes -o wide |
结论
恭喜,现在已经更新了应用程序! Helm
不需要任何手动更改资源,因此非常容易升级!所有配置都可以在命令行上即时设置,也可以使用替代文件设置。从将逻辑添加到模板文件后就可以实现这一点,这取决于flag
标识,启用或禁用此功能。
Lab 3. 跟踪已部署的应用程序
假设我们部署了应用程序的不同发行版(即升级了正在运行的应用程序)。如何跟踪版本以及如何回滚?
场景1: 使用Kubernetes进行修订管理
在本部分的实验中,我们应该直接使用Kubernetes
来说明留言簿的修订管理,但是我们不能。这是因为Kubernetes
不为修订管理提供任何支持。我们有责任管理系统以及所做的任何更新或更改。但是,我们可以使用Helm
进行修订管理。
场景2: 使用Helm进行修订管理
在本部分的实验中,我们将使用Helm
来说明对已部署的应用程序guestbook-demo
的修订管理。
使用Helm
,每次进行安装,升级或回滚时,修订版本号都会增加1。第一个修订版本号始终为1。Helm
将发布元数据保留在Kubernetes
集群中存储的Secrets
(默认)或ConfigMap
中。每当发行版更改时,都会将其附加到现有数据中。这为Helm
提供了回滚到先前版本的功能。
让我们看看这在实践中如何工作。
- 检查部署的数量:
应该看到类似于以下的输出,因为在Lab 1
中进行初始安装后,我们在Lab 2
中进行了升级。
1 | helm history guestbook-demo -n helm-demo |
- 回滚到以前的版本:
在此回滚中,Helm
将检查从修订版1升级到修订版2时发生的更改。此信息使它能够调用Kubernetes API
服务,以根据初始部署更新已部署的应用程序-换句话说,使用Redis slave
并使用负载平衡器。
1 | helm rollback guestbook-demo 1 -n helm-demo |
- 再次检查历史记录:
应该看到类似于以下的输出:
1 | helm history guestbook-demo -n helm-demo |
- 检查回滚结果:
1 | kubectl get all --namespace helm-demo |
从输出中可以再次看到,应用程序服务是LoadBalancer
的服务类型,并且Redis
主/从部署已返回。这显示了实验2中升级的完整回滚。
结论
从这个实验中,我们可以说Helm
很好地进行了修订管理,而Kubernetes
没有内置的功能!我们可能想知道为什么需要helm rollback
,因为重新执行helm upgrade
也可以回到老版本。这是一个很好的问题。从技术上讲,我们应该最终部署相同的资源(具有相同的参数)。但是,使用helm rollback
的好处是,Helm
可以管理(即记住)以前的helm install\upgrade
的所有变体/参数。通过helm upgrade
进行回滚需要我们手动跟踪先前执行命令的方式。这不仅繁琐,而且容易出错。让Helm
管理所有这些工作更加容易,安全和可靠,并且我们需要做的所有事情都告诉它可以使用哪个以前的版本,其余的都可以完成。
Lab 4. 共享Helm Charts
提供应用程序的一个关键方面意味着与他人共享。共享可以是直接的(由用户或在CI/CD
管道中),也可以作为其他chart
的依赖项。如果人们找不到你的应用程序,那么他们就无法使用它。
共享的一种方法是使用chart
库,该仓库可以存储和共享打包的chart
。由于chart
库仅适用于Helm
,因此我们将仅查看Helm chart
的用法和存储。
从公共仓库中获取Chart
Helm charts
可以在远程存储库或本地环境/存储库中使用。远程存储库可以是公共的,例如Bitnami Charts或IBM Helm Charts,也可以是托管存储库,例如在Google Cloud Storage
或GitHub
上。有关更多详细信息,请参阅《 Helm Chart存储库指南》。我们可以通过在本实验中检查chart索引文件来了解有关chart
存储库结构的更多信息。
在本部分的实验中,我们将展示如何从Helm101存储库中安装留言簿chart
。
- 检查系统上配置的存储库:
1 | helm repo list |
注意:默认情况下,
Helm v3
未安装chart
存储库,而是期望我们自己为要使用的chart
添加存储库。Helm Hub
可以集中搜索公共可用的分布式chart
。使用Helm Hub,我们可以找到所需chart
,然后将其添加到本地存储库列表中。Helm chart
存储库(如Helm v2
)处于“维护模式”,将于2020年11月13日弃用。有关更多详细信息,请参见项目状态。
- 添加
helm101
仓库:
1 | helm repo add helm101 https://ibm.github.io/helm101/ |
还可以通过运行以下命令在存储库中搜索chart
:
1 | helm search repo helm101 |
- 安装
chart
:
如前所述,我们将安装Helm101
存储库中的留言簿chart
。当将仓库添加到我们的本地仓库清单中时,我们可以使用repo name/chart name
(即helm101/guestbook
)来引用chart
。要查看实际效果,将应用程序安装到名为repo-demo
的新命名空间中。
1 | kubectl create namespace repo-demo |
检查是否按预期部署了该版本,如下所示:
1 | helm list -n repo-demo |
结论
本实验简要介绍了Helm
存储库,以显示如何安装chart
。共享chart
的能力意味着更易于使用。