新的 Apigee Hybrid 安装和管理(预览版)


预览版用户指南
Apigee Hybrid v1.8 的新安装和管理程序预览版。


文档内容:

预览版


本文档适用于 Apigee 操作人员角色(安装/管理/控制 Apigee Hybrid 安装的用户)。拥有在一个受支持的 Kubernetes 平台上安装 Apigee Hybrid 的经验是您按照本文档中的说明操作的前提条件。建议您创建一个评估 Apigee 组织,以尝试以下步骤。

反馈

请将此过程的相关反馈发送至 Apigee-hybrid-install-preview@google.com


概览

全新的 Apigee Hybrid 安装体验使用 kubectl 安装 Apigee 组件,并将 Apigee Hybrid 的安装和管理与 Kustomize 等 Kubernetes 配置编排工具相集成。增强所安装的组件的验证和可见性可以提供更好的可调试性,并改善整体安装过程。

安装脚本 apigee-hybrid-setup.sh 提供了一种简单的基本工具。您可以使用该工具创建 Hybrid 安装,然后根据您的需求使用 kubectl 对其进行修改,或者使用 kubectl 从头开始创建 Hybrid 安装。所有 Apigee Hybrid 配置属性都存储在 yaml 文件中,每个主要组件对应一个。这样可以对 Kubernetes 环境中的 Hybrid 安装进行更精细的控制。您可以在 GitHub 代码库中找到配置文件和安装脚本。

新安装过程的更改

Apigee 更改了 Apigee Hybrid 的安装过程,原因如下:

  • 安装 Apigee Hybrid 的新方法可以与不使用 overrides.yaml 配置文件的现有 Kubernetes CI/CD 工具(例如 Argo、Flux 或 Anthos Config Management)集成。
  • Apigee Hybrid 提供了 apigeectl,这是一个自定义模板工具,可生成 Kubernetes 清单(以及其他内容),以在 Kubernetes 集群中安装和管理 Apigee Hybrid。新的安装和管理流程提供与其他软件供应商类似的体验。
  • 新过程会自动创建具有必要权限的服务账号、TLS 证书,预填充默认值及其他必要的基础元素,从而快速完成基本安装。

前提条件

在使用此预览版安装之前,您必须满足以下前提条件:

预览版

此预览版适用于 Apigee Hybrid 1.8.x 版。不支持更高版本的 Apigee Hybrid。

Apigee Hybrid 设置

在继续 Apigee Hybrid 的实际安装之前,您需要已完成文档的以下部分中列出的说明:

  1. 项目和组织设置
  2. Hybrid 运行时设置

工具

此外,您需要在工作站上下载和配置以下工具:

  • curl
  • 运行 apigee-hybrid-setup.sh 脚本需要 docker。按照获取 Docker 中的说明安装 Docker。
  • envsubst 应该适用于大多数基于 Linux/UNIX 的系统。对于 MacOS 和其他系统,请按照此代码库中的说明操作
  • 应安装 jq下载 jq
  • kpt 下载 kpt

  • kubectl 1.23 版或更高版本。请参阅 kubernetes 文档中的安装工具:kubectl

本指南中常用的变量

本指南在多个步骤中使用以下环境变量。您可以在命令行或脚本中定义它们,也可以在输入命令时替换命令中的文本。

  • APIGEE_NAMESPACE:Apigee 命名空间。默认情况下为 apigee。不过,您可以使用其他命名空间。
  • CLUSTER_NAME:要在其中安装 Apigee Hybrid 的集群的名称。这是您在第 1 步:创建集群中创建的集群
  • CLUSTER_LOCATION:集群所在的区域。 本指南中的流程假定您使用区域级集群。如果您使用的是可用区级集群,请参阅第 1 步:创建集群中的说明
  • ENV_GROUP:您的 Apigee Hybrid 安装的环境组的名称。这是您在第 3 步:创建环境组中创建的环境组。您可以创建多个环境组。
  • ENV_NAME:您的 Apigee Hybrid 安装的环境组的名称。这是您在第 3 步:创建环境组中创建的环境组。您可以创建多个环境组。
  • INSTALL_DIR:Apigee Hybrid 的安装目录。默认情况下,这是安装程序的下载目录的 apigee-hybrid-install/ 子目录,例如 /myhybrid/apigee-hybrid-install/。这是 Apigee Hybrid 设置文件夹结构中记录的文件结构的根目录。
  • INSTANCE_DIR:特定 Apigee Hybrid 实例的目录。默认情况下,第一个实例名为 instance-1。实例目录是 ${INSTALL_DIR}/overlays/instances/ 的子目录。您可以为 Hybrid 实例指定任何名称。请参阅多实例安装
  • ORG_NAME:您的 Apigee Hybrid 组织的名称。此 ID 必须与您的 Google Cloud 项目 ID 相同。请参阅第 2 步:创建组织

基本 Apigee Hybrid 安装

如需快速安装 Apigee Hybrid 而不进行大量自定义,您可以按照以下两步流程操作。


  • 单个环境
  • 单个环境组
  • 系统会创建一个 Google Cloud 服务账号并将其用于各个组件
  • 所有加密密钥和密码的默认值。

  1. 下载设置文件
  2. 运行设置

下载设置文件

通过在 https://github.com/apigee/apigee-hybrid-install/releases/tag/preview-1 克隆 GitHub 代码库来下载并准备设置文件:

  1. 克隆代码库:

    git clone https://github.com/apigee/apigee-hybrid-install.git
    
  2. 进入克隆的代码库的目录:

    cd apigee-hybrid-install
    
  3. 从 preview-1 标记创建一个分支:

    git branch preview-1 preview-1
    git checkout preview-1
    
  4. 将设置脚本设为可执行:

    chmod +x ./tools/apigee-hybrid-setup.sh
    

    克隆的代码库的结构类似于 Apigee Hybrid 设置文件夹结构中所述的结构:

运行设置

运行位于 tools/ 文件夹内的 apigee-hybrid-setup.sh shell 脚本。

./tools/apigee-hybrid-setup.sh --cluster-name $CLUSTER_NAME --cluster-region $CLUSTER_LOCATION --org $ORG_NAME --setup-all

如果您遇到错误,请尝试再次运行该脚本。


您可能需要使用的其他选项包括:

  • --env $ENV_NAME 指定 Apigee 环境的名称。
  • --envgroup $ENV_GROUP 指定环境组。
  • --ingress-domain $HOSTNAME 指定为您的环境组提供的主机名。
  • --gcp-project-id $PROJECT_ID 指定您的 Google Cloud 项目的 ID。

如需查看更多选项,请参阅了解脚本

执行期间发生的任何错误都将显示在标准输出中。

脚本成功完成后,您将完成基本的 Hybrid 安装。您可以通过创建示例代理来测试安装,详情请参阅创建和部署新的 API 代理

已自定义 Apigee Hybrid 安装

对于希望精细控制安装的更高级用户,您可以按照以下步骤顺序操作(对于下面提供的许多步骤,您可以选择手动执行步骤,也可以使用 shell 脚本自动执行单个步骤):



下载设置文件

下载并准备设置文件:

  1. https://github.com/apigee/apigee-hybrid-install/ 克隆 GitHub 代码库

    克隆的代码库的结构类似于 Apigee Hybrid 设置文件夹结构中所述的结构:

  2. 使用 cd 命令进入 apigee-hybrid-install/ 目录

  3. 将设置脚本设为可执行:

    chmod +x ./tools/apigee-hybrid-setup.sh
    

创建命名空间

在集群中创建 kubernetes 命名空间,其中包含所有 Apigee 集群组件。

kubectl create namespace apigee


如果您为命名空间选择其他名称,则可以按照以下三种方法之一操作:

  • (推荐)在修改资源 yaml 中预填充值时使用 --namespace={YOUR_NAMESPACE_NAME}
  • 运行以下两个命令:

    1. 使用 kpt 指定 Apigee 命名空间:

      kpt fn eval "${INSTALL_DIR}/overlays/" \
        --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \
        APIGEE_NAMESPACE="${APIGEE_NAMESPACE}"
      # This is for replacing the namespace in istio discoveryAddress which cannot be
      # achieved with kpt
      
    2. 使用 sed 替换 istio discoveryAddress 中的命名空间:

      sed -i -E -e "s/(discoveryAddress: apigee-ingressgateway-manager\.).*(\.svc:15012)/\1${APIGEE_NAMESPACE}\2/" "${INSTALL_DIR}/overlays/controllers/istiod/apigee-istio-mesh-config.yaml"
      
  • 作为替代方法,您可以手动逐个更改要在所选命名空间中创建的资源。

使用私有代码库中的 docker 映像(可选)

您可以选择不使用公开托管的映像,并且可以使用您自己的私有代码库中的映像:

  1. 第一步是将所有映像推送到您的私有代码库,您可以按照 apigee-pull-push | Apigee X 中的步骤完成此操作。默认情况下,映像使用其对应的 Apigee Hybrid 版本进行标记,建议您不要修改这些标记。我们还建议您不要修改映像名称,以便按照 Image Hub 中的说明构建最终映像路径。
  2. 将文件 apigee-hybrid-config.yaml 中存在的 imageHub 字段的值设置为私有代码库主机路径。(如需了解详情,请参阅 Image Hub。)

    imageHub: "your.private.repo/apigee/hybrid"
    

这会确保所有 Apigee Hybrid 组件都使用私有仓库中的映像。

除此之外,您可能还需要将私有映像用于控制器和 Apigee 入站流量网关,因此,您必须修改 apigee-controller-deployment.yamlapigee-ingressgateway-manager-deployment.yaml 文件,并将所有 image 字段替换为其私有代码库中的映像。



配置 imagePullSecret(可选)

  1. 创建一个 kubernetes Secret,其中包含用于向私有代码库进行身份验证的凭据。请参阅从私有注册表中拉取映像,了解如何创建该 Secret。
  2. 创建 Secret 后,您只需引用该 Secret(可通过修改文件 apigee-hybrid-config.yaml 并将 imagePullSecret 字段的值设置为前面创建的 Secret 的名称来完成此操作),并在相应的 kustomization.yaml 文件中启用 imagePullSecret 组件。

如果您在这两个位置都指定了 imagePullSecrets,则 apigee-controller-manager.yaml 文件中存在的优先。


配置转发代理(可选)

您可以通过将 forwardProxy 字段添加到 apigee-hybrid-config.yaml 文件中来配置转发代理。例如:

  forwardProxy: |
    scheme: HTTP
    host: 10.12.0.47
    port: 3128

指定入站流量 TLS 证书

使用脚本

./tools/apigee-hybrid-setup.sh --create-ingress-tls-certs

如需详细了解此标志,请参阅了解脚本

手动

您需要提供用于 Istio 入站流量网关的 TLS 证书。您可以:

在此处,我们以自签名证书为例。可通过以下方式生成自签名证书(假设 DOMAIN 已正确设置,并且应与 envgroup 中设置的主机名匹配):

openssl req -nodes -new -x509 -keyout ./tls.key -out ./tls.crt -subj '/CN='$DOMAIN'' -days 3650

这将创建名为 tls.keytls.crt 的两个文件。

然后,您需要创建采用以下格式的 Secret;您可以按照使用证书签名授权机构的自定义证书/密钥对(可选)中所述,使用 kubectl createkubectl apply

apiVersion: v1
kind: Secret
metadata:
  name: "{ORG_NAME}-{ENV_GROUP_NAME}"
  namespace: {$APIGEE_NAMESPACE}
type: Opaque
data:
  cert: |
    {BASE64_ENCODED_TLS_CRT}
  key: |
    {BASE64_ENCODED_TLS_KEY}

---

使用 kubectl create 创建 Secret 的示例如下:

kubectl create secret tls {ORG_NAME}-{ENV_GROUP_NAME} \
  --cert="tls.crt" \
  --key="tls.key" \
  -n {$APIGEE_NAMESPACE}


更新入站流量部署

如需创建/修改入站流量部署,您需要修改 bases/initialization/crds/customresourcedefinition-apigeeorganizations.apigee.cloud.google.com.yaml 中 ApigeeOrganization 自定义资源的 spec.components.ingressGateways 字段。

默认情况下,我们会使用默认参数(默认值显示在 CR 参考文档中)创建一个入站流量部署:

ingressGateways:
- name: "prod-1"

示例:

A. 替换入站流量服务字段

ingressGateways:
- name: "prod-1"
  serviceSpec:
    annotations:
      {KEY}: ${VALUE}
    loadBalancerIP: ${IP}

B. 更改最小/最大副本数

ingressGateways:
- name: "prod-1"
  ​​autoScaler:
    minReplicas: 4
    maxReplicas: 10

C. 添加新的入站流量部署

