三、 Helm的优点
• 生命周期管理:可以实现对组件实例的查询、安装、卸载、升级、回滚。
• 方便的命令行:对于简单变量,可以在部署的同时指定对应的参数,方便部署。
• 插件和工具生态:作为CNCF项目,Helm已经变成了K8S基础生态的一部分,各种各样的外部系统都会对它进行默认支持,CICD工具集成方面有得天独厚的优势;同时用户能够从社区中获取丰富的专业知识和共享的Chart包。
• 确保Secret安全性:一些敏感数据在Kubernetes中会存储为文本文件,作为Helm模版和值的一部分,而helm-secrets插件为关键信息提供秘密管理和保护,将相关值进行加密。
• Chart调试功能:Helm提供了一些命令让用户在安装前测试资源的正确性,检查Chart是否正确生成,例如helm lint;helm install —dry-run — debug等。
四、 Helm的缺点
• 应用定制受限于预置变量:Chart是一种模板,Chart的用户仅能通过对values的控制来定制组件的部署行为,模板中没有提供变量的位置,是无法在下游直接进行变更。
• YAML文件的无序部署:在YAML文件变多之后,尤其在Operator-CRD场景下,YAML下发常常需要存在一定的先后顺序。helm中利用一个叫crd目录来进行优先下发来避免问题。但实际工程实践中,对于顺序的要求会更复杂。
• 应用安装状态感知:对于Helm而言,将所有Chart中的模版推到Kubernetes之后,它的install过程就结束了,它并不关心yaml中配置的各个组件在Kubernetes中是否能有效运行,而这恰恰是用户最关心的部分,因此使用Helm安装可能会出现用户无法感知的异常。
五、 SREWorks对Helm的能力补充
1. 部署SREWorks时的Helm安装进度反馈
SREWorks平台自身的安装也是通过Helm包来实现的,常常会有一些SREWorks的用户以为helm install执行完就安装完了。事实上这个时候安装才刚刚开始。我们希望用户在这个过程中能够感知到具体的安装进度和异常反馈,于是我们在helm install执行完后提醒用户(该功能将于v1.3版本上线):
Please execute following command in terminal to trace the install progress:
kubectl logs job.batch/sreworks-progress-check -nsreworks -f
After install finished (5-10mins) open the following URL in your browser:
http://xxxx/#/
account: admin password: *****
|
在这个sreworks-progress-check的job中,我们实现了对SREWorks安装进度全跟踪。
我们编写了进度查询和错误诊断脚本,将其包装成SREWorks的一个Job和其他所有组件一起同步部署,这样用户就能在终端实时查看安装进度,并能在异常出现时及时进行排查。
• 进度查询
• 错误诊断
2. SREWorks中的Helm组件状态统一管理
鉴于Helm并不跟踪各个组件的部署状态,在SREWorks中,我们复用AppManager已有的Groovy脚本托管能力,自己编写了一个小Groovy脚本,目的在于等待终态+获取数据。
代码如下:
getStatus(request) { def client = getKubeClient(kubeconfig from parameters) def service = client.services().inNamespace(namespace).withName(name).get() def response = new JSONObject() if (service.get("loadbalancer", "ingress", 0, "ip") not empty) { response.put("spec.metadata.annotations.vvpSlb", service.get("loadbalancer", "ingress", 0, "ip")) return Status.builder().response(response).status("SUCCESS").build(); } else { return Status.builder().status("RUNNING").build(); } }
|
上述流程完成了Helm的安装、终态等待及数据获取。
上述getStatus()函数除了部署过程会刷(5s/次);部署完之后也会一直刷,不过频率逐步降低到5min/次。作为状态感知的数据来源。
3. SREWorks中的Helm组件顺序部署
前面也提到过Helm的YAML文件无序下发针对大型工程而言,会有一定的影响。SREWorks的Appmanager基于OAM模型实现了workflow能力,能够支持多个Helm组件按照DAG图的顺序部署。