云计算时代操作系统Kubernetes之安全(五)

通过安全系列文章到目前为止的所有内容,我们知道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的架构如下图所示:

《图1.1 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文件只是一个模板(可以理解为只有架子,没有具体的数据,比如应用的名称等),如下图所示:

《图1.2 templates文件夹包含了应用所需Kubernetes资源的模板》

如上图所示,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来管理隐私数据,敬请期待!

你可能感兴趣的:(云计算时代操作系统Kubernetes之安全(五))