6.5. 在 IBM Power、IBM Z 和 IBM (R) Linux 上使用服务绑定

Service Binding Operator 管理工作负载和后备服务的数据平面。本指南提供了一些示例,可帮助您创建数据库实例、部署应用程序,以及使用 Service Binding Operator 在应用程序和数据库服务间创建绑定连接。

先决条件

  • 可以使用具有 cluster-admin 权限的账户访问 OpenShift Container Platform 集群。
  • 已安装 oc CLI。
  • 您已从 OperatorHub 安装 Service Binding Operator。

6.5.1. 部署 PostgreSQL Operator

流程

  1. 要在 my-petclinic 命名空间中部署 Dev4Devs PostgreSQL Operator,请在 shell 中运行以下命令:
$ oc apply -f - << EOD
---
apiVersion: v1
kind: Namespace
metadata:
  name: my-petclinic
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: postgres-operator-group
  namespace: my-petclinic
---
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  name: ibm-multiarch-catalog
  namespace: openshift-marketplace
spec:
  sourceType: grpc
  image: quay.io/ibm/operator-registry-<architecture> 1
  imagePullPolicy: IfNotPresent
  displayName: ibm-multiarch-catalog
  updateStrategy:
    registryPoll:
      interval: 30m
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: postgresql-operator-dev4devs-com
  namespace: openshift-operators
spec:
  channel: alpha
  installPlanApproval: Automatic
  name: postgresql-operator-dev4devs-com
  source: ibm-multiarch-catalog
  sourceNamespace: openshift-marketplace
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: database-view
  labels:
    servicebinding.io/controller: "true"
rules:
  - apiGroups:
      - postgresql.dev4devs.com
    resources:
      - databases
    verbs:
      - get
      - list
EOD
1
Operator 镜像。
  • 对于 IBM Power: quay.io/ibm/operator-registry-ppc64le:release-4.9
  • 对于 IBM Z 和 IBM® LinuxONE: quay.io/ibm/operator-registry-s390x:release-4.8

验证

  1. 安装 Operator 后,列出 openshift-operators 命名空间中的 Operator 订阅:

    $ oc get subs -n openshift-operators

    输出示例

    NAME                               PACKAGE                            SOURCE                  CHANNEL
    postgresql-operator-dev4devs-com   postgresql-operator-dev4devs-com   ibm-multiarch-catalog   alpha
    rh-service-binding-operator        rh-service-binding-operator        redhat-operators        stable

6.5.2. 创建 PostgreSQL 数据库实例

要创建 PostgreSQL 数据库实例,您必须创建一个 Database 自定义资源(CR)并配置数据库。

流程

  1. 在 shell 中运行以下命令来在 my-petclinic 命名空间中创建 Database CR:

    $ oc apply -f - << EOD
    apiVersion: postgresql.dev4devs.com/v1alpha1
    kind: Database
    metadata:
      name: sampledatabase
      namespace: my-petclinic
      annotations:
        host: sampledatabase
        type: postgresql
        port: "5432"
        service.binding/database: 'path={.spec.databaseName}'
        service.binding/port: 'path={.metadata.annotations.port}'
        service.binding/password: 'path={.spec.databasePassword}'
        service.binding/username: 'path={.spec.databaseUser}'
        service.binding/type: 'path={.metadata.annotations.type}'
        service.binding/host: 'path={.metadata.annotations.host}'
    spec:
      databaseCpu: 30m
      databaseCpuLimit: 60m
      databaseMemoryLimit: 512Mi
      databaseMemoryRequest: 128Mi
      databaseName: "sampledb"
      databaseNameKeyEnvVar: POSTGRESQL_DATABASE
      databasePassword: "samplepwd"
      databasePasswordKeyEnvVar: POSTGRESQL_PASSWORD
      databaseStorageRequest: 1Gi
      databaseUser: "sampleuser"
      databaseUserKeyEnvVar: POSTGRESQL_USER
      image: registry.redhat.io/rhel8/postgresql-13:latest
      databaseStorageClassName: nfs-storage-provisioner
      size: 1
    EOD

    Database CR 中添加的注解可启用服务绑定连接并触发 Operator 协调。

    输出会验证数据库实例是否已创建:

    输出示例

    database.postgresql.dev4devs.com/sampledatabase created

  2. 创建数据库实例后,确保 my-petclinic 命名空间中的所有 pod 都在运行:

    $ oc get pods -n my-petclinic

    输出(需要几分钟)验证是否创建并配置了数据库:

    输出示例

    NAME                                     READY    STATUS      RESTARTS   AGE
    sampledatabase-cbc655488-74kss            0/1     Running        0       32s

