将 Apigee Hybrid 升级到 1.12 版

此过程涉及从 Apigee Hybrid 1.11.x 版升级到 Apigee Hybrid 1.12.0 版。

相对于 Apigee Hybrid v1.11 的更改

Apigee Hybrid 1.12 版引入了以下会影响升级过程的更改。如需查看 v1.12 中功能的完整列表,请参阅 Hybrid v1.12.0 版本说明

  • Cassandra 4.x:从 1.12 版开始,Apigee Hybrid 使用 Cassandra 4 及更高版本。
  • apigeectl 弃用:从 1.12 版开始,Apigee Hybrid 仅支持使用 Helm 来安装和管理 Hybrid 安装。
  • 现已推出一套用于监控 Apigee 代理和目标端点的新指标。对于 Hybrid v1.12,默认情况下不再使用 ProxyV2TargetV2 受监控的资源。所有代理和目标指标都会发布到 ProxyTarget 受监控的资源。

    如需继续向 ProxyV2TargetV2 受监控的资源发出指标,请在 overrides.yaml 中将 metrics.disablePrometheusPipeline 设置为 true

    如果您配置了基于指标的提醒,请确认为 Hybrid 安装使用了正确的指标。如需了解详情,请参阅基于指标的提醒

开始升级到 1.12 版之前的注意事项

从 Apigee Hybrid 1.11 版升级到 1.12 版包括 Cassandra 数据库从 3.11.x 版升级到 4.x 版。虽然 Cassandra 升级作为 Apigee Hybrid 升级过程的一部分进行处理,但请规划以下注意事项:

  • Cassandra 版本升级会在后台进行,并且一次在 1 个 Pod(或 Cassandra 节点)上进行,因此请规划在升级期间减少数据库容量。
  • 开始升级之前,扩缩 Cassandra 容量并确保磁盘利用率接近或低于 50%。
  • 验证和测试 Cassandra 备份和恢复程序。
  • 开始升级和验证备份之前,请备份 Hybrid 1.11 版安装中的 Cassandra 数据。
  • 由于 Cassandra 执行的升级后任务,升级 apigee-datastore 会导致 CPU 消耗暂时增加
  • 升级了 apigee-datastore (Cassandra) 组件后,您无法将该组件回滚到先前的版本。有两种场景需在升级 apigee-datastore 组件后将升级回滚到 Hybrid v1.12:
    • 如果 apigee-datastore 组件处于良好状态,但其他组件需要回滚,您可以单独回滚这些其他组件。
    • 如果 apigee-datastore 组件处于错误状态,您必须从 v1.11 备份恢复到 v1.11 安装。

升级单区域安装之前的注意事项

如果您需要回滚到先前版本的 Apigee Hybrid,则该过程可能需要停机。因此,如果您要升级单区域安装,则可能需要按照以下顺序创建第二个区域,然后一次仅升级一个区域:

  1. 使用同一 Hybrid 版本向现有安装添加第二个区域。请参阅 1.11 版文档中的多区域部署
  2. 开始升级之前,备份并验证第一个区域中的数据。请参阅 1.11 版文档中的 Cassandra 备份概览
  3. 将新添加的区域升级到 Hybrid 1.12。
  4. 将流量切换到新区域并验证流量。
  5. 验证后,使用 Hybrid 1.12 升级旧区域。
  6. 将所有流量切换回旧区域,并验证流量。
  7. 停用新区域。

升级多区域安装之前的注意事项

Apigee 建议按以下顺序来升级多区域安装:

  1. 开始升级之前,备份并验证每个区域中的数据。
  2. 在一个区域中升级 Hybrid 版本,并确保所有 Pod 都处于运行状态以验证升级。
  3. 验证新升级的区域中的流量。
  4. 仅在验证上一个区域中的流量后才升级每个后续区域。
  5. 如果可能需要回滚多区域部署中的升级,请准备将流量从失败区域迁出,并考虑在将流量转移到的区域中添加足够的容量来处理两个区域的流量。

前提条件

升级到 Hybrid 1.12 版之前,请确保您的安装满足以下要求:

  • 使用 Helm 管理的 Apigee Hybrid 1.11 版安装。
  • Helm v3.10+ 版。
  • kubectl 1.27、1.28 或 1.29 版(推荐)。
  • cert-manager v1.13.0 版。如果需要,您会在下面的准备升级到版本部分中升级 cert-manager。

限制

规划从 Apigee Hybrid 1.11 版到 1.12 版的升级时,请注意以下限制。如果您需要在升级后回滚或恢复,规划有助于减少所需的停机时间。

  • 由于两个版本之间不兼容,因此 Hybrid 1.12 中的备份无法在 Hybrid 1.11 中恢复,反之亦然。
  • 升级到 1.12 版期间,您无法扩缩数据存储区 Pod。开始升级 Hybrid 安装之前,请先解决所有区域中的扩缩需求。
  • 在单区域 Hybrid 安装中,数据存储区升级过程完成后,便无法回滚数据存储区组件。您无法将 Cassandra 4.x 数据存储区回滚到 Cassandra 3.x 数据存储区。这需要通过 Cassandra 3.x 数据的最新备份(来自 Hybrid 1.11 版安装)进行恢复。
  • 升级过程中不支持删除或添加区域。在多区域升级中,您必须先完成所有区域的升级,然后才能添加或删除区域。

升级到 1.12.0 版概览

以下各部分介绍升级 Apigee Hybrid 的过程:

  1. 准备升级
    • 备份 Cassandra。
    • 备份 Hybrid 安装目录。
  2. 安装 Hybrid 运行时 1.12.0 版

准备升级到 1.12 版

