Azure Quickstart Part 2

Important

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

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

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

先决条件

  • 完成 [快速入门第 1 部分] (https://crossplane.devops.gold/master/getting-started/provider-azure/) 将 Kubernetes 连接到 Azure。
  • 一个具有创建 Azure 虚拟机、资源的权限的 Azure 帐户。

群组和虚拟网络。

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

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

3.使用 Azure CLI 创建服务委托,并将 JSON 输出保存为 `azure-crednetials.json

1az ad sp create-for-rbac \
2--sdk-auth \
3--role Owner \
4--scopes /subscriptions/

4.从 Azure JSON 文件创建 Kubernetes secret。

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

5.创建 ProviderConfig

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

创建自定义应用程序接口

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

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

1apiVersion: compute.example.com/v1alpha1
2kind: VirtualMachine
3metadata:
4  name: my-vm
5spec: 
6  location: "US"

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

###定义组和版本

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

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

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

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

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

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

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

1apiVersion: compute.example.com/v1alpha1

定义一种

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

例如,一个 “计算 “组可能有 “虚拟机 “和 “裸机 “两种类型。

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

该应用程序接口的种类是虚拟机

1apiVersion: compute.example.com/v1alpha1
2kind: VirtualMachine

定义规格

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

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

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

1apiVersion: compute.example.com/v1alpha1
2kind: VirtualMachine
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: virtualmachines.compute.example.com
 6spec:
 7  group: compute.example.com
 8  names:
 9    kind: VirtualMachine
10    plural: virtualmachines
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: VirtualMachineClaim
31    plural: virtualmachineclaims
32EOF

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

namespace 范围内的 API 是 crossplane Claim

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

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

1kubectl get xrd
2NAME ESTABLISHED OFFERED AGE
3virtualmachines.compute.example.com True True 43s

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

1kubectl api-resources | grep VirtualMachine
2virtualmachineclaims compute.example.com/v1alpha1 true VirtualMachineClaim
3virtualmachines compute.example.com/v1alpha1 false VirtualMachine

创建部署模板

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

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

此模板会创建一个 Azure虚拟机网络接口,子网虚拟网络资源组.

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

将此 Composition 应用于您的集群。

  1cat <<EOF | kubectl apply -f -
  2apiVersion: apiextensions.crossplane.io/v1
  3kind: Composition
  4metadata:
  5  name: crossplane-quickstart-vm-with-network
  6spec:
  7  resources:
  8    - name: quickstart-vm
  9      base:
 10        apiVersion: compute.azure.upbound.io/v1beta1
 11        kind: LinuxVirtualMachine
 12        spec:
 13          forProvider:
 14            adminUsername: adminuser
 15            adminSshKey:
 16              - publicKey: ssh-rsa
 17                  AAAAB3NzaC1yc2EAAAADAQABAAABAQC+wWK73dCr+jgQOAxNsHAnNNNMEMWOHYEccp6wJm2gotpr9katuF/ZAdou5AaW1C61slRkHRkpRRX9FA9CYBiitZgvCCz+3nWNN7l/Up54Zps/pHWGZLHNJZRYyAB6j5yVLMVHIHriY49d/GZTZVNB8GoJv9Gakwc/fuEZYYl4YDFiGMBP///TzlI4jhiJzjKnEvqPFki5p2ZRJqcbCiF4pJrxUQR/RXqVFQdbRLZgYfJ8xGB878RENq3yQ39d8dVOkq4edbkzwcUmwwwkYVPIoDGsYLaRHnG+To7FvMeyO7xDVQkMKzopTQV8AuKpyvpqu0a9pWOMaiCyDytO7GGN
 18                  [email protected]
 19                username: adminuser
 20            location: "Central US"
 21            osDisk:
 22              - caching: ReadWrite
 23                storageAccountType: Standard_LRS
 24            resourceGroupNameSelector:
 25              matchControllerRef: true
 26            size: Standard_B1ms
 27            sourceImageReference:
 28              - offer: debian-11
 29                publisher: Debian
 30                sku: 11-backports-gen2
 31                version: latest
 32            networkInterfaceIdsSelector:
 33              matchControllerRef: true
 34      patches:
 35        - type: FromCompositeFieldPath
 36          fromFieldPath: "spec.location"
 37          toFieldPath: "spec.forProvider.location"
 38          transforms:
 39            - type: map
 40              map: 
 41                EU: "Sweden Central"
 42                US: "Central US"
 43    - name: quickstart-nic
 44      base:
 45        apiVersion: network.azure.upbound.io/v1beta1
 46        kind: NetworkInterface
 47        spec:
 48          forProvider:
 49            ipConfiguration:
 50              - name: crossplane-quickstart-configuration
 51                privateIpAddressAllocation: Dynamic
 52                subnetIdSelector:
 53                  matchControllerRef: true
 54            location: "Central US"
 55            resourceGroupNameSelector:
 56              matchControllerRef: true
 57      patches:
 58        - type: FromCompositeFieldPath
 59          fromFieldPath: "spec.location"
 60          toFieldPath: "spec.forProvider.location"
 61          transforms:
 62            - type: map
 63              map: 
 64                EU: "Sweden Central"
 65                US: "Central US"            
 66    - name: quickstart-subnet
 67      base:
 68        apiVersion: network.azure.upbound.io/v1beta1
 69        kind: Subnet
 70        spec:
 71          forProvider:
 72            addressPrefixes:
 73              - 10.0.1.0/24
 74            virtualNetworkNameSelector:
 75              matchControllerRef: true
 76            resourceGroupNameSelector:
 77              matchControllerRef: true
 78      patches:
 79        - type: FromCompositeFieldPath
 80          fromFieldPath: "spec.location"
 81          toFieldPath: "spec.forProvider.location"
 82          transforms:
 83            - type: map
 84              map: 
 85                EU: "Sweden Central"
 86                US: "Central US"
 87    - name: quickstart-network
 88      base:
 89        apiVersion: network.azure.upbound.io/v1beta1
 90        kind: VirtualNetwork
 91        spec:
 92          forProvider:
 93            addressSpace:
 94              - 10.0.0.0/16
 95            location: "Central US"
 96            resourceGroupNameSelector:
 97              matchControllerRef: true
 98      patches:
 99        - type: FromCompositeFieldPath
100          fromFieldPath: "spec.location"
101          toFieldPath: "spec.forProvider.location"
102          transforms:
103            - type: map
104              map: 
105                EU: "Sweden Central"
106                US: "Central US"
107    - name: crossplane-resourcegroup
108      base:
109        apiVersion: azure.upbound.io/v1beta1
110        kind: ResourceGroup
111        spec:
112          forProvider:
113            location: Central US
114      patches:
115        - type: FromCompositeFieldPath
116          fromFieldPath: "spec.location"
117          toFieldPath: "spec.forProvider.location"
118          transforms:
119            - type: map
120              map: 
121                EU: "Sweden Central"
122                US: "Central US"
123  compositeTypeRef:
124    apiVersion: compute.example.com/v1alpha1
125    kind: VirtualMachine
126EOF

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

Tip

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

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

使用 kubectl get composition 查看 Composition

1kubectl get composition
2NAME XR-KIND XR-APIVERSION AGE
3crossplane-quickstart-vm-with-network XVirtualMachine custom-api.example.org/v1alpha1 77s

安装 Azure 虚拟机 Providers

第 1 部分只安装了 Azure 虚拟网络 Provider。 要部署虚拟机还需要 Azure 计算提供程序。

将新的 Provider 添加到集群中。

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

使用 kubectl get Provider 查看新的计算提供程序。

1kubectl get providers
2NAME INSTALLED HEALTHY PACKAGE AGE
3provider-azure-compute True True xpkg.upbound.io/upbound/provider-azure-compute:v0.34.0 25s
4provider-azure-network True True xpkg.upbound.io/upbound/provider-azure-network:v0.34.0 3h
5upbound-provider-family-azure True True xpkg.upbound.io/upbound/provider-family-azure:v0.34.0 3h

访问自定义应用程序接口

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

创建一个 虚拟机对象来创建云资源。

1cat <<EOF | kubectl apply -f -
2apiVersion: compute.example.com/v1alpha1
3kind: VirtualMachine
4metadata:
5  name: my-vm
6spec: 
7  location: "EU"
8EOF

使用 kubectl get VirtualMachine 查看资源。

Note
资源提供可能需要 5 分钟。
1kubectl get VirtualMachine
2NAME SYNCED READY COMPOSITION AGE
3my-vm True True crossplane-quickstart-vm-with-network 3m3s

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

使用 kubectl get managed 查看单个资源

 1kubectl get managed
 2NAME READY SYNCED EXTERNAL-NAME AGE
 3resourcegroup.azure.upbound.io/my-vm-7jb4n True True my-vm-7jb4n 3m43s
 4
 5NAME READY SYNCED EXTERNAL-NAME AGE
 6linuxvirtualmachine.compute.azure.upbound.io/my-vm-5h7p4 True True my-vm-5h7p4 3m43s
 7
 8NAME READY SYNCED EXTERNAL-NAME AGE
 9networkinterface.network.azure.upbound.io/my-vm-j7fpx True True my-vm-j7fpx 3m43s
10
11NAME READY SYNCED EXTERNAL-NAME AGE
12subnet.network.azure.upbound.io/my-vm-b2dqt True True my-vm-b2dqt 3m43s
13
14NAME READY SYNCED EXTERNAL-NAME AGE
15virtualnetwork.network.azure.upbound.io/my-vm-pd2sw True True my-vm-pd2sw 3m43s

访问应用程序接口可创建模板中定义的所有五个资源,并将它们链接在一起。

查看特定资源,看它是在 API 中被引用的位置创建的。

1kubectl describe linuxvirtualmachine | grep Location
2    Location:                         Sweden Central
3    Location:                         swedencentral

使用 kubectl delete VirtualMachine 删除资源。

1kubectl delete VirtualMachine my-vm
2virtualmachine.compute.example.com "my-vm" deleted

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

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

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

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

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

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

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

1kubectl create namespace crossplane-test

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

1cat <<EOF | kubectl apply -f -
2apiVersion: compute.example.com/v1alpha1
3kind: VirtualMachineClaim
4metadata:
5  name: my-namespaced-vm
6  namespace: crossplane-test
7spec: 
8  location: "EU"
9EOF

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

1kubectl get claim -n crossplane-test
2NAME SYNCED READY CONNECTION-SECRET AGE
3my-namespaced-vm True True 5m11s

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

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

1kubectl get composite
2NAME SYNCED READY COMPOSITION AGE
3my-namespaced-vm-r7gdr True True crossplane-quickstart-vm-with-network 5m33s

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

 1NAME READY SYNCED EXTERNAL-NAME AGE
 2resourcegroup.azure.upbound.io/my-namespaced-vm-r7gdr-cvzw6 True True my-namespaced-vm-r7gdr-cvzw6 5m51s
 3
 4NAME READY SYNCED EXTERNAL-NAME AGE
 5linuxvirtualmachine.compute.azure.upbound.io/my-namespaced-vm-r7gdr-vrbgb True True my-namespaced-vm-r7gdr-vrbgb 5m51s
 6
 7NAME READY SYNCED EXTERNAL-NAME AGE
 8networkinterface.network.azure.upbound.io/my-namespaced-vm-r7gdr-hwrb8 True True my-namespaced-vm-r7gdr-hwrb8 5m51s
 9
10NAME READY SYNCED EXTERNAL-NAME AGE
11subnet.network.azure.upbound.io/my-namespaced-vm-r7gdr-gh468 True True my-namespaced-vm-r7gdr-gh468 5m51s
12
13NAME READY SYNCED EXTERNAL-NAME AGE
14virtualnetwork.network.azure.upbound.io/my-namespaced-vm-r7gdr-5qhz7 True True my-namespaced-vm-r7gdr-5qhz7 5m51s

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

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

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

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

1kubectl get composite
2No resources found

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

1kubectl get managed
2No resources found

下一步