AWS Quickstart Part 2

Important

本指南是系列指南的第二部分。

[第 1** 部分https://crossplane.devops.gold/master/getting-started/provider-aws/包括安装 crossplane 并将 Kubernetes 集群连接到 AWS。

本指南将指导您使用 crossplane 构建和访问自定义 API。

先决条件

  • 完成 quickstart part 1 将 Kubernetes 连接到 AWS。
  • 具有创建 AWS S3 存储桶和 DynamoDB 实例权限的 AWS 账户

1.添加 Crossplane Helm 软件源并安装 Crossplane

1helm repo add \
2crossplane-stable https://charts.crossplane.io/stable
3helm repo update
4
5helm install crossplane \
6crossplane-stable/crossplane \
7--namespace crossplane-system \
8--create-namespace

2.当 crossplane pod 完成安装并准备就绪后,应用 AWS Provider-aws

1cat <<EOF | kubectl apply -f -
2apiVersion: pkg.crossplane.io/v1
3kind: Provider
4metadata:
5  name: provider-aws-s3
6spec:
7  package: xpkg.upbound.io/upbound/provider-aws-s3:v0.47.0
8EOF

3.创建一个包含 AWS 密钥的文件

1[default]
2aws_access_key_id = <aws_access_key>
3aws_secret_access_key = <aws_secret_key>

4.根据 AWS 密钥创建 Kubernetes secret

1kubectl create secret \
2generic aws-secret \
3-n crossplane-system \
4--from-file=creds=./aws-credentials.txt

5.创建 ProviderConfig

 1cat <<EOF | kubectl apply -f -
 2apiVersion: aws.upbound.io/v1beta1
 3kind: ProviderConfig
 4metadata:
 5  name: default
 6spec:
 7  credentials:
 8    source: Secret
 9    secretRef:
10      namespace: crossplane-system
11      name: aws-secret
12      key: creds
13EOF

安装 DynamoDB Provider

第 1 部分只安装了 AWS S3 Provider。 本部分将部署一个 S3 桶和一个 DynamoDB 表。 部署 DynamoDB 表还需要 DynamoDB Provider。

将新的 Provider 添加到集群中。

1cat <<EOF | kubectl apply -f -
2apiVersion: pkg.crossplane.io/v1
3kind: Provider
4metadata:
5  name: provider-aws-dynamodb
6spec:
7  package: xpkg.upbound.io/upbound/provider-aws-dynamodb:v0.47.0
8EOF

使用 kubectl get Providers 查看新的 DynamoDB Provider。

1kubectl get providers
2NAME INSTALLED HEALTHY PACKAGE AGE
3provider-aws-dynamodb True True xpkg.upbound.io/upbound/provider-aws-dynamodb:v0.47.0 3m55s
4provider-aws-s3 True True xpkg.upbound.io/upbound/provider-aws-s3:v0.47.0 13m
5upbound-provider-family-aws True True xpkg.upbound.io/upbound/provider-family-aws:v0.47.0 13m

创建自定义应用程序接口

Crossplane 允许您为用户构建自己的自定义 API,抽象掉有关云提供商及其资源的细节。 您可以随心所欲地让自己的 API 变得复杂或简单。

下面是一个自定义 API 的示例。

1apiVersion: database.example.com/v1alpha1
2kind: NoSQL
3metadata:
4  name: my-nosql-database
5spec: 
6  location: "US"

与任何 Kubernetes 对象一样,API 也有一个版本,类型规格.

###定义组和版本

要创建自己的 API,首先要定义一个 API 组版本

group 可以是任何值,但通常的习惯是映射到完全合格的域名。

版本显示 API 的成熟或稳定程度,并在更改、添加或删除 API 中的字段时递增。

crossplane 并不要求特定的版本或特定的版本命名约定,但强烈建议遵循Kubernetes API 版本指南

  • v1alpha1 - 随时可能更改的新 API。
  • v1beta1 - 稳定的现有 API。不鼓励进行破坏性更改。
  • v1 - 没有破坏性更改的稳定 API。

本指南被引用的组是database.example.com.

由于这是 API 的第一个版本,本指南被引用的版本为v1alpha1.

1apiVersion: database.example.com/v1alpha1

定义一种

API 组是相关 API 的逻辑集合。 在一个组中,有代表不同资源的单个种类。

例如,“数据库 “组可能有 “关系型 “和 “NoSQL “两种。

种类 “可以是任何东西,但必须是UpperCamelCased

该应用程序接口的类型是NoSQL

1apiVersion: database.example.com/v1alpha1
2kind: NoSQL

定义规格

应用程序接口最重要的部分是模式。 模式定义了用户接受的输入。

该应用程序接口允许用户提供位置运行云资源的位置。

所有其他资源设置都不能由用户配置。 这使得 crossplane 可以执行任何策略和标准,而不用担心用户出错。

1apiVersion: database.example.com/v1alpha1
2kind: NoSQL
3spec: 
4  location: "US"

应用应用程序接口

crossplane 被引用Composition 资源定义(也称为 “XRD”)在 Kubernetes 中安装您的自定义 API。

XRD 规范包含有关应用程序接口的所有信息,包括,版本,种类模式.

XRD 的 名称必须是 复数.

模式 模式被引用为开放式应用程序接口 v3规范来定义应用程序接口 规范.

应用程序接口定义了一个 位置必须是 之一欧盟美国.

应用此 XRD 在 Kubernetes 集群中创建自定义 API。

 1cat <<EOF | kubectl apply -f -
 2apiVersion: apiextensions.crossplane.io/v1
 3kind: CompositeResourceDefinition
 4metadata:
 5  name: nosqls.database.example.com
 6spec:
 7  group: database.example.com
 8  names:
 9    kind: NoSQL
10    plural: nosqls
11  versions:
12  - name: v1alpha1
13    schema:
14      openAPIV3Schema:
15        type: object
16        properties:
17          spec:
18            type: object
19            properties:
20              location:
21                type: string
22                oneOf:
23                  - pattern: '^EU$'
24                  - pattern: '^US$'
25            required:
26              - location
27    served: true
28    referenceable: true
29  claimNames:
30    kind: NoSQLClaim
31    plural: nosqlclaim
32EOF

添加 claim名称允许用户在集群级别使用nosql端点访问该 API,或在名称空间中使用nosqlclaim端点访问该 API。

namespace 范围内的 API 是 crossplane Claim

Tip
有关 Composition 资源定义的字段和选项的更多详情,请阅读 XRD 文档.

使用 kubectl get xrd 查看已安装的 XRD。

1kubectl get xrd
2NAME ESTABLISHED OFFERED AGE
3nosqls.database.example.com True True 2s

使用 kubectl api-resources | grep nosql 查看新的自定义 API 端点

1kubectl api-resources | grep nosql
2nosqlclaim database.example.com/v1alpha1 true NoSQLClaim
3nosqls database.example.com/v1alpha1 false NoSQL

创建部署模板

当用户访问自定义 API 时,crossplane 会接收他们的输入,并将其与描述要部署的基础架构的模板相结合。 Crossplane 将此模板称为_Composition_。

composition Composition模板中的每个条目都是一个完整的资源定义,定义了所有资源设置和元数据,如标签和 Annotations。

此模板会创建一个 AWSS3数据桶DynamoDB.

crossplane 被引用为 补丁将用户的输入应用到资源模板中。 该 Composition 将用户的位置输入,并将其作为区域被引用到单个资源中。

将此 Composition 应用于您的集群。

 1cat <<EOF | kubectl apply -f -
 2apiVersion: apiextensions.crossplane.io/v1
 3kind: Composition
 4metadata:
 5  name: dynamo-with-bucket
 6spec:
 7  resources:
 8    - name: s3Bucket
 9      base:
10        apiVersion: s3.aws.upbound.io/v1beta1
11        kind: Bucket
12        metadata:
13          name: crossplane-quickstart-bucket
14        spec:
15          forProvider:
16            region: us-east-2
17          providerConfigRef:
18            name: default
19      patches:
20        - type: FromCompositeFieldPath
21          fromFieldPath: "spec.location"
22          toFieldPath: "spec.forProvider.region"
23          transforms:
24            - type: map
25              map: 
26                EU: "eu-north-1"
27                US: "us-east-2"
28    - name: dynamoDB
29      base:
30        apiVersion: dynamodb.aws.upbound.io/v1beta1
31        kind: Table
32        metadata:
33          name: crossplane-quickstart-database
34        spec:
35          forProvider:
36            region: "us-east-2"
37            writeCapacity: 1
38            readCapacity: 1
39            attribute:
40              - name: S3ID
41                type: S
42            hashKey: S3ID
43      patches:
44        - type: FromCompositeFieldPath
45          fromFieldPath: "spec.location"
46          toFieldPath: "spec.forProvider.region"
47          transforms:
48            - type: map
49              map: 
50                EU: "eu-north-1"
51                US: "us-east-2"
52  compositeTypeRef:
53    apiVersion: database.example.com/v1alpha1
54    kind: NoSQL
55EOF

复合类型 compositeTypeRef定义了哪些自定义 API 可以使用此模板创建资源。

Tip

请阅读 Composition documentation 获取更多关于配置 Composition 和所有可用选项的信息。

阅读补丁和转换文档,了解有关 crossplane 如何使用补丁将用户输入映射到 Composition 资源模板的更多信息。

使用 kubectl get composition 查看 Composition

1kubectl get composition
2NAME XR-KIND XR-APIVERSION AGE
3dynamo-with-bucket NoSQL database.example.com/v1alpha1 3s

访问自定义应用程序接口

安装了自定义应用程序接口(XRD)并与资源模板(Composition)关联后,用户就可以访问应用程序接口来创建资源。

创建一个 对象来创建云资源。对象来创建云资源。

1cat <<EOF | kubectl apply -f -
2apiVersion: database.example.com/v1alpha1
3kind: NoSQL
4metadata:
5  name: my-nosql-database
6spec: 
7  location: "US"
8EOF

使用 kubectl get nosql 查看资源。

1kubectl get nosql
2NAME SYNCED READY COMPOSITION AGE
3my-nosql-database True True dynamo-with-bucket 14s

该对象是一个 crossplane composite resource(也称为 XR)。 它是一个单独的对象,代表从 Composition 模板创建的资源集合。

使用 kubectl get managed 查看单个资源

1kubectl get managed
2NAME READY SYNCED EXTERNAL-NAME AGE
3table.dynamodb.aws.upbound.io/my-nosql-database-t5wtx True True my-nosql-database-t5wtx 33s
4
5NAME READY SYNCED EXTERNAL-NAME AGE
6bucket.s3.aws.upbound.io/my-nosql-database-xtzph True True my-nosql-database-xtzph 33s

使用 kubectl delete nosql 删除资源。

1kubectl delete nosql my-nosql-database
2nosql.database.example.com "my-nosql-database" deleted

使用 kubectl get managed 验证 crossplane 是否删除了资源

Note
删除资源可能需要 5 分钟。
1kubectl get managed
2No resources found

使用带有 namespace 的应用程序接口

访问应用程序接口 nosql 是在集群范围内进行的。 大多数组织将用户隔离到 namespace 中。

Crossplane Claim 是名称空间中的自定义应用程序接口。

创建 Claim 就像访问自定义 API 端点一样,只不过是使用了类型从自定义 API 的 “claim名称 “中创建。

创建一个新的命名空间,以测试在其中创建一个 claims。

1kubectl create namespace crossplane-test

然后在 crossplane-test 名称空间中创建一个 claim。

1cat <<EOF | kubectl apply -f -
2apiVersion: database.example.com/v1alpha1
3kind: NoSQLClaim
4metadata:
5  name: my-nosql-database
6  namespace: crossplane-test
7spec: 
8  location: "US"
9EOF

使用 kubectl get claim -n crossplane-test 查看claim。

1kubectl get claim -n crossplane-test
2NAME SYNCED READY CONNECTION-SECRET AGE
3my-nosql-database True True 17s

claims 会自动创建一个复合资源,该资源会创建托管资源。

使用 kubectl get composite 查看 Crossplane 创建的 Composition 资源。

1kubectl get composite
2NAME SYNCED READY COMPOSITION AGE
3my-nosql-database-t9qrw True True dynamo-with-bucket 77s

同样,使用 kubectl get managed 查看托管资源。

1kubectl get managed
2NAME READY SYNCED EXTERNAL-NAME AGE
3table.dynamodb.aws.upbound.io/my-nosql-database-t9qrw-dcpwv True True my-nosql-database-t9qrw-dcpwv 116s
4
5NAME READY SYNCED EXTERNAL-NAME AGE
6bucket.s3.aws.upbound.io/my-nosql-database-t9qrw-g98lv True True my-nosql-database-t9qrw-g98lv 117s

删除 claim 会删除所有 crossplane 生成的资源。

kubectl delete claim -n crossplane-test my-nosql-database.

1kubectl delete claim -n crossplane-test my-nosql-database
2nosqlclaim.database.example.com "my-nosql-database" deleted
Note
删除资源可能需要 5 分钟。

使用 kubectl get composite 验证 crossplane 是否删除了 Composition 资源。

1kubectl get composite
2No resources found

使用 kubectl get managed 验证 crossplane 是否删除了托管资源。

1kubectl get managed
2No resources found

下一步