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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