什么是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成为一个通用控制平面的原因。

525