备份 Cassandra

  • 开始升级之前,请在所有适用区域中备份 Cassandra 数据库,并验证 Hybrid 1.11 版安装中的数据。请参阅 1.11 版文档中的监控备份
  • 开始升级过程之前,请重启集群中的所有 Cassandra Pod,以便任何遗留问题都可以出现。

    如需重启并测试 Cassandra Pod,请单独删除每个 Pod(一次删除一个 Pod),然后验证其是否恢复为运行状态以及就绪性探测是否通过:

    1. 列出 Cassandra Pod:
      kubectl get pods -n APIGEE_NAMESPACE -l app=apigee-cassandra

      例如:

      kubectl get pods -n apigee -l app=apigee-cassandra
      NAME                         READY   STATUS    RESTARTS   AGE
      apigee-cassandra-default-0   1/1     Running   0          2h
      apigee-cassandra-default-1   1/1     Running   0          2h
      apigee-cassandra-default-2   1/1     Running   0          2h
      
      . . .
    2. 删除 Pod:
      kubectl delete pod -n APIGEE_NAMESPACE CASSANDRA_POD_NAME

      例如:

      kubectl delete pod -n apigee apigee-cassandra-default-0
    3. 通过再次列出 Cassandra Pod 来检查状态:
      kubectl get pods -n APIGEE_NAMESPACE -l app=apigee-cassandra

      例如:

      kubectl get pods -n apigee -l app=apigee-cassandra
      NAME                         READY   STATUS    RESTARTS   AGE
      apigee-cassandra-default-0   1/1     Running   0          16s
      apigee-cassandra-default-1   1/1     Running   0          2h
      apigee-cassandra-default-2   1/1     Running   0          2h
      
      . . .
  • 再次应用上一个已知替换文件,确保未对其进行任何更改,以便您可以使用同一配置升级到 Hybrid 1.12 版。
  • 确保所有区域中的所有 Cassandra 节点都处于 UN(启动/正常)状态。如果任何 Cassandra 节点处于其他状态,请先解决该状态,然后再开始升级。

    您可以使用以下命令验证 Cassandra 节点的状态:

    1. 列出 Cassandra Pod:
      kubectl get pods -n APIGEE_NAMESPACE -l app=apigee-cassandra

      例如:

      kubectl get pods -n apigee -l app=apigee-cassandra
      NAME                         READY   STATUS    RESTARTS   AGE
      apigee-cassandra-default-0   1/1     Running   0          2h
      apigee-cassandra-default-1   1/1     Running   0          2h
      apigee-cassandra-default-2   1/1     Running   0          2h
      apigee-cassandra-default-3   1/1     Running   0          16m
      apigee-cassandra-default-4   1/1     Running   0          14m
      apigee-cassandra-default-5   1/1     Running   0          13m
      apigee-cassandra-default-6   1/1     Running   0          9m
      apigee-cassandra-default-7   1/1     Running   0          9m
      apigee-cassandra-default-8   1/1     Running   0          8m
    2. 使用 kubectl nodetool status 命令检查每个 Cassandra Pod 的节点状态:
      kubectl -n APIGEE_NAMESPACE exec -it CASSANDRA_POD_NAME nodetool status

      例如:

      kubectl -n apigee exec -it apigee-cassandra-default-0 nodetool status
      Datacenter: us-east1
      ====================
      Status=Up/Down
      |/ State=Normal/Leaving/Joining/Moving
      --  Address      Load        Tokens       Owns (effective)  Host ID                               Rack
      UN  10.16.2.6    690.17 KiB  256          48.8%             b02089d1-0521-42e1-bbed-900656a58b68  ra-1
      UN  10.16.4.6    705.55 KiB  256          51.6%             dc6b7faf-6866-4044-9ac9-1269ebd85dab  ra-1
      UN  10.16.11.11  674.36 KiB  256          48.3%             c7906366-6c98-4ff6-a4fd-17c596c33cf7  ra-1
      UN  10.16.1.11   697.03 KiB  256          49.8%             ddf221aa-80aa-497d-b73f-67e576ff1a23  ra-1
      UN  10.16.5.13   703.64 KiB  256          50.9%             2f01ac42-4b6a-4f9e-a4eb-4734c24def95  ra-1
      UN  10.16.8.15   700.42 KiB  256          50.6%             a27f93af-f8a0-4c88-839f-2d653596efc2  ra-1
      UN  10.16.11.3   697.03 KiB  256          49.8%             dad221ff-dad1-de33-2cd3-f1.672367e6f  ra-1
      UN  10.16.14.16  704.04 KiB  256          50.9%             1feed042-a4b6-24ab-49a1-24d4cef95473  ra-1
      UN  10.16.16.1   699.82 KiB  256          50.6%             beef93af-fee0-8e9d-8bbf-efc22d653596  ra-1

备份 Hybrid 安装目录

  1. 这些说明将环境变量 APIGEE_HELM_CHARTS_HOME 用于文件系统中安装了 Helm 图表的目录。如果需要,请切换到此目录,然后使用以下命令定义变量:

    Linux

    export APIGEE_HELM_CHARTS_HOME=$PWD
    echo $APIGEE_HELM_CHARTS_HOME

    Mac OS

    export APIGEE_HELM_CHARTS_HOME=$PWD
    echo $APIGEE_HELM_CHARTS_HOME

    Windows

    set APIGEE_HELM_CHARTS_HOME=%CD%
    echo %APIGEE_HELM_CHARTS_HOME%
  2. 创建 1.11 版 $APIGEE_HELM_CHARTS_HOME/ 目录的备份副本。您可以使用任何备份过程。例如,您可以使用以下命令创建整个目录的 tar 文件:
    tar -czvf $APIGEE_HELM_CHARTS_HOME/../apigee-helm-charts-v1.11-backup.tar.gz $APIGEE_HELM_CHARTS_HOME
  3. 按照 Cassandra 备份和恢复中的说明备份 Cassandra 数据库。
  4. 如果您使用替换文件中的服务证书文件 (.json) 对服务账号进行身份验证,请确保服务账号证书文件位于正确的 Helm 图表目录中。Helm 图表无法读取每个图表目录之外的文件。

    如果您使用 Kubernetes Secret 或 Workload Identity 对服务账号进行身份验证,则无需执行此步骤。

    下表展示了每个服务账号文件的目标位置,具体取决于您的安装类型:

    生产

    服务账号 默认文件名 Helm 图表目录
    apigee-cassandra PROJECT_ID-apigee-cassandra.json $APIGEE_HELM_CHARTS_HOME/apigee-datastore/
    apigee-logger PROJECT_ID-apigee-logger.json $APIGEE_HELM_CHARTS_HOME/apigee-telemetry/
    apigee-mart PROJECT_ID-apigee-mart.json $APIGEE_HELM_CHARTS_HOME/apigee-org/
    apigee-metrics PROJECT_ID-apigee-metrics.json $APIGEE_HELM_CHARTS_HOME/apigee-telemetry/
    apigee-runtime PROJECT_ID-apigee-runtime.json $APIGEE_HELM_CHARTS_HOME/apigee-env
    apigee-synchronizer PROJECT_ID-apigee-synchronizer.json $APIGEE_HELM_CHARTS_HOME/apigee-env/
    apigee-udca PROJECT_ID-apigee-udca.json $APIGEE_HELM_CHARTS_HOME/apigee-org/
    apigee-watcher PROJECT_ID-apigee-watcher.json $APIGEE_HELM_CHARTS_HOME/apigee-org/

    非生产

    创建以下每个目录中的 apigee-non-prod 服务账号文件的副本:

    服务账号 默认文件名 Helm 图表目录
    apigee-non-prod PROJECT_ID-apigee-non-prod.json $APIGEE_HELM_CHARTS_HOME/apigee-datastore/
    $APIGEE_HELM_CHARTS_HOME/apigee-telemetry/
    $APIGEE_HELM_CHARTS_HOME/apigee-org/
    $APIGEE_HELM_CHARTS_HOME/apigee-env/
  5. 确保您的 TLS 证书和密钥文件(.crt.key 和/或 .pem)位于 $APIGEE_HELM_CHARTS_HOME/apigee-virtualhost/ 目录中。

升级 Kubernetes 版本

检查您的 Kubernetes 平台版本,并根据需要将 Kubernetes 平台升级到 Hybrid 1.11 和 Hybrid 1.12 均支持的版本。如需帮助,请参阅该平台的相关文档。

安装 Hybrid 1.12.0 运行时