ingressGateways:
- name: "prod-1"
- name: "prod-2"

配置自定义 Google Cloud 服务账号



使用脚本

./tools/apigee-hybrid-setup.sh --create-gcp-sa-and-secrets  --namespace APIGEE_NAMESPACE

其中,APIGEE_NAMESPACE 是您的自定义命名空间。默认命名空间为 apigee

如需详细了解这些标志,请参阅了解脚本

手动

Google Cloud 服务账号密钥需要作为 Secret 存储在集群中。Secret yaml 应具有以下结构:

apiVersion: v1
kind: Secret
metadata:
  name: "{NAME}"
  namespace: {APIGEE_NAMESPACE}
type: Opaque
data:
  client_secret.json: |
    {BASE64_ENCODED_SA_KEY}

如需详细了解所需的所有服务账号和 Secret 的名称,请参阅 Google Cloud 服务账号部分。

您可以随意为 Secret 选择其他名称,但必须在使用该 Secret 名称的组件中进行相应的更改。例如,如果您决定将运行时服务账号 Secret 的名称从 apigee-runtime-svc-account-${ORG_NAME}-${ENV_NAME} 更改为 my-runtime-svc,则必须在该环境的 apigee-environment.yaml 中进行相应的更改



使用工作负载身份


您必须配置自定义 Google Cloud 服务账号或使用工作负载身份。


前提条件

在使用工作负载身份之前,请确保您的 GKE 集群已启用支持。如需了解详情,请参阅更新节点池 | Apigee X

启用 workload-identity

如需详细了解如何在安装之前启用工作负载身份,请参阅 Kustomize 和组件下的工作负载身份部分。

修改资源 yaml

组件 yaml 中的某些位置要求提供正确的组织、环境和环境组名称。您可以手动设置这些值,也可以使用 shell 脚本自动填充这些值。

使用脚本

./tools/apigee-hybrid-setup.sh --fill-values

创建初始化资源和控制器

#Additional steps for openshift
kubectl apply -k ${INSTALL_DIR}/overlays/initialization/openshift
//apigee datastore
kubectl apply -f ${INSTANCE_DIR}/overlays/instances/${INSTANCE_DIR}/datastore/components/openshift-scc/scc.yaml
//telemetry
kubectl apply -f ${INSTANCE_DIR}/overlays/instances/${INSTANCE_DIR}/telemetry/components/openshift-scc/scc.yaml

#Create Apigee initialization kubernetes resources
kubectl apply -f ${INSTALL_DIR}/overlays/initialization/namespace.yaml
kubectl apply -k ${INSTALL_DIR}/overlays/initialization/certificates
kubectl apply --server-side --force-conflicts -k ${INSTALL_DIR}/overlays/initialization/crds
kubectl apply -k ${INSTALL_DIR}/overlays/initialization/webhooks
kubectl apply -k ${INSTALL_DIR}/overlays/initialization/rbac
kubectl apply -k ${INSTALL_DIR}/overlays/initialization/ingress

# Create controller config and controller
kubectl apply -k ${INSTALL_DIR}/overlays/controllers

# Wait for the controllers to be available
kubectl wait deployment/apigee-controller-manager deployment/apigee-ingressgateway-manager -n "${APIGEE_NAMESPACE}" --for=condition=available --timeout=2m

# Create the datastore and redis secrets first and then the rest of the secrets.
kubectl apply -f ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/datastore/secrets.yaml
kubectl apply -f ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/redis/secrets.yaml
kubectl apply -f ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/environments/${ENV_NAME}/secrets.yaml
kubectl apply -f ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/organization/secrets.yaml

为 Synchronizer 服务账号授予与控制平面交互的权限

按照第 8 步:启用 Synchronizer 访问权限中的步骤操作,并将服务账号的名称 apigee-non-prodapigee-synchronizer 替换为由新安装过程创建的服务账号的名称 apigee-all-sa


★ 重要提示:请务必按照启用同步器访问权限下的说明更改服务账号名称。否则,为同步器启用访问权限将失败。


创建 Apigee 数据平面组件

如果您在前面的步骤中更改了任何资源的名称,则需要在引用该资源的其他 YAML 文件中进行相应的更改。完成此操作后,请使用以下示例中的命令:

# Create the rest of the resources.
kubectl apply -k ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}

以安装所有组件。

等待资源启动

kubectl wait "apigeedatastore/default" \
"apigeeredis/default" \
"apigeeenvironment/${ORG_NAME}-${ENV_NAME}" \
"apigeeorganization/${ORG_NAME}" \
"apigeetelemetry/apigee-telemetry" \
-n "${APIGEE_NAMESPACE}" --for="jsonpath=.status.state=running" --timeout=15m

在自定义命名空间中自定义 cert-manager 的安装

按照以下流程自定义 cert-manager 在其中运行的命名空间。

如果 cert-manager 安装在集群的非 cert-manager 命名空间中,您需要更新用于创建 Apigee 根证书的命名空间。

  1. 修改用于创建证书的 customization.yaml 文件:$INSTALL_DIR/overlays/initialization/certificates/kustomize.yaml
  2. 将以下内容添加到该文件的末尾:

    - patch: |-
    - op: replace
      path: /metadata/namespace
      value: "gk-cert-manager"
    target:
    group: cert-manager.io
    version: v1
    kind: Certificate
    name: apigee-root-certificate
    
  3. 保存文件。

Kustomize 和组件

概览

新的 Hybrid 安装沿用了 Kustomize 概念,以基础叠加层的形式构建 yaml

  • 基础是 Apigee 提供的文件,各个新 Hybrid 版本之间可能会发生变化。您不应修改这些文件。这些文件包含 Apigee 提供的一些默认值。顶级 bases/ 文件夹的所有文件都包含这些基础
  • 叠加层包含用户配置,并用作您修改基础中指定的默认值的方式。顶级 overlays/ 文件夹下的所有文件都包含这些叠加层



如何使用组件

顶级 overlays/ 目录中的子文件夹的结构使您可以通过备注(或取消备注)kustomization.yaml 文件中的某些行来启用(或停用)特定附加功能。

例如,overlays/instances/{INSTANCE_NAME}/telemetry 文件夹结构如下所示:

telemetry
├── components
   ├── http-proxy
   ├── imagepullsecret
   ├── logger
   ├── metrics
   ├── nodeselector
   ├── openshift-scc
   ├── workload-identity-logger
   └── workload-identity-metrics
├── apigee-telemetry.yaml
└── kustomization.yaml

telemetry/kustomization.yaml 文件默认情况下可能如下所示:

resources:
- apigee-telemetry.yaml

components:
- ./components/metrics
# - ./components/workload-identity-metrics
# - ./components/logger
# - ./components/workload-identity-logger
# - ./components/http-proxy
# - ./components/nodeselector/
# - ./components/imagepullsecret
# - ./components/openshift-scc

我们可以看到 ./components/logger 已被注释掉,这仅表示默认未启用 Google Cloud 日志记录器。如需启用该日志记录器,您只需取消备注该行,如下所示:

components:

- ./components/logger

同样,如需停用指标,您可以注释掉 ./components/metrics 行:

...
components:
...
# - ./components/metrics
…

以下部分将讨论所有此类组件、何时使用以及如何配置。

OpenShift

对于希望在 OpenShift 集群中安装 Apigee Hybrid 的用户,您可能需要先启用一些组件/资源,然后再执行安装。(如果您不使用脚本来执行安装,则必须执行此操作)。需要修改的文件包括:

  • overlays/initialization/openshift/kustomization.yaml。在 resources: 部分下,取消备注以下行:

    # - ../../../bases/initialization/openshift/
    
  • overlays/instances/{INSTANCE_NAME}/datastore/kustomization.yaml。取消备注以下行:

    # - ./components/openshift-scc
    

    如果“components:”字段仍被注释掉,则取消备注该字段。

  • overlays/instances/{INSTANCE_NAME}/telemetry/kustomization.yaml。取消备注以下行:

    # - ./components/openshift-scc
    

    如果“components:”字段仍被注释掉,则取消备注该字段。

然后,您可以继续执行安装步骤。

imagepullsecret

在您将映像存储在私有代码库中后,可以启用此组件。如需从私有代码库中拉取映像,您可以创建一个 kubernetes Secret(其中包含您的身份验证详细信息),然后在其中引用此 Secret。如需查看相关说明,请参阅配置 imagePullSecret(可选)。如需了解详情,请参阅 Kubernetes 文档中的从私有注册表中拉取映像 | Kubernetes

语言版本:

  • overlays/controllers/apigee-controller
  • overlays/controllers/istiod
  • overlays/instances/{INSTANCE_NAME}/datastore
  • overlays/instances/{INSTANCE_NAME}/environments/{ENV_NAME}
  • overlays/instances/{INSTANCE_NAME}/organization
  • overlays/instances/{INSTANCE_NAME}/redis
  • overlays/instances/{INSTANCE_NAME}/telemetry

启用:

根据需要取消备注相应 kustomization.yaml 文件中的“./components/imagepullsecret/”行。

要进行的修改:

  • components/imagepullsecret/patch.yaml
    • (必需)将相关的 Secret 名称添加到 spec.template.spec.imagePullSecrets 中的列表

用法:

  1. 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
  2. 如果您已安装 Apigee Hybrid,则需要使用以下命令应用这些新更改:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

nodeselector

此组件可让您在特定节点上为 Apigee 资源调度 pod。如需了解详情,请参阅将 Pod 分配给节点 | Kubernetes

语言版本:

  • overlays/controllers/apigee-controller
  • overlays/controllers/istiod
  • overlays/instances/{INSTANCE_NAME}/datastore
  • overlays/instances/{INSTANCE_NAME}/environments/{ENV_NAME}
  • overlays/instances/{INSTANCE_NAME}/organization
  • overlays/instances/{INSTANCE_NAME}/redis
  • overlays/instances/{INSTANCE_NAME}/telemetry

启用:

根据需要取消备注相应 kustomization.yaml 文件中的“./components/nodeselector”行。

要进行的修改:

  • components/nodeselector/patch.yaml
    • (可选)将节点选择器标签的值从 apigee-runtimeapigee-data 更改为所需的值。

用法:

  1. 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
  2. 如果您已安装 Apigee Hybrid,则需要使用以下命令应用这些新更改:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

workload-identity

Apigee Hybrid 生态系统中的各种容器都需要对 Apigee 控制平面/管理平面进行特定 API 调用的权限。工作负载身份是向 pod(以及其中的容器)授予这些权限之一。详细了解此组件的有用资源包括:- Workload Identity 简介:更好地对 GKE 应用进行身份验证 | Google Cloud 博客 - 使用 Workload Identity | Kubernetes Engine 文档 | Google Cloud

语言版本:

  • overlays/instances/{INSTANCE_NAME}/datastore
  • overlays/instances/{INSTANCE_NAME}/environments/{ENV_NAME}
  • overlays/instances/{INSTANCE_NAME}/organization
  • overlays/instances/{INSTANCE_NAME}/redis
  • overlays/instances/{INSTANCE_NAME}/telemetry

前提条件:

您需要使用以下命令在 Google Cloud 项目中授予相关权限,才能利用工作负载身份:

    gcloud iam service-accounts add-iam-policy-binding \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:${ORG_NAME}.svc.id.goog[${APIGEE_NAMESPACE}/${KSA_NAME}]" \
        ${GSA_NAME}@${ORG_NAME}.iam.gserviceaccount.com

其中:- ${ORG_NAME} - 您的 Apigee 组织的名称。- ${APIGEE_NAMESPACE} - 在其中安装了 Apigee 组件的 kubernetes 命名空间。除非安装期间用户明确更改,否则通常为 apigee - ${KSA_NAME} - kubernetes 命名空间的名称。您需要为 Kubernetes 服务账号中提到的每个 kubernetes 服务账号运行此命令 - ${GSA_NAME} - Google Cloud 服务账号的名称。如果您在安装期间未进行任何更改,则其值为 apigee-all-sa。如果您为单个组件设置多个 Google Cloud 服务账号,则需要将 KSA_NAME 与相应的 GSA_NAME 匹配。您可以将 Google Cloud 服务账号中的表与 Kubernetes 服务账号进行比较,以找到等效项。

启用:

根据需要取消备注相应 kustomization.yaml 文件中的 ./components/workload-identity 行。请注意,在遥测中,我们为 metricslogger 组件使用不同的工作负载身份插件,这些组件可单独启用。

用法:

  1. 如果您尚未安装 Hybrid,则只需按照上一部分中所述启用 workload-identity,然后继续安装,安装随后会自动使用 workload-identity。
  2. 如果您已安装 Apigee Hybrid,则需要使用以下命令应用这些新更改:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

http-proxy

