Crossplane Overview
我们可以看到,通过另外的provider,我们可以任意的对资源进行组合并在kuberntes上创建我们想要的资源,并集成k8s自身的认证鉴权等多种功能,方便我们对于资源以及权限进行管理,这种可以任意组合形成一个对于资源的封装效果,极大简化开发对于资源的操作复杂度,同时任意资源同可以使用provider来通过到kuber去管理,这大概就是crossplane称自己使kubernetes成为一个通用控
什么是crossplane
根据crossplane官网的定义,Crossplane 是一个开源 Kubernetes 扩展,可将 Kubernetes 集群转变为通用控制平面。这样解释可能会比较官方,通俗点讲就是,我们期望什么样的一个资源对象,直接向kuber提交yaml文件,然后会通过crossplane建立在k8s之上的api与对应的后端,去帮助我们完成期望对象的创建。这其中包括各种对对象的封装来简化我们对资源的管理以及利用k8s自身的优势来方便我们管理这些资源。
How it works
Providers:定义 Crossplane 如何连接到非 Kubernetes 服务。例如,AWS、Azure 和 GCP 是每个云服务的不同提供商。
Compositions:对于资源对象的组合。
Managed resource:Crossplane 在 Kubernetes 集群外部创建和管理的任何资源。
Example
首先,我们会安装crossplane到kuber,然后我们需要安装对应资源的provider,provider告诉crossplane如何与对应资源交互。接着我们会创建需要的资源对象,接下来我们通过crossplane部署一个aws s3。
首先需要安装crossplane pod。
helm install crossplane \ crossplane-stable/crossplane \ --namespace crossplane-system \ --create-namespace
接着安装aws s3 provider。
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
然后我们需要配置aws的认证信息,创建.txt文件放入认证信息。
[default] aws_access_key_id = aws_secret_access_key =
kubectl create secret \ generic aws-secret \ -n crossplane-system \ --from-file=creds=./aws-credentials.txt
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
完成我们就可以利用crossplane创建s3了。
cat <<EOF | kubectl create -f - apiVersion: s3.aws.upbound.io/v1beta1 kind: Bucket metadata: generateName: crossplane-bucket- spec: forProvider: region: us-east-2 providerConfigRef: name: default EOF
$ kubectl get buckets NAME READY SYNCED EXTERNAL-NAME AGE crossplane-bucket-hhdzh True True crossplane-bucket-hhdzh 5s
可以看到,我们成功通过crossplane在k8s里面创建了aws s3。
除了单个的资源对象之外,我们还可以自己创建组合资源,那么如何实现呢。这就需要借助Composite,它会对单个资源进行组合,形成一个复合资源。举一个官网的例子:
首先需要创建一个资源nosql的定义CompositeResourceDefinition,类似kuber里面的crd。
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
这告诉crossplane生成一个关于NoSQL的api定义以及需要哪些字段,类比为创建一个pod需要什么字段,注意claimNames是用来访问这个资源的。
接着我们通过Composition制作nosql底层的实际资源组成,注意resource字段告诉我们具体涉及到那些组成,相当于程序里的一个封装效果,compositeTypeRef就是把nosql的定义CompositeResourceDefinition关联起来了。
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
这时候我们向api提交这些定义之后,就可以创建一个关于nosql的资源。
cat <<EOF | kubectl apply -f - apiVersion: database.example.com/v1alpha1 kind: NoSQL metadata: name: my-nosql-database spec: location: "US" EOF
注意我们这里的关联性,利用nosql的CompositeResourceDefinition,我们定义了一个nosql资源如何被创建(类似CRD),通过Composition,定义了nosql资源实际的组成。最后再通过nosql的资源文件(CR),创建了这个复合资源。
summary
我们可以看到,通过另外的provider,我们可以任意的对资源进行组合并在kuberntes上创建我们想要的资源,并集成k8s自身的认证鉴权等多种功能,方便我们对于资源以及权限进行管理,这种可以任意组合形成一个对于资源的封装效果,极大简化开发对于资源的操作复杂度,同时任意资源同可以使用provider来通过到kuber去管理,这大概就是crossplane称自己使kubernetes成为一个通用控制平面的原因。
更多推荐
所有评论(0)