作者:Grant Gumina
这是Upbound的首席产品经理Grant Gumina发表的一篇客座文章,他最近构建了Domino API的Crossplane提供程序provider-pizza。在这篇文章中,他分享了他对提供程序(provider)的了解,以及初学者在编写第一个提供程序时可能会犯的一些常见错误。
在我的日常工作中,我在Upbound帮助客户部署并将Crossplane扩展到生产中。我们的产品Upbound Cloud是一个Crossplane的托管服务,它允许基础设施运营商为他们的团队定义和部署定制的云API和控制台。
作为“产品人”,我已经很多年没有写过产品代码了。然而,在看到客户使用Crossplane来编排从AWS环境到GitHub票务系统的一切之后,我想用我的技术背景来测试Crossplane的扩展性的极限。因此,我花了一个周末的时间研究如何通过为Domino的pizza API构建一个Crossplane提供程序来通过Crossplane订披萨。
如果你不熟悉这个项目,Crossplane是一个云原生控制平面,它允许用户定位和抽象运行在本地或云中的基础设施资源。它通过安装到Kubernetes集群并通过安装到其中的提供程序扩展集群的API来实现这一点。
安装到运行Crossplane的集群中的每个提供程序为各种“托管资源”添加集群范围的CRD。作为用户,你可以使用kubectl与这些资源交互。例如,Crossplane允许你应用kubectl apply -f db.yaml用于创建数据库。
这个项目
Provider-pizza是我学习更多关于Crossplane内部工作原理的尝试,并看看我可以在多大程度上扩展“通用云API”这个比喻,但这不是这篇文章的重点。由于Crossplane还很年轻,所以没有大量的资源面向初学者。我希望这篇文章可以帮助指导有抱负的提供程序建设者在正确的方向,并帮助你避免一些错误,我在编写我的第一个提供程序。
在GitHub上查看这个项目,了解更多它是如何工作的,看看如何自己运行它,并点一份美味的披萨。如果你有兴趣了解更多关于Crossplane提供程序的信息,请继续阅读。
https://github.com/grantgumina/provider-pizza
对提供程序的剖析
Crossplane有一个令人难以置信的可扩展性故事,这要归功于它的提供程序模型。提供程序基本上是Kubernetes风格的控制器,它们通过API将任何东西连接到运行Crossplane的Kubernetes集群,并为你提供代表每个资源的CRD。
为了构建我的第一个提供程序,我在GitHub上克隆了Crossplane团队的提供程序模板仓库(provider-template),然后开始工作。
https://github.com/crossplane/provider-template
托管资源
在提供程序内部,可以有许多不同的托管资源,每个资源都有自己的类型(Type)。在provider-pizza中,这些托管资源在/api目录中定义。你可以看到有一个order类型的托管资源。
控制器
就像Kubernetes控制器一样,提供程序在它们自己的调节循环中运行。循环有几个方法:
ProviderConfig
通过应用ProviderConfig(由用户安装的CRD类型),可以使用用于身份验证的秘密或其他用户定义的值来配置Crossplane提供程序。ProviderConfig具有标准格式,Crossplane在配置提供程序时希望读取该格式。他们可以引用Kubernetes机密,这样用户就可以存储连接到web服务所需的凭证。
在provider-pizza中,支付信息存储为一个秘密,并由ProviderConfig引用:
apiVersion: v1
kind: Secret
metadata:
name: payment-secret
namespace: crossplane-system
type: Opaque
data:
credentials.json: ewogIGNyZWRlbnRpYWxzOiBCQVNFNjRFTkNPREVEX1BST1ZJREVSX0NSRURTLAogIFR5cGU6ICJDcmVkaXRDYXJkIiwKICBDYXJkVHlwZTogIlZpc2EiLAogIE51bWJlcjogIjExMTEyMjIyMzMzMzQ0NDQiLAogIEV4cGlyYXRpb246ICIwMTIzIiwKICBTZWN1cml0eUNvZGU6ICIxMjMiLAp9
---
apiVersion: provider-pizza.crossplane.io/v1alpha1
kind: ProviderConfig
metadata:
name: example
spec:
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: payment-secret
key: payment-secret-key
总结
Crossplane的设计考虑到了可扩展性。通常,用户会将云和本地基础设施与项目协调在一起,但正如你所看到的,也可以使用任何具有API的服务。安装之后,提供程序为Crossplane用户提供统一的接口和API来编排和操作它们所代表的托管资源。
我们看到了kubectl -f apply order.yaml,但是你可以同样轻松地kubectl -f apply database.yaml使用其他提供程序(如provider-aws)。
如果你有兴趣了解更多关于如何使用Crossplane处理和抽象你自己的基础设施的知识,即使它与比萨饼无关,我们也很乐意与你进行交流。加入Slack社区并在Twitter上关注我们。
想要将Crossplane部署到生产环境中,还是已经这样做了?我们想给你一个Upbound云的演示,看看它对你的用例有什么帮助。来upbound.io访问我们或电子邮件info@upbound.io以了解更多。
参与!
我们很高兴看到跨界社区的持续增长,并希望你能参与进来。无论你是开发人员、用户,还是对我们的工作感兴趣,都可以通过以下方法加入我们: