部署高可用性自管式 Oracle 数据库

本指南概述了如何在 Google Distributed Cloud (GDC) 网闸隔离标准集群上部署高可用性 Oracle Data Guard 配置。此设置使用 Oracle Database 企业版,并利用 GDC 的现有存储和网络功能。

此部署使用官方 Oracle Database Operator for Kubernetes,可自动执行数据库的生命周期管理。

架构

该架构描述了由 GDC 标准集群中的 Oracle Database Operator 管理的高可用性 Oracle Database 部署。高可用性部署由主数据库和备用数据库组成,这些数据库配置了 Data Guard 以进行复制和故障切换。

采用 Data Guard 的高可用性 Oracle 数据库部署架构图。

关键组件如下:

  • GDC 项目:资源的项目容器。
  • 标准 Kubernetes 集群:提供计算资源的标准集群。
  • Oracle Database Operator:一个 Kubernetes operator,可自动执行 Oracle 数据库的预配、生命周期管理和可观测性。它简化了修补、备份和恢复等复杂任务,使您能够更轻松地在容器化环境中运行有状态 Oracle 工作负载。
  • 主数据库:活跃的读写容器化数据库实例。
  • 备用数据库:副本只读(或故障切换期间读写)数据库实例。
  • Data Guard Broker:编排数据库之间的配置和角色转换(切换/故障切换)。
  • Harbor:用于在经过网闸隔离的环境中托管数据库、Operator 和客户端映像的私有 Container Registry。
  • Cert-manager:Operator 依赖 cert-manager 来管理网络钩子证书。cert-manager 已预安装在 GDC 标准集群上。

在本指南中,您将在其自己的命名空间 (oracle-database-operator-system) 中部署 Operator,并在单独的命名空间 (oracle-dbs) 中部署数据库实例。这些命名空间在架构图中用虚线边框框表示。

建议进行这种分离,以便于清晰管理。不过,您可以自行决定如何整理数据库。例如,您可以将不同命名空间中的某些数据库分组,以便根据工作负载需求、团队所有权或安全规范管理精细的访问权限控制 (RBAC)。

准备工作

