暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用OCI Service Broker通过Kubernetes配置OCI服务

1211

毋庸置疑,容器已经改变了我们构建项目的方式。容器化工作流程方法的指导原则之一是将控制权交还给开发人员,让他们能够选择自己的依赖项以及使用依赖项的方式 – 最重要的是,他们需要依赖项的时间。如今,恐怕没人可以等待运营团队三周时间,让他们去预配置一个数据库。

因此,社区需要拿出一种方法来确保无论您的容器在何处运行,您都能始终以简单、可预测的方式来控制您的外部依赖项。解决方案: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,与他联系。


扫描二维码或点击阅读原文

快速预约精选云解决方案演示




文章转载自甲骨文开发者社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论