GCP Quickstart Part 2
本指南是系列指南的第二部分。
[第一部分**](https://crossplane.devops.gold/master/getting-started/provider-gcp/包括安装 crossplane 并将 Kubernetes 集群连接到 GCP。
本指南将指导您使用 crossplane 构建和访问自定义 API。
先决条件
- 完成 quickstart part 1 将 Kubernetes 连接到 GCP。
- 一个 GCP 账户,该账户具有创建 GCP 存储桶 和 发布/子主题 的权限。
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 文件。
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-credentials.json
文件中的 project_id
字段查找 GCP 项目 ID。
安装 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。
本指南被引用的组是
.
由于这是 API 的第一个版本,本指南被引用的版本为
.
1apiVersion: database.example.com/v1alpha1
定义一种
API 组是相关 API 的逻辑集合。 在一个组中,有代表不同资源的单个种类。
例如,“队列 “组可能有 “PubSub “和 “CloudTask “两种。
种类 “可以是任何东西,但必须是UpperCamelCased。
该应用程序接口的类型是
定义规格
应用程序接口最重要的部分是模式。 模式定义了用户接受的输入。
该应用程序接口允许用户提供
运行云资源的位置。
所有其他资源设置都不能由用户配置。 这使得 crossplane 可以执行任何策略和标准,而不用担心用户出错。
应用应用程序接口
crossplane 被引用
(也称为 “XRD”)在 Kubernetes 中安装您的自定义 API。
XRD
包含有关应用程序接口的所有信息,包括
,
,
和
.
XRD 的
必须是
和
.
模式
被引用为
规范来定义应用程序接口
.
应用程序接口定义了一个
必须是
或
或
.
应用此 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
添加
允许用户在集群级别使用
端点访问该 API,或在名称空间中使用
端点访问该 API。
namespace 范围内的 API 是 crossplane Claim。
使用 kubectl get xrd
查看已安装的 XRD。
使用 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
模板中的每个条目都是一个完整的资源定义,定义了所有资源设置和元数据,如标签和 Annotations。
该模板可创建一个 GCP
和
.
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
复合类型
定义了哪些自定义 API 可以使用此模板创建资源。
请阅读 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
删除资源。
使用 kubectl get managed
验证 crossplane 是否删除了资源
使用带有 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
使用 kubectl get composite
验证 crossplane 是否删除了 Composition 资源。
使用 kubectl get managed
验证 crossplane 是否删除了托管资源。
下一步
- 在Provider CRD reference中探索 Crossplane 可以配置的 AWS 资源。
- 加入 Crossplane Slack 并与 Crossplane 用户和贡献者联系。
- 阅读更多有关Crossplane 概念,了解 Crossplane 还能做些什么。