在开始部署之前,您必须确保您的环境满足以下要求:

  • 创建一个项目,用于存放本指南中生成的所有资源。
  • 为您的用户授予项目的 Cluster Admin 和 Standard Cluster Admin 角色。这样,您就可以创建标准 Kubernetes 集群并管理其资源:

    export PROJECT_ID=PROJECT_ID
    export USER_NAME=USER_NAME
    
    gdcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member="user:${USER_NAME}" \
      --role=cluster-admin
    
    gdcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member="user:${USER_NAME}" \
      --role=standard-cluster-admin
    
  • 创建一个 Harbor 实例和一个 Harbor 项目,以托管本指南所需的容器映像。

  • 为您的用户授予 Harbor Instance Admin 角色,以便您可以将映像上传到 Harbor 实例:

    gdcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member="user:${USER_NAME}" \
      --role=harbor-instance-admin
    
  • 在 Harbor 项目中创建 Harbor 机器人账号。在本指南的后面部分,机器人账号的凭据将存储在 Kubernetes Secret 中,以便集群在实例化容器时从 Harbor 拉取映像。

  • 创建一个标准 Kubernetes 集群,其中至少有两个工作器节点,每个节点至少有 16GB 内存。例如:

    kubectl --kubeconfig MGMT_API_KUBECONFIG create -f - <<EOF
    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: ${CLUSTER_NAME}
      namespace: ${PROJECT_ID}
    spec:
      nodePools:
      - machineTypeName: n3-standard-8-gdc
        nodeCount: 2
        name: ${CLUSTER_NAME}-node-pool
    EOF
    
  • 设置环境变量。在整个指南中,这些变量将用于创建和引用资源:

    注意:

    • 在本指南中,这两个数据库实例被任意命名为 blue 和 green。最初,blue 实例是主实例,green 是备用实例。
    # General info
    export PROJECT_ID="PROJECT_ID"
    export ZONE="ZONE"
    export ORG_NAME="ORG_NAME"
    export CLUSTER_NAME="CLUSTER_NAME"
    
    # Software versions
    export ORACLE_OPERATOR_VERSION="2.1.0"
    export ORACLE_DB_VERSION="21.3.0.0"
    
    # Namespaces
    export ORACLE_OPERATOR_NAMESPACE="ORACLE_OPERATOR_NAMESPACE"
    export DB_NAMESPACE="DATABASE_NAMESPACE"
    
    # Harbor config
    export HARBOR_INSTANCE_PROJECT_ID="HARBOR_PROJECT_ID"
    export HARBOR_INSTANCE_NAME="HARBOR_INSTANCE_NAME"
    export HARBOR_INSTANCE_URL="HARBOR_INSTANCE_URL"
    export HARBOR_PROJECT="HARBOR_PROJECT"
    export HARBOR_PULL_SECRET_NAME="HARBOR_PULL_SECRET_NAME"
    export HARBOR_ROBOT_ACCOUNT="robot\$HARBOR_PROJECT+ROBOT_NAME"
    export HARBOR_ROBOT_SECRET="HARBOR_ROBOT_SECRET"
    
    # Oracle database config
    export ADMIN_PASSWORD="ADMIN_PASSWORD"
    export ADMIN_PASSWORD_SECRET_NAME="ADMIN_PASSWORD_SECRET_NAME"
    
    # Database names
    export DB_NAME_BLUE="database-blue"
    export DB_NAME_GREEN="database-green"
    
  • 网络说明:本指南假定从堡垒节点运行,该节点可以访问 GDC API,也可以访问互联网以下载 Oracle Operator 的清单和容器映像。如果您在无法访问互联网的机器上运行此命令,则必须单独获取这些资源(例如,使用 docker save 从已连接的机器导出映像,并使用 docker load 导入映像),并将其安全地上传到您的环境,然后再继续。

  • 在继续操作之前,您必须在 container-registry.oracle.com 创建账号并获取 API 令牌,然后接受 Oracle Database Enterprise Edition 和 Oracle Instant Client 映像的许可协议。

将映像加载到 Harbor

由于 Google Distributed Cloud 网闸隔离配置中的集群无法访问外部注册表,因此您必须将所需映像镜像到您的私有 Harbor 实例。

登录 Oracle Container Registry

您必须先向官方 Oracle 注册表进行身份验证,才能拉取基础映像:

docker --config=./docker-oracle login container-registry.oracle.com

成功登录后,凭证将保存在 ./docker-oracle/config.json 中。

登录 Harbor

使用您的私有 Harbor 实例进行身份验证:

docker --config=./docker-harbor login ${HARBOR_INSTANCE_URL} \
  -u ${HARBOR_ROBOT_ACCOUNT} \
  -p ${HARBOR_ROBOT_SECRET}

成功登录后,机器人账号的凭据将保存在 ./docker-harbor/config.json 中。

拉取、标记和推送映像

从官方 Oracle Container Registry 下载映像,并将其推送到内部 Harbor 项目。您将镜像 Operator、企业数据库和 Instant Client 以进行测试。

  1. 镜像 Oracle 数据库 Operator 映像:

    docker --config=./docker-oracle pull \
      container-registry.oracle.com/database/operator:${ORACLE_OPERATOR_VERSION} \
      --platform linux/amd64
    
    docker tag container-registry.oracle.com/database/operator:${ORACLE_OPERATOR_VERSION} \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-operator:${ORACLE_OPERATOR_VERSION}
    
    docker --config=./docker-harbor push \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-operator:${ORACLE_OPERATOR_VERSION}
    
  2. 镜像 Oracle 数据库企业版映像:

    docker --config=./docker-oracle pull \
      container-registry.oracle.com/database/enterprise:${ORACLE_DB_VERSION} \
      --platform linux/amd64
    
    docker tag container-registry.oracle.com/database/enterprise:${ORACLE_DB_VERSION} \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-enterprise:${ORACLE_DB_VERSION}
    
    docker --config=./docker-harbor push \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-enterprise:${ORACLE_DB_VERSION}
    
  3. 镜像 Oracle Instant Client 映像:

    docker --config=./docker-oracle pull \
      container-registry.oracle.com/database/instantclient:latest \
      --platform linux/amd64
    
    docker tag container-registry.oracle.com/database/instantclient:latest \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-instantclient:latest
    
    docker --config=./docker-harbor push \
      ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-instantclient:latest
    