准备 Helm 图表升级

  1. 拉取 Apigee Helm 图表。

    Apigee Hybrid 图表托管在 Google Artifact Registry 中:

    oci://us-docker.pkg.dev/apigee-release/apigee-hybrid-helm-charts

    使用以下 pull 命令将所有 Apigee Hybrid Helm 图表复制到您的本地存储空间:

    export CHART_REPO=oci://us-docker.pkg.dev/apigee-release/apigee-hybrid-helm-charts
    export CHART_VERSION=1.12.0
    helm pull $CHART_REPO/apigee-operator --version $CHART_VERSION --untar
    helm pull $CHART_REPO/apigee-datastore --version $CHART_VERSION --untar
    helm pull $CHART_REPO/apigee-env --version $CHART_VERSION --untar
    helm pull $CHART_REPO/apigee-ingress-manager --version $CHART_VERSION --untar
    helm pull $CHART_REPO/apigee-org --version $CHART_VERSION --untar
    helm pull $CHART_REPO/apigee-redis --version $CHART_VERSION --untar
    helm pull $CHART_REPO/apigee-telemetry --version $CHART_VERSION --untar
    helm pull $CHART_REPO/apigee-virtualhost --version $CHART_VERSION --untar
    
  2. 根据需要升级 cert-manager。

    如果您需要升级 cert-manager 版本,请使用以下命令安装新版本:

    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml
    
  3. 安装更新后的 Apigee CRD:
    1. 通过运行以下命令使用 kubectl 试运行功能:

      kubectl apply -k  apigee-operator/etc/crds/default/ --server-side --force-conflicts --validate=false --dry-run=server
      
    2. 使用试运行命令进行验证后,运行以下命令:

      kubectl apply -k  apigee-operator/etc/crds/default/ --server-side --force-conflicts --validate=false
      
    3. 使用 kubectl get crds 命令验证安装:
      kubectl get crds | grep apigee

      输出内容应如下所示:

      apigeedatastores.apigee.cloud.google.com                    2023-10-09T14:48:30Z
      apigeedeployments.apigee.cloud.google.com                   2023-10-09T14:48:30Z
      apigeeenvironments.apigee.cloud.google.com                  2023-10-09T14:48:31Z
      apigeeissues.apigee.cloud.google.com                        2023-10-09T14:48:31Z
      apigeeorganizations.apigee.cloud.google.com                 2023-10-09T14:48:32Z
      apigeeredis.apigee.cloud.google.com                         2023-10-09T14:48:33Z
      apigeerouteconfigs.apigee.cloud.google.com                  2023-10-09T14:48:33Z
      apigeeroutes.apigee.cloud.google.com                        2023-10-09T14:48:33Z
      apigeetelemetries.apigee.cloud.google.com                   2023-10-09T14:48:34Z
      cassandradatareplications.apigee.cloud.google.com           2023-10-09T14:48:35Z
      
  4. 检查集群节点上的标签。默认情况下,Apigee 会将数据 pod 调度到带有 cloud.google.com/gke-nodepool=apigee-data 标签的节点上,并将运行时 pod 调度到带有 cloud.google.com/gke-nodepool=apigee-runtime 标签的节点上。您可以在 overrides.yaml 文件中自定义节点池标签。

    如需了解详情,请参阅配置专用节点池

安装 Apigee Hybrid Helm 图表

  1. 如果没有,请转到 APIGEE_HELM_CHARTS_HOME 目录。从该目录运行以下命令。
  2. 升级 Apigee Operator/Controller:

    试运行:

    helm upgrade operator apigee-operator/ \
      --install \
      --create-namespace \
      --namespace apigee-system \
      -f OVERRIDES_FILE \
      --dry-run
    

    升级图表:

    helm upgrade operator apigee-operator/ \
      --install \
      --create-namespace \
      --namespace apigee-system \
      -f OVERRIDES_FILE
    

    验证 Apigee Operator 安装:

    helm ls -n apigee-system
    
    NAME       NAMESPACE       REVISION   UPDATED                                STATUS     CHART                   APP VERSION
    operator   apigee-system   3          2023-06-26 00:42:44.492009 -0800 PST   deployed   apigee-operator-1.12.0   1.12.0
    

    通过检查可用性来验证它已启动并正在运行:

    kubectl -n apigee-system get deploy apigee-controller-manager
    
    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    apigee-controller-manager   1/1     1            1           7d20h
    
  3. 升级 Apigee 数据存储区:

    试运行:

    helm upgrade datastore apigee-datastore/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE \
      --dry-run
    

    升级图表:

    helm upgrade datastore apigee-datastore/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    

    通过检查 apigeedatastore 的状态来验证它已启动并正在运行:

    kubectl -n apigee get apigeedatastore default
    
    NAME      STATE       AGE
    default   running    2d
    
  4. 升级 Apigee 遥测:

    试运行:

    helm upgrade telemetry apigee-telemetry/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE \
      --dry-run
    

    升级图表:

    helm upgrade telemetry apigee-telemetry/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    

    通过检查状态来验证它已启动并正在运行:

    kubectl -n apigee get apigeetelemetry apigee-telemetry
    
    NAME               STATE     AGE
    apigee-telemetry   running   2d
    
  5. 升级 Apigee Redis:

    试运行:

    helm upgrade redis apigee-redis/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE \
      --dry-run
    

    升级图表:

    helm upgrade redis apigee-redis/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    

    通过检查状态来验证它已启动并正在运行:

    kubectl -n apigee get apigeeredis default
    
    NAME      STATE     AGE
    default   running   2d
    
  6. 升级 Apigee 入站流量管理器:

    试运行:

    helm upgrade ingress-manager apigee-ingress-manager/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE \
      --dry-run
    

    升级图表:

    helm upgrade ingress-manager apigee-ingress-manager/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    

    通过检查可用性来验证它已启动并正在运行:

    kubectl -n apigee get deployment apigee-ingressgateway-manager
    
    NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
    apigee-ingressgateway-manager   2/2     2            2           2d
    
  7. 升级 Apigee 组织:

    试运行:

    helm upgrade ORG_NAME apigee-org/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE \
      --dry-run
    

    升级图表:

    helm upgrade ORG_NAME apigee-org/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    

    通过检查相应组织的状态来验证它已启动并正在运行:

    kubectl -n apigee get apigeeorg
    
    NAME                      STATE     AGE
    apigee-org1-xxxxx          running   2d
    
  8. 升级环境。

    一次只能安装一个环境。使用 --set env=ENV_NAME 指定环境:

    试运行:

    helm upgrade ENV_RELEASE_NAME apigee-env/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --set env=ENV_NAME \
      -f OVERRIDES_FILE \
      --dry-run
    
    • ENV_RELEASE_NAME 是您之前安装 apigee-env 图表时使用的名称。在 Hybrid v1.10 中,该名称通常是 apigee-env-ENV_NAME。在 Hybrid v1.11 及更高版本中,该名称通常是 ENV_NAME
    • ENV_NAME 是您要升级的环境的名称。
    • OVERRIDES_FILE 是 v.1.12.0 的新替换文件

    升级图表:

    helm upgrade ENV_RELEASE_NAME apigee-env/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --set env=ENV_NAME \
      -f OVERRIDES_FILE
    

    通过检查相应环境的状态来验证它已启动并正在运行:

    kubectl -n apigee get apigeeenv
    
    NAME                          STATE       AGE   GATEWAYTYPE
    apigee-org1-dev-xxx            running     2d
    
  9. 升级环境组 (virtualhosts)。
    1. 一次只能升级一个环境组 (virtualhost)。使用 --set envgroup=ENV_GROUP_NAME 指定环境组。对 override.yaml 文件中提到的每个环境组重复运行以下命令:

      试运行:

      helm upgrade ENV_GROUP_RELEASE_NAME apigee-virtualhost/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --set envgroup=ENV_GROUP_NAME \
        -f OVERRIDES_FILE \
        --dry-run
      

      ENV_GROUP_RELEASE_NAME 是您之前安装 apigee-virtualhost 图表时使用的名称。在 Hybrid v1.10 中,该名称通常是 apigee-virtualhost-ENV_GROUP_NAME。在 Hybrid v1.11 及更高版本中,该名称通常是 ENV_GROUP_NAME

      升级图表:

      helm upgrade ENV_GROUP_RELEASE_NAME apigee-virtualhost/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --set envgroup=ENV_GROUP_NAME \
        -f OVERRIDES_FILE
      
    2. 检查 ApigeeRoute (AR) 的状态。

      安装 virtualhosts 会创建 ApigeeRouteConfig (ARC),它会在 Apigee Watcher 从控制平面拉取环境组相关详细信息后在内部创建 ApigeeRoute (AR)。因此,请检查相应 AR 的状态是否为正在运行:

      kubectl -n apigee get arc
      
      NAME                                STATE   AGE
      apigee-org1-dev-egroup                       2d
      
      kubectl -n apigee get ar
      
      NAME                                        STATE     AGE
      apigee-org1-dev-egroup-xxxxxx                running   2d
      

回滚到先前的版本

根据升级到 Apigee Hybrid 1.12 版后 apigee-datastore 组件的状态,本节划分为多个部分。有一些过程适用于在 apigee-datastore 组件处于良好状态的情况下进行单区域或多区域回滚,还有一些过程适用于在 apigee-datastore 处于错误状态的情况下从备份恢复。

单区域回滚和恢复

apigee-datastore 处于良好状态时回滚

此过程介绍了如何将每个 Apigee Hybrid 组件从 v1.12 回滚到 v1.11(apigee-datastore 除外)。v1.12 apigee-datastore 组件向后兼容 Hybrid v1.11 组件。

如需将单区域安装回滚到 1.11 版,请执行以下操作:

  1. 开始回滚之前,验证所有 Pod 是否都处于运行状态:
    kubectl get pods -n APIGEE_NAMESPACE
    kubectl get pods -n apigee-system
  2. 使用 helm 验证组件的版本:
    helm -n APIGEE_NAMESPACE list
    helm -n apigee-system list

    例如,

    helm -n apigee list
    NAME              NAMESPACE   REVISION   UPDATED                                   STATUS     CHART                           APP VERSION
    datastore         apigee      2          2024-03-29 17:08:07.917848253 +0000 UTC   deployed   apigee-datastore-1.12.0         1.12.0
    ingress-manager   apigee      2          2024-03-29 17:21:02.917333616 +0000 UTC   deployed   apigee-ingress-manager-1.12.0   1.12.0
    redis             apigee      2          2024-03-29 17:19:51.143728084 +0000 UTC   deployed   apigee-redis-1.12.0             1.12.0
    telemetry         apigee      2          2024-03-29 17:16:09.883885403 +0000 UTC   deployed   apigee-telemetry-1.12.0         1.12.0
    myhybridorg       apigee      2          2024-03-29 17:21:50.899855344 +0000 UTC   deployed   apigee-org-1.12.0               1.12.0
  3. 使用以下命令回滚每个组件(apigee-datastore 除外)
    1. 创建以下环境变量:
      • PREVIOUS_HELM_CHARTS_HOME:先前 Apigee Hybrid Helm 图表的安装目录。这是要回滚到的版本。
    2. 回滚 virtualhost。对替换文件中提到的每个环境组重复运行以下命令。
      helm upgrade ENV_GROUP_RELEASE_NAME $PREVIOUS_HELM_CHARTS_HOME/apigee-virtualhost/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        --set envgroup=ENV_GROUP_NAME \
        -f PREVIOUS_OVERRIDES_FILE
      

      ENV_GROUP_RELEASE_NAME 是您之前安装 apigee-virtualhost 图表时使用的名称。在 Hybrid v1.10 中,该名称通常是 apigee-virtualhost-ENV_GROUP_NAME。在 Hybrid v1.11 及更高版本中,该名称通常是 ENV_GROUP_NAME

    3. 回滚环境。对替换文件中提到的每个环境重复运行以下命令。
      helm upgrade apigee-env-ENV_NAME $PREVIOUS_HELM_CHARTS_HOME/apigee-env/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        --set env=ENV_NAME \
        -f PREVIOUS_OVERRIDES_FILE
      

      ENV_RELEASE_NAME 是您之前安装 apigee-env 图表时使用的名称。在 Hybrid v1.10 中,该名称通常是 apigee-env-ENV_NAME。在 Hybrid v1.11 及更高版本中,该名称通常是 ENV_NAME

      通过检查相应环境的状态来验证它已启动并正在运行:

      kubectl -n apigee get apigeeenv
      
      NAME                  STATE     AGE   GATEWAYTYPE
      apigee-org1-dev-xxx   running   2d
      
    4. 回滚组织:
      helm upgrade ORG_NAME $PREVIOUS_HELM_CHARTS_HOME/apigee-org/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f PREVIOUS_OVERRIDES_FILE
      

      通过检查相应组织的状态来验证它已启动并正在运行:

      kubectl -n apigee get apigeeorg
      
      NAME                STATE     AGE
      apigee-org1-xxxxx   running   2d
      
    5. 回滚入站流量管理器:
      helm upgrade ingress-manager $PREVIOUS_HELM_CHARTS_HOME/apigee-ingress-manager/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f PREVIOUS_OVERRIDES_FILE
      

      通过检查可用性来验证它已启动并正在运行:

      kubectl -n apigee get deployment apigee-ingressgateway-manager
      
      NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
      apigee-ingressgateway-manager   2/2     2            2           2d
      
    6. 回滚 Redis:
      helm upgrade redis $PREVIOUS_HELM_CHARTS_HOME/apigee-redis/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f PREVIOUS_OVERRIDES_FILE
      

      通过检查状态来验证它已启动并正在运行:

      kubectl -n apigee get apigeeredis default
      
      NAME      STATE     AGE
      default   running   2d
      
    7. 回滚 Apigee Telemetry:
      helm upgrade telemetry $PREVIOUS_HELM_CHARTS_HOME/apigee-telemetry/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f PREVIOUS_OVERRIDES_FILE
      

      通过检查状态来验证它已启动并正在运行:

      kubectl -n apigee get apigeetelemetry apigee-telemetry
      
      NAME               STATE     AGE
      apigee-telemetry   running   2d
      
    8. 回滚 Apigee 控制器:
      helm upgrade operator $PREVIOUS_HELM_CHARTS_HOME/apigee-operator/ \
        --install \
        --namespace apigee-system \
        --atomic \
        -f PREVIOUS_OVERRIDES_FILE

      验证 Apigee Operator 安装:

      helm ls -n apigee-system
      
      NAME       NAMESPACE       REVISION   UPDATED                                STATUS     CHART                   APP VERSION
      operator   apigee-system   3          2023-06-26 00:42:44.492009 -0800 PST   deployed   apigee-operator-1.12.0   1.12.0
      

      通过检查可用性来验证它已启动并正在运行:

      kubectl -n apigee-system get deploy apigee-controller-manager
      
      NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
      apigee-controller-manager   1/1     1            1           7d20h
      
    9. 回滚 Apigee Hybrid CRD:
      kubectl apply -k  $PREVIOUS_HELM_CHARTS_HOME/apigee-operator/etc/crds/default/ --server-side --force-conflicts --validate=false
      
  4. 验证所有 Pod 是否都处于运行或已完成状态:
    kubectl get pods -n APIGEE_NAMESPACE
    kubectl get pods -n apigee-system
  5. 验证所有组件的版本。除数据存储区外,所有组件都应是先前的版本:
    helm -n APIGEE_NAMESPACE list
    helm -n apigee-system list

    例如,

    helm -n apigee  list
    NAME              NAMESPACE  REVISION  UPDATED                                  STATUS    CHART                          APP VERSION
    datastore         apigee     2         2024-03-29 18:47:55.979671057 +0000 UTC  deployed  apigee-datastore-1.12.0        1.12.0
    ingress-manager   apigee     3         2024-03-14 19:14:57.905700154 +0000 UTC  deployed  apigee-ingress-manager-1.11.0  1.11.0
    redis             apigee     3         2024-03-14 19:15:49.406917944 +0000 UTC  deployed  apigee-redis-1.11.0            1.11.0
    telemetry         apigee     3         2024-03-14 19:17:04.803421424 +0000 UTC  deployed  apigee-telemetry-1.11.0        1.11.0
    myhybridorg       apigee     3         2024-03-14 19:13:17.807673713 +0000 UTC  deployed  apigee-org-1.11.0              1.11.0

apigee-datastore 未处于良好状态时恢复

如果 apigee-datastore 组件升级失败,您无法将 apigee-datastore 从 1.12 版回滚到 1.11 版。而是必须通过由 v1.11 安装生成的备份进行恢复。请使用以下顺序恢复先前的版本。

  1. 如果您没有活跃的 Apigee Hybrid 1.11 版安装(例如在其他区域中),请使用备份的图表和替换文件创建新的 v1.11 安装。请参阅 Apigee Hybrid 1.11 版安装说明
  2. 按照以下方面的说明,从备份恢复 v1.11 区域(或新安装):
  3. 验证发送到恢复后的安装的流量
  4. 可选:按照卸载 Hybrid 运行时中的说明移除 1.12 版安装。

多区域回滚和恢复

apigee-datastore 处于良好状态时回滚

此过程介绍了如何将每个 Apigee Hybrid 组件从 v1.12 回滚到 v1.11(apigee-datastore 除外)。v1.12 apigee-datastore 组件向后兼容 Hybrid v1.11 组件。

  1. 开始回滚之前,验证所有 Pod 是否都处于运行状态:
    kubectl get pods -n APIGEE_NAMESPACE
    kubectl get pods -n apigee-system
  2. 确保所有区域中的所有 Cassandra 节点都处于 UN(启动/正常)状态。如果任何 Cassandra 节点处于其他状态,请先解决该状态,然后再开始升级过程。

    您可以使用以下命令验证 Cassandra 节点的状态:

    1. 列出 Cassandra Pod:
      kubectl get pods -n APIGEE_NAMESPACE -l app=apigee-cassandra

      例如:

      kubectl get pods -n apigee -l app=apigee-cassandra
      NAME                         READY   STATUS    RESTARTS   AGE
      apigee-cassandra-default-0   1/1     Running   0          2h
      apigee-cassandra-default-1   1/1     Running   0          2h
      apigee-cassandra-default-2   1/1     Running   0          2h
      apigee-cassandra-default-3   1/1     Running   0          16m
      apigee-cassandra-default-4   1/1     Running   0          14m
      apigee-cassandra-default-5   1/1     Running   0          13m
      apigee-cassandra-default-6   1/1     Running   0          9m
      apigee-cassandra-default-7   1/1     Running   0          9m
      apigee-cassandra-default-8   1/1     Running   0          8m
    2. 使用 kubectl nodetool status 命令检查每个 Cassandra Pod 的节点状态:
      kubectl -n APIGEE_NAMESPACE exec -it CASSANDRA_POD_NAME -- nodetool -u JMX_USER -pw JMX_PASSWORD

      例如:

      kubectl -n apigee exec -it apigee-cassandra-default-0 -- nodetool -u jmxuser -pw JMX_PASSWORD status
      Datacenter: us-east1
      ====================
      Status=Up/Down
      |/ State=Normal/Leaving/Joining/Moving
      --  Address      Load        Tokens   Owns (effective)   Host ID                                Rack
      UN  10.16.2.6    690.17 KiB  256      48.8%              b02089d1-0521-42e1-bbed-900656a58b68   ra-1
      UN  10.16.4.6    705.55 KiB  256      51.6%              dc6b7faf-6866-4044-9ac9-1269ebd85dab   ra-1
      UN  10.16.11.11  674.36 KiB  256      48.3%              c7906366-6c98-4ff6-a4fd-17c596c33cf7   ra-1
      UN  10.16.1.11   697.03 KiB  256      49.8%              ddf221aa-80aa-497d-b73f-67e576ff1a23   ra-1
      UN  10.16.5.13   703.64 KiB  256      50.9%              2f01ac42-4b6a-4f9e-a4eb-4734c24def95   ra-1
      UN  10.16.8.15   700.42 KiB  256      50.6%              a27f93af-f8a0-4c88-839f-2d653596efc2   ra-1
      UN  10.16.11.3   697.03 KiB  256      49.8%              dad221ff-dad1-de33-2cd3-f1.672367e6f   ra-1
      UN  10.16.14.16  704.04 KiB  256      50.9%              1feed042-a4b6-24ab-49a1-24d4cef95473   ra-1
      UN  10.16.16.1   699.82 KiB  256      50.6%              beef93af-fee0-8e9d-8bbf-efc22d653596   ra-1

    如果并非所有 Cassandra Pod 都处于 UN 状态,请按照从 Cassandra 集群中移除已关闭节点中的说明操作。

  3. 导航到之前的 Apigee Hybrid Helm 图表的安装目录
  4. 将上下文更改为已升级的区域
    kubectl config use-context UPGRADED_REGION_CONTEXT
        
  5. 验证所有 Pod 是否都处于运行状态:
    kubectl get pods -n APIGEE_NAMESPACE
    kubectl get pods -n apigee-system
  6. 使用 helm 命令确保所有版本都已升级到 Hybrid v1.12:
    helm -n APIGEE_NAMESPACE list
    helm -n apigee-system list

    例如,

    helm -n apigee list
    NAME             NAMESPACE  REVISION  UPDATED                                  STATUS    CHART                          APP VERSION
    datastore        apigee     2         2024-03-29 17:08:07.917848253 +0000 UTC  deployed  apigee-datastore-1.12.0        1.12.0
    ingress-manager  apigee     2         2024-03-29 17:21:02.917333616 +0000 UTC  deployed  apigee-ingress-manager-1.12.0  1.12.0
    redis            apigee     2         2024-03-29 17:19:51.143728084 +0000 UTC  deployed  apigee-redis-1.12.0            1.12.0
    telemetry        apigee     2         2024-03-29 17:16:09.883885403 +0000 UTC  deployed  apigee-telemetry-1.12.0        1.12.0
    myhybridorg      apigee     2         2024-03-29 17:21:50.899855344 +0000 UTC  deployed  apigee-org-1.12.0              1.12.0
  7. 使用以下命令回滚每个组件(apigee-datastore 除外)
    1. 创建以下环境变量:
      • PREVIOUS_HELM_CHARTS_HOME:先前 Apigee Hybrid Helm 图表的安装目录。这是要回滚到的版本。
    2. 回滚 virtualhost。对替换文件中提到的每个环境组重复运行以下命令。
      helm upgrade ENV_GROUP_RELEASE_NAME $PREVIOUS_HELM_CHARTS_HOME/apigee-virtualhost/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        --set envgroup=ENV_GROUP_NAME \
        -f PREVIOUS_OVERRIDES_FILE
      

      ENV_GROUP_RELEASE_NAME 是您之前安装 apigee-virtualhost 图表时使用的名称。在 Hybrid v1.10 中,该名称通常是 apigee-virtualhost-ENV_GROUP_NAME。在 Hybrid v1.11 及更高版本中,该名称通常是 ENV_GROUP_NAME

    3. 回滚环境。对替换文件中提到的每个环境重复运行以下命令。
      helm upgrade apigee-env-ENV_NAME $PREVIOUS_HELM_CHARTS_HOME/apigee-env/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        --set env=ENV_NAME \
        -f PREVIOUS_OVERRIDES_FILE
      

      ENV_RELEASE_NAME 是您之前安装 apigee-env 图表时使用的名称。在 Hybrid v1.10 中,该名称通常是 apigee-env-ENV_NAME。在 Hybrid v1.11 及更高版本中,该名称通常是 ENV_NAME

      通过检查相应环境的状态来验证每个环境已启动并正在运行:

      kubectl -n apigee get apigeeenv
      
      NAME                  STATE     AGE   GATEWAYTYPE
      apigee-org1-dev-xxx   running   2d
      
    4. 回滚组织:
      helm upgrade ORG_NAME $PREVIOUS_HELM_CHARTS_HOME/apigee-org/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f PREVIOUS_OVERRIDES_FILE
      

      通过检查相应组织的状态来验证它已启动并正在运行:

      kubectl -n apigee get apigeeorg
      
      NAME                STATE     AGE
      apigee-org1-xxxxx   running   2d
      
    5. 回滚入站流量管理器:
      helm upgrade ingress-manager $PREVIOUS_HELM_CHARTS_HOME/apigee-ingress-manager/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f PREVIOUS_OVERRIDES_FILE
      

      通过检查可用性来验证它已启动并正在运行:

      kubectl -n apigee get deployment apigee-ingressgateway-manager
      
      NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
      apigee-ingressgateway-manager   2/2     2            2           2d
      
    6. 回滚 Redis:
      helm upgrade redis $PREVIOUS_HELM_CHARTS_HOME/apigee-redis/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f PREVIOUS_OVERRIDES_FILE
      

      通过检查状态来验证它已启动并正在运行:

      kubectl -n apigee get apigeeredis default
      
      NAME      STATE     AGE
      default   running   2d
      
    7. 回滚 Apigee Telemetry:
      helm upgrade telemetry $PREVIOUS_HELM_CHARTS_HOME/apigee-telemetry/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f PREVIOUS_OVERRIDES_FILE
      

      通过检查状态来验证它已启动并正在运行:

      kubectl -n apigee get apigeetelemetry apigee-telemetry
      
      NAME               STATE     AGE
      apigee-telemetry   running   2d
      
    8. 回滚 Apigee 控制器:
      helm upgrade operator $PREVIOUS_HELM_CHARTS_HOME/apigee-operator/ \
        --install \
        --namespace apigee-system \
        --atomic \
        -f PREVIOUS_OVERRIDES_FILE
      

      验证 Apigee Operator 安装:

      helm ls -n apigee-system
      
      NAME       NAMESPACE       REVISION   UPDATED                                STATUS     CHART                   APP VERSION
      operator   apigee-system   3          2023-06-26 00:42:44.492009 -0800 PST   deployed   apigee-operator-1.12.0   1.12.0
      

      通过检查可用性来验证它已启动并正在运行:

      kubectl -n apigee-system get deploy apigee-controller-manager
      
      NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
      apigee-controller-manager   1/1     1            1           7d20h
      
    9. 回滚 Apigee Hybrid CRD:
      kubectl apply -k  $PREVIOUS_HELM_CHARTS_HOME/apigee-operator/etc/crds/default/ --server-side --force-conflicts --validate=false
      
  8. 验证所有组件的版本。除 datastore 外,所有组件都应是先前的版本:
    helm -n APIGEE_NAMESPACE list
    helm -n apigee-system list

    例如,

    helm -n apigee  list
    NAME              NAMESPACE  REVISION  UPDATED                                  STATUS    CHART                          APP VERSION
    datastore         apigee     2         2024-03-29 18:47:55.979671057 +0000 UTC  deployed  apigee-datastore-1.12.0        1.12.0
    ingress-manager   apigee     3         2024-03-14 19:14:57.905700154 +0000 UTC  deployed  apigee-ingress-manager-1.11.0  1.11.0
    redis             apigee     3         2024-03-14 19:15:49.406917944 +0000 UTC  deployed  apigee-redis-1.11.0            1.11.0
    telemetry         apigee     3         2024-03-14 19:17:04.803421424 +0000 UTC  deployed  apigee-telemetry-1.11.0        1.11.0
    myhybridorg       apigee     3         2024-03-14 19:13:17.807673713 +0000 UTC  deployed  apigee-org-1.11.0              1.11.0
    

    此时,所有版本(datastore 除外)都已回滚到先前的版本。

