一 背景
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 配置
shell
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
#- role: worker
#- role: worker

在我本地利用kind启动了k8s集群
- helm3已经安装

- 安装Crossplane Helm chart
shell
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
shell
$ kubectl get all -n crossplane-system

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

四 实战AWS S3
4.1 安装AWS Provider
- 使用Kubernetes配置文件将AWS S3提供程序安装到Kubernetes集群中。
shell
cat <<EOF | kubectl apply -f -
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-aws-s3
spec:
package: xpkg.upbound.io/upbound/provider-aws-s3:v1.1.0
EOF
Crossplane Provider安装代表AWS S3服务的Kubernetes自定义资源定义(crd)。这些crd允许您直接在Kubernetes中创建AWS资源。
shell
k get all -n crossplane-system

aws-provider 创建了对应的pod控制器,并将crd应用至K8s集群内,

S3提供程序安装第二个提供程序,即upbound-provider-family-aws
. 家族提供商管理跨所有AWS家族提供商的AWS身份验证。
您可以使用kubectl get CRDs查看新的CRDs。 每个CRD都映射到一个独特的AWS服务,Crossplane可以提供和管理。

4.2 为AWS创建Kubernetes密钥
提供商需要凭据来创建和管理AWS资源。 提供者使用Kubernetes Secret将凭据连接到提供者。 从您的AWS密钥对生成Kubernetes Secret,然后配置提供商以使用它。
- 生成AWS密钥对文件
创建一个包含AWS帐户aws_access_key_id和aws_secret_access_key的文本文件。
shell
[default]
aws_access_key_id = xxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxx
将此文本文件保存为aws -credentials.txt。
- 使用AWS凭证创建Kubernetes密钥
Kubernetes通用密钥有名称和内容。 使用kubectl创建secret 生成名为aw -secret的秘密对象 在跨平面系统命名空间中。 使用------from-file=参数将值设置为laws -credentials.txt文件的内容。
shell
$ kubectl create secret \
generic aws-secret \
-n crossplane-system \
--from-file=creds=./aws-credentials.txt
$ kubectl describe secret aws-secret -n crossplane-system
Name: aws-secret
Namespace: crossplane-system
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
creds: 116 bytes

4.3 创建providerconfig
ProviderConfig用于自定义AWS Provider的设置。将k8s中的secret关联到 providers中。 这将把作为Kubernetes密钥保存的AWS凭证附加为一个密钥。 spec.credentials.secretRef.name值是在spec.credentials.secretRef.namespace中包含AWS凭证的Kubernetes密钥的名称。
shell
cat <<EOF | kubectl apply -f -
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
name: default
spec:
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: aws-secret
key: creds
EOF

providerconfig 是集群级别的。
4.4 创建managed resource
托管资源是Crossplane在Kubernetes集群之外创建和管理的任何东西。 本指南使用Crossplane创建一个AWS S3桶。 S3桶是一种托管资源。
注意:AWS S3桶名必须全局唯一。为了生成唯一的名称,本示例使用随机散列。任何唯一的名称都是可以接受的。
shell
apiVersion: s3.aws.upbound.io/v1beta1
kind: Bucket
metadata:
generateName: crossplane-bucket-
spec:
forProvider:
region: us-east-2
providerConfigRef:
name: default
apiVersion和kind来自提供商的crd。 其中metadata.name为在AWS中创建的S3桶名。 本例使用$bucket变量中生成的名称crossplane-bucket-。 region告诉AWS在部署资源时使用哪个AWS区域。 区域可以是任何AWS区域端点代码。 使用kubectl get buckets来验证Crossplane创建了bucket。

当READY和SYNCED的值为True时,Crossplane创建桶。
shell
$ kubectl get buckets

当READY和SYNCED的值为True时,Crossplane创建桶,可以看到bucket

4.5 删除管理资源
在关闭Kubernetes集群之前,删除刚刚创建的S3桶。 使用kubectl delete bucket 命令删除桶。
shell
k delete bucket crossplane-bucket-sj5p2

五 实战DynamoDB
5.1 安装dynamodb provider
将部署一个S3 bucket和一个DynamoDB Table。 部署DynamoDB表也需要DynamoDB提供程序。 将新的Provider添加到集群中。
shell
cat <<EOF | kubectl apply -f -
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-aws-dynamodb
spec:
package: xpkg.upbound.io/upbound/provider-aws-dynamodb:v1.1.0
EOF
使用kubectl get providers查看新的DynamoDB提供程序。