配置集群访问权限

在部署资源之前,请检索标准集群的凭据并创建一个方便使用的别名:

  1. 检索标准集群的 kubeconfig 文件:

    KUBECONFIG=kubeconfig-${CLUSTER_NAME}.yaml gdcloud clusters \
      get-credentials ${CLUSTER_NAME} \
      --standard \
      --project ${PROJECT_ID} \
      --zone ${ZONE}
    
  2. 创建 kk 别名以简化后续命令:

    alias kk="kubectl --kubeconfig kubeconfig-${CLUSTER_NAME}.yaml"
    

创建 Secret

创建一个 Kubernetes Secret,以允许集群使用保存在本地 ./docker-harbor/config.json 中的凭据从 Harbor 拉取映像。您需要在 Operator 的命名空间(用于拉取 Operator 映像)和数据库的命名空间(用于拉取数据库映像)中都提供此 Secret。

  1. 为 Operator 创建命名空间:

    kk create ns ${ORACLE_OPERATOR_NAMESPACE}
    
  2. 为 Operator 创建拉取 Secret:

    kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \
      --from-file=.dockerconfigjson=./docker-harbor/config.json \
      -n ${ORACLE_OPERATOR_NAMESPACE}
    
  3. 为数据库创建命名空间:

    kk create ns ${DB_NAMESPACE}
    
  4. 为数据库容器创建映像拉取 Secret:

    kk create secret docker-registry ${HARBOR_PULL_SECRET_NAME} \
      --from-file=.dockerconfigjson=./docker-harbor/config.json \
      -n ${DB_NAMESPACE}
    
  5. 为数据库的管理员密码创建 Secret:

    kk create secret generic ${ADMIN_PASSWORD_SECRET_NAME} \
      --from-literal=password=${ADMIN_PASSWORD} \
      -n ${DB_NAMESPACE}
    

安装 Oracle Database Operator

现在,通过应用三个清单将 Oracle Database Operator 安装到集群中:

  1. 集群角色绑定:为 Operator 设置在整个集群范围内运行所需的权限。

    kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/cluster-role-binding.yaml
    
  2. 节点 RBAC:授予读取节点拓扑的权限,这对于正确调度 Pod 至关重要。

    kk apply -f https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/rbac/node-rbac.yaml
    
  3. Operator Deployment:部署 Operator Pod 和自定义资源定义。此命令会下载官方清单,将映像路径替换为您的 Harbor 网址,注入 imagePullSecrets 配置,以便 Kubernetes 可以向 Harbor 进行身份验证,并应用结果:

    curl -L https://raw.githubusercontent.com/oracle/oracle-database-operator/refs/tags/v${ORACLE_OPERATOR_VERSION}/oracle-database-operator.yaml \
      | sed "s|container-registry.oracle.com/database/operator:latest|${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-operator:${ORACLE_OPERATOR_VERSION}|g" \
      | awk "/terminationGracePeriodSeconds: 10/{print; print \"      imagePullSecrets:\n      - name: ${HARBOR_PULL_SECRET_NAME}\"; next}1" \
      | kk apply -f -
    

    等待 Operator Pod 运行:

    kk get pods -n ${ORACLE_OPERATOR_NAMESPACE} --watch
    

    输出应如下所示:

    NAME                                                           READY   STATUS    RESTARTS   AGE
    oracle-database-operator-controller-manager-5f7b56874d-k9v4z   1/1     Running   0          45s
    oracle-database-operator-controller-manager-5f7b56874d-n2x8m   1/1     Running   0          45s
    oracle-database-operator-controller-manager-5f7b56874d-r6z7q   1/1     Running   0          45s
    

部署主数据库和备用数据库

现在,您在同一命名空间中依次部署两个数据库实例。

部署主实例

  1. 运行以下命令,创建主数据库实例:

    apiVersion: database.oracle.com/v4
    kind: SingleInstanceDatabase
    metadata:
      name: ${DB_NAME_BLUE}
      namespace: ${DB_NAMESPACE}
    spec:
      replicas: 1
      edition: enterprise
      image:
        pullFrom: "${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-enterprise:${ORACLE_DB_VERSION}"
        pullSecrets: ${HARBOR_PULL_SECRET_NAME}
        prebuiltDB: true
      sid: ORCLBLUE
      pdbName: ORCLPDB1
      archiveLog: true
      flashBack: true
      forceLog: true
      adminPassword:
        secretName: "${ADMIN_PASSWORD_SECRET_NAME}"
        secretKey: "password"
      persistence:
        size: "50Gi"
        storageClass: "standard-rwo"
        accessMode: "ReadWriteOnce"
      resources:
        requests:
          memory: "4Gi"
    

    关键配置参数:

    • sid / pdbName:定义系统标识符 (SID) 和可插入数据库 (PDB) 名称。
    • edition:指定数据库版本(在本例中为 enterprise)。
    • image:指向您的私有 Harbor 注册表映像。
    • persistence:使用 standard-rwo StorageClass 请求 50Gi 永久性卷,这会在 GDC 中创建可用区级永久性磁盘。
    • replicas:将实例的 Pod 数量设置为 1。
    • archiveLog:启用归档日志模式,这是 Data Guard 所必需的。
    • flashBack:启用闪回数据库,以便将数据库恢复到之前的时间点。
    • forceLog:启用强制日志记录,确保所有更改都会被记录,即使是通常会绕过日志记录的操作也不例外。

    如需查看配置选项(包括自定义初始化参数和资源限制)的完整列表,请参阅官方文档。

    数据库创建过程会占用大量资源,可能需要 10 到 20 分钟。

    等待数据库完全准备就绪,然后再继续操作。这一点至关重要,因为备用数据库需要主数据库可访问才能建立复制。

    等待数据库 Pod 变为 Running:

    kk get po -n ${DB_NAMESPACE} -l app=${DB_NAME_BLUE} -w
    

    输出应如下所示:

    NAME                   READY   STATUS    RESTARTS   AGE
    database-blue-i5xdj   0/1     Pending   0          0s
    database-blue-i5xdj   0/1     Pending   0          0s
    database-blue-i5xdj   0/1     Pending   0          1s
    database-blue-i5xdj   0/1     Init:0/1   0          1s
    database-blue-i5xdj   0/1     PodInitializing   0          98s
    database-blue-i5xdj   0/1     Running           0          99s
    database-blue-i5xdj   1/1     Running           0          99s
    

    然后观察日志并等待 DATABASE IS READY TO USE! 消息:

    kk logs -n ${DB_NAMESPACE} -l app=${DB_NAME_BLUE} -f
    

    输出应包含以下内容:

    #########################
    DATABASE IS READY TO USE!
    #########################
    
  2. 验证状态是否为 Healthy,角色是否为 PRIMARY:

    kk get sidb -n ${DB_NAMESPACE} ${DB_NAME_BLUE}
    

    输出应如下所示:

    NAME            EDITION      STATUS    ROLE
    database-blue   Enterprise   Healthy   PRIMARY
    

部署备用实例

主实例运行状况良好后,部署备用实例。请注意,Data Guard 参数(archiveLog、flashBack、forceLog)继承自主数据库,不得在备用数据库清单中指定:

  1. 部署备用实例:

    apiVersion: database.oracle.com/v4
    kind: SingleInstanceDatabase
    metadata:
      name: ${DB_NAME_GREEN}
      namespace: ${DB_NAMESPACE}
    spec:
      replicas: 1
      edition: enterprise
      image:
        pullFrom: "${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-enterprise:${ORACLE_DB_VERSION}"
        pullSecrets: ${HARBOR_PULL_SECRET_NAME}
        prebuiltDB: true
      sid: ORCLGREEN
      pdbName: ORCLPDB1
      adminPassword:
        secretName: "${ADMIN_PASSWORD_SECRET_NAME}"
        secretKey: "password"
      createAs: standby
      primaryDatabaseRef: ${DB_NAME_BLUE}
      persistence:
        size: "50Gi"
        storageClass: "standard-rwo"
        accessMode: "ReadWriteOnce"
      resources:
        requests:
          memory: "4Gi"
    

    等待数据库 Pod 变为 Running:

    kk get po -n ${DB_NAMESPACE} -l app=${DB_NAME_GREEN} -w
    

    输出应如下所示:

    NAME                   READY   STATUS    RESTARTS   AGE
    database-green-q1gur   0/1     Pending   0          0s
    database-green-q1gur   0/1     Pending   0          0s
    database-green-q1gur   0/1     Pending   0          1s
    database-green-q1gur   0/1     Init:0/1   0          1s
    database-green-q1gur   0/1     PodInitializing   0          98s
    database-green-q1gur   0/1     Running           0          99s
    database-green-q1gur   1/1     Running           0          99s
    

    然后观察日志并等待 DATABASE IS READY TO USE! 消息:

    kk logs -n ${DB_NAMESPACE} -l app=${DB_NAME_GREEN} -f
    

    输出应包含以下内容:

    #########################
    DATABASE IS READY TO USE!
    #########################
    
  2. 验证状态是否为 Healthy,角色是否为 PHYSICAL_STANDBY:

    kk get sidb -n ${DB_NAMESPACE}
    

    输出应如下所示:

    NAME             EDITION      STATUS    ROLE
    database-blue    Enterprise   Healthy   PRIMARY
    database-green                Healthy   PHYSICAL_STANDBY
    

配置 Data Guard 代理

  1. 部署 DataguardBroker 以管理 Data Guard 配置:

    apiVersion: database.oracle.com/v4
    kind: DataguardBroker
    metadata:
      name: broker-blue-green
      namespace: ${DB_NAMESPACE}
    spec:
      primaryDatabaseRef: ${DB_NAME_BLUE}
      standbyDatabaseRefs:
        - ${DB_NAME_GREEN}
      protectionMode: MaxAvailability
      fastStartFailover: false
      loadBalancer: true
    

    关键配置参数:

    • protectionMode:设置为 MaxAvailability,以确保在至少有一个备用实例可用时不会丢失数据,并在至少有一个备用实例可访问时转换为异步模式。
    • fastStartFailover:设置为 false 可停用自动故障切换。启用后,如果主数据库不可用,观察器进程可以自动触发故障切换。
    • loadBalancer:设置为 true,以便为代理创建 Kubernetes LoadBalancer 服务,从而提供始终路由到当前主数据库的稳定外部 IP 地址。
  2. 监控代理状态,直到其报告 Healthy:

    kk get dataguardbroker -n ${DB_NAMESPACE} -w
    

    输出应如下所示:

    NAME                PRIMARY   STANDBYS   PROTECTION MODE   CONNECT STR   STATUS     FSFO
    broker-blue-green                        MaxAvailability                 Creating
    broker-blue-green                        MaxAvailability                 Creating
    broker-blue-green   ORCLBLUE   ORCLGREEN   MaxAvailability   10.0.0.25:32345/DATAGUARD   Creating   false
    broker-blue-green   ORCLBLUE   ORCLGREEN   MaxAvailability   10.0.0.25:32345/DATAGUARD   Healthy    false
    
  3. DataguardBroker 会创建一个 Kubernetes 服务 (broker-blue-green),该服务会自动将流量路由到当前主数据库。这为应用提供了稳定的连接点。获取此服务:

    kk get svc -n ${DB_NAMESPACE} broker-blue-green
    

    输出应如下所示。请注意,系统会为集群内客户端预配 CLUSTER-IP,并为使用负载均衡器的外部客户端预配 EXTERNAL-IP:

    NAME                TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                         AGE
    broker-blue-green   LoadBalancer   10.0.19.198   100.66.38.138   1521:31116/TCP,5500:31842/TCP   8m
    
  4. 检查代理服务的端点。它最初必须指向蓝色 Pod 的 IP 地址:

    kk get endpoints -n ${DB_NAMESPACE} broker-blue-green
    

    输出应如下所示,其中应显示蓝色 Pod IP,而不是 BLUE_POD_IP:

    NAME                ENDPOINTS
    broker-blue-green   [BLUE_POD_IP]:5500,[BLUE_POD_IP]:1521
    
  5. 检查数据库 Pod 以关联 IP:

    kk get pod -n ${DB_NAMESPACE} -o wide
    

