介绍
开始
进入正题
(Note: Please choose the most appropriate option based on the context, which could be informal, casual, or more formal.)
管理 Kubernetes 配置可能因无数的 YAML 文件和手动流程而变得让人感到无所适从。此时,Pepr 就派上用场了,这是一款用于 Kubernetes 管理的工具,简化并优化了与管理、安全相关的工作。Pepr 使用 TypeScript 以类型安全且易于阅读的方式定义 Kubernetes 转换。因此,可以说它是一种 中间件。
将你的组织知识转换成可维护的TypeScript模块,轻松地使用Kubernetes的准入控制器和webhooks来自动化任务,并确保符合规范和安全。Pepr的直观构建器模式使得定义策略、修改资源和监控变更变得简单。
在这次博客里,我们将带您了解Pepr的各种功能,指导您安装,并帮助您创建自定义功能。看看Pepr如何改变您的Kubernetes管理体验,使其更加简单、高效且超级强大。
开始使用Pepr非常简单。你可以通过互动教程一步步完成设置以及所有步骤,跟着配套视频教程学习。
Pepr在云原生生态系统中扮演着独特的角色,结合了类似于策略执行工具Kyverno以及自动化框架Shell-operator之类的工具的功能。为了更好地理解Pepr的角色,我们不妨将其与这些成熟的工具做个比较:
Pepr 对决 Kyverno
Pepr 和 Kyverno 都使用 webhooks 和 Informers 来管理 Kubernetes 资源,但它们的方法有很大差异。Kyverno 是一个专门的策略引擎,用于使用 YAML 进行配置,而 Pepr 则是一个更广泛的框架,基于 TypeScript 编写。
Kyverno在执行简单策略方面表现出色,而Pepr则提供了更为灵活且以代码为中心的集群管理方法。选择哪一种取决于具体需求、团队技能,以及是否需要更多超出策略执行之外的自动化功能。
Pepr 框架 vs 操作符框架
Pepr 使用 TypeScript 可以实现更复杂且编程性强的集群事件响应。它不仅限于策略执行,还像操作员一样提供扩展功能,从而支持复杂的自动化场景和自定义资源管理。这使得 Pepr 更像这些工具一样,例如 Kube-Builder、Operator SDK 或 Shell-Operator。
更多关于如何使用 shell-operator 的信息,可以在这里找到:
Pepr 在他们的网页上有一个超酷(虽然吓人)的架构图:
请参阅: https://github.com/defenseunicorns/pepr?tab=readme-ov-file#logical-pepr-flow 来源:逻辑 pepr 流程详情请参阅上述链接。
我们一步一步来,慢慢来。首先,选择TypeScript作为转换和功能引擎的设计对我来说有点奇怪。毕竟,Pepr旨在成为IT运维中的代码即配置,而IT运维人员通常不是JavaScript开发者。
不过,这句话又被另一句话抵消了:“作为 Kubernetes 控制器,Pepr 允许你使用 TypeScript 定义 Kubernetes 转换,而无需具备软件开发专业知识,这是因为采用了简单易懂的英文配置。”
也就是说,即使使用 TypeScript 表示这些功能,也应该像普通的英语一样易于理解。我们来看几个例子吧:
import { a, Capability, Log } from "pepr"; const name = "hello-pepr-validate"; export const HelloPeprValidate = new Capability({ name: name, description: name, namespaces: [name], }); const { When } = HelloPeprValidate; When(a.Secret) // 这里表示处理名为 "Secret" 的事件 .IsCreated() .InNamespace(name) .WithName("create-yay") .Validate(function createYay(request) { Log.info("通过: create-yay"); return request.Approve(); });
除了导入语句外,完全不懂 TypeScript 的情况下,我也可以看出这将会批准名为 create-yay 的名称,该名称在 hello-pepr-validate 命名空间中。非常简单明了。那这个呢:
当(a.ConfigMap) .IsCreated() .WithName("example-2") .Mutate(request => { // 这个 Mutate 操作会在请求被提交到集群之前对其进行修改 // 使用 `request.Merge()` 将新数据与已有数据合并 request.Merge({ 元数据: { 标签: { pepr: "was-here", }, 注解: { "pepr.dev": "annotations-work-too", }, }, }); })
看起来也挺简单的,在 example-2 命名空间中创建的任何 config map 都会带有指定值的标签和注释。
当然,这些例子很简单,随着任务变得更加复杂,代码复杂度也会急剧上升。
上面的例子称为能力。我特别喜欢这种设计选择,那就是优秀的抽象。
来源:作者根据或参考文献资料
内部开发循环非常顺畅,使用 pepr dev --confirm
命令可以直接在本地环境中运行控制器代码,并连接到当前活动的集群,使我们的模块代码变得可用。该命令会部署 pepr-system
命名空间,并安装两个 Webhook。
运行 pepr dev
后,我们可以测试我们的功能,例如,通过应用 HelloPepr
模块提供的示例 YAML 文件。
Pepr本地开发体验
之前我提到过,TypeScript可能是IT运维专业人士的一个奇怪选择,但支持WebAssembly使得Pepr变得更灵活和易用。这个特性让IT运维团队可以利用他们熟悉的语言技能,让他们还能享受Pepr在Kubernetes管理上的强大功能。
支持 WebAssembly(https://docs.pepr.dev/v0.33.0/user-guide/webassembly/),Pepr 开启了许多可能:
此功能有效地连接了Pepr的TypeScript框架与IT运维团队多样化的技能。它让组织可以利用Pepr在Kubernetes管理上的创新方法,同时利用他们现有的编程技能,从而使Pepr对更多团队和应用场景来说更易使用且更具吸引力。
了解更多关于如何在 Kubernetes 中使用 WebAssembly 的信息,请参阅 SpinKube Operator。
Spin Kube & Spin Operatoritnext.io
https://medium.com/deploy-your-first-webassembly-app-on-kubernetes-in-10-minutes-ad61b668501c?source=post_page-----5b9e8242a5cb--------------------------------
在日志记录方面,准入控制器和观察控制器都通过环境变量提供了可配置的日志级别。开发人员可以使用 kubectl logs
命令来访问这些特定控制器的日志,目标是带有特定标签(例如 pepr.dev/controller=admission
或 pepr.dev/controller=watcher
) 的 pod。
npx pepr monitor
命令特别方便,提供了一种用户友好的方式来查看变体和验证的格式化日志信息。此工具便于排查准入控制器问题,而无需特定的开发环境支持。
如果你更喜欢在命令行上调试,可以在Pepr的开发模式下使用Node.js自带的调试工具或类似ndb的工具。
部署: 部署指将软件或资源分配到运行环境的过程。
在生产环境中,Pepr建议使用声明式方法,通过npx pepr build
生成模块。生成的模块需要移动到合适的部署位置。在开发环境中,可以用npx pepr deploy
来部署Kubernetes清单。
Pepr Store
这一关键组件由 ETCD 提供的 PeprStore 资源实现。它每隔 5 秒更新一次,并设计为最终一致性而非强事务性,开发者在管理数据和处理潜在冲突时需要注意这一点,尤其是在考虑数据更新的一致性时。
来源:作者基于相关文档。
为了增强Pepr的安全性,建议采取一些最佳实践。这包括保持Pepr更新至最新稳定版本,启用带有范围模式的角色基础访问控制(RBAC),并在分配权限时遵循最小权限原则,确保权限最小化。建议使用NetworkPolicies来限制进出Pepr控制器的流量,并尽量减少对Kubernetes API服务器的请求。
在验证 Webhooks 时,将 failurePolicy
设置为 ‘Fail’,这样如果 Webhook 失效,请求就会被拒绝,从而增加了一层安全保障。
Pepr模块和功能可以按需扩展以满足您的Kubernetes环境的需求。您可以部署多个Pepr实例来分担负载以确保高可用性。要扩展Pepr,您可以使用Kubernetes的部署策略,比如增加Pepr部署的副本数量,以实现扩展。
apiVersion: apps/v1 # API版本 kind: Deployment # 部署 metadata: # 元数据 name: pepr-deployment # 名称 spec: # 规格 replicas: 3 # 副本数 template: # 模板 spec: # 规格 containers: # 容器 - name: pepr # 名称 image: pepr:latest # 镜像 # 配置省略
这会增加您集群中Pepr实例的数量,从而使系统更可靠、性能更强。
Pepr 是一种新颖的 Kubernetes 配置与自动化的解决方案。通过采用 TypeScript 和类似英文的流畅语法,它填补了传统 IT 运维和现代软件开发实践之间的鸿沟。它结合了 Kyverno 这样的项目的策略执行能力和操作类自动化的灵活性。我非常期待看到该项目的发展。
对我来说,Pepr 最吸引我的是其直观的模块、功能和行为抽象模型。这种结构不仅允许创建复杂的策略和自动化流程,还能保持代码的可读性和易理解性。对于从基础设施即代码工具或 shell 脚本过渡到 TypeScript 的 IT 专业人士来说,这意味着他们可能需要一些时间来熟悉 TypeScript。
作为一个年轻的项目,Pepr 提供了许多探索的空间。在你的环境中尝试它,并与社区分享你的经历。不论是成功还是挑战,你的看法对维护者和用户都非常重要。通过积极参与,你不仅能提高自己的技能,还将帮助决定 Pepr 的未来及其在 Kubernetes 生态系统中的角色。
非常感谢你抽空读这篇文章,希望你读得开心,也学到了一些东西。
🔗 在LinkedIn上与我连接LinkedIn
🌐 来访问我的网站
📺 点击订阅我的YouTube频道吧