通过安全系列文章到目前为止的所有内容,我们知道Kubernetes提供了运行复杂应用程序配置管理所需要的能力,比如说configMaps对象用来管理应用程序的配置,Secret对象用来管理敏感配置数据,服务Service对象用来将应用暴露给外部系统访问,以及Deployment对象用来管理应用程序的部署。
随着应用程序越来越负载,应用包含的各种YAML文件迅速会让人头疼,Kubernetes社区当然也理解开发和运维人员面临的这种挑战。传统意义上,应用程序的部署包管理由yum或者apt-get,brew这样的包管理器负责,随着社区对这个问题的重视程度越来越高,我们终于看到他们努力的结果:Helm,一个在Kubernetes平台管理应用应用程序部署包的工具。
Helm简化了开发人员和运维人员使用Kubernetes来部署自己的应用程序,主要包含如下的功能:
- 应用的生命周期管理(install-安装,upgrade-更新,rollback-回滚)
- YAML模板
- 软件包依赖管理
Helm使用名叫Charts的软件包格式,Charts中包含了Kubernetes应用程序所有需要的对象资源YAML文件(也叫manifests文件),并且整个应用程序会被作为整体的单元部署到Kubernetes集群中。
Manifest在Helm中又被称作Templates(模板),在部署的时候,模板Templates会被模板引擎处理。Vlues(值)会被当做参数注入到模板资源中,将Manifest(Templates)和Values进行merge后部署到Kubernetes集群中,就称作一次Release(发布)。
最后,Helm也提供了命令行工具来给历软件包,整个Helm的架构如下图所示:
了解了Helm之后,接下来我们就可以来实际操作一下,看看在Helm上如何管理应用程序,如何将Helm Chart包部署到Kubernetes集群中。
注:笔者不打算介绍如何安装helm客户端命令行工具,如果读者用的是macOS,可以直接使用brew install helm,在写文章的时候,在brew渠道上的最新版本是3.5.4。
为了让后续的内容更加连贯,笔者准备了一个叫hello-demo的应用程序,应用程序的文件夹结构如下所示:
➜ hello-demo tree
.
├── Chart.yaml
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── configmap.yaml
│ ├── deployment.yaml
│ ├── ingress.yaml
│ ├── secret.yaml
│ ├── service.yaml
│ └── serviceaccount.yaml
└── values.yaml
我们来简单介绍一下这个文件夹中的内容。首先Chart.yaml文件是整个Helm chart软件包的manifest,包含了软件包的元数据,比如Chart的名称和版本等。templates文件夹包含了软件包需要的Kubernetes资源,这些资源会被kubectl apply到Kubernetes集群中,当Chart被部署的时候。
如果大家打开templates文件夹中的对象资源,会发现和原始的YAML文件比起来,templates文件夹中的YAML文件只是一个模板(可以理解为只有架子,没有具体的数据,比如应用的名称等),如下图所示:
如上图所示,include函数用来引用_helpers.tpl文件中的命名模板,如果读者对模板以及Helm的文件夹结构有兴趣,可以查阅HELM的官方文档,因为要把模板的规则说清楚,不是一两句话就可以的。
另外笔者在secret.yaml文件中,stringData部分对greeting.message键赋值为:{{ required "A valid greeting message is required!" $.Values.greeting.message | quote }},笔者需要强调的这里的值$.Values.greeting.message会被注入,并且使用了required函数,意味着只有value的值被注入,应用程序会被部署到Kubernetes集群。
被注入的信息可以有很多中配置方式,我们可以通过配置文件,命令行等,Helm自己有一套优先级机制,从原理上说,定义在values.yaml中的值优先级最低。
为了不和其他的应用程序混淆,笔者建议大家在自己的环境中创建命名空间来部署HELM Chart应用程序包。在自己的集群上运行命令:kubectl create namespace kubernetes-secrets-helm 和 kubectl config set-context --current --namespace=kubernetes-secrets-helm来分别创建一个新的命名空间。接着创建一个配置文件来提供greeting.message配置项。
接下来,激动人心的时刻到了,我们要做的是把这个叫hello-demo的应用部署到Kubernetes集群中。在自己的集群上运行:helm upgrade -i hello-demo hello-demo -f values-kubernetes-secrets.yaml命令,在笔者的本地集群上输出如下:
➜ source_code helm upgrade -i hello-demo hello-demo -f values-kubernetes-secrets.yaml
Release "hello-demo" does not exist. Installing it now.
NAME: hello-demo
LAST DEPLOYED: Thu Sep 16 17:07:34 2021
NAMESPACE: kubernetes-secrets-helm
STATUS: deployed
REVISION: 1
TEST SUITE: None
接下来,我们来验证一下应用是否被成功部署到Kubernetes平台上,笔者在前边的文章中详细介绍过如何访问部署到POD的应用,这里我们采用:minikube service hello-demo -n kubernetes-secrets-helm --url,来获取service的具体地址:http://127.0.0.1:63983, 然后基于这个Service的地址,我们可以来访问部署的服务接口,在笔者的机器上输出如下:
➜ source_code curl http://127.0.0.1:63983/v1/yunpan/k8s/hello
被访问机器的Host:hello-demo-5cbcff45cf-hmxg9 ,IP地址是:172.17.0.12%
接下来我们来更新一下模板,把服务的实例数从模板中的1,修改为2,这个配置在values.yaml文件中。修改之后,重新执行命令helm upgrade -i hello-demo hello-demo -f values-kubernetes-secrets.yaml,我们再去查看应用的状态,会发现我们有两个实例在运行。在笔者的机器上输出如下:
➜ source_code curl http://127.0.0.1:64259/v1/yunpan/k8s/hello
被访问机器的Host:hello-demo-5cbcff45cf-5dn4s ,IP地址是:172.17.0.13%
➜ source_code curl http://127.0.0.1:64259/v1/yunpan/k8s/hello
被访问机器的Host:hello-demo-5cbcff45cf-hmxg9 ,IP地址是:172.17.0.12%
➜ source_code curl http://127.0.0.1:64259/v1/yunpan/k8s/hello
被访问机器的Host:hello-demo-5cbcff45cf-5dn4s ,IP地址是:172.17.0.13%
注:我们在使用helm upgrad的时候用了-i参数,这个参数的意思是幂等方法(idempotent),如果应用已经存在就更新,如果应用不存在就安装。
好了, 我们关于helm这部分内容就介绍完了,由于helm的内容相对来说比较复杂,因此这篇文章的篇幅并不是太长,大家可以仔细阅读,在自己的机器上验证。我们下篇文章介绍如何使用helm来管理隐私数据,敬请期待!