将多区域安装恢复到先前的版本

可通过从多区域安装中移除对多区域升级中升级失败的区域的引用,来恢复该区域。仅当 Hybrid 1.11 上至少有 1 个动态区域时,才能使用此方法。v1.12 数据存储区与 v1.11 组件兼容。

如需从健康状况良好的区域恢复故障区域,请执行以下步骤:

  1. 将 API 流量从受影响的区域重定向到正常工作的区域。相应地规划容量,以支持从故障区域转移的流量。
  2. 停用受影响的区域。对于每个受影响的区域,请按照停用 Hybrid 区域中所述的步骤执行操作。等待停用完成,然后再继续执行下一步操作。

  3. 按照从失败的升级恢复区域中的说明清理失败区域。
  4. 恢复受影响的区域。如需恢复,请创建一个新区域,如 GKE、GKE On-Prem 和 AKS 上的多区域部署中所述。

apigee-datastore 处于错误状态的情况下从备份恢复多区域安装

如果 apigee-datastore 组件升级失败,您无法从 1.12 版回滚到 1.11 版。而是必须通过由 v1.11 安装生成的备份进行恢复。请使用以下顺序恢复先前的版本。

  1. 如果您没有活跃的 Apigee Hybrid 1.11 版安装(例如在其他区域中),请使用备份的图表和替换文件创建新的 v1.11 安装。请参阅 Apigee Hybrid 1.11 版安装说明
  2. 按照以下方面的说明,从备份恢复 v1.11 区域(或新安装):
  3. 验证发送到恢复后的安装的流量
  4. 对于多区域安装,请重新构建和恢复下一个区域。请参阅“在多个区域中恢复”中的“使用备份进行恢复”中的说明。
  5. 按照卸载 Hybrid 运行时中的说明移除 1.12 版安装。

附录:从失败的升级恢复区域

