243 lines
7.3 KiB
Markdown
243 lines
7.3 KiB
Markdown
---
|
|
title: Provision and Consume Cloud Resources
|
|
---
|
|
|
|
> ⚠️ This section requires your platform builder has already installed the [cloud resources related capabilities](../platform-engineers/cloud-services).
|
|
|
|
## Provision and consume cloud resource in a single application v1 (one cloud resource)
|
|
|
|
Check the parameters of cloud resource component:
|
|
|
|
```shell
|
|
$ kubectl vela show alibaba-rds
|
|
|
|
# Properties
|
|
+---------------+------------------------------------------------+--------+----------+--------------------+
|
|
| NAME | DESCRIPTION | TYPE | REQUIRED | DEFAULT |
|
|
+---------------+------------------------------------------------+--------+----------+--------------------+
|
|
| engine | RDS engine | string | true | mysql |
|
|
| engineVersion | The version of RDS engine | string | true | 8.0 |
|
|
| instanceClass | The instance class for the RDS | string | true | rds.mysql.c1.large |
|
|
| username | RDS username | string | true | |
|
|
| secretName | Secret name which RDS connection will write to | string | true | |
|
|
+---------------+------------------------------------------------+--------+----------+--------------------+
|
|
```
|
|
|
|
Use the service binding trait to bind cloud resources into workload as ENV.
|
|
|
|
Create an application with a cloud resource provisioning component and a consuming component as below.
|
|
|
|
```yaml
|
|
apiVersion: core.oam.dev/v1beta1
|
|
kind: Application
|
|
metadata:
|
|
name: webapp
|
|
spec:
|
|
components:
|
|
- name: express-server
|
|
type: webservice
|
|
properties:
|
|
image: zzxwill/flask-web-application:v0.3.1-crossplane
|
|
ports: 80
|
|
traits:
|
|
- type: service-binding
|
|
properties:
|
|
envMappings:
|
|
# environments refer to db-conn secret
|
|
DB_PASSWORD:
|
|
secret: db-conn
|
|
key: password # 1) If the env name is different from secret key, secret key has to be set.
|
|
endpoint:
|
|
secret: db-conn # 2) If the env name is the same as the secret key, secret key can be omitted.
|
|
username:
|
|
secret: db-conn
|
|
|
|
- name: sample-db
|
|
type: alibaba-rds
|
|
properties:
|
|
name: sample-db
|
|
engine: mysql
|
|
engineVersion: "8.0"
|
|
instanceClass: rds.mysql.c1.large
|
|
username: oamtest
|
|
secretName: db-conn
|
|
|
|
```
|
|
|
|
Apply it and verify the application.
|
|
|
|
```shell
|
|
$ kubectl get application
|
|
NAME AGE
|
|
webapp 46m
|
|
|
|
$ kubectl port-forward deployment/express-server 80:80
|
|
Forwarding from 127.0.0.1:80 -> 80
|
|
Forwarding from [::1]:80 -> 80
|
|
Handling connection for 80
|
|
Handling connection for 80
|
|
```
|
|
|
|

|
|
|
|
## Provision and consume cloud resource in a single application v2 (two cloud resources)
|
|
|
|
Based on the section `Provisioning and consuming cloud resource in a single application v1 (one cloud resource)`,
|
|
|
|
Update the application to also consume cloud resource OSS.
|
|
|
|
```yaml
|
|
apiVersion: core.oam.dev/v1beta1
|
|
kind: Application
|
|
metadata:
|
|
name: webapp
|
|
spec:
|
|
components:
|
|
- name: express-server
|
|
type: webservice
|
|
properties:
|
|
image: zzxwill/flask-web-application:v0.3.1-crossplane
|
|
ports: 80
|
|
traits:
|
|
- type: service-binding
|
|
properties:
|
|
envMappings:
|
|
# environments refer to db-conn secret
|
|
DB_PASSWORD:
|
|
secret: db-conn
|
|
key: password # 1) If the env name is different from secret key, secret key has to be set.
|
|
endpoint:
|
|
secret: db-conn # 2) If the env name is the same as the secret key, secret key can be omitted.
|
|
username:
|
|
secret: db-conn
|
|
# environments refer to oss-conn secret
|
|
BUCKET_NAME:
|
|
secret: oss-conn
|
|
key: Bucket
|
|
|
|
- name: sample-db
|
|
type: alibaba-rds
|
|
properties:
|
|
name: sample-db
|
|
engine: mysql
|
|
engineVersion: "8.0"
|
|
instanceClass: rds.mysql.c1.large
|
|
username: oamtest
|
|
secretName: db-conn
|
|
|
|
- name: sample-oss
|
|
type: alibaba-oss
|
|
properties:
|
|
name: velaweb
|
|
secretName: oss-conn
|
|
```
|
|
|
|
Apply it and verify the application.
|
|
|
|
```shell
|
|
$ kubectl port-forward deployment/express-server 80:80
|
|
Forwarding from 127.0.0.1:80 -> 80
|
|
Forwarding from [::1]:80 -> 80
|
|
Handling connection for 80
|
|
Handling connection for 80
|
|
```
|
|
|
|

