随着云原生技术的发展,越来越多地转向云基础设施。Kubernetes和Terraform等基础设施即代码(IaC)工具在管理和部署基于云的应用方面变得越来越流行。
IaC“基础设施即代码”中的代码其实上是一行行的配置,面对越来庞大和复杂的基础设施体系,其配置也越来越重要,越来越成为挑战。传统的基YAML的配置则越来越难以适应对配置的规模化,动态化,安全性、稳定性和可扩展性需求。在本文撰写时候虫虫看到一则关于滴滴平台的故障报告,由于一个Kubernetes版本配置上的问题导致滴滴全平台服务停止24小时,网友们分析可能是由于大规模裁剪运维人员导致的“减猿增笑”,但是我认为更主要还是配置管理混乱和提基础架构不合理导致的,这从另一个方面也见证了规范配置管理的重要性。
本文虫虫介绍云原生配置和策略管理的新范式一个KRMKCL规范,用来解决此类的问题和挑战。
概述Kubernetes作为使用最广泛的容器编排系统,在全球超过75%的组织已经在生产中运行容器化应用程序,预计到年容器云相关产业将超过10亿美元。
Terraform作为业界使用最广泛的IaC工具,目前TerraformVSCode插件的安装量约万。HCL是年GitHub上增长最快的编程语言,超过所有其他通用和特定领域的编程语言,形成了广泛的开发者生态系统。
Kubernetes和Terraform正在成为云原生领域不可或缺的基础设施项目,并将在未来几年持续增长。
KRMKCL规范旨在解决以下问题:
静态化问题:大多数静态配置,例如云原生领域的KubernetesYAML配置,需要针对每个环境单独配置。在最坏的情况下,可能会引入涉及跨环境依赖的难以调试的错误,导致稳定性和可扩展性较差。
配置漂移:通常没有标准化的方法来管理不同环境的应用程序和基础设施的动态配置。采用非标准方法(例如编写脚本和拼凑粘合代码)可能会导致指数级的复杂性和配置漂移。
配置可见性:Kubernetes和其他作为构建平台的平台技术擅长在底层统一基础设施细节。然而,缺乏更高级别的软件交付抽象,这给普通开发人员带来了更高的认知负担,并影响了更高级别应用程序开发人员的软件交付体验
KCLKCL是一种专门用于云原生领域的配置策略语言,在开源,是CNCF基金会托管的CNCFSandbox项目。KCL旨在改善KubernetesAPI层编写云原生配置策略和可编程性的用户体验。KCL项目目前包含在CNCF基金会的自动化和配置环境中。KCL中的“C”代表Configuration,“L”代表Language,“K”源自Kubernetes的第一个字母。
与通用编程语言不同,KCL是一种特定于领域的编程语言,它通过一组收敛的语法和语义解决了几乎无限的业务场景变化和复杂性。例如,仅在Kubernetes领域内,社区就有数千种资源和碎片化的Operator生态系统。KC将复杂配置和策略编写的思维过程和方法封装到其语言特性中,避免了使用通用语言进行配置所带来的安全风险和副作用。
作为一种配置语言,KCL为应用程序和平台开发运维人员(SRE)提供了最重要的功能,即动态配置管理。通过代码抽象,可以构建以应用程序为中心的模型,使开发人员免受基础设施和平台概念的复杂性的影响,并为他们提供以应用程序为中心且易于理解的界面。此外,KCL允许平台工程师快速扩展和定义自己的模型,并提供丰富的可管理性功能,包括开箱即用的KCL代码库、语义版本控制、CI注册表、语言工具链和自动化支持。
此外,KCL在完全开放的云原生生态系统中运行,并且不与任何编排/工程工具或Kubernetes控制器紧密耦合。在云原生供应链场景和大规模运营场景中,KCL可以为客户端和运行时提供API抽象、组合和验证能力。用户可以选择合适的引擎,如Kubectl、KusionStack、KubeVela或Helmfile与KCL结合并将配置应用到集群。
此外,KCL本身是一种现代的、高级的特定领域编程语言,是一种编译型静态强类型语言。KCL通过面向记录和函数的语言设计,为开发者提供了配置(config)、模型抽象(schema)、逻辑(lambda)和策略(rules)的核心能力。
KCL旨在提供独立于运行时的可编程性,而不在本地提供线程和IO等系统功能。它致力于提供稳定、安全、低噪声、低副作用、高性能、易于自动化、易于管理的编程支持,以解决特定领域的问题。
KRMKCL规格KRMKCL规范是基于Kubernetes资源模型(KRM)的配置规范。KRM是一种通用配置模型,用于描述和管理容器、Pod和服务等各种云原生资源。KRM提供了一种统一的方式来定义和管理这些资源,使它们能够在不同的环境中移植和重用。
作为Kubernetes官方规范之一,KRM的核心概念是KRM功能。KRM函数的输入是一组Kubernetes资源和KRM函数的配置,输出是一组Kubernetes资源以及函数执行的结果,例如错误消息和调试信息。KRMKCL是使用KCL代码实现KRM功能,并通过支持各种代码源(例如OCI注册表、Git和HTTPS)对其进行了扩展。
在KRMKCL规范中,其配置模型的行为主要分为三类:
变异(Mutation):输入KCL参数params和KRM资源列表并输出修改后的KRM资源列表。
验证(Mutation):输入KCL参数params和KRM资源列表,输出KRM资源列表和资源验证结果。
抽象(Abstraction):输入KCL参数params并输出KRM资源列表。
可以通过KCL编程实现以下功能:
修改资源,例如根据一定条件添加/修改标签标签或注释注释或在所有包含PodTemplate的Kubernetes资源模型(KRM)资源中注入Sidecar容器配置。
使用KCL架构验证所有KRM资源,例如限制容器仅以root方式启动。
使用抽象模型生成KRM资源或抽象/组合不同的KubernetesAPI,例如,使用“web-service”模型实例化Web应用程序配置。
借助KCLIDE和KCL包管理工具,编写模型并将其上传到OCI注册表以供模型复用。可以通过编程方式扩展对KRMKCL规范的支持,并且这些模型可以根据具体的场景需求在客户端或运行时单独使用。
针对领域特定问题以及KCL的相关概念,主要为用户提供三个方面的支持:语言、工具链、云原生集成。
开发者生态尽管KCL是一种特定于领域的语言,但它的功能很全面。KCL提供了与通用语言相当的工具链功能,例如格式化、测试、文档、包管理等,以协助编写、理解和验证配置或策略。VSCode和Playground等IDE插件降低了配置编写和共享的成本。配置管理和执行的自动化是通过Rust、Go和Python等多语言SDK实现的。
对于IDE插件,KCL目前主要支持VSCode、IntelliJ和NeoVim。这些插件基于相同的KCL语言服务器,提供自动补全、导航、悬停、代码重构和格式化等功能。
作为CNCF项目,KCL与许多其他CNCF生态系统项目集成。例如,KCL为现有CNCF生态系统配置管理工具(如Kubectl、Helm、Kustomize、kpt、helmfile等)提供插件。在运行时,KCL提供KCLKubernetesOperator来满足各种配置管理需求。此外,还提供以下集成支持:
多语言支持:提供多语言SDK来帮助用户使用不同编程语言的KCL并将其集成到自己的应用程序中。
包管理支持:提供KCL包管理工具,允许通过标准OCI供应链方法(如Harbor、DockerHub、GitHubPackages等)分发和重用配置和策略代码。
架构和数据迁移支持:支持将架构和数据从其他生态系统一键迁移到KCLSchema,包括Go/Rust结构定义、JsonSchema、Protobuf、OpenAPI、TerraformProviderSchema、JSON、YAML等。
KCL支持与ArtifactHub集成。通过向ArtifactHub提交PR来将KCL包发布到ArtifactHubkcl-lang/artifacthub存储库。这样就可以在ArtifactHub页面看到上传的KCL包的效果,比如k8s包。
除此之外,KCL还提供了许多开箱即用的云原生模型,主要涵盖Kubernetes和Terraform模型。开发者只需一行KCL命令即可轻松添加相应的配置模型依赖或查看KCL源代码。
除了与语言、工具链和云原生集成相关的外部工作外,在代码库较大或计算要求较高的场景中,KCL的性能优于CUE、Jsonnet、HCL等语言。此外,KCL的渐进式静态类型系统、不变性、模式和验证规则确保了配置的进一步稳定性。
应用KubernetesKCL目前主要
转载请注明:http://www.0431gb208.com/sjszjzl/9268.html