测试数据同步和角色

现在,您可以通过使用集群内客户端 Pod 将数据写入主数据库并从备用数据库读取数据来验证复制。

使用代理服务写入主数据库

  1. 部署临时 Pod,以使用稳定的代理服务连接到主数据库:

    kk run sqlplus -n ${DB_NAMESPACE} --rm -it --restart=Never \
      --image=${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-instantclient:latest \
      --image-pull-policy=Always \
      --overrides='{"spec": {"imagePullSecrets": [{"name": "'${HARBOR_PULL_SECRET_NAME}'"}]}}' \
      -- sqlplus sys/${ADMIN_PASSWORD}@broker-blue-green:1521/ORCLPDB1 as sysdba
    
  2. 创建一个测试表:

    CREATE TABLE employees (id NUMBER, name VARCHAR2(50));
    INSERT INTO employees VALUES (1, 'John Doe');
    COMMIT;
    SELECT * FROM employees;
    exit;
    

    输出应如下所示:

            ID NAME
    ---------- --------------------------------------------------
            1 John Doe
    

从待机状态读取(直接访问)

  1. 部署一个临时 Pod,以直接连接到备用服务:

    kk run sqlplus -n ${DB_NAMESPACE} --rm -it --restart=Never \
      --image=${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/oracle-instantclient:latest \
      --image-pull-policy=Always \
      --overrides='{"spec": {"imagePullSecrets": [{"name": "'${HARBOR_PULL_SECRET_NAME}'"}]}}' \
      -- sqlplus sys/${ADMIN_PASSWORD}@${DB_NAME_GREEN}:1521/ORCLPDB1 as sysdba
    
  2. 验证数据复制:

    SELECT * FROM employees;
    exit;
    

    输出应如下所示:

            ID NAME
    ---------- --------------------------------------------------
            1 John Doe
    

执行手动切换

触发手动切换以反转角色,使绿色数据库成为新的主数据库。操作员需要切换目标的 SID(例如 ORCLGREEN)。

  1. 运行以下命令:

    kk patch dataguardbroker broker-blue-green -n ${DB_NAMESPACE} --type='merge' \
      -p "{\"spec\":{\"setAsPrimaryDatabase\":\"ORCLGREEN\"}}"
    
  2. 监控切换进度:

    kk get sidb -n ${DB_NAMESPACE} -w
    

    切换完成后,输出应如下所示:

    NAME             EDITION      STATUS    ROLE
    database-blue    Enterprise   Healthy   PHYSICAL_STANDBY
    database-green                Healthy   PRIMARY
    
  3. 确认数据库实例已切换角色,并且绿色数据库现在是主数据库:

    kk get dataguardbroker -n ${DB_NAMESPACE}
    

    输出应如下所示:

    NAME                PRIMARY     STANDBYS   PROTECTION MODE
    broker-blue-green   ORCLGREEN   ORCLBLUE   MaxAvailability
    
  4. 验证 broker-blue-green 服务端点是否已更新为指向绿色 Pod 的 IP:

    kk get endpoints -n ${DB_NAMESPACE} broker-blue-green
    

    输出应如下所示,其中应显示绿色 Pod IP,而不是 GREEN_POD_IP:

    NAME                ENDPOINTS
    broker-blue-green   [GREEN_POD_IP]:5500,[GREEN_POD_IP]:1521
    

后续步骤