您可以在以下每个组件中配置代理服务器,使相应组件的流量通过为该组件配置的 HTTP 代理。您可以为每个 Apigee 组件单独配置此代理。

语言版本:

  • overlays/instances/{INSTANCE_NAME}/datastore
  • overlays/instances/{INSTANCE_NAME}/environments/{ENV_NAME}
  • overlays/instances/{INSTANCE_NAME}/organization
  • overlays/instances/{INSTANCE_NAME}/telemetry

启用:

根据需要取消备注相应 kustomization.yaml 文件中的“./components/http-proxy/”行。

要进行的修改:

  • components/http-proxy/patch.yaml 可以在 spec.httpForwardProxy 下配置以下参数
    • scheme(必需)HTTPHTTPS 之一
    • host(必需)代理的主机地址
    • port(必需)端口号
    • username(可选)与代理关联的用户名
    • password(可选)用于访问代理的密码

用法:

  1. 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
  2. 如果您已安装 Apigee Hybrid,则需要使用以下命令应用这些新更改:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

logger 和 metrics

您可以在 overlays/instances/{INSTANCE_NAME}/telemetry 中单独启用或停用 logger 或 metrics。默认情况下,logger 处于停用状态,metrics 处于启用状态。启用或停用它们只是在 telemetry/kustomization.yaml 中取消备注或备注其对应行。

gcs-backup 和 gcs-restore

此 kustomize 组件可用于执行 cassandra 数据库到 Google Cloud Storage 的备份和恢复。

语言版本:

  • overlays/instances/{INSTANCE_NAME}/datastore

前提条件:

  1. 为具有 Storage Object Admin 角色的账号下载 Google Cloud 服务账号密钥。

    • 如果您使用脚本执行安装,并且未使用 workload-identities,则可以重复使用在脚本创建的 service-accounts 文件夹下获得的已下载的密钥。
    • 您还可以使用 create-service-account.sh 脚本来创建新的服务账号并下载其密钥:

      ./tools/create-service-accounts=.sh --env prod --profile apigeecassandra
      
  2. 下载密钥后,您需要创建一个名称为 apigee-cassandra-backup-and-restore-gcp-sa-key 的 kubernetes Secret,可使用以下命令完成此操作:

    kubectl create secret generic "apigee-cassandra-backup-and-restore-gcp-sa-key" \
              --from-file="dbbackup_key.json=${PATH_TO_SA_KEY}" \
              -n "${APIGEE_NAMESPACE}"
    

    其中:

    • ${PATH_TO_SA_KEY} - 包含服务账号密钥的文件的路径。
    • ${APIGEE_NAMESPACE} - 在其中安装了 Apigee 组件的 kubernetes 命名空间。除非安装期间明确更改,否则通常为 apigee

或者,您可以使用模板文件 templates/secret-apigee-cassandra-backup-and-restore-gcp-sa-key.yaml 来创建此 Secret。

启用:

  • 如果您要启用备份,请取消备注数据存储区 kustomization.yaml 文件中的“./components/gcs-backup”行。
  • 如果您要恢复备份,请取消备注数据存储区 kustomization.yaml 文件中的“./component/gcs-restore”行。

仅针对备份的修改

  • components/gcs-backup/apigee-datastore-patch.yaml
    • (必需)更改 DATABASE_STORAGE_BUCKET 环境变量的值,该值的格式为 gs://BUCKET_NAME,指向数据需要备份到的 Google Cloud Storage 存储桶。说明与此处所述的 dbStorageBucket 相符。
  • components/gcs-backup/cron-patch.yaml
    • (必需)更改 spec.schedule 以指定备份的频率。字段接受标准 Crontab 时间安排格式。说明与此处所述的时间表相符。
    • (必需)更改 DATABASE_STORAGE_BUCKET 环境变量的值,该值的格式为 gs://BUCKET_NAME,指向数据需要备份到的 Google Cloud Storage 存储桶。说明与此处所述的 dbStorageBucket 相符。
    • (可选)将 HTTP_PROXY_URL 的值更改为指向任何已配置的代理。格式可能如下所示:
      • http://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • https://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS>:${HOST_PORT}

执行备份

您可以使用以下命令执行备份:

kubectl apply -k overlays/instances/{INSTANCE_NAME}

如需应用更改并启用备份,请按照以下所述操作:

仅针对恢复的修改

  • components/gcs-restore/apigee-datastore-patch.yaml
    • (必需)更改 DATABASE_STORAGE_BUCKET 环境变量的值,该值的格式为 gs://BUCKET_NAME,指向数据需要备份到的 Google Cloud Storage 存储桶。说明与此处所述的 dbStorageBucket 相符。
  • components/gcs-restore/job-patch.yaml
    • (必需)更改 DATABASE_STORAGE_BUCKET 环境变量的值,该值的格式为 gs://BUCKET_NAME,指向数据需要备份到的 Google Cloud Storage 存储桶。
    • (必需)更改 BACKUP_SNAPSHOT_TIMESTAMP 环境变量的值。说明与此处所述的 restore:snapshotTimestamp 相符。
    • (可选)将 HTTP_PROXY_URL 的值更改为指向任何已配置的代理。格式可能如下所示:
      • http://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • https://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}

执行恢复:

如需了解有关恢复备份的背景信息,请参阅恢复备份 | Apigee X | Google Cloud

  1. 使用新命名空间创建新的 Kubernetes 集群以在其中恢复 Hybrid 运行时部署。您不能使用用于原始 Hybrid 安装的同一集群/命名空间。
  2. 将 Hybrid 安装到配置了上述设置以及您所需的任何其他设置的新集群中:

    • 您可以使用基本安装并在新命名空间中安装 Hybrid
    ./tools/apigee-hybrid-setup.sh \
    --cluster-name $CLUSTER_NAME \
    --cluster-region $CLUSTER_LOCATION \
    --namespace ${NEW_APIGEE_NAMESPACE}
    
  3. 恢复完成后,旧命名空间中的所有资源都可以删除并切换到新命名空间。

如需了解详情,请参阅恢复备份

non-gcs-backup 和 non-gcs-restore

此 kustomize 组件可用于执行 cassandra 数据库到 Google Cloud Storage 的备份和恢复。

语言版本:

  • overlays/instances/{INSTANCE_NAME}/datastore

前提条件:

  1. 可以使用有关设置服务器和 SSH 的现有文档中的步骤。
  2. 在以上步骤中,您需要使用 SSH 私钥,该私钥可在按照上述步骤生成的“ssh_key”文件中获得。然后,我们将创建一个名称为 apigee-cassandra-backup-and-restore-gcp-sa-key 的 kubernetes Secret,其中包含此 SSH 私钥。



    可使用以下命令创建 kubernetes Secret:

    kubectl create secret generic "apigee-cassandra-backup-and-restore-key-file" \
            --from-file="key=${PATH_TO_SSH_PRIVATE_KEY}" \
            -n "${APIGEE_NAMESPACE}"
    

    其中:

    • ${PATH_TO_SSH_PRIVATE_KEY} - 包含 SSH 私钥的文件的路径。
    • ${APIGEE_NAMESPACE} - 在其中安装了 Apigee 组件的 kubernetes 命名空间。除非安装期间明确更改,否则通常为 apigee

    或者,您可以使用模板文件 templates/secret-apigee-cassandra-backup-and-restore-key-file.yaml 来创建此 Secret。

启用:

  • 如果您要启用备份,请取消备注数据存储区 kustomization.yaml 文件中的“./components/non-gcs-backup”行。
  • 如果您要恢复备份,请取消备注数据存储区 kustomization.yaml 文件中的“./components/non-gcs-restore”行。

仅针对备份的修改

  • components/non-gcs-backup/apigee-datastore-patch.yaml
    • (必需)更改 BACKUP_SERVER_IP 的值。说明与此处所述的 BACKUP_SERVER_IP 相符。
    • (必需)更改 BACKUP_STORAGE_DIR 的值。说明与此处所述的 BACKUP_STORAGE_DIR 相符。
  • components/non-gcs-backup/cron-patch.yaml
    • (必需)更改 spec.schedule 以指定备份的频率。字段接受标准 Crontab 时间安排格式。说明与此处所述的时间表相符。
    • (必需)更改 BACKUP_SERVER_IP 的值。说明与此处所述的 BACKUP_SERVER_IP 相符。
    • (必需)更改 BACKUP_STORAGE_DIR 的值。说明与此处所述的 BACKUP_STORAGE_DIR 相符。
    • (可选)将 HTTP_PROXY_URL 的值更改为指向任何已配置的代理。格式可能如下所示:
      • http://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • https://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}

执行备份

您可以使用以下命令执行备份:

kubectl apply -k overlays/instances/{INSTANCE_NAME}

如需应用更改并启用备份,请按照以下所述操作:

仅针对备份的修改

  • components/non-gcs-restore/apigee-datastore-patch.yaml
    • (必需)更改 BACKUP_SERVER_IP 的值。说明与此处所述BACKUP_SERVER_IP 相符。
    • (必需)更改 BACKUP_STORAGE_DIR 的值。说明与此处所述BACKUP_STORAGE_DIR 相符。
  • components/non-gcs-restore/job-patch.yaml
    • (必需)更改 BACKUP_SNAPSHOT_TIMESTAMP 环境变量的值。说明与此处所述restore:snapshotTimestamp 相符。
    • (必需)更改 BACKUP_SERVER_IP 的值。说明与此处所述BACKUP_SERVER_IP 相符。
    • (必需)更改 BACKUP_STORAGE_DIR 的值。说明与此处所述BACKUP_STORAGE_DIR 相符。
    • (可选)将 HTTP_PROXY_URL 的值更改为指向任何已配置的代理。格式可能如下所示:
      • http://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • https://${USERNAME}:${PASSOWORD}@${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}
      • http://${HOST_IP_ADDRESS}:${HOST_PORT}

执行恢复:

如需简要了解如何恢复备份,请参阅 Cassandra 恢复概览

  1. 使用新命名空间创建新的 Kubernetes 集群以在其中恢复 Hybrid 运行时部署。您不能使用用于原始 Hybrid 安装的同一集群/命名空间。
  2. 将 Hybrid 安装到配置了上述设置以及您所需的任何其他设置的新集群中:您可以使用基本安装并在新命名空间中安装 Hybrid

    ./tools/apigee-hybrid-setup.sh \
      --cluster-name $CLUSTER_NAME \
      --cluster-region $CLUSTER_LOCATION \
      --namespace ${NEW_APIGEE_NAMESPACE}
    

    或者,按照自定义 Apigee Hybrid 安装,根据您的选择进行配置。

  3. 恢复完成后,旧命名空间中的所有资源都可以删除并切换到新命名空间。

    如需了解详情,请参阅在远程服务器上安排备份

http-client

如需查看相关说明,请参阅启用 HTTP 客户端 | Apigee

语言版本:

  • overlays/instances/${INSTANCE_NAME}/route-config/${ENV_GROUP}

启用:

取消备注相应 route-config/${ENV_GROUP}/kustomization.yaml 文件中的“./components/http-client”行

要进行的修改:

  • 无需进行任何强制性修改。

用法:

  1. 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
  2. 如果您已安装 Apigee Hybrid,则需要使用以下命令应用这些新更改:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

non-sni-client

等效于现有的如何配置非 SNI 客户端 | Apigee

语言版本:

  • overlays/instances/${INSTANCE_NAME}/route-config/${ENV_GROUP}

启用:

取消备注相应 route-config/${ENV_GROUP}/kustomization.yaml 文件中的“./components/non-sni-client”行

要进行的修改:

  • components/non-sni-client/apigee-route.yaml
    • (必需)credentialName,说明与此处所述credential_name 相符。

用法:

  1. 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
  2. 如果您已安装 Apigee Hybrid,则需要使用以下命令应用这些新更改:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

http-and-non-sni-client

如需查看相关说明,请参阅启用对非 SNI 和 HTTP 客户端的支持 | Apigee

启用:

取消备注相应 route-config/${ENV_GROUP}/kustomization.yaml 文件中的“./components/http-and-non-sni-client”行

要进行的修改:

  • components/http-and-non-sni-client/apigee-route.yaml
    • (必需)credentialName,说明与此处所述credential_name 相符。

用法:

  1. 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
  2. 如果您已安装 Apigee Hybrid,则需要使用以下命令应用这些新更改:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

多区域

该组件可在配置多区域 cassandra 部署时使用。如需了解详情,请参阅 GKE 和 GKE On-Prem 上的多区域部署

启用:

取消备注 datastore/kustomization.yaml 文件中的“./components/multi-region”行