配置了数据库后,您可以部署示例应用程序并将其连接到数据库服务。

6.5.3. 部署 Spring PetClinic 示例应用程序

要在 OpenShift Container Platform 集群上部署 Spring PetClinic 示例应用程序,您必须使用部署配置并配置本地环境才能测试应用程序。

流程

  1. 在 shell 中运行以下命令,使用 PostgresCluster 自定义资源(CR)部署 spring-petclinic 应用程序:

    $ oc apply -n my-petclinic -f - << EOD
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: spring-petclinic
      labels:
        app: spring-petclinic
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: spring-petclinic
      template:
        metadata:
          labels:
            app: spring-petclinic
        spec:
          containers:
            - name: app
              image: quay.io/service-binding/spring-petclinic:latest
              imagePullPolicy: Always
              env:
              - name: SPRING_PROFILES_ACTIVE
                value: postgres
              - name: org.springframework.cloud.bindings.boot.enable
                value: "true"
              ports:
              - name: http
                containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: spring-petclinic
      name: spring-petclinic
    spec:
      type: NodePort
      ports:
        - port: 80
          protocol: TCP
          targetPort: 8080
      selector:
        app: spring-petclinic
    EOD

    输出会验证 Spring PetClinic 示例应用是否已创建并部署:

    输出示例

    deployment.apps/spring-petclinic created
    service/spring-petclinic created

    注意

    如果要在 web 控制台的 Developer 视角中使用 容器镜像 部署应用程序,则必须在高级选项Deployment 部分输入以下环境变量:

    • 名称:SPRING_PROFILES_ACTIVE
    • 值: postgres
  2. 运行以下命令,验证应用程序是否还没有连接到数据库服务:

    $ oc get pods -n my-petclinic

    显示 CrashLoopBackOff 状态需要几分钟:

    输出示例

    NAME                                READY   STATUS             RESTARTS      AGE
    spring-petclinic-5b4c7999d4-wzdtz   0/1     CrashLoopBackOff   4 (13s ago)   2m25s

    在这个阶段,pod 无法启动。如果您尝试与应用交互,它会返回错误。

现在,您可以使用 Service Binding Operator 将应用程序连接到数据库服务。

6.5.4. 将 Spring PetClinic 示例应用程序连接到 PostgreSQL 数据库服务

要将示例应用程序连接到数据库服务,您必须创建一个 ServiceBinding 自定义资源 (CR),该资源会触发 Service Binding Operator 将绑定数据项目到应用程序中。

流程

  1. 创建 ServiceBinding CR 以项目绑定数据:

    $ oc apply -n my-petclinic -f - << EOD
    ---
    apiVersion: binding.operators.coreos.com/v1alpha1
    kind: ServiceBinding
    metadata:
        name: spring-petclinic-pgcluster
    spec:
      services: 1
        - group: postgresql.dev4devs.com
          kind: Database 2
          name: sampledatabase
          version: v1alpha1
      application: 3
        name: spring-petclinic
        group: apps
        version: v1
        resource: deployments
    EOD
    1
    指定服务资源列表。
    2
    数据库的 CR。
    3
    示例应用程序,指向带有嵌入式 PodSpec 的 Deployment 或任何其他类似资源。

    输出会验证是否已创建 ServiceBinding CR 以将绑定数据项目到示例应用程序中。

    输出示例

    servicebinding.binding.operators.coreos.com/spring-petclinic created

  2. 验证服务绑定的请求是否成功:

    $ oc get servicebindings -n my-petclinic

    输出示例

    NAME                          READY   REASON              AGE
    spring-petclinic-postgresql   True    ApplicationsBound   47m

    默认情况下,来自数据库服务的绑定数据的值作为运行示例应用程序的工作负载容器中的文件进行投射。例如,Secret 资源中的所有值都投射到 bindings/spring-petclinic-pgcluster 目录中。

  3. 创建后,您可以进入拓扑来查看可视连接。

    图 6.1. 将 spring-petclinic 连接到示例数据库

    img power
  4. 设置应用程序端口的端口转发,以便从本地环境访问示例应用程序:

    $ oc port-forward --address 0.0.0.0 svc/spring-petclinic 8080:80 -n my-petclinic

    输出示例

    Forwarding from 0.0.0.0:8080 -> 8080
    Handling connection for 8080

  5. 访问 http://localhost:8080

    现在,您可以在 localhost:8080 远程访问 Spring PetClinic 示例应用程序,并查看应用程序现在连接到数据库服务。

6.5.5. 其他资源