预览版用户指南:
Apigee Hybrid v1.8 的新安装和管理程序预览版。
文档内容:
- 预览
- 概览
- 前提条件
- 基本 Apigee Hybrid 安装
- 自定义 Apigee Hybrid 安装
- Kustomize 和组件
- 概念
- 了解脚本
- Apigee Hybrid 设置文件夹结构
- 将服务账号密钥存储在外部保险柜中
- Apigee Hybrid 升级
- Apigee Hybrid 回滚
- 清理
- 删除环境
- 多实例安装
预览
本文档适用于 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 的实际安装之前,您需要已完成文档的以下部分中列出的说明:
- 项目和组织设置
- 安装 Apigee Hybrid 的前提条件的概览。
- 第 1 步:启用 API
- 第 2 步:创建组织
- 第 3 步:创建环境和环境组
- 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 服务账号并将其用于各个组件
- 所有加密密钥和密码的默认值。
下载设置文件
通过在 https://github.com/apigee/apigee-hybrid-install/releases/tag/preview-1
克隆 GitHub 代码库来下载并准备设置文件:
克隆代码库:
git clone https://github.com/apigee/apigee-hybrid-install.git
进入克隆的代码库的目录:
cd apigee-hybrid-install
从 preview-1 标记创建一个分支:
git branch preview-1 preview-1 git checkout preview-1
将设置脚本设为可执行:
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 脚本自动执行单个步骤):
下载设置文件
下载并准备设置文件:
在
https://github.com/apigee/apigee-hybrid-install/
克隆 GitHub 代码库克隆的代码库的结构类似于 Apigee Hybrid 设置文件夹结构中所述的结构:
使用
cd
命令进入apigee-hybrid-install/
目录将设置脚本设为可执行:
chmod +x ./tools/apigee-hybrid-setup.sh
创建命名空间
在集群中创建 kubernetes 命名空间,其中包含所有 Apigee 集群组件。
kubectl create namespace apigee
如果您为命名空间选择其他名称,则可以按照以下三种方法之一操作:
- (推荐)在修改资源 yaml 中预填充值时使用
--namespace={YOUR_NAMESPACE_NAME}
。 运行以下两个命令:
使用
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
使用
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 映像(可选)
您可以选择不使用公开托管的映像,并且可以使用您自己的私有代码库中的映像:
- 第一步是将所有映像推送到您的私有代码库,您可以按照 apigee-pull-push | Apigee X 中的步骤完成此操作。默认情况下,映像使用其对应的 Apigee Hybrid 版本进行标记,建议您不要修改这些标记。我们还建议您不要修改映像名称,以便按照 Image Hub 中的说明构建最终映像路径。
将文件 apigee-hybrid-config.yaml 中存在的
imageHub
字段的值设置为私有代码库主机路径。(如需了解详情,请参阅 Image Hub。)imageHub: "your.private.repo/apigee/hybrid"
这会确保所有 Apigee Hybrid 组件都使用私有仓库中的映像。
除此之外,您可能还需要将私有映像用于控制器和 Apigee 入站流量网关,因此,您必须修改 apigee-controller-deployment.yaml 和 apigee-ingressgateway-manager-deployment.yaml 文件,并将所有 image
字段替换为其私有代码库中的映像。
配置 imagePullSecret(可选)
- 创建一个 kubernetes Secret,其中包含用于向私有代码库进行身份验证的凭据。请参阅从私有注册表中拉取映像,了解如何创建该 Secret。
- 创建 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 证书。您可以:
- 按照获取 TLS 证书:示例 | Apigee X 中所述的步骤,使用由已知授权机构签名的证书
- 或生成自签名证书。
在此处,我们以自签名证书为例。可通过以下方式生成自签名证书(假设 DOMAIN
已正确设置,并且应与 envgroup 中设置的主机名匹配):
openssl req -nodes -new -x509 -keyout ./tls.key -out ./tls.crt -subj '/CN='$DOMAIN'' -days 3650
这将创建名为 tls.key
和 tls.crt
的两个文件。
然后,您需要创建采用以下格式的 Secret;您可以按照使用证书签名授权机构的自定义证书/密钥对(可选)中所述,使用 kubectl create
或 kubectl 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-prod
或 apigee-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 根证书的命名空间。
- 修改用于创建证书的 customization.yaml 文件:
$INSTALL_DIR/overlays/initialization/certificates/kustomize.yaml
将以下内容添加到该文件的末尾:
- patch: |- - op: replace path: /metadata/namespace value: "gk-cert-manager" target: group: cert-manager.io version: v1 kind: Certificate name: apigee-root-certificate
保存文件。
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
中的列表
- (必需)将相关的 Secret 名称添加到
用法:
- 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
如果您已安装 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
- OPTIONAL(可选)将节点选择器标签的值从
apigee-runtime
或apigee-data
更改为所需的值。
- OPTIONAL(可选)将节点选择器标签的值从
用法:
- 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
如果您已安装 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
行。请注意,在遥测中,我们为 metrics
和 logger
组件使用不同的工作负载身份插件,这些组件可单独启用。
用法:
- 如果您尚未安装 Hybrid,则只需按照上一部分中所述启用 workload-identity,然后继续安装,安装随后会自动使用 workload-identity。
如果您已安装 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
:(必需)HTTP
或HTTPS
之一host
:(必需)代理的主机地址port
:(必需)端口号username
:OPTIONAL(可选)与代理关联的用户名password
:OPTIONAL(可选)用于访问代理的密码
用法:
- 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
如果您已安装 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
前提条件:
为具有 Storage Object Admin 角色的账号下载 Google Cloud 服务账号密钥。
- 如果您使用脚本执行安装,并且未使用 workload-identities,则可以重复使用在脚本创建的 service-accounts 文件夹下获得的已下载的密钥。
您还可以使用 create-service-account.sh 脚本来创建新的服务账号并下载其密钥:
./tools/create-service-accounts=.sh --env prod --profile apigee‑cassandra
下载密钥后,您需要创建一个名称为 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 相符。
- OPTIONAL(可选)将 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 相符。
- OPTIONAL(可选)将 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
- 使用新命名空间创建新的 Kubernetes 集群以在其中恢复 Hybrid 运行时部署。您不能使用用于原始 Hybrid 安装的同一集群/命名空间。
将 Hybrid 安装到配置了上述设置以及您所需的任何其他设置的新集群中:
- 您可以使用基本安装并在新命名空间中安装 Hybrid:
./tools/apigee-hybrid-setup.sh \ --cluster-name $CLUSTER_NAME \ --cluster-region $CLUSTER_LOCATION \ --namespace ${NEW_APIGEE_NAMESPACE}
- 或者,按照自定义 Apigee Hybrid 安装,根据您的选择进行配置。
恢复完成后,旧命名空间中的所有资源都可以删除并切换到新命名空间。
如需了解详情,请参阅恢复备份。
non-gcs-backup 和 non-gcs-restore
此 kustomize 组件可用于执行 cassandra 数据库到 Google Cloud Storage 的备份和恢复。
语言版本:
overlays/instances/{INSTANCE_NAME}/datastore
前提条件:
- 可以使用有关设置服务器和 SSH 的现有文档中的步骤。
在以上步骤中,您需要使用 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
- components/non-gcs-backup/cron-patch.yaml
- (必需)更改 spec.schedule 以指定备份的频率。字段接受标准 Crontab 时间安排格式。说明与此处所述的时间表相符。
- (必需)更改 BACKUP_SERVER_IP 的值。说明与此处所述的 BACKUP_SERVER_IP 相符。
- (必需)更改 BACKUP_STORAGE_DIR 的值。说明与此处所述的 BACKUP_STORAGE_DIR 相符。
- OPTIONAL(可选)将 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
- components/non-gcs-restore/job-patch.yaml
- (必需)更改
BACKUP_SNAPSHOT_TIMESTAMP
环境变量的值。说明与此处所述的restore:snapshotTimestamp
相符。 - (必需)更改
BACKUP_SERVER_IP
的值。说明与此处所述的BACKUP_SERVER_IP
相符。 - (必需)更改
BACKUP_STORAGE_DIR
的值。说明与此处所述的BACKUP_STORAGE_DIR
相符。 - OPTIONAL(可选)将
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 恢复概览。
- 使用新命名空间创建新的 Kubernetes 集群以在其中恢复 Hybrid 运行时部署。您不能使用用于原始 Hybrid 安装的同一集群/命名空间。
将 Hybrid 安装到配置了上述设置以及您所需的任何其他设置的新集群中:您可以使用基本安装并在新命名空间中安装 Hybrid:
./tools/apigee-hybrid-setup.sh \ --cluster-name $CLUSTER_NAME \ --cluster-region $CLUSTER_LOCATION \ --namespace ${NEW_APIGEE_NAMESPACE}
或者,按照自定义 Apigee Hybrid 安装,根据您的选择进行配置。
恢复完成后,旧命名空间中的所有资源都可以删除并切换到新命名空间。
如需了解详情,请参阅在远程服务器上安排备份。
http-client
如需查看相关说明,请参阅启用 HTTP 客户端 | Apigee。
语言版本:
- overlays/instances/${INSTANCE_NAME}/route-config/${ENV_GROUP}
启用:
取消备注相应 route-config/${ENV_GROUP}/kustomization.yaml
文件中的“./components/http-client
”行
要进行的修改:
- 无需进行任何强制性修改。
用法:
- 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
如果您已安装 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
相符。
- (必需)
用法:
- 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
如果您已安装 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
相符。
- (必需)
用法:
- 如果您尚未安装 Apigee Hybrid,则可以继续执行安装步骤并且这些更改将在此过程中应用
如果您已安装 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 的其他工作设置时,使用此组件基本上是合适的。
- 新集群和现有集群需要使用相同的 TLS 证书,以确保 Cassandra Pod 之间的正确通信。因此,我们需要从现有集群中复制
apigee-root-certificate
Secret 并将其用于较新的集群: 运行:
kubectl config get-contexts
- 如需获取所有 kubernetes 上下文的列表,请运行以下命令
kubectl config use-context SOURCE_CLUSTER_CONTEXT
其中,SOURCE_CLUSTER_CONTEXT 是来源 kubernetes 集群上下文的名称。
将根证书 Secret 存储在文件中:
kubectl get secret/apigee-root-certificate -n cert-manager -o yaml > apigee-root-certificate.yaml
将集群上下文切换到要在其中安装 Apigee Hybrid 的新集群。
kubectl config use-context ${NEW_CLUSTER_CONTEXT}
在新集群中创建根 Secret:
kubectl -n cert-manager apply -f apigee-root-certificate.yaml
禁止创建新的根证书。这将确保我们不会创建新的
apigee-root-certificate
,并最终覆盖在上一步中创建的证书。取消备注
overlays/initialization/certificates/kustomization.yaml
文件中的以下行:# components: # - ./components/disable-apigee-root-certificate-generation
使用基本 Apigee Hybrid 安装或自定义 Apigee Hybrid 安装继续执行 Apigee Hybrid 安装的其余步骤。例如,按照基本 Apigee Hybrid 安装操作,您可以执行以下命令:
./tools/apigee-hybrid-setup.sh --cluster-name $CLUSTER_NAME --cluster-region $CLUSTER_LOCATION
使用以下命令验证重新构建状态:
kubectl -n ${APIGEE_NAMESPACE} get apigeeds -o json | jq ".items[].status.cassandraDataReplication"
从日志中验证重建进程。此外,使用 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
使用以下命令验证重新构建状态:
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 }
另请参阅多区域部署。
从
components/multi-region/patch.yaml
中移除以下行:properties: multiRegionSeedHost: {IP_ADDRESS} # To be modified. REQUIRED
应用更改:
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)
└── ...
添加新环境就像执行以下操作一样简单:
- 在环境目录中创建新文件夹(或者您已构建文件夹结构)
- 将
apigee-environment.yaml
文件从任何现有环境复制到新文件夹中。 - 如果您希望为新环境创建新的服务账号和加密密钥,请将
secrets.yaml
复制到新文件夹中,并适当地重命名 Secret,以将新环境与其他现有环境区分开(这通常通过添加环境名称作为后缀来实现) - 对
apigee-environment.yaml
进行适当的更改,例如:- 更改环境名称
- 如果您要创建新的服务账号和加密密钥,则需要在 yaml 中正确引用它们。
- 应用
yaml
:
kubectl apply -f components/environments/new-env-name/secrets.yaml
kubectl apply -f components/environments/new-env-name/apigee-environment.yaml
在 Apigee 数据存储区中使用强制删除
如果数据存储区删除因任何原因没有进展,则现在无论集群的当前状态如何,都可以使用以下命令强制删除 apigee 数据存储区。
删除
apigee
命名空间中的apigeeds
:Kubectl delete -n apigee apigeeds default
如果此步骤卡住,您可以使用 CTRL + C 执行此操作。
修改新的
apigeeds
:Kubectl edit -n apigee apigeeds default
在 apigee 数据存储区规范中添加/更新 forceDelete 字段
spec: forceDelete: true
保存文件并退出。
现在,等待数据存储区被删除。删除所有 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
包含用于向网络钩子颁发证书的 Issuer
和 Certificate
资源。还包含用于为各种 Pod 颁发证书以进行 TLS 通信的 Issuer
。
rbac
包含由各种组件使用的 Role
、ClusterRole
、RoleBinding
和 ClusterRoleBinding
。
crds
Contains the definition of all the CRDs which are used by Apigee.
webhooks
包含用于对自定义资源执行验证的 ValidatingWebhookConfiguration
和 MutatingWebhookConfiguration
。
入站流量
包含适用于所有 Ingress POD 的配置。例如,常见的标头修改、健康检查等
openshift
包含 openshift SecurityContextConstraints 的定义。
控制器
apigee-controller
apigee-hybrid-config.yaml
包含 ConfigMap
,作为 apigee-controller-manager.yaml 中的输入提供。此 ConfigMap 包含 imageHub
、imagePullSecrets
、forwardProxy
等配置。
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 服务账号密钥。
- 我们将使用 Helm 在集群中安装与 Vault 相关的资源。请按照安装 Helm 中的步骤操作,了解如何在系统中设置 helm。
按照安装 Vault Helm 图表中的步骤操作,即:
将 Hashicorp 代码库添加到 helm 中
helm repo add hashicorp https://helm.releases.hashicorp.com
更新 helm 代码库
helm repo update
安装保险柜
helm install vault hashicorp/vault \ --set "server.dev.enabled=true" \ --set "injector.enabled=false" \ --set "csi.enabled=true"
现在,我们将 Secret 存储在 Vault 中。
在 vault dev pod 中获取 shell
kubectl exec -it vault-0 -- /bin/sh ```
在此示例中,我们将使用键值 Secret 引擎来存储数据。
vault kv put secret/runtime-gcp-sa-key key="${BASE_64_ENCODED_KEY}"
如需验证密钥是否已成功存储,请使用:
vault kv get secret/runtime-gcp-sa-key
设置身份验证,以允许运行时 Pod 拉取密钥。如 Kubernetes 服务账号中所述,kubernetes 服务账号会为 pod 提供身份,并允许 pod 向其他系统进行身份验证。
在 vault dev pod 中获取 shell
kubectl exec -it vault-0 -- /bin/sh
启用 Kubernetes 身份验证方法
vault auth enable kubernetes
编写身份验证配置
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
创建身份验证政策
vault policy write apigee-runtime-app - <<EOF path "secret/data/runtime-gcp-sa-key" { capabilities = ["read"] } EOF
将此政策与服务账号绑定
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 的命名空间,则将使用该名称。
在 vault-0 内退出 shell
exit
安装 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
创建
SecretProviderClass
kubernetes 资源,以引用您在 Vault 中创建的 Secretcat > 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
应用
yaml
kubectl apply -f spc-vault.yaml
创建我们在步骤 (4.e) 中向其分配的权限的 kubernetes 服务账号
kubectl create serviceaccount -n ${APIGEE_NAMESPACE} apigee-runtime-sa
为环境修改 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"
应用更改:
kubectl apply -k ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/environments/$ENV_NAME
Apigee Hybrid 升级
您应已完成前提条件中提到的所有要求。此外,建议您对所有组件执行滚动重启,以检查集群健康状况是否良好。重启的顺序是 Cassandra、Redis、ApigeeOrganization 和 ApigeeEnvironment。
创建备份
创建当前 Hybrid 设置的备份副本。如果您需要将升级回滚到当前版本,则需要进行备份。
tar -czvf apigee-hybrid-install.v-X.Y.Z.tar.gz $HYBRID_INSTALL_BASE_DIR
创建 cassandra 数据库的备份。Cassandra 备份是防范灾难场景的重要措施。
根据需要升级 Kubernetes 平台
此步骤不是每次都必须执行的步骤,但如果较新版本的 Apigee Hybrid 不再支持,则您需要升级 kubernetes、openshift 等 Kubernetes 平台以及 cert-manager、cassandra 等版本的组件。文档包含支持的平台和组件版本。
下载设置文件
下载代码库并将现有 Apigee Hybrid 设置中的 bases
和 tools
文件夹替换为一个较新的文件夹:
在
https://github.com/apigee/apigee-hybrid-install/releases/tag/preview-1
克隆 GitHub 代码库 preview-1 标记克隆的代码库的结构类似于 Apigee Hybrid 设置文件夹结构中所述的结构:
替换现有 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 回滚
恢复 apigee-hybrid-setup
移到包含先前版本的 Apigee Hybrid 设置的目录。如果不可用,请通过 Apigee Hybrid 升级期间的第 1 步 [链接] 中创建的 zip 文件进行恢复。
回滚 Kubernetes 组件
应用 Apigee CR 的更改
kubectl apply -k ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}
回滚控制器
按照 Apigee Hybrid 安装工作流的创建初始化资源和控制器中提供的同一组步骤操作。您可以使用脚本,也可以按照提供的手动步骤来回滚初始化资源和控制器。
清理
您需要清理升级期间创建的所有额外的新资源,例如较新版本的 Hybrid 中引入的新组件或服务账号。升级指南中提供了需要清理的所有资源以及清理这些资源的步骤。
删除环境
下面是从 kubernetes 集群中删除与环境相关的所有资源的步骤:
获取环境 CR 的名称。此操作可通过获取所有环境来完成:
kubectl get env -n ${APIGEE_NAMESPACE}
将资源名称存储在
APIGEE_ENV
环境变量中。删除环境加密密钥。例如,如果您尚未更改加密密钥的名称,则可以使用以下命令将其删除:
kubectl delete secret -n ${APIGEE_NAMESPACE} $APIGEE_ENV-encryption-keys
删除 Google Cloud 服务账号 Secret:
kubectl delete secret -n ${APIGEE_NAMESPACE} $(kubectl get env $APIGEE_ENV -n ${APIGEE_NAMESPACE} -o=jsonpath='{.spec.components.*.appServiceAccountSecretName}')
删除 kubernetes 服务账号:
kubectl delete secret -n ${APIGEE_NAMESPACE} $(kubectl get env $APIGEE_ENV -n ${APIGEE_NAMESPACE} -o=jsonpath='{.spec.components.*.podServiceAccountName}')
删除 Apigee 环境自定义资源:
kubectl -n ${APIGEE_NAMESPACE} delete env $APIGEE_ENV
删除 Hybrid 设置
下面是从 kubernetes 集群中删除与 Apigee Hybrid 相关的所有资源的步骤:
您需要删除 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')
您需要删除已部署的 Apigee Hybrid 数据平面组件。使用以下命令以删除所有组件:
kubectl delete -k ${INSTALL_DIR}/overlays/instances/$INSTANCE_NAME
仅当您不依赖于 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}')
对于 OpenShift,您需要删除安装 Apigee Hybrid 期间创建的 scc(安全上下文限制条件)。
kubectl delete scc ${SECURITY_CONTEXT_CONSTRAINTS_NAME}
运行以下命令以删除角色、角色绑定、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
运行以下命令以删除 apigee 命名空间
kubectl delete -f ${INSTALL_DIR}/overlays/initialization/namespace.yaml
或者,使用以下命令:
kubectl delete $APIGEE_NAMESPACE
多实例安装
多实例设置是指可以跨越多个区域或位于同一区域中的 Hybrid 设置。Apigee 建议在单独的目录结构中以环境配置(副本等)的形式组织第 2 个实例的配置始终在实例之间有所不同。每个实例的配置都是分离的,且按各自的文件夹结构进行独立组织。
例如:对于多区域场景中的主动-被动设置,您可能需要在热备用中配置大小和配置不同的第 2 个区域。
在下面的文件夹结构中,您可以创建 instance1 目录的副本(名为 instance1),并根据需要修改数据存储区和入站流量配置。
下面是多实例设置的 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 等工具来验证服务器时间是否同步。
配置多区域种子主机
- 创建现有实例中 $INSTANCE_NAME 文件夹的副本,并将其添加到 instances 文件夹下。
- 如果命名空间字段的值与 instance1 命名空间不同,则对其进行修改。
- 按照指定入站流量 TLS 证书中指定的步骤,修改另一个实例的入站流量配置。
如需了解如何为另一个实例配置负载均衡器 IP,请参阅管理 Apigee 入站流量网关
在检索种子名称之前,将 kubectl 上下文设置为原始集群
kubectl config use-context original-cluster-name
运行以下 kubectl 命令,以确定当前区域中 Cassandra 的种子主机地址。
kubectl get pods -o wide -n apigee -l app=apigee-cassandra
上一个命令返回的任何 Pod IP 都可以被视为多区域种子主机。
在第 2 个实例中,在 ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/datastore/apigee-datastore.yaml 下配置 apigee 数据存储区 CR 中的 multiRegionSeedHost 的值
设置新实例
将上下文设置为现有集群
kubectl config use-context existing-cluster-name
将 apigee-ca Secret 导出到文件中
kubectl -n cert-manager get secret apigee-root-certificate -o yaml > apigee-root-certificate.yaml
将上下文设置为新区域的集群名称:
kubectl config use-context NEW_CLUSTER_NAME
将 Secret 导入新集群
kubectl -n cert-manager apply -f apigee-root-certificate.yaml
按照创建初始化资源和控制器中所述的步骤在新实例(区域)中安装 Hybrid。
在新数据中心中的所有 pod 上设置 Cassandra。 使用以下命令从集群中获取 apigeeorg:
kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
创建 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 数据中心的值
使用以下命令应用 CassandraDataReplication:
kubectl apply -f datareplication.yaml
使用以下命令验证重新构建状态:
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 }
从日志中验证重建进程。此外,使用 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
从 apigee 数据存储区 CR 中移除
multiRegionSeedHost
,然后运行以下命令以应用更改kubectl apply k apply -k ${INSTALL_DIR}/overlays/instances/${INSTANCE_DIR}/datastore
检查 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
问题排查
可支持性、诊断和问题排查指南
在多区域 Apigee Hybrid 设置中使用 forceDelete 后进行手动清理
- 以下示例中有 2 个区域
us-east1
和us-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 执行 execkubectl 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。
使用以下命令在调试 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)