要进行的修改:

  • components/multi-region/cassandra-data-replication.yaml

    • (必需)source.region,用于从中复制数据的来源 Cassandra 数据中心名称。可以在来源集群中使用以下命令进行标识:
    kubectl get apigeedatastore -n ${APIGEE_NAMESPACE} -o=jsonpath='{.items[*].spec.components.cassandra.properties.datacenter}'
    
  • components/multi-region/patch.yaml

    • (必需)spec.components.properties.multiRegionSeedHost,任何来源 Cassandra pod 的 pod IP。我们可以使用以下命令:
    kubectl get pods -n ${APIGEE_NAMESPACE} -o wide
    
    • 如需列出所有 pod 并获取任何 cassandra pod 的 IP,请使用以下命令:
    kubectl get pods -o wide -n apigee
    

    输出内容应如下所示:

    NAME                      READY   STATUS      RESTARTS   AGE   IP          NODE                                          NOMINATED NODE
    apigee-cassandra-default-0        1/1     Running     0          5d    10.0.0.11   gke-k8s-dc-2-default-pool-a2206492-p55d
    apigee-cassandra-default-1        1/1     Running     0          5d    10.0.2.4    gke-k8s-dc-2-default-pool-e9daaab3-tjmz
    apigee-cassandra-default-2        1/1     Running     0          5d    10.0.3.5    gke-k8s-dc-2-default-pool-e589awq3-kjch
    

如需了解详情,请参阅“GKE、GKE On-Prem 和 AKS 上的多区域部署”中 GKE 的前提条件

用法:

当您在新集群中设置 Apigee Hybrid 并且已有 Apigee Hybrid 的其他工作设置时,使用此组件基本上是合适的。

  1. 新集群和现有集群需要使用相同的 TLS 证书,以确保 Cassandra Pod 之间的正确通信。因此,我们需要从现有集群中复制 apigee-root-certificate Secret 并将其用于较新的集群:
  2. 运行:

    kubectl config get-contexts
    
    • 如需获取所有 kubernetes 上下文的列表,请运行以下命令
    kubectl config use-context SOURCE_CLUSTER_CONTEXT
    

    其中,SOURCE_CLUSTER_CONTEXT 是来源 kubernetes 集群上下文的名称。

  3. 将根证书 Secret 存储在文件中:

    kubectl get secret/apigee-root-certificate -n cert-manager -o yaml > apigee-root-certificate.yaml
    
  4. 将集群上下文切换到要在其中安装 Apigee Hybrid 的新集群。

    kubectl config use-context ${NEW_CLUSTER_CONTEXT}
    
  5. 在新集群中创建根 Secret:

    kubectl -n cert-manager apply -f apigee-root-certificate.yaml
    
  6. 禁止创建新的根证书。这将确保我们不会创建新的 apigee-root-certificate,并最终覆盖在上一步中创建的证书。

  7. 取消备注 overlays/initialization/certificates/kustomization.yaml 文件中的以下行:

    # components:
    # - ./components/disable-apigee-root-certificate-generation
    
  8. 使用基本 Apigee Hybrid 安装自定义 Apigee Hybrid 安装继续执行 Apigee Hybrid 安装的其余步骤。例如,按照基本 Apigee Hybrid 安装操作,您可以执行以下命令:

    ./tools/apigee-hybrid-setup.sh --cluster-name $CLUSTER_NAME --cluster-region $CLUSTER_LOCATION
    
  9. 使用以下命令验证重新构建状态:



    kubectl -n ${APIGEE_NAMESPACE} get apigeeds -o json | jq ".items[].status.cassandraDataReplication"
    
  10. 从日志中验证重建进程。此外,使用 nodetool 状态命令验证数据大小:

    kubectl logs apigee-cassandra-default-0 -f -n ${APIGEE_NAMESPACE}
    kubectl exec apigee-cassandra-default-0 -n ${APIGEE_NAMESPACE}  -- nodetool -u ${JMX_USER} -pw ${JMX_PASSWORD} status
    
  11. 使用以下命令验证重新构建状态:



    kubectl -n apigee get apigeeds -o json | jq ".items[].status.cassandraDataReplication"
    

    结果应如下所示:

    {
    "rebuildDetails": {
    "apigee-cassandra-default-0": {
      "state": "complete",
      "updated": 1623105760
    },
    "apigee-cassandra-default-1": {
      "state": "complete",
      "updated": 1623105765
    },
    "apigee-cassandra-default-2": {
      "state": "complete",
      "updated": 1623105770
    }
    },
    "state": "complete",
    "updated": 1623105770
    }
    

    另请参阅多区域部署

  12. components/multi-region/patch.yaml 中移除以下行:

      properties:
        multiRegionSeedHost: {IP_ADDRESS} # To be modified. REQUIRED
    
  13. 应用更改:

    kubectl apply -k overlays/instances/{INSTANCE_NAME}
    

概念

Image Hub

Docker 容器映像通常按以下格式指定:

${REGISTRY_HOST_PATH}/${IMAGE_NAME}:${IMAGE_TAG}

或使用摘要的映像如下所示:

${REGISTRY_HOST_PATH}/${IMAGE_NAME}@${DIGEST}

Apigee 使用“Image Hub”的概念,采用上述格式的映像引用 ${REGISTRY_HOST_PATH}。Image Hub 的默认值为 gcr.io/apigee-release/hybrid/

(使用 DIGEST 的映像需要在每个子组件中单独设置)

Apigee 通过结合使用以下各项的值构建最终映像路径:

  • 可在 apigee-hybrid-config.yaml 中替换的“Image Hub”(如需了解如何替换 Image Hub 的详细步骤,请参阅使用私有代码库中的 docker 映像)。
  • IMAGE_TAG 的值会从 version 字段中获得,该字段存在于每个单独的组件 的 yaml 文件(例如 apigee-organization.yaml)中。Apigee 使用 Apigee Hybrid 版本标记映像,意味着 IMAGE_TAG 为 1.8,表示 Apigee Hybrid 1.8 版
  • IMAGE_NAME 是根据在其中使用映像的容器的名称隐式确定的。例如,对于 apigee-runtime 容器,IMAGE_NAME 是 apigee-runtime。

因此,映像路径的完整示例为 gcr.io/apigee-release/hybrid/apigee-runtime:1.8.0

系统会以这种方式构建最终映像路径,该路径随后会在它们各自 pod 中的每个容器内使用。

Google Cloud 服务账号

Google Cloud 服务账号是应用用来对 Google API 进行已授权调用的账号。您可以下载 Google Cloud 服务账号密钥,然后该密钥可用于身份验证。Apigee 要求用户通过创建 Secret 来提供服务账号密钥。以下是组件的名称,以及用于查找服务账号密钥的 Secret 的默认名称:

组件 子组件 包含服务账号密钥的默认 kubernetes Secret 名称
组织
connectAgent apigee-connect-agent-gcp-sa-key-${ORG_NAME}
watcher apigee-watcher-gcp-sa-key-${ORG_NAME}
mart apigee-mart-gcp-sa-key-${ORG_NAME}
udca apigee-udca-gcp-sa-key-${ORG_NAME}
ingressGateways 不适用
environment
运行时 apigee-runtime-gcp-sa-key-${ORG_NAME}-${ENV_NAME}
udca apigee-udca-gcp-sa-key-${ORG_NAME}-${ENV_NAME}
同步器 apigee-synchronizer-gcp-sa-key-${ORG_NAME}-${ENV_NAME}
telemetry
指标 apigee-metrics-gcp-sa-key
containerLogs apigee-logger-gcp-sa-key

Kubernetes 服务账号

Kubernetes 服务账号可以为集群中的 pod 提供身份。默认情况下,Apigee 控制器会为您创建这些目录。但是,如果您想要替换创建的服务账号(例如,当您使用工作负载身份时),则可以通过指定各个子组件中的 podServiceAccountName 字段来完成。

下面列出了组件、可以在其中指定 kubernetes 服务账号的相应子组件以及 k8s 服务账号的默认名称(在为它们启用工作负载身份补丁时)。

组件 子组件 默认名称(在启用工作负载身份补丁时可用)
组织
connectAgent apigee-connect-agent-svc-account-${ORG_NAME}
watcher apigee-watcher-svc-account-${ORG_NAME}
mart apigee-mart-svc-account-${ORG_NAME}
udca apigee-udca-svc-account-${ORG_NAME}
environment
同步器 apigee-synchronizer-svc-account-${ORG_NAME}-${ENV_NAME}
udca apigee-udca-svc-account-${ORG_NAME}-${ENV_NAME}
运行时 apigee-runtime-svc-account-${ORG_NAME}-${ENV_NAME}
datastore
cassandra apigee-datastore-svc-account
telemetry
metricsApp apigee-metricsApp-svc-account
metricsProxy apigee-metricsProxy-svc-account
metricsAdapter apigee-metricsAdapter-svc-account
containerLogs apigee-container-logs-svc-account

工作负载身份

工作负载身份允许在 GKE 中运行的 pod(使用 kubernetes 服务账号)直接向 Google Cloud API 进行身份验证,而无需 Google Cloud 服务账号密钥。

添加新环境

.
├── ...
├── instances/instance1/components
│   ├── ...
│   ├── environments
│   │   ├── dev
│   │   │   └── apigee-environment.yaml
│   │   │   └── secrets.yaml
│   │   └── new-env-name (new)
│   │       └── apigee-environment.yaml (new)
│   │       └── secrets.yaml (new)
└── ...

添加新环境就像执行以下操作一样简单:

  1. 在环境目录中创建新文件夹(或者您已构建文件夹结构)
  2. apigee-environment.yaml 文件从任何现有环境复制到新文件夹中。
  3. 如果您希望为新环境创建新的服务账号和加密密钥,请将 secrets.yaml 复制到新文件夹中,并适当地重命名 Secret,以将新环境与其他现有环境区分开(这通常通过添加环境名称作为后缀来实现)
  4. apigee-environment.yaml 进行适当的更改,例如:
    • 更改环境名称
    • 如果您要创建新的服务账号和加密密钥,则需要在 yaml 中正确引用它们。
  5. 应用 yaml
kubectl apply -f components/environments/new-env-name/secrets.yaml
kubectl apply -f components/environments/new-env-name/apigee-environment.yaml

在 Apigee 数据存储区中使用强制删除

如果数据存储区删除因任何原因没有进展,则现在无论集群的当前状态如何,都可以使用以下命令强制删除 apigee 数据存储区。





  1. 删除 apigee 命名空间中的 apigeeds

    Kubectl delete -n apigee apigeeds default
    

    如果此步骤卡住,您可以使用 CTRL + C 执行此操作。

  2. 修改新的 apigeeds

    Kubectl edit -n apigee apigeeds default
    
  3. 在 apigee 数据存储区规范中添加/更新 forceDelete 字段

    spec:
    forceDelete: true
    
  4. 保存文件并退出。

现在,等待数据存储区被删除。删除所有 cassandra 资源可能需要几分钟的时间。

了解脚本

apigee-hybrid-setup.sh 脚本会执行一些基本验证,并可帮助自动执行您在需要更详细的自定义内容时必须完成的步骤,如自定义 Apigee Hybrid 安装中所述。即使在自定义安装的情况下,您仍然可以该脚本的一部分来完成特定任务。

您可以运行 ./tools/apigee-hybrid-setup.sh --help 来查看支持的标志列表,并获取一些有关该脚本的额外帮助。目前支持以下标志:

  • --namespace:默认情况下,该脚本会安装 apigee 命名空间中的所有组件。您可以通过使用此标志指定命名空间的名称来更改此行为。
  • --org:用于提供 Apigee 组织的名称。如果未指定,则默认为 gcloud 中当前选定的 Google Cloud 项目
  • --envgroup:用于提供组织内环境组的名称。如果未指定,则系统会尝试查询控制平面 API 来确定环境组的名称。如果找到多个环境组,则系统会返回错误并且脚本会退出。
  • --env:用于提供组织内环境的名称。如果未指定,则系统会尝试查询控制平面 API 来确定环境的名称。如果找到多个环境或者环境不属于环境组,则系统会返回错误并且脚本会退出。
  • --cluster-name:Kubernetes 集群名称。
  • --cluster-region kubernetes 集群所在的区域
  • --gcp-project-id:kubernetes 集群所在的 Google Cloud 项目的 ID
  • --ingress-domain:指定用于为 istio ingress-gateway 生成自签名 TLS 证书的主机名/域名。如果未指定,则系统会尝试通过查询控制平面 API 从 envgroup 获取值来确定值。如果确定 envgroup 时出现问题,或者为 envgroup 配置了多个主机名,则系统会返回错误并且脚本会退出。
  • --generate-internal-tls-certs:此标志会生成一个名为 apigee-ca 的 kubernetes Secret,其中包含我们生成的证书和密钥对。
  • --create-ingress-tls-certs:此标志会在 istio-system 命名空间中生成一个名为 {ORG_NAME}-{ENV_GROUP_NAME}(派生自 org 和 envgroup 名称)的 Secret,其中包含用于 TLS 通信的证书和密钥对。用于生成这些证书的域名派生自 envgroup 配置中找到的值。如果发生冲突(例如,找到多个网域时),则系统会显示相应的错误消息。
  • --create-gcp-sa-and-secrets:在 Google Cloud 项目中创建单个 Google Cloud 服务账号,下载密钥,然后创建包含密钥的 kubernetes Secret。Secret 的名称可在 Google Cloud 服务账号中找到。
  • --fill-values:替换各种 yaml 中所需的 org、env、envgroup 和其他名称的值。
  • --apply-configuration:此标志会创建证书颁发机构、自定义资源定义、webhook、角色和控制器资源。资源会按照正确的顺序创建,并且命令将保持阻止,直到所有资源均健康状况良好。
  • -- rename-directories:将环境和环境组重命名为正确环境和环境组的名称。
  • --verbose:显示详细的调试输出。
  • --help:显示使用情况信息。
  • --setup-all:此标志会执行此脚本可以执行的所有任务