如果从 1.11 升级到 1.12 失败,请移除数据中心。

  1. 从动态区域验证 Cassandra 集群状态:
    1. 将 kubectl 上下文切换到要移除的区域:
      kubectl config use-context CONTEXT_OF_LIVE_REGION
    2. 列出 Cassandra Pod:
      kubectl get pods -n APIGEE_NAMESPACE -l app=apigee-cassandra

      例如:

      kubectl get pods -n apigee -l app=apigee-cassandra
      NAME                 READY   STATUS    RESTARTS   AGE
      apigee-cassandra-default-0   1/1     Running   0          2h
      apigee-cassandra-default-1   1/1     Running   0          2h
      apigee-cassandra-default-2   1/1     Running   0          2h
    3. 对其中一个 Cassandra Pod 执行 exec:
      kubectl exec -it -n CASSANDRA_POD_NAME -- /bin/bash
    4. 验证 Cassandra 集群的状态:
      nodetool -u JMX_USER -pw JMX_PASSWORD status

      输出内容应如下所示:

      Datacenter: dc-1
      ================
      Status=Up/Down
      |/ State=Normal/Leaving/Joining/Moving
      --  Address      Load        Tokens       Owns (effective)  Host ID                               Rack
      UN  10.48.12.16  813.84 KiB  256          100.0%            a6340ad9-37ba-4ec8-a8c2-f7b7ac931807  ra-1
      UN  10.48.14.16  859.89 KiB  256          100.0%            39f03c51-e387-4dac-8360-6d8732e690a7  ra-1
      UN  10.48.0.18   888.95 KiB  256          100.0%            0d57df49-52e4-4c01-832d-d9df845ab732  ra-1
      
    5. 描述集群,以验证您是否仅看到来自动态区域的 Cassandra Pod 的 IP 并且它们全都采用同一架构版本:
      nodetool -u JMX_USER -pw JMX_PASSWORD describecluster

      输出内容应如下所示:

      nodetool -u JMX_USER -pw JMX_PASSWORD describecluster
      
      Schema versions:
          4bebf2de-0582-31b4-9c5f-e36f60127e1b: [10.48.14.16, 10.48.12.16, 10.48.0.18]
      
  2. 清理 Cassandra 键空间复制:
    1. 获取 user-setup 作业并将其删除。系统会立即创建新的 user-setup 作业。
      kubectl get jobs -n APIGEE_NAMESPACE

      例如:

      kubectl get jobs -n apigee
        NAME                                                           COMPLETIONS   DURATION   AGE
        apigee-cassandra-schema-setup-myhybridorg-8b3e61d          1/1           6m35s      3h5m
        apigee-cassandra-schema-val-myhybridorg-8b3e61d-28499150   1/1           10s        9m22s
       apigee-cassandra-user-setup-myhybridorg-8b3e61d            0/1           21s        21s
      
      kubectl delete jobs USER_SETUP_JOB_NAME -n APIGEE_NAMESPACE

      输出应显示新作业正在启动:

      kubectl delete jobs apigee-cassandra-user-setup-myhybridorg-8b3e61d -n apigee
      
        apigee-cassandra-user-setup-myhybridorg-8b3e61d-wl92b         0/1     Init:0/1    0               1s
        
    2. 按照创建客户端容器中的说明创建客户端容器,以验证 Cassandra 键空间复制设置。
    3. 获取所有键空间。对 cassandra-client Pod 执行 exec,然后启动 cqlsh 客户端:
      kubectl exec -it -n APIGEE_NAMESPACE cassandra-client -- /bin/bash

      使用 ddl user 连接到 Cassandra 服务器,因为它具有运行以下命令所需的权限:

      cqlsh apigee-cassandra-default.apigee.svc.cluster.local -u DDL_USER -p DDL_PASSWORD --ssl

      获取键空间:

      select * from system_schema.keyspaces;

      输出应如下所示,其中 dc-1 是动态 DC:

      select * from system_schema.keyspaces;
      
       keyspace_name            | durable_writes | replication
      --------------------------+----------------+--------------------------------------------------------------------------------
         kvm_myhybridorg_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
                    system_auth |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
                  system_schema |           True |                        {'class': 'org.apache.cassandra.locator.LocalStrategy'}
       quota_myhybridorg_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
       cache_myhybridorg_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
         rtc_myhybridorg_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
             system_distributed |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
                         system |           True |                        {'class': 'org.apache.cassandra.locator.LocalStrategy'}
                         perses |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
                  system_traces |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
         kms_myhybridorg_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
      
      (11 rows)
      
    4. 如果由于某种原因,user-setup 作业仍然出错并且验证失败,请使用以下命令更正键空间中的复制。
      kubectl exec -it -n APIGEE_NAMESPACE cassandra-client -- /bin/bash

      使用 ddl user 连接到 Cassandra 服务器,因为它具有运行以下命令所需的权限:

      cqlsh apigee-cassandra-default.apigee.svc.cluster.local -u DDL_USER -p DDL_PASSWORD --ssl

      获取键空间:

      select * from system_schema.keyspaces;

      使用上述命令中的键空间名称,并在以下示例中替换这些名称

      alter keyspace quota_myhybridorg_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'LIVE_DC_NAME':'3'};
      alter keyspace kms_myhybridorg_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'LIVE_DC_NAME':'3'};
      alter keyspace kvm_myhybridorg_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'LIVE_DC_NAME':'3'};
      alter keyspace cache_myhybridorg_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'LIVE_DC_NAME':'3'};
      alter keyspace perses_myhybridorg_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'LIVE_DC_NAME':'3'};
      alter keyspace rtc_myhybridorg_hybrid WITH replication = {'class': 'NetworkTopologyStrategy', 'LIVE_DC_NAME':'3'};
      alter keyspace system_auth WITH replication = {'class': 'NetworkTopologyStrategy', 'LIVE_DC_NAME':'3'};
      alter keyspace system_distributed WITH replication = {'class': 'NetworkTopologyStrategy', 'LIVE_DC_NAME':'3'};
      alter keyspace system_traces WITH replication = {'class': 'NetworkTopologyStrategy', 'LIVE_DC_NAME':'3'};

    5. 使用以下 cqlsh 命令验证所有键空间是否在正确的区域中进行复制:
      select * from system_schema.keyspaces;

      例如:

      select * from system_schema.keyspaces;
      
       keyspace_name           | durable_writes | replication
      -------------------------+----------------+--------------------------------------------------------------------------------
      kvm_myhybridorg_hybrid   |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
                system_auth    |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
              system_schema    |           True |                        {'class': 'org.apache.cassandra.locator.LocalStrategy'}
      quota_myhybridorg_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
      cache_myhybridorg_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
      rtc_myhybridorg_hybrid   |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
         system_distributed    |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
                     system    |           True |                        {'class': 'org.apache.cassandra.locator.LocalStrategy'}
                     perses    |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
              system_traces    |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
      kms_myhybridorg_hybrid   |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'dc-1': '3'}
      
      (11 rows)

在此阶段,您已从 Cassandra 集群中完全移除对失效 DC 的所有引用。

附录:从 Cassandra 集群中移除已关闭节点

