GCP Quickstart Part 2

Important

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

[第一部分**](https://crossplane.devops.gold/master/getting-started/provider-gcp/包括安装 crossplane 并将 Kubernetes 集群连接到 GCP。

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

先决条件

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吊舱完成安装并准备就绪时,应用 GCP

Provider.

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

3.用 GCP 服务账户创建名为 gcp-credentials.json 的文件

JSON 文件。

Tip
GCP 文档 提供了如何生成服务帐户 JSON 文件的信息。

4.从 GCP JSON 文件创建 Kubernetes secret

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

5.创建 ProviderConfig

包括您的GCP 项目 ID设置中。

Tip
gcp-credentials.json 文件中的 project_id 字段查找 GCP 项目 ID。
 1cat <<EOF | kubectl apply -f -
 2apiVersion: gcp.upbound.io/v1beta1
 3kind: ProviderConfig
 4metadata:
 5  name: default
 6spec:
 7  projectID: 
 8  credentials:
 9    source: Secret
10    secretRef:
11      namespace: crossplane-system
12      name: gcp-secret
13      key: creds
14EOF

安装 PubSub Providers

第一部分只安装了 GCP 存储提供程序。 本部分将部署一个 PubSub Topic 和一个 GCP 存储桶。 首先安装 GCP PubSub Provider。

将新的 Provider 添加到集群中。

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

使用 kubectl get Provider 查看新的 PubSub Provider。

1kubectl get providers
2NAME INSTALLED HEALTHY PACKAGE AGE
3provider-gcp-pubsub True True xpkg.upbound.io/upbound/provider-gcp-pubsub:v0.41.0 39s
4provider-gcp-storage True True xpkg.upbound.io/upbound/provider-gcp-storage:v0.41.0 13m
5upbound-provider-family-gcp True True xpkg.upbound.io/upbound/provider-family-gcp:v0.41.0 12m

创建自定义应用程序接口

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 的逻辑集合。 在一个组中,有代表不同资源的单个种类。

例如,“队列 “组可能有 “PubSub “和 “CloudTask “两种。

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

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

1apiVersion: queue.example.com/v1alpha1
2kind: PubSub

定义规格

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

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

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

1apiVersion: queue.example.com/v1alpha1
2kind: PubSub
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: pubsubs.queue.example.com
 6spec:
 7  group: queue.example.com
 8  names:
 9    kind: PubSub
10    plural: pubsubs
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: PubSubClaim
31    plural: pubsubclaims
32EOF

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

namespace 范围内的 API 是 crossplane Claim

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

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

1kubectl get xrd
2NAME ESTABLISHED OFFERED AGE
3pubsubs.queue.example.com True True 7s

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

1kubectl api-resources | grep queue.example
2pubsubclaims queue.example.com/v1alpha1 true PubSubClaim
3pubsubs queue.example.com/v1alpha1 false PubSub

创建部署模板

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

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

该模板可创建一个 GCP存储存储桶PubSub主题.

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

将此 Composition 应用于您的集群。

 1cat <<EOF | kubectl apply -f -
 2apiVersion: apiextensions.crossplane.io/v1
 3kind: Composition
 4metadata:
 5  name: topic-with-bucket
 6spec:
 7  resources:
 8    - name: crossplane-quickstart-bucket
 9      base:
10        apiVersion: storage.gcp.upbound.io/v1beta1
11        kind: Bucket
12        spec:
13          forProvider:
14            location: "US"
15      patches:
16        - fromFieldPath: "spec.location"
17          toFieldPath: "spec.forProvider.location"
18          transforms:
19            - type: map
20              map: 
21                EU: "EU"
22                US: "US"
23    - name: crossplane-quickstart-topic
24      base:
25        apiVersion: pubsub.gcp.upbound.io/v1beta1
26        kind: Topic
27        spec:
28          forProvider:
29            messageStoragePolicy:
30              - allowedPersistenceRegions: 
31                - "us-central1"
32      patches:
33        - fromFieldPath: "spec.location"
34          toFieldPath: "spec.forProvider.messageStoragePolicy[0].allowedPersistenceRegions[0]"
35          transforms:
36            - type: map
37              map: 
38                EU: "europe-central2"
39                US: "us-central1"
40  compositeTypeRef:
41    apiVersion: queue.example.com/v1alpha1
42    kind: PubSub
43EOF

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

Tip

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

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

使用 kubectl get composition 查看 Composition

1kubectl get composition
2NAME XR-KIND XR-APIVERSION AGE
3topic-with-bucket PubSub queue.example.com 3s

访问自定义应用程序接口

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

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

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

使用 kubectl get pubsub 查看资源。

1kubectl get pubsub
2NAME SYNCED READY COMPOSITION AGE
3my-pubsub-queue True True topic-with-bucket 2m12s

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

使用 kubectl get managed 查看单个资源

1kubectl get managed
2NAME READY SYNCED EXTERNAL-NAME AGE
3topic.pubsub.gcp.upbound.io/my-pubsub-queue-cjswx True True my-pubsub-queue-cjswx 3m4s
4
5NAME READY SYNCED EXTERNAL-NAME AGE
6bucket.storage.gcp.upbound.io/my-pubsub-queue-vljg9 True True my-pubsub-queue-vljg9 3m4s

使用 kubectl delete pubsub 删除资源。

1kubectl delete pubsub my-pubsub-queue
2pubsub.queue.example.com "my-pubsub-queue" deleted

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

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

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

访问应用程序接口 pubsub 发生在集群范围内。 大多数组织将用户隔离到 namespace 中。

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

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

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

1kubectl create namespace crossplane-test

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

1cat <<EOF | kubectl apply -f -
2apiVersion: queue.example.com/v1alpha1
3kind: PubSubClaim
4metadata:  
5  name: my-pubsub-queue
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-pubsub-queue True True 2m10s

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

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

1kubectl get composite
2NAME SYNCED READY COMPOSITION AGE
3my-pubsub-queue-7bm9n True True topic-with-bucket 3m10s

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

1kubectl get managed
2NAME READY SYNCED EXTERNAL-NAME AGE
3topic.pubsub.gcp.upbound.io/my-pubsub-queue-7bm9n-6kdq4 True True my-pubsub-queue-7bm9n-6kdq4 3m22s
4
5NAME READY SYNCED EXTERNAL-NAME AGE
6bucket.storage.gcp.upbound.io/my-pubsub-queue-7bm9n-hhwx8 True True my-pubsub-queue-7bm9n-hhwx8 3m22s

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

kubectl delete claim -n crossplane-test my-pubsub-queue

1kubectl delete pubsubclaim my-pubsub-queue -n crossplane-test
2pubsubclaim.queue.example.com "my-pubsub-queue" deleted
Note
删除资源可能需要 5 分钟。

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

1kubectl get composite
2No resources found

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

1kubectl get managed
2No resources found

下一步