Apigee Hybrid 设置文件夹结构

apigee-hybrid-setup 文件夹默认具有以下层次结构:

.
├── bases
   ├── controllers
      ├── apigee-controller
         ├── apigee-controller-deployment.yaml
         └── kustomization.yaml
      └── apigee-ingressgateway-manager
          ├── apigee-ingressgateway-manager-deployment.yaml
          └── kustomization.yaml
   ├── datastore
      └── backup-and-restore
          ├── backup
             ├── cronjob.yaml
             └── kustomization.yaml
          ├── common
             ├── kustomization.yaml
             ├── rbac.yaml
             └── tls-certificate.yaml
          └── restore
              ├── job.yaml
              └── kustomization.yaml
   └── initialization
       ├── certificates
          ├── certificates-and-issuers.yaml
          └── kustomization.yaml
       ├── crds
          ├── customresourcedefinition-apigeedatastores.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeedeployments.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeeenvironments.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeeorganizations.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeeredis.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeerouteconfigs.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeeroutes.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeetelemetries.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-cassandradatareplications.apigee.cloud.google.com.yaml
          └── kustomization.yaml
       ├── openshift
          ├── kustomization.yaml
          └── scc.yaml
       ├── rbac
          ├── apigee-controller
             ├── kustomization.yaml
             └── rbac.yaml
          └── apigee-embedded-ingress-controller
              ├── cluster-role-bindings.yaml
              ├── cluster-roles.yaml
              ├── kustomization.yaml
              └── service-account.yaml
       └── webhooks
           ├── kustomization.yaml
           ├── mutatingwebhookconfiguration.yaml
           └── validatingwebhookconfiguration.yaml
├── CONTRIBUTING.md
├── docs
   └── api_references
       ├── v1alpha1.md
       └── v1alpha2.md
├── kokoro
   ├── build.sh
   ├── common.cfg
   ├── continuous.cfg
   ├── presubmit.cfg
   └── release.cfg
├── LICENSE
├── overlays
   ├── controllers
      ├── apigee-controller
         ├── apigee-hybrid-config.yaml
         ├── components
            ├── imagepullsecret
               ├── kustomization.yaml
               └── patch.yaml
            └── nodeselector
                ├── kustomization.yaml
                └── patch.yaml
         └── kustomization.yaml
      ├── apigee-ingressgateway-manager
         ├── apigee-ingressgateway-manager-deployment-patch.yaml
         ├── apigee-istio-mesh-config.yaml
         ├── components
            ├── imagepullsecret
               ├── kustomization.yaml
               └── patch.yaml
            └── nodeselector
                ├── kustomization.yaml
                └── patch.yaml
         └── kustomization.yaml
      └── kustomization.yaml
   ├── initialization
      ├── certificates
         ├── apigee-ingressgateway-manager-certificate-patch.yaml
         ├── apigee-serving-cert-patch.yaml
         ├── components
            └── disable-apigee-root-certificate-generation
                └── kustomization.yaml
         └── kustomization.yaml
      ├── crds
         └── kustomization.yaml
      ├── ingress
         ├── envoyfilter-1.11.yaml
         └── kustomization.yaml
      ├── namespace.yaml
      ├── openshift
         ├── kustomization.yaml
         └── scc.yaml
      ├── rbac
         ├── apigee-controller
            └── kustomization.yaml
         ├── apigee-ingressgateway-manager
            └── kustomization.yaml
         └── kustomization.yaml
      └── webhooks
          ├── kustomization.yaml
          ├── mutatingwebhookconfiguration.yaml
          └── validatingwebhookconfiguration.yaml
   └── instances
       └── instance1
           ├── datastore
              ├── apigee-datastore.yaml
              ├── components
                 ├── gcs-backup
                    ├── apigee-datastore-patch.yaml
                    ├── cron-patch.yaml
                    ├── kustomization.yaml
                    └── tls-certificate-patch.yaml
                 ├── gcs-restore
                    ├── apigee-datastore-patch.yaml
                    ├── job-patch.yaml
                    ├── kustomization.yaml
                    └── tls-certificate-patch.yaml
                 ├── http-proxy
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── imagepullsecret
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── multi-region
                    ├── cassandra-data-replication.yaml
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── nodeselector
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── non-gcs-backup
                    ├── apigee-datastore-patch.yaml
                    ├── cron-patch.yaml
                    ├── kustomization.yaml
                    └── tls-certificate-patch.yaml
                 ├── non-gcs-restore
                    ├── apigee-datastore-patch.yaml
                    ├── job-patch.yaml
                    ├── kustomization.yaml
                    └── tls-certificate-patch.yaml
                 ├── openshift-scc
                    ├── kustomization.yaml
                    └── scc.yaml
                 └── workload-identity
                     ├── kustomization.yaml
                     ├── patch.yaml
                     └── service-accounts.yaml
              ├── kustomization.yaml
              └── secrets.yaml
           ├── environments
              ├── kustomization.yaml
              └── test
                  ├── apigee-environment.yaml
                  ├── components
                     ├── http-proxy
                        ├── kustomization.yaml
                        └── patch.yaml
                     ├── imagepullsecret
                        ├── kustomization.yaml
                        └── patch.yaml
                     ├── nodeselector
                        ├── kustomization.yaml
                        └── patch.yaml
                     └── workload-identity
                         ├── kustomization.yaml
                         ├── patch.yaml
                         └── service-accounts.yaml
                  ├── kustomization.yaml
                  └── secrets.yaml
           ├── kustomization.yaml
           ├── organization
              ├── apigee-organization.yaml
              ├── components
                 ├── http-proxy
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── imagepullsecret
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── nodeselector
                    ├── kustomization.yaml
                    └── patch.yaml
                 └── workload-identity
                     ├── kustomization.yaml
                     ├── patch.yaml
                     └── service-accounts.yaml
              ├── kustomization.yaml
              └── secrets.yaml
           ├── redis
              ├── apigee-redis.yaml
              ├── components
                 ├── imagepullsecret
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── nodeselector
                    ├── kustomization.yaml
                    └── patch.yaml
                 └── workload-identity
                     ├── kustomization.yaml
                     ├── patch.yaml
                     └── service-accounts.yaml
              ├── kustomization.yaml
              └── secrets.yaml
           ├── route-config
              ├── kustomization.yaml
              └── test-envgroup
                  ├── apigee-route-config.yaml
                  ├── components
                     ├── http-and-non-sni-client
                        ├── apigee-route.yaml
                        └── kustomization.yaml
                     ├── http-client
                        ├── apigee-route.yaml
                        └── kustomization.yaml
                     └── non-sni-client
                         ├── apigee-route.yaml
                         └── kustomization.yaml
                  └── kustomization.yaml
           └── telemetry
               ├── apigee-telemetry.yaml
               ├── components
                  ├── http-proxy
                     ├── kustomization.yaml
                     └── patch.yaml
                  ├── imagepullsecret
                     ├── kustomization.yaml
                     └── patch.yaml
                  ├── logger
                     ├── kustomization.yaml
                     └── patch.yaml
                  ├── metrics
                     ├── kustomization.yaml
                     └── patch.yaml
                  ├── nodeselector
                     ├── kustomization.yaml
                     └── patch.yaml
                  ├── openshift-scc
                     ├── kustomization.yaml
                     └── scc.yaml
                  ├── workload-identity-logger
                     ├── kustomization.yaml
                     ├── patch.yaml
                     └── service-accounts.yaml
                  └── workload-identity-metrics
                      ├── kustomization.yaml
                      ├── patch.yaml
                      └── service-accounts.yaml
               └── kustomization.yaml
├── README.md
├── templates
   ├── certificate-org-envgroup.yaml
   ├── secret-apigee-cassandra-backup-and-restore-gcp-sa-key.yaml
   ├── secret-apigee-cassandra-backup-and-restore-key-file.yaml
   ├── secret-gcp-sa-key.yaml
   └── secret-ingress-tls-cert-key.yaml
└── tools
    ├── apigee-hybrid-setup.sh
    ├── apigee-pull-push.sh
    ├── common.sh
    ├── create-service-account.sh
    └── dump_kubernetes.sh

您可以在 github 代码库的 preview-1 标记中找到上述文件的版本,网址为:https://github.com/apigee/apigee-hybrid-install/releases/tag/preview-1

上述文件夹包含 Apigee Hybrid 运行时的 Kubernetes 清单,并使用 Kustomize 进行配置管理。这些清单是基于 Kustomize bases 和 overlays 的概念来组织的。bases 文件夹包含每个 apigee 组件所需的最低配置。overlays 文件夹包含多个其他定义为组件的功能(配置)。您可以通过在 kustomization.yaml 中取消备注组件引用来启用组件。

示例gcs-backup 组件在下面的 customization.yaml 中取消了备注,以便为 apigee 数据存储区启用 gcs-backup