在回滚多区域安装并且并非所有 Cassandra Pod 都处于启动/正常 (UN) 状态时,请使用此过程。

  1. 对其中一个 Cassandra Pod 执行 exec:
    kubectl exec -it -n CASSANDRA_POD_NAME -- /bin/bash
  2. 验证 Cassandra 集群的状态:
    nodetool -u JMX_USER -pw JMX_PASSWORD status
  3. 验证节点是否确实已关闭 (DN)。对 Cassandra Pod 无法启动的区域中的 Cassandra Pod 执行 exec。
    Datacenter: dc-1
    ================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address      Load        Tokens  Owns (effective)  Host ID                               Rack
    UN  10.48.12.16  1.15 MiB    256     100.0%            a6340ad9-37ba-4ec8-a8c2-f7b7ac931807  ra-1
    UN  10.48.0.18   1.21 MiB    256     100.0%            0d57df49-52e4-4c01-832d-d9df845ab732  ra-1
    UN  10.48.14.16  1.18 MiB    256     100.0%            39f03c51-e387-4dac-8360-6d8732e690a7  ra-1
    
    Datacenter: us-west1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address      Load        Tokens  Owns (effective)  Host ID                               Rack
    DN  10.8.4.4     432.42 KiB  256     100.0%            cd672398-5c45-4c88-a424-86d757951e53  rc-1
    UN  10.8.19.6    5.8 MiB     256     100.0%            84f771f3-3632-4155-b27f-a67125d73bc5  rc-1
    UN  10.8.21.5    5.74 MiB    256     100.0%            f6f21b70-348d-482d-89fa-14b7147a5042  rc-1
    
  4. 移除对已关闭 (DN) 节点的引用。在上面的示例中,我们将移除对主机 10.8.4.4 的引用
    kubectl exec -it -n apigee apigee-cassandra-default-2 -- /bin/bash
     nodetool -u JMX_USER -pw JMX_PASSWORD removenode HOST_ID
    
  5. 移除引用后,终止 Pod。新的 Cassandra Pod 应启动并加入集群
    kubectl delete pod -n POD_NAME
  6. 验证新的 Cassandra Pod 是否已加入集群。
    Datacenter: dc-1
    ================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address      Load        Tokens  Owns (effective)  Host ID                               Rack
    UN  10.48.12.16  1.16 MiB    256     100.0%            a6340ad9-37ba-4ec8-a8c2-f7b7ac931807  ra-1
    UN  10.48.0.18   1.22 MiB    256     100.0%            0d57df49-52e4-4c01-832d-d9df845ab732  ra-1
    UN  10.48.14.16  1.19 MiB    256     100.0%            39f03c51-e387-4dac-8360-6d8732e690a7  ra-1
    
    Datacenter: us-west1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address      Load        Tokens  Owns (effective)  Host ID                               Rack
    UN  10.8.19.6    5.77 MiB    256     100.0%            84f771f3-3632-4155-b27f-a67125d73bc5  rc-1
    UN  10.8.4.5     246.99 KiB  256     100.0%            0182e675-eec8-4d68-a465-69211b621601  rc-1
    UN  10.8.21.5    5.69 MiB    256     100.0%            f6f21b70-348d-482d-89fa-14b7147a5042  rc-1

此时,您可以继续升级或回滚集群其余区域。

附录:问题排查:apigee-datastore 在回滚后处于卡滞状态

升级后将 apigee-datastore 回滚到 Hybrid 1.11,而它处于卡滞状态时,请使用此过程。

  1. 再次更正数据存储区控制器状态之前,请验证它是否处于 releasing 状态以及 Pod 是否未随 Cassandra 集群状态一起启动。
    1. 使用 Helm 命令验证数据存储区是否已回滚:
      helm -n APIGEE_NAMESPACE list

      例如:

      helm -n apigee list
      NAME              NAMESPACE  REVISION  UPDATED                                   STATUS    CHART                              APP VERSION
      datastore         apigee     3         2024-04-04 22:15:08.792539892 +0000 UTC   deployed   apigee-datastore-1.11.0           1.11.0
      ingress-manager   apigee     1         2024-04-02 22:24:27.564184968 +0000 UTC   deployed   apigee-ingress-manager-1.12.0     1.12.0
      redis             apigee     1         2024-04-02 22:23:59.938637491 +0000 UTC   deployed   apigee-redis-1.12.0               1.12.0
      telemetry         apigee     1         2024-04-02 22:23:39.458134303 +0000 UTC   deployed   apigee-telemetry-1.12             1.12.0
      myhybridorg       apigee     1         2024-04-02 23:36:32.614927914 +0000 UTC   deployed   apigee-org-1.12.0                 1.12.0
      
    2. 获取 Cassandra Pod 的状态:
      kubectl get pods -n APIGEE_NAMESPACE

      例如:

      kubectl get pods -n apigee
      NAME                         READY   STATUS             RESTARTS      AGE
      apigee-cassandra-default-0   1/1     Running            0             2h
      apigee-cassandra-default-1   1/1     Running            0             2h
      apigee-cassandra-default-2   0/1     CrashLoopBackOff   4 (13s ago)   2m13s
      
    3. 验证 apigeeds 控制器是否卡滞在正在发布状态:
      kubectl get apigeeds -n APIGEE_NAMESPACE

      例如:

      kubectl get apigeeds -n apigee
      NAME      STATE       AGE
      default   releasing   46h
    4. 验证 Cassandra 节点状态(注意一个节点处于 DN 状态,而这是卡滞在 CrashLoopBackOff 状态的节点):
      kubectl exec apigee-cassandra-default-0 -n APIGEE_NAMESPACE  -- nodetool -u JMX_USER -pw JMX_PASSWORD status

      例如:

      kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u jmxuser -pw JMX_PASSWORD status
      Defaulted container "apigee-cassandra" out of: apigee-cassandra, apigee-cassandra-ulimit-init (init)
      Datacenter: us-west1
      ====================
      Status=Up/Down
      |/ State=Normal/Leaving/Joining/Moving
      --   Address       Load       Tokens   Owns (effective)   Host ID                               Rack
      UN   10.68.7.28    2.12 MiB   256      100.0%             4de9df37-3997-43e7-8b5b-632d1feb14d3  rc-1
      UN   10.68.10.29   2.14 MiB   256      100.0%             a54e673b-ec63-4c08-af32-ea6c00194452  rc-1
      DN   10.68.6.26    5.77 MiB   256      100.0%             0fe8c2f4-40bf-4ba8-887b-9462159cac45   rc-1
      
  2. 使用 1.12 图表升级数据存储区。
    helm upgrade datastore APIGEE_HELM_1.12.0_HOME/apigee-datastore/   --install   --namespace APIGEE_NAMESPACE   -f overrides.yaml
  3. 验证所有 Pod 是否都是 Running,并且 Cassandra 集群再次健康状况良好。
    1. 再次验证所有 Pod 是否都是 READY
      kubectl get pods -n APIGEE_NAMESPACE

      例如:

      kubectl get pods -n apigee
      NAME                         READY   STATUS    RESTARTS   AGE
      apigee-cassandra-default-0   1/1     Running   0          29h
      apigee-cassandra-default-1   1/1     Running   0          29h
      apigee-cassandra-default-2   1/1     Running   0          60m
    2. 验证 Cassandra 集群状态:
      kubectl exec apigee-cassandra-default-0 -n APIGEE_NAMESPACE  -- nodetool -u JMX_USER -pw JMX_PASSWORD status

      例如:

      kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u jmxuser -pw JMX_PASSWORD status
      Datacenter: us-west1
      ====================
      Status=Up/Down
      |/ State=Normal/Leaving/Joining/Moving
      --   Address       Load      Tokens   Owns (effective)   Host ID                                Rack
      UN   10.68.4.15    2.05 MiB  256      100.0%             0fe8c2f4-40bf-4ba8-887b-9462159cac45   rc-1
      UN   10.68.7.28    3.84 MiB  256      100.0%             4de9df37-3997-43e7-8b5b-632d1feb14d3   rc-1
      UN   10.68.10.29   3.91 MiB  256      100.0%             a54e673b-ec63-4c08-af32-ea6c00194452   rc-1
        
    3. 验证 apigeeds 控制器的状态:
      kubectl get apigeeds -n APIGEE_NAMESPACE

      例如:

      kubectl get apigeeds -n apigee
      NAME      STATE     AGE
      default   running   2d1h

此时,您已修复数据存储区,它应处于 running 状态。