|
|
|
|
## Provision and consume cloud resource in different applications
|
|
|
|
In this section, cloud resource will be provisioned in one application and consumed in another application.
|
|
|
|
### Provision Cloud Resource
|
|
|
|
Instantiate RDS component with `alibaba-rds` workload type in an [Application](../application) to provide cloud resources.
|
|
|
|
As we have claimed an RDS instance with ComponentDefinition name `alibaba-rds`.
|
|
The component in the application should refer to this type.
|
|
|
|
```yaml
|
|
apiVersion: core.oam.dev/v1beta1
|
|
kind: Application
|
|
metadata:
|
|
name: baas-rds
|
|
spec:
|
|
components:
|
|
- name: sample-db
|
|
type: alibaba-rds
|
|
properties:
|
|
name: sample-db
|
|
engine: mysql
|
|
engineVersion: "8.0"
|
|
instanceClass: rds.mysql.c1.large
|
|
username: oamtest
|
|
secretName: db-conn
|
|
```
|
|
|
|
Apply the application to Kubernetes and a RDS instance will be automatically provisioned (may take some time, ~2 mins).
|
|
|
|
A secret `db-conn` will also be created in the same namespace as that of the application.
|
|
|
|
```shell
|
|
$ kubectl get application
|
|
NAME AGE
|
|
baas-rds 9h
|
|
|
|
$ kubectl get rdsinstance
|
|
NAME READY SYNCED STATE ENGINE VERSION AGE
|
|
sample-db-v1 True True Running mysql 8.0 9h
|
|
|
|
$ kubectl get secret
|
|
NAME TYPE DATA AGE
|
|
db-conn connection.crossplane.io/v1alpha1 4 9h
|
|
|
|
$ ✗ kubectl get secret db-conn -o yaml
|
|
apiVersion: v1
|
|
data:
|
|
endpoint: xxx==
|
|
password: yyy
|
|
port: MzMwNg==
|
|
username: b2FtdGVzdA==
|
|
kind: Secret
|
|
```
|
|
|
|
### Consume the Cloud Resource
|
|
|
|
In this section, we will show how another component consumes the RDS instance.
|
|
|
|
> Note: we recommend defining the cloud resource claiming to an independent application if that cloud resource has
|
|
> standalone lifecycle.
|
|
|
|
Now create the Application to consume the data.
|
|
|
|
```yaml
|
|
apiVersion: core.oam.dev/v1beta1
|
|
kind: Application
|
|
metadata:
|
|
name: webapp
|
|
spec:
|
|
components:
|
|
- name: express-server
|
|
type: webconsumer
|
|
properties:
|
|
image: zzxwill/flask-web-application:v0.3.1-crossplane
|
|
ports: 80
|
|
dbSecret: db-conn
|
|
```
|
|
|
|
```shell
|
|
$ kubectl get application
|
|
NAME AGE
|
|
baas-rds 10h
|
|
webapp 14h
|
|
|
|
$ kubectl get deployment
|
|
NAME READY UP-TO-DATE AVAILABLE AGE
|
|
express-server-v1 1/1 1 1 9h
|
|
|
|
$ kubectl port-forward deployment/express-server 80:80
|
|
```
|
|
|
|
We can see the cloud resource is successfully consumed by the application.
|
|
|
|

|