基于 Flux 的 GitOps 管理 Crossplane 部署及资源
Overview
背景
在Flux 部署实战的总结展望中有一个方向是如何将云上基础设施资源同Kubernetes内资源统一管理, 而Crossplane提供了一个高度可扩展的后端,使用声明式程序同时编排应用程序和基础设施,不用关心它们在哪里运行。
近期 AWS 官方博客宣布了 AWS Blueprints for Crossplane,为客户提供了在 Amazon EKS 上应用 Crossplane 的参考实现。
AWS Blueprints for Crossplane
AWS Blueprints for Crossplane 是一个 Github 上开源项目,它提供了如下参考架构及功能,
- ✅ 使用Terraform 创建 Amazon EKS 集群并部署Crossplane
- ✅ 使用eksctl 创建 Amazon EKS 集群并部署Crossplane
- ✅ AWS Provider- Crossplane Compositions for AWS Services
- ✅ Terrajet AWS Provider - Another Crossplane Compositions for AWS Services
- ✅ AWS IRSA on EKS - AWS Provider Config with IRSA enabled
- ✅ 使用 AWS Provider 和 Terrajet AWS Provider 的 Composite Resources (XRs)示例部署模式
- ✅ 使用Crossplane Managed Resources (MRs) 的示例部署
部署 Crossplane
EKS Crossplane 参考蓝图示例了如何使用 Terraform(通过Amazon EKS Blueprints for Terraform) 和 eksctl 部署 EKS 集群及部署 Crossplane, 本文将演示如何使用 Flux 按照 GitOps 方式部署管理 Crossplane,演示将沿用 Flux 实战 所使用的示例repo。
手动部署 Crossplane
按照 Crossplane 部署文档,Crossplane 在 EKS 上的部署分为下面三步,
- 通过 Helm 部署 Crossplane chart
- 由于 Crossplane 大量通过 CRD 使用扩展性,需要在 Crossplane 组件部署成功后, 通过 Crossplane pkg CRD 部署及配置对应的 Provider,如在 AWS 上管理 AWS Provider 或 Terrajet AWS Provider
- AWS Provider 或 Terrajet AWS Provider 是通过
pkg
CRD 异步部署的,需要等 Provider CRD 可用后,才可部署对应的 Provider Config
通过 Flux 实现 GitOps 部署 Crossplane
鉴于 Crossplane 部署三个步骤的强依赖性,所以使用 Flux 部署通过 Kustomization dependencies 功能实现三部分资源创建的先后依赖。
1. 部署 Crossplane Helm chart
如下 manifest 创建 Crossplane helm release kustomization, 通过healthChecks检查确保 Crossplane 组件部署成功后才将 kustomization 设置为 reconcilation 成功。
1apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
2kind: Kustomization
3metadata:
4 name: crossplane
5 namespace: flux-system
6spec:
7 interval: 10m0s
8 path: ./infrastructure/base/crossplane/release
9 targetNamespace: crossplane-system
10 prune: true
11 sourceRef:
12 kind: GitRepository
13 name: flux-system
14 namespace: flux-system
15 timeout: 5m
16 healthChecks:
17 - apiVersion: apps/v1
18 kind: Deployment
19 name: crossplane
20 namespace: crossplane-system
通过 Flux Helm 支持部署 Crossplane helm release
1apiVersion: helm.toolkit.fluxcd.io/v2beta1
2kind: HelmRelease
3metadata:
4 name: crossplane
5 namespace: crossplane-system
6spec:
7 releaseName: crossplane
8 targetNamespace: crossplane-system
9 chart:
10 spec:
11 chart: crossplane
12 version: "1.8.0"
13 sourceRef:
14 kind: HelmRepository
15 name: crossplane-stable
16 namespace: crossplane-system
17 serviceAccountName: helm-controller
18 timeout: 5m
19 test:
20 enable: true
21 ignoreFailures: true
22 interval: 1h0m0s
23 install:
24 crds: CreateReplace
25 remediation:
26 retries: 3
27 upgrade:
28 crds: CreateReplace
29 remediation:
30 remediateLastFailure: false
2. 创建 Crossplane AWS Provider
Kustomization crossplane-provider
将依赖 kustomization crossplane
,
并检查 Crossplane AWS provider 自定义资源 providerconfigs.aws.crossplane.io
创建成功与否。
1apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
2kind: Kustomization
3metadata:
4 name: crossplane-provider
5 namespace: flux-system
6spec:
7 interval: 10m0s
8 path: ./infrastructure/base/crossplane/provider
9 prune: true
10 sourceRef:
11 kind: GitRepository
12 name: flux-system
13 namespace: flux-system
14 dependsOn:
15 - name: crossplane
16 targetNamespace: crossplane-system
17 healthChecks:
18 - apiVersion: apiextensions.k8s.io/v1
19 kind: CustomResourceDefinition
20 name: providerconfigs.aws.crossplane.io
21 timeout: 5m
22 patches:
23 - patch: |
24 - op: replace
25 path: /metadata/annotations/eks.amazonaws.com~1role-arn
26 value: arn:aws:iam::845861764576:role/crossplane-provider-aws
27 target:
28 group: pkg.crossplane.io
29 version: v1alpha1
30 kind: ControllerConfig
3. 创建 Provider Config
同样方式创建部署 ProviderConfig
资源的 kustomization 对象,依赖 crossplane-provider
kustomization 部署。
1apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
2kind: Kustomization
3metadata:
4 name: crossplane-provider-config
5 namespace: flux-system
6spec:
7 interval: 10m0s
8 path: ./infrastructure/base/crossplane/provider-config
9 prune: true
10 sourceRef:
11 kind: GitRepository
12 name: flux-system
13 dependsOn:
14 - name: crossplane-provider
15 timeout: 5m
使用 Crossplane 创建 AWS 基础设施
Crossplane 提供了两种方式表示外部系统资源,
- 托管资源 (MR) 是 Crossplane 对外部系统中资源的表示,例如,最常见的是云提供商。如下资源申明由 AWS Provider 支持,创建 AWS 上的 RDS 数据库实例。
1apiVersion: database.aws.crossplane.io/v1beta1
2kind: RDSInstance
- Crossplane 复合资源 (XR)是由托管资源组成的封装的 Kubernetes 自定义资源。 复合资源旨在让用户使用自己的观点和 API 构建自己的平台,而无需从头开始编写 Kubernetes 控制器。 相反,用户定义的 XR 架构教会 Crossplane 当有使用用户定义的 XR 时它应该组成(即创建)哪些托管资源。
AWS Blueprints for Crossplane 提供了 Compositions 示例,涵盖了 VPC,S3,IAM,RDS,DynamoDB,EKS 等服务。 如前面介绍 Crossplane Compositions(XRs) 是对基础设施的模式封装和组合,并不会直接创建云原生资源。
AWS Blueprints for Crossplane 同时提供了 Examples 示例 直接使用 AWS Provider 提供的托管资源 (MR) 和示例的复合资源 (XR),如上Compositions中示例VPC,S3, DynamoDB等AWS资源。
小结及展望
Crossplane 目前是 CNCF 基金会下孵化中项目,一定程度可以实现云上基础设施资源和 Kubernetes 内资源统一使用声明式方式管理。 复合资源 (Composite Resources) 支持了对业务需求的高层次抽象,理念同 Construct Hub 类似。 基础实施团队可以通过复合资源提供高阶抽象,复用经过验证且符合管理需求的抽象组合,简化下游团队管理资源的复杂度。
Crossplane 自身利用 K8S CRD 创建管理 Composite Resources,首先需要用户熟悉 CRD 的实现。 XRs 本质是通过声明式方式管理云原生基础设施,同样 AWS CloudFormation 是由 AWS 原生提供的通过声明式方式管理 AWS 上资源。 由于云原生资源的功能复杂性,CloudFormation 面临的编写复杂声明式代码,不易于测试和复用的问题同样在 Crossplane XRs 上存在。 同时面对数量庞大的 AWS 或其他云厂商原生服务资源,需要大量的社区资源来创建管理 AWS 可复用的复合资源模式, 可以预见在相当一段时间内云厂商托管资源覆盖率及高阶的复合资源数量都是该技术被广泛采纳的一个障碍。
对比 AWS CDK/Pulumi 编程方式管理创建的复用资源和更高阶的抽象, Crossplane 在开发和复用效率上并没有优势。 Crossplane 最大的优势是可通过统一 Kubernetes 声明式方式来管理云上资源和 Kubernetes 集群内资源。 但对用户而言采用 Crossplane 的学习成本和开发复杂度较高,Crossplane 及类似技术可列为持续评估调用中,小量谨慎用于生产环境。