5.2 创建自定义API
Crossplane允许您为用户构建自己的自定义api,抽象出有关云提供商及其资源的详细信息。你可以让你的API变得复杂或简单。 自定义API是Kubernetes对象。 下面是一个自定义API示例。
shell
apiVersion: database.example.com/v1alpha1
kind: NoSQL
metadata:
name: my-nosql-database
spec:
location: "US"
像任何Kubernetes对象一样,API有版本、种类和规范。
5.2.1 定义group和version
要创建自己的API,首先要定义API组和版本。 组可以是任何值,但通常的约定是映射到一个完全限定的域名。 版本显示API的成熟或稳定程度,并在更改、添加或删除API中的字段时增加。 Crossplane不需要特定的版本或特定的版本命名约定,但强烈建议遵循Kubernetes API版本控制指南。 v1alpha1 -一个可以随时更改的新API。 v1beta1 -一个被认为是稳定的现有API。强烈不鼓励破坏性的更改。 v1 -一个稳定的API,没有破坏性的变化。 本指南使用database.example.com组。 因为这是API的第一个版本,所以本指南使用版本v1alpha1。
shell
apiVersion: database.example.com/v1alpha1
5.2.2 定义kind
API组是相关API的逻辑集合。在一个群体中有代表不同资源的个体种类。 例如,一个数据库组可能有关系型和NoSQL类型。 类型可以是任何类型,但必须是上驼色。 这个API的类型是NoSQL
yaml
apiVersion: database.example.com/v1alpha1
kind: NoSQL
5.2.3 定义spec
API最重要的部分是模式。模式定义接受来自用户的输入。 该API允许用户提供运行其云资源的位置。 用户不能配置所有其他资源设置。这允许Crossplane执行任何策略和标准,而不必担心用户错误。
shell
apiVersion: database.example.com/v1alpha1
kind: NoSQL
spec:
location: "US"
5.2.4 apply API
Crossplane使用复合资源定义(也称为XRD)在Kubernetes中安装自定义API。 XRD规范包含API的所有信息,包括API的组、版本、种类和模式。 XRD的名称必须是复数和基团的组合。 该模式使用OpenAPIv3规范来定义API规范。 API定义的位置必须是EU或US之一。 应用此XRD在Kubernetes集群中创建自定义API。
shell
cat <<EOF | kubectl apply -f -
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: nosqls.database.example.com
spec:
group: database.example.com
names:
kind: NoSQL
plural: nosqls
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
location:
type: string
oneOf:
- pattern: '^EU$'
- pattern: '^US$'
required:
- location
served: true
referenceable: true
claimNames:
kind: NoSQLClaim
plural: nosqlclaim
EOF
添加claimNames允许用户使用nosql端点在集群级别访问该API,或者使用nosqlclaim端点在名称空间中访问该API。 命名空间作用域的API是一个Crossplane Claim。
查看xrd
shell
$ kubectl get xrd
$ kubectl api-resources | grep nosql

5.3 创建一个部署模版
当用户访问自定义API时,Crossplane获取他们的输入,并将它们与描述要部署的基础设施的模板组合在一起。Crossplane称这个模板为Composition。 组合定义了要部署的所有云资源。模板中的每个条目都是一个完整的资源定义,定义了所有的资源设置和元数据,如标签和注释。 此模板创建了一个AWS S3 Bucket和一个DynamoDB Table。 Crossplane使用补丁将用户的输入应用到资源模板中。 此组合获取用户的位置输入,并将其用作单个资源中使用的区域。 将此合成应用到您的集群。
shell
cat <<EOF | kubectl apply -f -
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: dynamo-with-bucket
spec:
resources:
- name: s3Bucket
base:
apiVersion: s3.aws.upbound.io/v1beta1
kind: Bucket
metadata:
name: crossplane-quickstart-bucket
spec:
forProvider:
region: us-east-2
providerConfigRef:
name: default
patches:
- type: FromCompositeFieldPath
fromFieldPath: "spec.location"
toFieldPath: "spec.forProvider.region"
transforms:
- type: map
map:
EU: "eu-north-1"
US: "us-east-2"
- name: dynamoDB
base:
apiVersion: dynamodb.aws.upbound.io/v1beta1
kind: Table
metadata:
name: crossplane-quickstart-database
spec:
forProvider:
region: "us-east-2"
writeCapacity: 1
readCapacity: 1
attribute:
- name: S3ID
type: S
hashKey: S3ID
patches:
- type: FromCompositeFieldPath
fromFieldPath: "spec.location"
toFieldPath: "spec.forProvider.region"
transforms:
- type: map
map:
EU: "eu-north-1"
US: "us-east-2"
compositeTypeRef:
apiVersion: database.example.com/v1alpha1
kind: NoSQL
EOF
compositeTypeRef定义了哪些自定义api可以使用这个模板来创建资源。
shell
kubectl get composition

