掘金 后端 ( ) • 2024-04-13 14:50

一 背景

Crossplane 是一个开源的跨云资源编排和管控引擎,旨在帮助云原生应用程序开发者在多云环境中管理和编排各种云服务和基础设施资源。通过使用 Crossplane,开发者可以以统一和声明式的方式定义和部署云资源,并且可以在不同云提供商之间进行灵活的迁移和管理。

二 相关概念

  • Provider: 在 Crossplane 中,Provider 是用于连接和管理特定云提供商的插件。AWS Provider 是连接和管理 AWS 服务的插件,它允许 Crossplane 与 AWS 进行交互并操作 AWS 资源。
  • Composite Resource Definition (XRD): XRD 是定义自定义资源的规范,在 Crossplane 中用于描述和管理 AWS 资源。开发者可以使用 XRD 创建自定义资源类型,以便能够以声明式的方式在 AWS 中创建和管理这些资源。
  • Composition: Composition 是 Crossplane 中的一个概念,用于描述资源之间的关系和依赖。通过 Composition,可以将多个资源组合在一起,并定义它们之间的关联关系。
  • Managed Resource: Managed Resource 是 Crossplane 中用于描述和管理云资源的对象。开发者可以使用 Managed Resource 来创建、更新、删除和查询云资源。
  • Claim:Claim 是 Crossplane 中的资源请求,它表示您希望创建或使用的资源。通过创建 Claim,您可以告诉 Crossplane 您需要什么类型的资源以及如何配置它们。Crossplane 将根据 Claim 的定义自动创建、配置和管理相应的资源。

三 安装部署

3.1 先决条件

  • 至少有2gb内存的Kubernetes集群
  • 在Kubernetes集群中创建pod和secret的权限
  • Helm版本为v3.2.0或更高版本
  • 具有创建S3存储桶权限的AWS账户
  • AWS访问密钥

3.2 安装部署Crossplane

  • Kind 配置
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker

在我本地利用kind启动了k8s集群

  • helm3已经安装

  • 安装Crossplane Helm chart
helm repo add \
crossplane-stable https://charts.crossplane.io/stable
helm repo update

helm install crossplane \
crossplane-stable/crossplane \
--namespace crossplane-system \
--create-namespace

查看pod

$ kubectl get all -n crossplane-system

使用kubectl API -resources | grep crossplane查看新的API端点

四 阿里云资源管理

4.1 安装阿里云provider

apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-alibaba
spec:
  package: xpkg.upbound.io/crossplane-contrib/provider-alibaba:v0.6.0

4.2 创建secret

#!/bin/bash

echo -e "accessKeyId: ${ALICLOUD_ACCESS_KEY}\naccessKeySecret: ${ALICLOUD_SECRET_KEY}" > alibaba-credentials.conf
kubectl create secret generic alibaba-account-creds -n crossplane-system --from-file=credentials=alibaba-credentials.conf
rm -f alibaba-credentials.conf

4.3 创建阿里云providerconfig

apiVersion: alibaba.crossplane.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: alibaba-account-creds
      key: credentials
  region: cn-beijing
k get providerconfig.alibaba.crossplane.io/default -oyaml

providerconfig 是集群级别的。

4.4 创建manage resource

托管资源是Crossplane在Kubernetes集群之外创建和管理的任何东西。 本指南使用Crossplane创建一个AWS S3桶。 S3桶是一种托管资源。

4.4.1 OSS

apiVersion: oss.alibaba.crossplane.io/v1alpha1
kind: Bucket
metadata:
  name: xuel-crossplane-oss-01
spec:
  # acl: public-read-write
  acl: private
  storageClass: Standard
  dataRedundancyType: LRS
  writeConnectionSecretToRef:
    name: example-oss
    namespace: crossplane-system

控制台查看对象存储

修改权限变更权限

清理

4.4.2 RDS

本示例为官方示例:https://marketplace.upbound.io/providers/crossplane-contrib/provider-alibaba/v0.6.0/resources/database.alibaba.crossplane.io/RDSInstance/v1alpha1

apiVersion: database.alibaba.crossplane.io/v1alpha1
kind: RDSInstance
metadata:
  labels:
    engine: mysql
    example: "true"
  name: xuel-crossplane-rds
spec:
  deletionPolicy: Delete
  forProvider:
    dbInstanceClass: rds.mysql.c1.large
    dbInstanceStorageInGB: 20
    engine: mysql
    engineVersion: "8.0"
    masterUsername: test123
    securityIPList: 0.0.0.0/0
  providerConfigRef:
    name: default
  writeConnectionSecretToRef:
    name: example-rds
    namespace: crossplane-system

错误信息为 message: 'connect failed: cloud resource is not supported'

查看源码

经过尝试测试其他类型rds资源,也异常,云资源变更,API变更,资源未同步变更。

五 总结

跨平面编排目标云资源,依赖于供应商,目前阿里的供应商支持NAS、OSS、REDIS、SLB、SLS。但是,单独使用此提供商无法实现对其他云资源的全面控制,官方文档中的示例缺乏长期维护,并且随着官方产品的发展而失效。由于没有人维护提供程序,管控治理变得无效。

如果控制层面为crossplane,数据层面可以利用terraform来进行配合,目前阿里terraform provider支持数据类型还是非常齐全,可以通过配合实现,但是同时管控两种工具,复杂度也响应提升。

六 结语

阿里在crossplane生态中为国内仅有的一家,目前还处于发展阶段,随着云原生的发展,不MNC公司global 云例如aws、azure、gcp利用kubernetes方式管控,也想将国内云厂商资源IaC利用kuberentes进行管控编排,因此如果仅用crossplane providers,需要云厂商不断完善相关产品支持,以应对此种情况,如果折中,暂时可以利用crossplane+terraform的方案,总结了一篇文章:https://juejin.cn/post/7346804737079083018

后续待crossplane的发展,及云厂商provider的支持,可以进行切换对应资源管控。

参考链接