毋庸置疑,容器已经改变了我们构建项目的方式。容器化工作流程方法的指导原则之一是将控制权交还给开发人员,让他们能够选择自己的依赖项以及使用依赖项的方式 – 最重要的是,他们需要依赖项的时间。如今,恐怕没人可以等待运营团队三周时间,让他们去预配置一个数据库。
因此,社区需要拿出一种方法来确保无论您的容器在何处运行,您都能始终以简单、可预测的方式来控制您的外部依赖项。解决方案:Open Service Broker (OSB) API。今天,我将向您介绍 OCI Service Broker,它是一款 OSB API 工具,允许您通过任何支持 OSB API 的平台直接预配置 ADW 和 ATP 等 OCI服务。目前OCI Service Broker支持的 4项服务:
1、ObjectStorage
2、AutonomousTransaction Processing
3、AutonomousData Warehouse
4、OracleStreaming Service
接下来让我们直接开始吧,让您亲自尝试体验一下OCI Service Broker的安装、配置和使用。
0、您需要的前提工具
为了跟随此文章进行操作,您需要做一些准备,提前准备和安装以下操作工具:
具有创建 IAM 权限的 OCI账户
OKE 集群 (Kubernetes v1.12.7)
Helm v2.14.1
OCI CLI v2.5.15
Python 2.7.5+
1、安装Kubernetes Service Catalog
Kubernetes Service Catalog是用于将所有服务通知给 Kubernetes 平台的机制。在管理 OCI 服务时,Service Catalog 与 OCI Service Broker 进行通信。安装 Service Catalog 的方法有很多,我个人认为使用 Helm 是最简单的。Service Catalog 有一个名为 svcat的 CLI,可以使安装过程变得更加轻松。
1.1、下载 svcatCLI
这一步将下载适用于 Linux 的 svcat CLI,但对于每种主流操作系统,它都有适用的版本。要了解完整的安装说明,请参阅此处[https://svc-cat.io/docs/install/]的文档。如果您使用 Linux,可以运行以下命令:
1.2、将 Service Catalog 图表存储库添加到 Helm 并安装Service Catalog
要检查是否已成功安装,您可以列出所有pod:
kubectl get po
2、安装 OCIService Broker
2.1、创建OCI credentials
OCI Service Broker需要OCI用户凭证的详细信息来在用户租赁中提供和管理服务/资源。用户需要创建一个Kubernetes的secret,详情如下:
密钥应该具有以下键和对应的值:
2.2、部署OCI ServiceBroker
OCI Service Broker被打包为Helm chart,以便在Kubernetes中易于安装。图表可在charts/oci-service-broker目录中找到。如下:
2.3、RBAC requiredfor OCI Service Broker
通常,注册OCI Service Broker由集群管理员完成。然后,普通用户创建/管理代理提供的服务。请确保正在注册代理的用户具有集群管理角色。
2.4、注册OCI Service Broker
使用OCI Service Broker URL创建一个Cluster Service Broker资源来注册代理。在更新OCI Service Broker的名称空间之后,使用下面的注册YAML文件进行注册。
2.5、校验OCI Service Broker安装是否成功
获取OCI Service Broker状态
获取OCI Service Broker服务列表
获取OCI ServiceBroker服务计划
3、通过OCI Service Broker创建和使用OCI服务ATP
3.1、创建ATP所用的Secret
创建一个名为atp-secret的YAML文件。并像下面的示例一样填充它。password和walletPassword的值必须是JSON对象的格式,如下面的内联注释所示,并且必须是base64编码的。您可以使用在线工具进行base64编码,或者在Unix系统上使用命令行:
apiVersion: v1
kind: Secret
metadata:
name: atp-secret
data:
#{"password":"Passw0rd123456"}
password: [base64 encoded JSONobject]
#{"walletPassword":"WalletPassw0rd13456"}
walletPassword: [base64 encodedJSON object]
现在通过:kubectlcreate -f atp-secret.yaml创建Secret。
3.2、创建预配置ATP实例
创建一个名为atp-instance的YAML文件。并按如下方式填写(根据需要更新名称、隔间、dbName、cpuCount、storageSizeTBs、licenseType)。注意,我们引用的是先前在这个YAML文件中创建的秘密。
apiVersion:servicecatalog.k8s.io/v1beta1
kind: ServiceInstance
metadata:
name: osb-atp-demo-1
spec:
clusterServiceClassExternalName: atp-service
clusterServicePlanExternalName:standard
parameters:
name: demo-db-1
compartmentId:ocid1.compartment.oc1...
dbName: demodb1
cpuCount: 1
storageSizeTBs: 1
licenseType: BYOL
# freeFormTags:
# testtag: demo
# definedTags:
# your-tag-namespace:
# your-defined-key: some_value
parametersFrom:
- secretKeyRef:
name:atp-secret
key: password
使用:kubectlcreate -f atp-instance.yaml创建实例。这将花费一些时间,但在大约10分钟或更少的时间内,您的实例将启动并运行。您可以通过OCI控制台UI检查状态,或者使用命令:svcatget instances,该命令将在提供实例时返回“ready”状态。
3.3、绑定预配置ATP实例以供使用
现在,服务已完成预配置,我们需要绑定它以便能够访问ATP实例。在绑定过程中,OCI Service Broker将创建一组新的 secret,您可以在集群的任意 pod 中使用这些 secret。使用以下内容创建一个名为 atp-binding的YAML文件。
apiVersion: servicecatalog.k8s.io/v1beta1
kind: ServiceBinding
metadata:
name: atp-demo-binding
spec:
instanceRef:
name: osb-atp-demo-1
parametersFrom:
- secretKeyRef:
name:atp-secret
key:walletPassword
注意,我们再次使用了第1步中创建的初始秘密的值。使用:kubectl create -f atp-binding.yaml创建应用绑定。并使用svcatget bindings检查绑定状态,再次查找“ready”状态。一旦准备就绪,您将能够通过以下方式查看由绑定创建的秘密:kubectl get secrets atp-demo-binding -o yaml,其中的秘密名称与atp-binding.yaml中使用的“name”值匹配。这个秘密将类似于下面的输出:
apiVersion: v1
kind: Secret
type: Opaque
metadata:
creationTimestamp:2018-09-20T19:54:02Z
name: atp-demo-binding
namespace: catalog
resourceVersion:"116279449"
selfLink:/api/v1/namespaces/catalog/secrets/atp-demo-binding
uid:ec556735-bd0e-11e8-9999-0a580aed122c
data:
cwallet.sso: b2ZoT05nQ..
ewallet.p12: TE1JSV...
keystore.jks: L3UzKz...B
ojdbc.properties:YjNKaFkyeGxMbTVsZ...
sqlnet.ora: VjBGTVRFVlVYMH...
tnsnames.ora: L3UzKzdR...
truststore.jks: L3UzKzdRQ...
user_name: QURNSU4=
3.4、将绑定的ATP实例内容挂载到应用程序
我们将把ATP实例内容作为一个卷挂载到应用程序部署中。让我们创建最后一个名为atp-demo的YAML文件。然后像下面这样填充它。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: atp-demo
spec:
replicas: 1
template:
metadata:
labels:
app:atp-demo
spec:
# The credentialfiles in the secret are base64 encoded twice and hence they need to be decodedfor the programs to use them.
# Thisdecode-creds initContainer takes care of decoding the files and writing them toa shared volume from which db-app container
# can read themand use it for connecting to ATP.
initContainers:
- name:decode-creds
command:
- bash
- -c
-"for i in `ls -1 tmp/creds | grep -v user_name`; do cat/tmp/creds/$i | base64 --decode > creds/$i; done; ls -l/creds/*;"
image:oraclelinux:7.4
volumeMounts:
- name:creds-raw
mountPath: tmp/creds
readOnly: false
- name:creds
mountPath: creds
containers:
# Userapplication that uses credential files to connect to ATP.
- name: db-app
image:alpine:3.7
command:["tail", "-f", "/dev/null"]
env:
# Pass DBADMIN user name that is part of the secret created by the binding request.
- name:DB_ADMIN_USER
valueFrom:
secretKeyRef:
name: atp-demo-binding
key: user_name
# Pass DBADMIN password. The password is managed by the user and hence not part of thesecret created by the binding request.
# In thisexample we read the password form secret atp-user-cred that is required to becreated by the user.
- name:DB_ADMIN_PWD
valueFrom:
secretKeyRef:
name: atp-user-cred
key: password
#Pass Wallet password to enable application to read Oracle wallet. Thepassword is managed by the user and hence not part of the secret created by thebinding request.
# In thisexample we read the password form secret atp-user-cred that is required to becreated by the user.
- name:WALLET_PWD
valueFrom:
secretKeyRef:
name: atp-user-cred
key: walletPassword
volumeMounts:
- name:creds
mountPath: db-demo/creds
volumes:
# Volume formouting the credentials file from Secret created by binding request.
- name: creds-raw
secret:
secretName: atp-demo-binding
# Shared Volumein which initContainer will save the decoded credential files and the db-appcontainer reads.
- name: creds
emptyDir: {}
这里我们只是创建一个基本的alpinelinux实例来测试服务实例。您的应用程序部署将在应用程序中使用Docker Image,但是格式几乎相同。使用:kubectl create -f atp-demo.yaml创建部署。一旦pod进入“就绪”状态,我们就可以运行一个终端,进行一些测试:
注意,实例中有3个可用的环境变量:DB_ADMIN_USER、DB_ADMIN_PWD和WALLET_PWD。我们还在/db-demo/creds上提供了一个卷,其中包含连接到新的ATP实例所需的所有Wallet内容。
希望您现在已经对使用 OCI Service Broker 通过 Kubernetes 预配置新 OCI 服务的工作流程以及如何在您的应用程序中使用它有所了解。如需要了解更多的OCI Service Broker可以浏览https://github.com/oracle/oci-service-broker。

作者简介
陈亮,甲骨文云平台资深售前顾问,专注 Application Integration PaaS 产品及服务,同时关注ChatBot、AI、IoT、BlockChain产品和技术方向研究。18年IT行业从业经验,擅长企业应用架构设计及产品应用研发。您可以通过liang.l.chen@oracle.com,与他联系。
扫描二维码或点击阅读原文
快速预约精选云解决方案演示