路径${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/datastore/kustomization.yaml

namespace: "apigee" # kpt-set: ${APIGEE_NAMESPACE}

resources:
- apigee-datastore.yaml

components:
# - ./components/http-proxy
# - ./components/nodeselector/
# - ./components/imagepullsecret
# - ./components/workload-identity
# - ./components/openshift-scc
- ./components/gcs-backup (uncommented)
# - ./components/gcs-restore
# - ./components/non-gcs-backup
# - ./components/non-gcs-restore

任何需要自定义的值都必须在 gcs-backup 的相应 patch.yaml 中进行设置。在以下文件中,CLOUD_STORAGE_BUCKET_PATH 的值必须由用户设置

路径$INSTALL_DIR/overlays/instances/$INSTANCE_DIR/datastore/components/gcs-backup/cron-patch.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: apigee-cassandra-backup
  namespace: apigee
spec:
  schedule: "${YOUR_BACKUP_SCHEDULE_CODE}" # To be modified
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: apigee-cassandra-backup
            env:
            - name: APIGEE_CLOUDPROVIDER
              value: "GCP"
            - name: DATABASE_STORAGE_BUCKET
              value: "${CLOUD_STORAGE_BUCKET_PATH}" # To be modified. REQUIRED
            volumeMounts:
            - name: apigee-cassandra-backup
              mountPath: /var/secrets/google
          volumes:
          - name: apigee-cassandra-backup
            secret:
              secretName: "apigee-cassandra-backup-and-restore-svc-account"

同样,任何需要自定义的功能/配置都可以通过在 apigee 组件的 kustomization.yaml 中取消备注组件来启用。此外,您需要根据要求对组件的 patch.yaml 中字段的对应值进行相应地设置。

文件夹和文件的简要说明如下:

bases

此文件夹包含模板,这些模板包含每个 apigee 组件所需的最低配置。无需修改此文件夹中的清单。

overlays

此文件夹包含用于其他配置的 kustomize 组件模板

initialization

namespaces.yaml

Apigee 数据平面组件将安装到的命名空间。默认命名空间名称为 apigee

certificates

包含用于向网络钩子颁发证书的 IssuerCertificate 资源。还包含用于为各种 Pod 颁发证书以进行 TLS 通信的 Issuer

rbac

包含由各种组件使用的 RoleClusterRoleRoleBindingClusterRoleBinding

crds
    Contains the definition of all the CRDs which are used by Apigee.
webhooks

包含用于对自定义资源执行验证的 ValidatingWebhookConfigurationMutatingWebhookConfiguration

入站流量

包含适用于所有 Ingress POD 的配置。例如,常见的标头修改、健康检查等

openshift

包含 openshift SecurityContextConstraints 的定义。

控制器

apigee-controller
apigee-hybrid-config.yaml

包含 ConfigMap,作为 apigee-controller-manager.yaml 中的输入提供。此 ConfigMap 包含 imageHubimagePullSecretsforwardProxy 等配置。

apigee-controller-deployment.yaml

包含用于控制器和 webhook 的两个 Service 以及用于控制器的 Deployment。如果您想要为控制器使用私有映像,则需要对该映像进行更改。

istiod

Apigee-istio-mesh-config.yaml 包含 Apigee 使用的 Istio 的网格配置。这不适用于集群中其他 ASM/Istio 安装。

apigee-ingressgateway-manager-deployment-patch.yaml

包含 Istiod 的服务和部署。这是仅供 Apigee 用例使用的专用 istiod。

instances/{instanceName}

datastore
apigee-datastore.yaml

包含管理 cassandra 的 ApigeeDatastore 自定义资源。

secrets.yaml

包含数据存储区的默认凭据。

redis
apigee-redis.yaml

包含管理 redis 的 ApigeeRedis 自定义资源。

secrets.yaml

包含数据存储区的默认凭据。

组织
apigee-organization.yaml

包含管理 connectAgent、watcherAndSynchronizer、MART、UDCA 和 Ingress 等其他子组件的 ApigeeOrganization 自定义资源。

secrets.yaml

包含 apigee-organization.yaml 中引用的 Secret。某些 Secret 在由脚本生成时会被注释掉。如果您禁止生成 Secret,则需要手动创建它们

environments

包含组织中的所有环境。您应该为每个环境创建一个单独的文件夹,方法是复制已为您提供的文件夹,并根据需求进行配置。

dev
apigee-environment.yaml

包含管理运行时等其他子组件的 ApigeeEnvironment 自定义资源。

secrets.yaml

包含 apigee-environment.yaml 中引用的 Secret。某些 Secret 在由脚本生成时会被注释掉。如果您禁止生成 Secret,则需要手动创建它们

telemetry
apigee-telemetry.yaml

包含 ApigeeTelemetry 自定义资源。

secrets.yaml

包含 apigee-telemetry.yaml 中引用的 Secret。某些 Secret 在由脚本生成时会被注释掉。如果您禁止生成 Secret,则需要手动创建它们

route-config
dev-envgroup
apigee-route-config.yaml

包含 ApigeeRouteConfig 自定义资源。

secrets.yaml

包含 apigee-route-config.yaml 中引用的 Secret。此 Secret 会被注释掉,因为它是由 apigee-hybrid-setup.sh 脚本自动生成的并且保留在其中,以提供您要手动创建 Secret 时应该是什么样的示例。

诊断信息

diagnostic-collector.yaml

用于启动诊断部署的资源

工具

apigee-hybrid-setup.sh
apigee-create-service-account.sh
dump-kubernetes.sh
apigee-pull-push.sh

将服务账号密钥存储在外部保险柜中

Vault(由 Hashicorp 提供)是一个常用的 Secret 管理系统,包含与 Google、Azure、AWS 等提供的 Secret 存储区的多项集成。Hashicorp Vault 允许您从外部来源提取 Secret,然后在 kubernetes 资源中使用它们。您可以通过多种方式使用 Vault 获取 Secret。以下步骤用作基本示例,说明了如何使用 Vault CSI 提供商装载存储在 Vault 提供的某些 Secret 引擎中的 Google Cloud 服务账号密钥。



  1. 我们将使用 Helm 在集群中安装与 Vault 相关的资源。请按照安装 Helm 中的步骤操作,了解如何在系统中设置 helm。
  2. 按照安装 Vault Helm 图表中的步骤操作,即:

    1. 将 Hashicorp 代码库添加到 helm 中

      helm repo add hashicorp https://helm.releases.hashicorp.com
      
    2. 更新 helm 代码库

      helm repo update
      
    3. 安装保险柜

      helm install vault hashicorp/vault \
      --set "server.dev.enabled=true" \
      --set "injector.enabled=false" \
      --set "csi.enabled=true"
      
  3. 现在,我们将 Secret 存储在 Vault 中。

    1. 在 vault dev pod 中获取 shell

      kubectl exec -it vault-0 -- /bin/sh
       ```
      
    2. 在此示例中,我们将使用键值 Secret 引擎来存储数据。

      vault kv put secret/runtime-gcp-sa-key key="${BASE_64_ENCODED_KEY}"
      
    3. 如需验证密钥是否已成功存储,请使用:

      vault kv get secret/runtime-gcp-sa-key
      
  4. 设置身份验证,以允许运行时 Pod 拉取密钥。如 Kubernetes 服务账号中所述,kubernetes 服务账号会为 pod 提供身份,并允许 pod 向其他系统进行身份验证。

    1. 在 vault dev pod 中获取 shell

      kubectl exec -it vault-0 -- /bin/sh
      
    2. 启用 Kubernetes 身份验证方法

      vault auth enable kubernetes
      
    3. 编写身份验证配置

      vault write auth/kubernetes/config \
      issuer="https://kubernetes.default.svc.cluster.local" \
      token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
      kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443" \
      kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
      disable_iss_validation=true
      
    4. 创建身份验证政策

      vault policy write apigee-runtime-app - <<EOF
      path "secret/data/runtime-gcp-sa-key" {
      capabilities = ["read"]
      }
      EOF
      
    5. 将此政策与服务账号绑定

      vault write auth/kubernetes/role/apigee-runtime-role \
      bound_service_account_names=apigee-runtime-sa \
      bound_service_account_namespaces=${APIGEE_NAMESPACE} \
      policies=apigee-runtime-app \
      ttl=20m
      

    在这里,我们假设服务账号在 apigee 命名空间中。如果您有任何其他用于安装 Apigee 的命名空间,则将使用该名称。

    1. 在 vault-0 内退出 shell

      exit
      
  5. 安装 Secret Store CSI 驱动程序

    # Add repo to helm
    helm repo add secrets-store-csi-driver https://raw.githubusercontent.com/kubernetes-sigs/secrets-store-csi-driver/master/charts
    # Install driver in cluster
    helm install csi secrets-store-csi-driver/secrets-store-csi-driver
    
  6. 创建 SecretProviderClass kubernetes 资源,以引用您在 Vault 中创建的 Secret

    cat > spc-vault.yaml <<EOF
    apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
    kind: SecretProviderClass
    metadata:
    name: vault-apigee-runtime-gcp-sa-key
    spec:
    provider: vault
    parameters:
      vaultAddress: "http://vault.default:8200"
      roleName: "apigee-runtime-role"
      objects: |
        - objectName: "client_secret.json"
          secretPath: "secret/data/runtime-gcp-sa-key"
          secretKey: "key"
    EOF
    
  7. 应用 yaml

    kubectl apply -f spc-vault.yaml
    
  8. 创建我们在步骤 (4.e) 中向其分配的权限的 kubernetes 服务账号

    kubectl create serviceaccount -n ${APIGEE_NAMESPACE} apigee-runtime-sa
    
  9. 为环境修改 apigee-environment.yaml 文件,并添加以下行:

    apiVersion: apigee.cloud.google.com/v1alpha2
    kind: ApigeeEnvironment
    # existing content
    spec:
    name: {ENV_NAME}
    organizationRef: {ORG_NAME}
    components:
     runtime:
    # existing content
       pod
       containers:
       - name: apigee-runtime
         podServiceAccountName: apigee-runtime-sa
    # existing content
         volumeMounts:
         - name: secrets-store-inline
           mountPath: "/opt/apigee/sa"
           readOnly: true
       volumes:
       - name: secrets-store-inline
         csi:
           driver: secrets-store.csi.k8s.io
           readOnly: true
           volumeAttributes:
             secretProviderClass: "vault-apigee-runtime-gcp-sa-key"
    
  10. 应用更改:

    kubectl apply -k ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/environments/$ENV_NAME
    

Apigee Hybrid 升级



您应已完成前提条件中提到的所有要求。此外,建议您对所有组件执行滚动重启,以检查集群健康状况是否良好。重启的顺序是 Cassandra、Redis、ApigeeOrganization 和 ApigeeEnvironment。

创建备份

  1. 创建当前 Hybrid 设置的备份副本。如果您需要将升级回滚到当前版本,则需要进行备份。

    tar -czvf apigee-hybrid-install.v-X.Y.Z.tar.gz $HYBRID_INSTALL_BASE_DIR
    
  2. 创建 cassandra 数据库的备份。Cassandra 备份是防范灾难场景的重要措施。

根据需要升级 Kubernetes 平台

此步骤不是每次都必须执行的步骤,但如果较新版本的 Apigee Hybrid 不再支持,则您需要升级 kubernetes、openshift 等 Kubernetes 平台以及 cert-manager、cassandra 等版本的组件。文档包含支持的平台和组件版本

下载设置文件

下载代码库并将现有 Apigee Hybrid 设置中的 basestools 文件夹替换为一个较新的文件夹:

  1. https://github.com/apigee/apigee-hybrid-install/releases/tag/preview-1 克隆 GitHub 代码库 preview-1 标记

    克隆的代码库的结构类似于 Apigee Hybrid 设置文件夹结构中所述的结构:

  2. 替换现有 Apigee Hybrid 设置中的 initialization、tools 和 controller 文件夹。

    export HYBRID_INSTALL_HOME=PATH_TO_PREVIOUS_HYBRID_INSTALL_DIRECTORY
    mv -f bases $HYBRID_INSTALL_HOME/bases
    mv -f tools $HYBRID_INSTALL_HOME/tools
    

根据需要更新服务账号权限

此步骤也不是每次都必须执行的步骤,但如有需要,您需要创建新的服务账号或更新现有服务账号的权限。升级指南详细介绍了需要修改或创建哪些服务账号,以及需要添加哪些角色。

  • 如果您需要修改现有服务账号的权限,请使用适当的 gcloud 命令。升级指南包含需要添加的详细命令和角色。

    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:apigee-component@$PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/$NEW_ROLE"
    
  • 如果较新 Apigee Hybrid 版本可能需要为新的/现有组件使用其他服务账号,则您需要创建该服务账号。您可以使用工具文件夹中随附的 apigee-create-service-account.sh 脚本来创建新的服务账号。由于该脚本已在第 4 步中更新,因此它包含需要创建的新服务账号所需的详细信息和新配置文件。

    您必须在相应组件 CR 中引用新创建的服务账号名称。

    ./tools/create-service-account --env prod --profile apigee-component
    

升级控制器

${INSTALL_DIR}/overlays/instances/$INSTANCE_DIR/kustomization.yaml 中列出的组件的版本字段更改为相关的混合版本。

下面是示例 $INSTALL_DIR/overlays/instances/$INSTANCE_DIR/kustomization.yaml 文件。版本字段的值必须更新为相关版本

resources:
- datastore/
- environments/
- organization/
- redis/
- route-config/
- telemetry/

patches:
- target:
    group: apigee.cloud.google.com
    version: v1alpha1
    kind: ApigeeDatastore
  patch: |-
    - op: add
      path: /spec/version
      value: 1-6-1 (Modify the version)
- target:
    group: apigee.cloud.google.com
    version: v1alpha2
    kind: ApigeeEnvironment
  patch: |-
    - op: add
      path: /spec/version
      value: 1-6-1 (Modify the version)

按照 Apigee Hybrid 安装工作流的创建初始化资源和控制器中提供的同一组步骤操作。您可以使用脚本,也可以按照提供的手动步骤来升级初始化资源和控制器。

更新 Apigee Kubernetes 组件

您需要进行以下更改:- 如果发生任何架构更改或引入新字段或弃用旧字段,则您必须按照升级指南中提供的说明,通过适当的更改来修改 CR。- 您至少需要将 CR 中的版本字段(表示安装的 Apigee Hybrid 版本)更新为较新的 Apigee Hybrid 版本。

应用 Apigee CR 的更改。对于非生产环境,您可以同时将所有更改应用于 apigee 组件

kubectl apply -f ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}

Apigee Hybrid 回滚

  1. 恢复 apigee-hybrid-setup

    移到包含先前版本的 Apigee Hybrid 设置的目录。如果不可用,请通过 Apigee Hybrid 升级期间的第 1 步 [链接] 中创建的 zip 文件进行恢复。

  2. 回滚 Kubernetes 组件

    应用 Apigee CR 的更改

    kubectl apply -k ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}
    
  3. 回滚控制器

    按照 Apigee Hybrid 安装工作流的创建初始化资源和控制器中提供的同一组步骤操作。您可以使用脚本,也可以按照提供的手动步骤来回滚初始化资源和控制器。

  4. 清理

    您需要清理升级期间创建的所有额外的新资源,例如较新版本的 Hybrid 中引入的新组件或服务账号。升级指南中提供了需要清理的所有资源以及清理这些资源的步骤。

删除环境



下面是从 kubernetes 集群中删除与环境相关的所有资源的步骤:

  1. 获取环境 CR 的名称。此操作可通过获取所有环境来完成:

    kubectl get env -n ${APIGEE_NAMESPACE}
    

    将资源名称存储在 APIGEE_ENV 环境变量中。

  2. 删除环境加密密钥。例如,如果您尚未更改加密密钥的名称,则可以使用以下命令将其删除:

    kubectl delete secret -n ${APIGEE_NAMESPACE} $APIGEE_ENV-encryption-keys
    
  3. 删除 Google Cloud 服务账号 Secret:

    kubectl delete secret -n ${APIGEE_NAMESPACE} $(kubectl get env $APIGEE_ENV -n ${APIGEE_NAMESPACE} -o=jsonpath='{.spec.components.*.appServiceAccountSecretName}')
    
  4. 删除 kubernetes 服务账号:

    kubectl delete secret -n ${APIGEE_NAMESPACE} $(kubectl get env $APIGEE_ENV -n ${APIGEE_NAMESPACE} -o=jsonpath='{.spec.components.*.podServiceAccountName}')
    
  5. 删除 Apigee 环境自定义资源:

    kubectl -n ${APIGEE_NAMESPACE} delete env $APIGEE_ENV
    

删除 Hybrid 设置



下面是从 kubernetes 集群中删除与 Apigee Hybrid 相关的所有资源的步骤:

  1. 您需要删除 apigee 用户设置和架构设置作业。

    # To list all jobs in ${APIGEE_NAMESPACE}
    kubectl -n ${APIGEE_NAMESPACE} get jobs
    # To delete all jobs in ${APIGEE_NAMESPACE}
    kubectl -n ${APIGEE_NAMESPACE} delete jobs $(kubectl -n ${APIGEE_NAMESPACE} get jobs -o custom-columns=':.metadata.name')
    
  2. 您需要删除已部署的 Apigee Hybrid 数据平面组件。使用以下命令以删除所有组件:

    kubectl delete -k ${INSTALL_DIR}/overlays/instances/$INSTANCE_NAME
    
  3. 仅当您不依赖于 kubernetes 服务账号 Secret、Google Cloud 服务账号 Secret 等默认名称时,才需要执行此步骤。如果您依赖于默认名称,则将会在下一步中删除,否则需要使用以下命令手动删除:

    kubectl delete secret -n ${APIGEE_NAMESPACE} $(kubectl get ${APIGEE_COMPONENT} ${APIGEE_COMPONENT_NAME} -n ${APIGEE_NAMESPACE} -o=jsonpath='{.spec.components.*.appServiceAccountSecretName}')
    kubectl delete secret -n ${APIGEE_NAMESPACE} $(kubectl get ${APIGEE_COMPONENT} ${APIGEE_COMPONENT_NAME} -n ${APIGEE_NAMESPACE} -o=jsonpath='{.spec.components.*.podServiceAccountName}')
    
  4. 对于 OpenShift,您需要删除安装 Apigee Hybrid 期间创建的 scc(安全上下文限制条件)。

    kubectl delete scc ${SECURITY_CONTEXT_CONSTRAINTS_NAME}
    
  5. 运行以下命令以删除角色、角色绑定、CRD、控制器部署等。

    kubectl delete -k ${INSTALL_DIR}/overlays/initialization/ingress
    kubectl delete -k ${INSTALL_DIR}/overlays/initialization/rbac
    kubectl delete -k ${INSTALL_DIR}/overlays/initialization/webhooks
    kubectl delete -k ${INSTALL_DIR}/overlays/initialization/crds
    kubectl delete -k ${INSTALL_DIR}/overlays/initialization/certificates
    
  6. 运行以下命令以删除 apigee 命名空间

    kubectl delete -f ${INSTALL_DIR}/overlays/initialization/namespace.yaml
    

    或者,使用以下命令:

    kubectl delete $APIGEE_NAMESPACE
    

多实例安装

多实例设置是指可以跨越多个区域或位于同一区域中的 Hybrid 设置。Apigee 建议在单独的目录结构中以环境配置(副本等)的形式组织第 2 个实例的配置始终在实例之间有所不同。每个实例的配置都是分离的,且按各自的文件夹结构进行独立组织。

例如:对于多区域场景中的主动-被动设置,您可能需要在热备用中配置大小和配置不同的第 2 个区域。

在下面的文件夹结构中,您可以创建 instance1 目录的副本(名为 instance2),并根据需要修改数据存储区和入站流量配置。

下面是多实例设置的 apigee-hybrid-setup 文件夹结构。

.
├── bases
   ├── controllers
      ├── apigee-controller
         ├── apigee-controller-deployment.yaml
         └── kustomization.yaml
      └── istiod
          ├── apigee-ingressgateway-manager-deployment.yaml
          └── kustomization.yaml
   └── initialization
       ├── certificates
          ├── certificates-and-issuers.yaml
          └── kustomization.yaml
       ├── crds
          ├── customresourcedefinition-apigeedatastores.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeedeployments.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeeenvironments.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeeorganizations.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeeredis.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeerouteconfigs.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeeroutes.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-apigeetelemetries.apigee.cloud.google.com.yaml
          ├── customresourcedefinition-cassandradatareplications.apigee.cloud.google.com.yaml
          └── kustomization.yaml
       ├── ingress
          ├── envoyfilter-1.11.yaml
          └── kustomization.yaml
       ├── openshift
          ├── kustomization.yaml
          └── scc.yaml
       ├── rbac
          ├── apigee-controller
             ├── kustomization.yaml
             └── rbac.yaml
          └── apigee-embedded-ingress-controller
              ├── cluster-role-bindings.yaml
              ├── cluster-roles.yaml
              ├── kustomization.yaml
              └── service-account.yaml
       └── webhooks
           ├── kustomization.yaml
           ├── mutatingwebhookconfiguration.yaml
           └── validatingwebhookconfiguration.yaml
├── instances
   └── instance1 (Add the 2nd instance under instances directory similar to instance1)
       ├── datastore
          ├── apigee-datastore.yaml
          ├── components
             ├── http-proxy
                ├── kustomization.yaml
                └── patch.yaml
             ├── imagepullsecret
                ├── kustomization.yaml
                └── patch.yaml
             ├── nodeselector
                ├── kustomization.yaml
                └── patch.yaml
             └── workload-identity
                 ├── apigee-workload-identities.yaml
                 ├── kustomization.yaml
                 └── patch.yaml
          ├── kustomization.yaml
          └── secrets.yaml
       ├── environments
          ├── kustomization.yaml
          └── test
              ├── apigee-environment.yaml
              ├── components
                 ├── http-proxy
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── imagepullsecret
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── nodeselector
                    ├── kustomization.yaml
                    └── patch.yaml
                 └── workload-identity
                     ├── apigee-workload-identities.yaml
                     ├── kustomization.yaml
                     └── patch.yaml
              ├── kustomization.yaml
              └── secrets.yaml
       ├── kustomization.yaml
       ├── organization
          ├── apigee-organization.yaml
          ├── components
             ├── http-proxy
                ├── kustomization.yaml
                └── patch.yaml
             ├── imagepullsecret
                ├── kustomization.yaml
                └── patch.yaml
             ├── nodeselector
                ├── kustomization.yaml
                └── patch.yaml
             └── workload-identity
                 ├── apigee-workload-identities.yaml
                 ├── kustomization.yaml
                 └── patch.yaml
          ├── kustomization.yaml
          └── secrets.yaml
       ├── redis
          ├── apigee-redis.yaml
          ├── components
             ├── imagepullsecret
                ├── kustomization.yaml
                └── patch.yaml
             ├── nodeselector
                ├── kustomization.yaml
                └── patch.yaml
             └── workload-identity
                 ├── apigee-workload-identities.yaml
                 ├── kustomization.yaml
                 └── patch.yaml
          ├── kustomization.yaml
          └── secrets.yaml
       ├── route-config
          ├── kustomization.yaml
          └── test-env-group
              ├── apigee-route-config.yaml
              ├── components
                 ├── http-and-non-sni-client
                    ├── apigee-route.yaml
                    └── kustomization.yaml
                 ├── http-client
                    ├── apigee-route.yaml
                    └── kustomization.yaml
                 └── non-sni-client
                     ├── apigee-route.yaml
                     └── kustomization.yaml
              └── kustomization.yaml
       └── telemetry
           ├── apigee-telemetry.yaml
           ├── components
              ├── http-proxy
                 ├── kustomization.yaml
                 └── patch.yaml
              ├── imagepullsecret
                 ├── kustomization.yaml
                 └── patch.yaml
              ├── logger
                 ├── kustomization.yaml
                 └── patch.yaml
              ├── metrics
                 ├── kustomization.yaml
                 └── patch.yaml
              ├── nodeselector
                 ├── kustomization.yaml
                 └── patch.yaml
              ├── workload-identity-logger
                 ├── apigee-workload-identities.yaml
                 ├── kustomization.yaml
                 └── patch.yaml
              └── workload-identity-metrics
                  ├── apigee-workload-identities.yaml
                  ├── kustomization.yaml
                  └── patch.yaml
           └── kustomization.yaml
├── overlays
   ├── controllers
      ├── apigee-controller
         ├── apigee-hybrid-config.yaml
         ├── components
            ├── imagepullsecret
               ├── kustomization.yaml
               └── patch.yaml
            └── nodeselector
                ├── kustomization.yaml
                └── patch.yaml
         └── kustomization.yaml
      ├── istiod
         ├── apigee-ingressgateway-manager-deployment-patch.yaml
         ├── apigee-istio-mesh-config.yaml
         ├── components
            ├── imagepullsecret
               ├── kustomization.yaml
               └── patch.yaml
            └── nodeselector
                ├── kustomization.yaml
                └── patch.yaml
         └── kustomization.yaml
      └── kustomization.yaml
   ├── initialization
      ├── certificates
         ├── apigee-ingressgateway-manager-certificate.yaml
         └── kustomization.yaml
      ├── crds
         └── kustomization.yaml
      ├── ingress
         └── kustomization.yaml
      ├── namespace.yaml
      ├── openshift
         ├── kustomization.yaml
         └── scc.yaml
      ├── rbac
         ├── apigee-controller
            └── kustomization.yaml
         ├── apigee-embedded-ingress-controller
            └── kustomization.yaml
         └── kustomization.yaml
      └── webhooks
          ├── kustomization.yaml
          ├── mutatingwebhookconfiguration.yaml
          └── validatingwebhookconfiguration.yaml
   └── instances
       └── instance1
           ├── datastore
              ├── apigee-datastore.yaml
              ├── components
                 ├── http-proxy
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── imagepullsecret
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── nodeselector
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── openshift-scc
                    ├── kustomization.yaml
                    └── scc.yaml
                 └── workload-identity
                     ├── apigee-workload-identities.yaml
                     ├── kustomization.yaml
                     └── patch.yaml
              ├── kustomization.yaml
              └── secrets.yaml
           ├── environments
              ├── kustomization.yaml
              └── test
                  ├── apigee-environment.yaml
                  ├── components
                     ├── http-proxy
                        ├── kustomization.yaml
                        └── patch.yaml
                     ├── imagepullsecret
                        ├── kustomization.yaml
                        └── patch.yaml
                     ├── nodeselector
                        ├── kustomization.yaml
                        └── patch.yaml
                     └── workload-identity
                         ├── apigee-workload-identities.yaml
                         ├── kustomization.yaml
                         └── patch.yaml
                  ├── kustomization.yaml
                  └── secrets.yaml
           ├── kustomization.yaml
           ├── organization
              ├── apigee-organization.yaml
              ├── components
                 ├── http-proxy
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── imagepullsecret
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── nodeselector
                    ├── kustomization.yaml
                    └── patch.yaml
                 └── workload-identity
                     ├── apigee-workload-identities.yaml
                     ├── kustomization.yaml
                     └── patch.yaml
              ├── kustomization.yaml
              └── secrets.yaml
           ├── redis
              ├── apigee-redis.yaml
              ├── components
                 ├── imagepullsecret
                    ├── kustomization.yaml
                    └── patch.yaml
                 ├── nodeselector
                    ├── kustomization.yaml
                    └── patch.yaml
                 └── workload-identity
                     ├── apigee-workload-identities.yaml
                     ├── kustomization.yaml
                     └── patch.yaml
              ├── kustomization.yaml
              └── secrets.yaml
           ├── route-config
              ├── kustomization.yaml
              └── test-envgroup
                  ├── apigee-route-config.yaml
                  ├── components
                     ├── http-and-non-sni-client
                        ├── apigee-route.yaml
                        └── kustomization.yaml
                     ├── http-client
                        ├── apigee-route.yaml
                        └── kustomization.yaml
                     └── non-sni-client
                         ├── apigee-route.yaml
                         └── kustomization.yaml
                  └── kustomization.yaml
           └── telemetry
               ├── apigee-telemetry.yaml
               ├── components
                  ├── http-proxy
                     ├── kustomization.yaml
                     └── patch.yaml
                  ├── imagepullsecret
                     ├── kustomization.yaml
                     └── patch.yaml
                  ├── logger
                     ├── kustomization.yaml
                     └── patch.yaml
                  ├── metrics
                     ├── kustomization.yaml
                     └── patch.yaml
                  ├── nodeselector
                     ├── kustomization.yaml
                     └── patch.yaml
                  ├── openshift-scc
                     ├── kustomization.yaml
                     └── scc.yaml
                  ├── workload-identity-logger
                     ├── apigee-workload-identities.yaml
                     └── kustomization.yaml
                  └── workload-identity-metrics
                      ├── apigee-workload-identities.yaml
                      ├── kustomization.yaml
                      └── patch.yaml
               └── kustomization.yaml
├── README.md
├── templates
   ├── ingress-certificate.yaml
   ├── ingress-cert-secret.yaml
   └── service-account-key-secret.yaml
└── tools
    ├── apigee-hybrid-setup.sh
    ├── common.sh
    ├── create-service-account.sh
    └── dump_kubernetes.sh

GKE 上的多实例设置

前提条件

在配置 Hybrid 的多个实例之前,您应该先满足以下前提条件:

  • 在具有不同 CIDR 地址块的多个区域(相同或不同)中设置 Kubernetes 集群
  • 设置跨区域通信
  • 在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口 7000 和 7001(在问题排查期间可能会使用 7000 作为备份选项)。另请参阅配置端口

您可以使用 ntpdate 等工具来验证服务器时间是否同步。


配置多区域种子主机

  1. 创建现有实例中 $INSTANCE_NAME 文件夹的副本,并将其添加到 instances 文件夹下。
  2. 如果命名空间字段的值与 instance1 命名空间不同,则对其进行修改。
  3. 按照指定入站流量 TLS 证书中指定的步骤,修改另一个实例的入站流量配置。
  4. 如需了解如何为另一个实例配置负载均衡器 IP,请参阅管理 Apigee 入站流量网关



  5. 在检索种子名称之前,将 kubectl 上下文设置为原始集群

    kubectl config use-context original-cluster-name
    
  6. 运行以下 kubectl 命令,以确定当前区域中 Cassandra 的种子主机地址。

    kubectl get pods -o wide -n apigee -l app=apigee-cassandra
    
  7. 上一个命令返回的任何 Pod IP 都可以被视为多区域种子主机。

  8. 在第 2 个实例中,在 ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/datastore/apigee-datastore.yaml 下配置 apigee 数据存储区 CR 中的 multiRegionSeedHost 的值

设置新实例

  1. 将上下文设置为现有集群

    kubectl config use-context existing-cluster-name
    
  2. 将 apigee-ca Secret 导出到文件中

    kubectl -n cert-manager get secret apigee-root-certificate -o yaml > apigee-root-certificate.yaml
    
  3. 将上下文设置为新区域的集群名称:

    kubectl config use-context NEW_CLUSTER_NAME
    
  4. 将 Secret 导入新集群

    kubectl -n cert-manager apply -f apigee-root-certificate.yaml
    
  5. 按照创建初始化资源和控制器中所述的步骤在新实例(区域)中安装 Hybrid。

  6. 在新数据中心中的所有 pod 上设置 Cassandra。 使用以下命令从集群中获取 apigeeorg:

    kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
    
  7. 创建 cassandra 数据复制自定义资源 (YAML) 文件。该文件可以采用任何名称。在以下示例中,该文件的名称为 datareplication.yaml。该文件必须包含以下内容

    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: CassandraDataReplication
    metadata:
    name: REGION_EXPANSION
    namespace: NAMESPACE
    spec:
    organizationRef: APIGEEORG_VALUE
    force: false
    source:
      region: SOURCE_REGION
    

    其中:

    • REGION_EXPANSION 是您为元数据指定的名称。您可以选择“cassandra-data-replication”之类的名称
    • NAMESPACE 是为第 2 个实例选择的同一命名空间。通常为“apigee”。
    • APIGEEORG_VALUE 是上一步骤中 kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name" 命令输出的值。
    • SOURCE_REGION 是来源集群中通过 nodetool 状态获得的 cassandra 数据中心的值
  8. 使用以下命令应用 CassandraDataReplication:

    kubectl apply -f datareplication.yaml
    
  9. 使用以下命令验证重新构建状态:



    kubectl -n apigee get apigeeds -o json | jq ".items[].status.cassandraDataReplication"
    

    结果应如下所示

    {
    "rebuildDetails": {
      "apigee-cassandra-default-0": {
        "state": "complete",
        "updated": 1623105760
      },
      "apigee-cassandra-default-1": {
        "state": "complete",
        "updated": 1623105765
      },
      "apigee-cassandra-default-2": {
        "state": "complete",
        "updated": 1623105770
      }
    },
    "state": "complete",
    "updated": 1623105770
    }
    
  10. 从日志中验证重建进程。此外,使用 nodetool 状态命令验证数据大小:

    kubectl logs apigee-cassandra-default-0 -f -n apigee
    

    请参阅 datastore/secrets.yaml 以了解 JMX_user 和 JMX_password

    kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u JMX_user -pw JMX_password status
    
  11. 从 apigee 数据存储区 CR 中移除 multiRegionSeedHost,然后运行以下命令以应用更改

    kubectl apply k apply -k ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/datastore
    
  12. 检查 Cassandra 集群状态

    以下命令可用于查看该集群在两个数据中心中是否成功设置。该命令会检查两个区域的 nodetool 状态。

    kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u JMX_user -pw JMX_password status
    
    
    Datacenter: us-central1
    =======================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
    UN  10.12.1.45  112.09 KiB  256          100.0%            3c98c816-3f4d-48f0-9717-03d0c998637f  ra-1
    UN  10.12.4.36  95.27 KiB  256          100.0%            0a36383d-1d9e-41e2-924c-7b62be12d6cc  ra-1
    UN  10.12.5.22  88.7 KiB   256          100.0%            3561f4fa-af3d-4ea4-93b2-79ac7e938201  ra-1
    Datacenter: us-west1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
    UN  10.0.4.33   78.69 KiB  256          100.0%               a200217d-260b-45cd-b83c-182b27ff4c99  ra-1
    UN  10.0.0.21   78.68 KiB  256          100.0%               9f3364b9-a7a1-409c-9356-b7d1d312e52b  ra-1
    UN  10.0.1.26   15.46 KiB  256          100.0%               1666df0f-702e-4c5b-8b6e-086d0f2e47fa  ra-1
    

问题排查

可支持性、诊断和问题排查指南

https://cloud.google.com/apigee/docs/api-platform/troubleshoot/playbooks/troubleshooting-apigee-hybrid.

在多区域 Apigee Hybrid 设置中使用 forceDelete 后进行手动清理

  • 以下示例中有 2 个区域 us-east1us-west1
  • us-west1 区域中,apigee 数据存储区已使用强制删除被删除。
  • us-east1 区域中,Cassandra 仍在启动并运行。
  • 使用命令验证 apigeeds 是否已删除

    kubectl get apigeeds -n apigee
    No resources found in apigee namespace.
    
  • 将 kubectl 上下文更改为 cassandra 集群仍在其中启动并运行的其他区域(此处为 us-east1 区域)。

  • 验证数据存储区是否处于正在运行状态

    kubectl get apigeeds -n apigee
    NAME      STATE     AGE
    default      running    23h
    
  • 对启动区域(此处为 us-east1 区域)中的一个 cassandra pod 执行 exec

    kubectl exec -it -n apigee apigee-cassandra-default-0 -- bash
    apigee@apigee-cassandra-default-0:~$
    
  • 检查 nodetool 状态,它将显示已删除区域(此处为 us-west1 区域)中所有关停的节点

    apigee@apigee-cassandra-default-0:~$ nodetool -u ${APIGEE_JMX_USER} -pw ${APIGEE_JMX_PASSWORD} status
    
    Datacenter: us-east1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --     Address         Load           Tokens   Owns    Host ID                                                           Rack
    UN  10.52.0.212   685.01 KiB  256          ?         e1aa61e3-4eae-4549-9b58-506d495d87ab   ra-1
    UN  10.52.0.72     606.75 KiB  256          ?         477dfc03-f93e-40ea-810a-d15769822ad5     ra-1
    UN  10.52.0.104   648.3 KiB    256          ?         a8854cff-c2e3-4f0c-a342-e692787efcab        ra-1
    Datacenter: us-west1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --     Address         Load             Tokens   Owns     Host ID                                                           Rack
    DN  10.60.0.143   567.06 KiB    256          ?           355d6ace-ab77-42cb-8138-9993bfd62d0e    ra-1
    DN  10.60.0.40     535.99 KiB    256          ?           4ed2c903-ff56-40fa-a15e-80a3de3cb22d      ra-1
    DN  10.60.0.17     573.08 KiB    256          ?           f9a50d19-c04a-4d0d-a088-612384bed9f5     ra-1
    
  • 移除已删除区域(此处为 us-west1 区域)中的所有节点

    apigee@apigee-cassandra-default-0:~$ nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD removenode 355d6ace-ab77-42cb-8138-9993bfd62d0e
    apigee@apigee-cassandra-default-0:~$ nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD removenode 4ed2c903-ff56-40fa-a15e-80a3de3cb22d
    apigee@apigee-cassandra-default-0:~$ nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD removenode f9a50d19-c04a-4d0d-a088-612384bed9f5
    
  • 验证已删除区域(此处为 us-west1 区域)的节点是否未保留

    apigee@apigee-cassandra-default-0:~$ nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD status
    
    
    Datacenter: us-east1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --     Address         Load             Tokens  Owns   Host ID                                                           Rack
    UN  10.52.0.212   699.71 KiB    256          ?        e1aa61e3-4eae-4549-9b58-506d495d87ab  ra-1
    UN  10.52.0.72     586.77 KiB    256          ?        477dfc03-f93e-40ea-810a-d15769822ad5    ra-1
    UN  10.52.0.104   623.6 KiB      256          ?        a8854cff-c2e3-4f0c-a342-e692787efcab       ra-1
    
  • 该操作完成后,删除启动区域(此处为 us-east1 区域)中的用户设置作业。系统将在几秒钟内自动重新创建作业。

    kubectl get jobs -n apigee
    
    
    ​​NAME                                                                                    COMPLETIONS   DURATION   AGE
    apigee-cassandra-schema-setup-apigee--0d2504c                    0/1           5m54s      5m54s
    apigee-cassandra-user-setup--apigee--0d2504c                          0/1            7s         7s
    
    
    kubectl delete job apigee-cassandra-user-setup--apigee--0d2504c
    
  • 等待用户设置作业完成

    kubectl get jobs -n apigee
    
    ​​NAME                                                                                    COMPLETIONS   DURATION   AGE
    apigee-cassandra-schema-setup-apigee--0d2504c                    1/1           5m54s      5m54s
    apigee-cassandra-user-setup--apigee--0d2504c                      1/1           7m                7m
    
  • 验证键空间没有已删除的区域。

  • 创建 cassandra 调试 pod。

    • 按照 Hybrid 1.5+ 版说明并按照 cassandra 问题排查指南文档操作(例如对于 Hybrid 1.5 - 链接、对于Hybrid 1.6 - 链接),然后对已创建的 pod 执行 exec
  • 使用以下命令在调试 Pod 中登录 cqlsh

    apigee@cassandra-debug-client:~$ cqlsh apigee-cassandra-default-0.apigee-cassandra-default.apigee.svc.cluster.local -u ddl_user --ssl
    Password:
    
  • 验证 us-west1 区域是否已从所有键空间中移除

    ddl_user@cqlsh> SELECT * FROM system_schema.keyspaces;
    
    keyspace_name              | durable_writes | replication
    ---------------------------+----------------+-----------------------------------------------------------------------------------
    cache_prince_hybrid_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
      rtc_prince_hybrid_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
                    system_auth |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
                  system_schema |           True |                            {'class': 'org.apache.cassandra.locator.LocalStrategy'}
    quota_prince_hybrid_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
      kms_prince_hybrid_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
             system_distributed |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
                         system |           True |                            {'class': 'org.apache.cassandra.locator.LocalStrategy'}
                         perses |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
      kvm_prince_hybrid_hybrid |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
                  system_traces |           True | {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'us-east1': '3'}
    (11 rows)