Crossplane 是一个开源的 Kubernetes 插件,通过扩展 Kubernetes API 来解决云资源的供应问题。使用 Crossplane 时,你可以用声明的方式定义需要创建哪些云资源才能让你的应用程序正常工作,不需要编写任何代码。可以直接通过创建相关的 CRD 对象来完成这些云资源的定义,可以看成是一个云原生版本的 Terraform。,,VCluster 是一个通过轻量级虚拟 Kubernetes 集群提供灵活性并节省成本的工具,使用 VCluster,你可以在 Kubernetes 集群内创建一个隔离的虚拟 Kubernetes 集群。这大大降低了创建和维护 Kubernetes 集群控制平面的复杂性。,,下表比较了使用命名空间、vcluster 和 Kubernetes 集群的隔离级别和管理复杂性:,,那么我们将 Crossplane 和 VCluster 这两个工具一起来结合时候会产生怎样的效果呢?接下来我们将通过一个示例来说明这二者的结合使用。,在这个示例中我们想要实现如下所示的一些功能:,这里我在本地环境使用 KinD 来进行演示,相关的资源清单可以在 https://github.com/salaboy/from-monolith-to-k8s/tree/main/platform/crossplane-vcluster 此处找到(需要自己提前安装 kubectl、helm、kind)。,,如上图所示,我们只需要创建一个 KinD 集群(当然也可以是其他任何的 Kuberentes 集群),然后在集群上安装 Crossplane 和 Crossplane Helm Provider,因为我们这里没有创建任何云资源,所以我们不需要配置任何其他的 Crossplane Provider(比如 GCP、AWS、Azure 等)。,接下来我们可以先使用 KinD 创建一个 Kubernetes 集群。,集群准备好后接下来我们可以将 Crossplane 和 Crossplane Helm Provider 安装到我们的 KinD 集群中去,如下所示:,安装完成后会在 crossplane-system 命名空间下面运行如下所示的两个 Pod:,接着需要安装 Crossplane Helm Provider,直接使用 crossplane 的 kubectl 插件即可安装:,另外需要注意在安装 Crossplane Helm Provider 的时候,我们需要为该 Provider 提供一个合适的 ServiceAccount 来创建新的 ClusterRoleBinding,以便该 Provider 可以安装 Helm Charts。,然后创建一个如下所示的 ProviderConfig 对象,用来声明安装 Helm Provider:,直接应用上面的资源清单即可:,到这里我们就将 Crossplane 安装完成了。最后我们还推荐安装 vcluster 命令行工具来连接 Kubernetes 集群,可以参考文档 https://www.vcluster.com/docs/getting-started/setup 进行安装。,Crossplane 和 Crossplane Helm Provider 现在已经准备好了,接下来让我们来看看 Crossplane Composition。Crossplane 提供了组合托管资源的机制,用户可以在其中以声明的方式创建自己的抽象。,我们这里的 Crossplane Composition(XR) 定义了创建新环境资源时需要执行的相关操作,该对象会执行以下的一些操作:,,接下来我们来看下这是如何实现的,首先我们需要将 Crossplane Composition 和 Environment CRD 应用到我们的集群中来,这样我们就可以创建新的 Environment 资源了。,首先定义一个 Environment 的组合资源,对应的资源清单如下所示,该对象相当于 Kubernetes 集群中的 CRD:,有了 XRD 组合资源声明过后,接下来定义一个组合对象,资源清单文件内容如下所示,在该 Composition 组合对象中定义了多个资源,其中关联了上面的 XRD 对象声明的 Environment 对象:,我们为 VCluster 的 Chart 包设置了 3 个参数,以便与 Crossplane 一起使用:,接着直接应用上面的两个对象即可:,一旦集群内的组合和 CRD 可用后,我们就可以开始创建新的环境资源,在运行之前要检查哪些 VClusters 目前是可用的。,现在应该还没有任何 VClusters,现在我们可以创建一个新的环境,比如现在我们定义一个 dev 的环境,只需要声明一个如下所示的 Environment 对象即可:,直接应用该对象:,现在我们可以像对待其他 Kubernetes 资源一样对待你创建的环境资源了,你可以直接使用 kubectl get environments 列出它们,甚至可以描述它们以查看更多细节。,现在我们再去检查 VCluster 正常就会发现一个新的资源了:,VCluster 将在一个新的命名空间 dev-environment 中安装一个 APIServer(默认使用 K3s)、CoreDNS 实例和一个 Syncer,让用户能够通过 kubectl 与 VCluster API Server 进行交互,就像与常规集群一样,VCluster 将与负责调度工作负载的主机集群同步这些资源,这样来实现了一个命名空间就是一个 Kubernetes 集群的功能。,一旦我们配置了 Crossplane 和 Crossplane Helm Provider,我们就可以通过创建一个新的 Helm Release 安装一个 Helm Chart 来创建一个新的 VCluster,非常简单。,,一旦我们使用在 secret 中创建的正确 kubeconfig 创建了 VCluster,我们就可以配置第二个 Helm Provider 以将我们的应用程序安装到新创建的 VCluster 中,上面 composition 对象中第 95 行定义的 helm-provider-vcluster 就是该描述。,然后在 composition 内部,我们配置使用了一个我们的会议应用的 Helm Chart 包。,,配置完所有内容并创建新环境后,我们可以连接到 VCluster 并检查应用程序是否已安装:,可以看到我们的应用在该集群中已经安装成功了,而这些应用实际上就是部署在 KinD 这个原始集群的 dev-environment 命名空间下面的:,只是 VCluster 将一个命名空间进行了隔离,使用起来和 Kubernetes 集群体验基本一致。,这只是一个简单的示例,介绍了如何使用 Crossplane 与 VCluster 来结合使用快速配置一套 Kubernetes 集群环境并在其中安装应用,以使开发人员提高工作效率。当然还有很多可以优化的地方,比如:
© 版权声明
文章版权归作者所有,未经允许请勿转载。