5.4 访问自定义API
通过安装自定义API (XRD)并将其关联到资源模板(Composition),用户可以访问API来创建资源。 创建NoSQL对象,用于创建云资源。
shell
cat <<EOF | kubectl apply -f -
apiVersion: database.example.com/v1alpha1
kind: NoSQL
metadata:
name: my-nosql-database
spec:
location: "US"
EOF

shell
$ k get nosql
$ k get managed
该对象是一个Crossplane复合资源(也称为XR)。 它是一个对象,表示从Composition模板创建的资源集合。 使用kubectl get manged查看单个资源


删除资源
shell
$ kubectl delete nosql my-nosql-database
$ kubectl get managed
5.5 使用带名称空间的自定义API
访问API nosql发生在集群范围内。 大多数组织将其用户隔离到名称空间中。 交叉平面声明是名称空间中的自定义API。 创建Claim就像访问自定义API端点一样,但是使用自定义API的claimNames的类型。 创建一个新的名称空间来测试在其中创建Claim。
shell
kubectl create namespace crossplane-test
cat <<EOF | kubectl apply -f -
apiVersion: database.example.com/v1alpha1
kind: NoSQLClaim
metadata:
name: my-nosql-database
namespace: crossplane-test
spec:
location: "US"
EOF
通过kubectl get claim -n crossplane-test
查看claim
SHELL
kubectl get claim -n crossplane-test
查看composite、managed
shell
$ k get claim -n crossplane-test
NAME SYNCED READY CONNECTION-SECRET AGE
my-nosql-database True True 2m10s
$ kubectl get composite
NAME SYNCED READY COMPOSITION AGE
my-nosql-database-6dksp True True dynamo-with-bucket 2m16s
$ kubectl get managed
NAME READY SYNCED EXTERNAL-NAME AGE
table.dynamodb.aws.upbound.io/my-nosql-database-6dksp-vfq8d True True my-nosql-database-6dksp-vfq8d 2m21s
NAME READY SYNCED EXTERNAL-NAME AGE
bucket.s3.aws.upbound.io/my-nosql-database-6dksp-9hr7z True True my-nosql-database-6dksp-9hr7z 2m21s

在aws云平台可以看到对应的资源。
- 删除资源
shell
k delete claim -n crossplane-test my-nosql-database
六 注意事项
- 配置准确的 AWS 访问凭证:确保在配置 AWS 提供商时提供准确的访问凭证,包括 Access Key 和 Secret Key。这些凭证应具有足够的权限来创建、更新和删除 AWS 资源。
- 熟悉 AWS 服务和资源:在使用 Crossplane 管控 AWS 资源之前,建议对所要管理的 AWS 服务和资源有一定的了解。了解每个服务的属性和限制,以便在定义资源类和创建资源实例时做出正确的配置。
- 细致的资源规划和命名:在定义资源类和创建资源实例时,仔细规划和命名资源,确保其具有可读性和一致性。这有助于管理和维护资源,并避免冲突或混淆。
- 谨慎操作资源生命周期:在管理资源的生命周期时,特别是删除资源时,要谨慎操作。确保你明确了解删除操作的后果,并进行必要的备份和验证,以免意外删除重要资源。
- 监控和错误处理:使用 Crossplane 管控 AWS 资源时,要配置适当的监控和日志记录,以便及时发现和处理任何错误或异常情况。监控资源的状态和性能,确保它们按预期工作。
- 安全性考虑:在配置 Crossplane 和 AWS 提供商时,要注意安全性方面的考虑。确保访问凭证的安全存储和传输,限制访问权限,使用安全的网络连接等,以保护资源和数据的安全。
七 结语
Crossplane 是一个开源的多云资源编排和管控平台,它提供了一种统一的方式来管理和控制不同云服务提供商的基础设施资源,特别适用于实战中对 AWS 资源的编排和管控。通过安装和配置 Crossplane,你可以与 AWS 进行集成,并定义资源类来描述 AWS 资源的规范和属性。然后,使用这些资源类创建具体的资源实例,如 S3 存储桶。Crossplane 还提供了资源的生命周期管理功能,包括创建、更新和删除等操作。此外,Crossplane 还与监控和扩展工具集成,帮助你监控和管理 AWS 资源的状态和性能。总之,Crossplane 是一个强大而灵活的工具,能够简化和加速 AWS 资源的编排和管控工作,提高云基础设施的效率和可管理性。