提供程序101:使用K8s和Crossplane订购披萨

2020-11-25 11:24:35 浏览数 (1)

作者: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控制器一样,提供程序在它们自己的调节循环中运行。循环有几个方法:

  • Setup—-提供程序启动时立即调用Setup。它注册在事件发生时触发这些方法运行的控制器。
  • Connect--生成一个用于连接托管资源的Crossplane ExternalClient(外部客户端)。connect方法通常使用用户提供并在ProviderConfig中定义的值来使用外部服务(通常是一个web API,比如Domino的pizza API)进行身份验证。ExternalClient对象将与外部资源(在本例中是Domino的API)交互,并将连接细节存储为秘密信息。
  • Create--我使用这个方法根据用户输入和ProviderConfig细节创建Order对象。我还在Order对象上设置了一个属性,这样我就可以知道在Observe方法中稍后是否请求了订单。这让我返回ExternalObservation,其中包含关于资源是否为最新的或是否已创建的适当信息。
  • Observe--Observe方法每隔几秒钟被调用一次,并更新对象的状态。在这里,我调用Domino的tracker API来获得关于我的订单的最新信息。返回一个将ResourceExists设置为false的ExternalObservation对象将调用Create方法。这是提供程序模板的默认行为。 我一开始并没有意识到这一点,在我发现错误之前,Dominos已经完成了大约六份订单。
  • Update--当ExternalObservation对象上的ResourceUpToDate属性被设置为false时,将调用此方法。我没有将此方法用于任何事情,但是如果Dominos的API支持订单修改,我怀疑这就是我要处理的地方。
  • Delete--当ExternalObservation对象上的ResourceExists属性被设置为false时调用此方法。

ProviderConfig

通过应用ProviderConfig(由用户安装的CRD类型),可以使用用于身份验证的秘密或其他用户定义的值来配置Crossplane提供程序。ProviderConfig具有标准格式,Crossplane在配置提供程序时希望读取该格式。他们可以引用Kubernetes机密,这样用户就可以存储连接到web服务所需的凭证。

在provider-pizza中,支付信息存储为一个秘密,并由ProviderConfig引用:

代码语言:javascript复制
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以了解更多。

参与!

我们很高兴看到跨界社区的持续增长,并希望你能参与进来。无论你是开发人员、用户,还是对我们的工作感兴趣,都可以通过以下方法加入我们:

  • Crossplane网站:https://crossplane.io/
  • Github:https://github.com/crossplaneio/crossplane
  • 推特:https://twitter.com/crossplane_io
  • Slack:https://slack.crossplane.io/
  • Youtube:https://www.youtube.com/channel/UC19FgzMBMqBro361HbE46Fw
  • 电子邮件:info@crossplane.io

0 人点赞