本主题介绍 GKE 上的 Apigee Hybrid 多区域部署、本地部署的 Anthos GKE、Microsoft® Azure Kubernetes Service (AKS)、Amazon Elastic Kubernetes Service (EKS) 和 RedHat OpenShift。在前提条件和过程中选择您的平台。
多区域部署的拓扑包括以下内容:
- 主动-主动:您的应用部署在多个地理位置,并且您的部署需要低延迟时间 API 响应时。您可以选择在距离您客户端最近的多个地理位置部署 Hybrid。例如:美国西海岸、美国东海岸、欧洲、亚太区域。
- 主动-被动:您拥有主要区域和故障切换或灾难恢复区域时。
多区域混合部署中的区域通过 Cassandra 通信,如下图所示:
前提条件
在为多个区域配置 Hybrid 之前,您必须先满足以下前提条件:
GKE
- 在不同的网络(例如不同的云服务提供商、不同的 VPC 网络、云端和本地等)之间安装多区域 Apigee 部署时,您必须在这些不同网络之间提供内部连接,以供 Cassandra 用于在节点之间进行通信。 这可以通过 VPN 或云专用的连接解决方案来实现。
- 如果您使用 Workload Identity 对服务账号进行身份验证,则您扩展到的每个集群还必须使用 Workload Identity。请参阅使用 Apigee Hybrid 启用 Workload Identity。
- 在多个具有不同 CIDR 块的区域中设置 Kubernetes 集群
- 确保每个集群中都安装了 cert-manager
- 设置跨区域通信
- 确保所有 Cassandra pod 都能够解析自己的主机名。如果 hostNetwork 设置为 false,则主机名是 Cassandra pod 名称。如果 hostNetwork 设置为 true,则主机名是运行 Cassandra pod 的 Kubernetes 节点主机名。
- Cassandra 多区域要求:
- 确保 pod 网络命名空间具有跨区域的连接,包括防火墙、vpn、vpc 对等互连和 vNet 对等互连。大多数 GKE 安装都是如此。
- 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置
cassandra.hostNetwork: true
,以启用 KuberneteshostNetwork
功能。如需详细了解使用
hostNetwork
的需求,请参阅下面的孤岛模式集群和 hostNetwork。 - 请先在现有集群上启用
hostNetwork
,然后再将多区域配置扩展到新区域。 - 启用
hostNetwork
后,请确保工作器节点可以执行其主机名的正向 DNS 查找。Apigee Cassandra 使用正向 DNS 查找在启动时获取主机 IP。 - 在跨所有区域的 Kubernetes 集群之间打开 TCP 端口 7001,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口。
如需了解详情,请参阅 Kubernetes 文档。
GKE On-Prem
- 在不同的网络(例如不同的云服务提供商、不同的 VPC 网络、云端和本地等)之间安装多区域 Apigee 部署时,您必须在这些不同网络之间提供内部连接,以供 Cassandra 用于在节点之间进行通信。 这可以通过 VPN 或云专用的连接解决方案来实现。
- 在多个具有不同 CIDR 块的区域中设置 Kubernetes 集群
- 确保每个集群中都安装了 cert-manager
- 设置跨区域通信
- 确保所有 Cassandra pod 都能够解析自己的主机名。如果 hostNetwork 设置为 false,则主机名是 Cassandra pod 名称。如果 hostNetwork 设置为 true,则主机名是运行 Cassandra pod 的 Kubernetes 节点主机名。
- Cassandra 多区域要求:
- 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行,这是 GKE On-Prem 安装的默认情况),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置
cassandra.hostNetwork: true
,以启用 KuberneteshostNetwork
功能。如需详细了解使用
hostNetwork
的需求,请参阅下面的孤岛模式集群和 hostNetwork。 - 请先在现有集群上启用
hostNetwork
,然后再将多区域配置扩展到新区域。 - 启用
hostNetwork
后,请确保工作器节点可以执行其主机名的正向 DNS 查找。Apigee Cassandra 使用正向 DNS 查找在启动时获取主机 IP。 - 在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口。
- 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行,这是 GKE On-Prem 安装的默认情况),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置
如需了解详情,请参阅 Kubernetes 文档。
AKS
- 在不同的网络(例如不同的云服务提供商、不同的 VPC 网络、云端和本地等)之间安装多区域 Apigee 部署时,您必须在这些不同网络之间提供内部连接,以供 Cassandra 用于在节点之间进行通信。 这可以通过 VPN 或云专用的连接解决方案来实现。
- 按照混合安装指南中的说明,在移到集群设置步骤之前,先满足 Google Cloud 和组织配置等前提条件。
- 确保每个集群中都安装了 cert-manager
- 确保所有 Cassandra pod 都能够解析自己的主机名。如果 hostNetwork 设置为 false,则主机名是 Cassandra pod 名称。如果 hostNetwork 设置为 true,则主机名是运行 Cassandra pod 的 Kubernetes 节点主机名。
- Cassandra 多区域要求:
- 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行,这是 AKS 安装的默认情况),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置
cassandra.hostNetwork: true
,以启用 KuberneteshostNetwork
功能。如需详细了解使用
hostNetwork
的需求,请参阅下面的孤岛模式集群和 hostNetwork。 - 请先在现有集群上启用
hostNetwork
,然后再将多区域配置扩展到新区域。 - 启用
hostNetwork
后,请确保工作器节点可以执行其主机名的正向 DNS 查找。Apigee Cassandra 使用正向 DNS 查找在启动时获取主机 IP。 - 在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口。
- 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行,这是 AKS 安装的默认情况),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置
如需了解详情,请参阅 Kubernetes 文档。
EKS
- 在不同的网络(例如不同的云服务提供商、不同的 VPC 网络、云端和本地等)之间安装多区域 Apigee 部署时,您必须在这些不同网络之间提供内部连接,以供 Cassandra 用于在节点之间进行通信。 这可以通过 VPN 或云专用的连接解决方案来实现。
- 按照混合安装指南中的说明,在移到集群设置步骤之前,先满足 Google Cloud 和组织配置等前提条件。
- 确保每个集群中都安装了 cert-manager
- 确保所有 Cassandra pod 都能够解析自己的主机名。如果 hostNetwork 设置为 false,则主机名是 Cassandra pod 名称。如果 hostNetwork 设置为 true,则主机名是运行 Cassandra pod 的 Kubernetes 节点主机名。
- Cassandra 多区域要求:
- 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置
cassandra.hostNetwork: true
,以启用 KuberneteshostNetwork
功能。默认情况下,Amazon EKS 使用完全集成的网络模型。如需详细了解使用
hostNetwork
的需求,请参阅下面的孤岛模式集群和 hostNetwork。 - 请先在现有集群上启用
hostNetwork
,然后再将多区域配置扩展到新区域。 - 启用
hostNetwork
后,请确保工作器节点可以执行其主机名的正向 DNS 查找。Apigee Cassandra 使用正向 DNS 查找在启动时获取主机 IP。 - 在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口。
- 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置
如需了解详情,请参阅 Kubernetes 文档。
OpenShift
- 在不同的网络(例如不同的云服务提供商、不同的 VPC 网络、云端和本地等)之间安装多区域 Apigee 部署时,您必须在这些不同网络之间提供内部连接,以供 Cassandra 用于在节点之间进行通信。 这可以通过 VPN 或云专用的连接解决方案来实现。
- 按照混合安装指南中的说明,在移到集群设置步骤之前,先满足 Google Cloud 和组织配置等前提条件。
- 确保每个集群中都安装了 cert-manager
- 确保所有 Cassandra pod 都能够解析自己的主机名。如果 hostNetwork 设置为 false,则主机名是 Cassandra pod 名称。如果 hostNetwork 设置为 true,则主机名是运行 Cassandra pod 的 Kubernetes 节点主机名。
- Cassandra 多区域要求:
- 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行,这是 OpenShift 安装的默认情况),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置
cassandra.hostNetwork: true
,以启用 KuberneteshostNetwork
功能。如需详细了解使用
hostNetwork
的需求,请参阅下面的孤岛模式集群和 hostNetwork。 - 请先在现有集群上启用
hostNetwork
,然后再将多区域配置扩展到新区域。 - 启用
hostNetwork
后,请确保工作器节点可以执行其主机名的正向 DNS 查找。Apigee Cassandra 使用正向 DNS 查找在启动时获取主机 IP。 - 在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口。
- 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行,这是 OpenShift 安装的默认情况),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置
如需了解详情,请参阅 Kubernetes 文档。
孤岛模式集群和 hostNetwork
Kubernetes 集群有两种主要网络模型:完全集成(或平面)和孤岛模式。Apigee 建议尽可能使用平面网络模型,因为它可以简化多区域 Cassandra 连接。在孤岛模式下配置 Kubernetes 集群时,Pod 网络是隔离的。Pod 无法使用 Pod IP 地址与其他集群中运行的 Pod 直接通信。如需详细了解这两种网络模型之间的差异以及每种模型的示例,请参阅典型的网络模型实现。
当 Apigee Hybrid 使用孤岛模式网络模型在两个或多个 Kubernetes 集群上运行时,需要通过 cassandra.hostNetwork 属性启用 Cassandra 的 hostNetwork
设置。默认情况下,Kubernetes Pod 被隔离到单独的网络命名空间中,从而阻止其使用 Kubernetes 工作器节点 IP 地址。当 hostNetwork
设置为 true
时,Pod 不会隔离在自己的网络命名空间中,而是使用 Pod 调度到的 Kubernetes 工作器节点的 IP 地址和主机名。这样,Cassandra 便能以原生方式使用 Kubernetes 工作器节点 IP 作为其 IP,使 Cassandra 能够在以孤岛模式运行的多个集群中的所有 Cassandra Pod 之间建立全网状拓扑。
Cassandra 主机名解析
虽然 Cassandra Pod 不会按主机名解析其他 Cassandra Pod,但在启动时,Cassandra 会检查其主机名是否可被 DNS 解析。由于 hostNetwork
设置为 true 时,Pod 主机名与 Kubernetes 工作器节点主机名相同,因此工作器节点主机名必须能够通过集群 DNS 服务解析为 IP 地址。如果 Kubernetes 工作器节点主机名无法解析,则 Cassandra Pod 将无法完全启动。因此,在将 hostNetwork
设置为 true
时,Kubernetes 工作器节点主机名必须能够从集群中的 Pod 进行解析。
为多区域配置 Apigee Hybrid
本部分介绍如何为多区域配置 Apigee Hybrid。
GKE
配置多区域种子主机
本部分介绍如何将现有 Cassandra 集群扩展到新区域。 此设置允许新区域引导集群并加入现有数据中心。如果没有此配置,多区域 Kubernetes 集群不会相互了解。
- 在检索种子名称之前,将 kubectl 上下文设置为原始集群:
kubectl config use-context original-cluster-name
运行以下
kubectl
命令,确定当前区域中 Cassandra 的种子宿主机地址。种子宿主机地址允许新区域实例在第一次启动时查找原始集群,以了解集群的拓扑。种子主机地址被指定为集群中的联络点。
kubectl get pods -o wide -n apigee -l app=apigee-cassandra --field-selector status.phase=Running
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
- 确定上一个命令返回的哪些 IP 地址将成为多区域种子宿主机。
- 在数据中心 2 中,在管理运行时平面组件中配置
cassandra.multiRegionSeedHost
和cassandra.datacenter
,其中multiRegionSeedHost
是上一个命令返回的其中一个 IP:cassandra: multiRegionSeedHost: seed_host_IP datacenter: data_center_name rack: rack_name hostNetwork: false clusterName: cluster_name # must be the same for all regions
例如:
cassandra: multiRegionSeedHost: 10.0.0.11 datacenter: "dc-2" rack: "ra-1" hostNetwork: false clusterName: my-apigee-cluster
- 在新数据中心/区域中,安装 Hybrid 之前,在
overrides.yaml
中设置您在第一个区域中设置的相同 TLS 证书和凭据。
设置新区域
配置种子主机后,您可以设置新区域。
要设置新区域,请执行以下操作:
- 将证书从现有集群复制到新集群。Cassandra 和其他混合组件会将新 CA 根用于 mTLS。因此,务必确保集群具有一致的证书。
- 将上下文设置为原始命名空间:
kubectl config use-context original-cluster-name
- 将当前命名空间配置导出到文件:
kubectl get namespace namespace -o yaml > apigee-namespace.yaml
- 将
apigee-ca
Secret 导出到文件:kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
- 将上下文设置为新区域的集群名称:
kubectl config use-context new-cluster-name
- 将命名空间配置导入新集群。如果您在新区域中使用不同的命名空间,请务必更新文件中的“命名空间”:
kubectl apply -f apigee-namespace.yaml
将密钥导入新集群:
kubectl -n cert-manager apply -f apigee-ca.yaml
- 将上下文设置为原始命名空间:
- 在新区域中安装 Hybrid。请确保
overrides-DC_name.yaml
文件包含在第一个区域中配置的相同 TLS 证书,如上一部分所述。执行以下两个命令以在新区域中安装 Hybrid:
apigeectl init -f overrides/overrides-DC_name.yaml
apigeectl apply -f overrides/overrides-DC_name.yaml
- 通过运行以下命令来验证 Hybrid 安装是否成功:
apigeectl check-ready -f overrides_DC_name.yaml
- 通过运行以下命令来验证 Cassandra 集群设置。输出应显示现有和新的数据中心。
kubectl exec apigee-cassandra-default-0 -n apigee \ -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
显示成功设置的示例:
Datacenter: dc-1 ==================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns Host ID Rack UN 10.132.87.93 68.07 GiB 256 ? fb51465c-167a-42f7-98c9-b6eba1de34de c UN 10.132.84.94 69.9 GiB 256 ? f621a5ac-e7ee-48a9-9a14-73d69477c642 b UN 10.132.84.105 76.95 GiB 256 ? 0561086f-e95b-4232-ba6c-ad519ff30336 d Datacenter: dc-2 ==================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns Host ID Rack UN 10.132.0.8 71.61 GiB 256 ? 8894a98b-8406-45de-99e2-f404ab10b5d6 c UN 10.132.9.204 75.1 GiB 256 ? afa0ffa3-630b-4f1e-b46f-fc3df988092e a UN 10.132.3.133 68.08 GiB 256 ? 25ae39ab-b39e-4d4f-9cb7-de095ab873db b
- 在新数据中心中的所有 pod 上设置 Cassandra。
- 使用以下命令从集群中获取
apigeeorg
:kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
例如:
Ex: kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name" "rg-hybrid-b7d3b9c"
- 创建 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 是您为此元数据指定的名称。您可以使用任意名称。
- NAMESPACE 是
overrides.yaml
中提供的同一命名空间。它通常为“apigee
”。 - APIGEEORG_VALUE 是上一步中
kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
命令的输出值。例如rg-hybrid-b7d3b9c
- SOURCE_REGION 是来源区域,它是来自来源区域 overrides.yaml 的 cassandra 部分下的数据中心值
例如:
apiVersion: apigee.cloud.google.com/v1alpha1 kind: CassandraDataReplication metadata: name: region-expansion namespace: apigee spec: organizationRef: rg-hybrid-b7d3b9c force: false source: region: "dc-1"
- 使用以下命令应用
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 status
命令验证数据大小。kubectl logs apigee-cassandra-default-0 -f -n apigee
kubectl exec apigee-cassandra-default-0 -n apigee -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
以下示例显示了日志条目示例:
INFO 01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens) INFO 01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild INFO 01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB) INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22 INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB) INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22 INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB) INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
- 更新种子主机。从
overrides-DC_name.yaml
中移除multiRegionSeedHost: 10.0.0.11
并重新应用。apigeectl apply -f overrides/overrides-DC_name.yaml
检查 Cassandra 集群状态
以下命令可用于查看该集群在两个数据中心中是否成功设置。该命令将检查两个区域的 nodetool 状态。
kubectl exec apigee-cassandra-default-0 -n apigee -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status Datacenter: dc-1 ======================= 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
GKE On-Prem
配置多区域种子主机
本部分介绍如何将现有 Cassandra 集群扩展到新区域。 此设置允许新区域引导集群并加入现有数据中心。如果没有此配置,多区域 Kubernetes 集群不会相互了解。
- 在原始集群的
overrides.yaml
文件中,确保将cassandra:hostNetwork
设置为true
。例如:cassandra: hostNetwork: true
如需详细了解何时设置
hostNetwork: true
,请参阅前提条件。 - 如果
cassandra:hostNetwork
未设置为true
,请执行以下操作:-
将
cassandra.hostNetwork
更改为true
。 -
使用以下命令应用
overrides.yaml
配置文件:apigeectl apply -f overrides.yaml --datastore
- 等待 Cassandra pod 完成滚动重启。
-
使用以下命令验证 Cassandra 集群的运行状况是否良好:
kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
确保输出中的所有 Cassandra 节点处于 UN(启动/正常)状态:
nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD describecluster
确保输出中未列出任何无法访问的节点。
-
将
- 在检索种子名称之前,将 kubectl 上下文设置为原始集群:
kubectl config use-context original-cluster-name
运行以下
kubectl
命令,确定当前区域中 Cassandra 的种子宿主机地址。种子宿主机地址允许新区域实例在第一次启动时查找原始集群,以了解集群的拓扑。种子主机地址被指定为集群中的联络点。
kubectl get pods -o wide -n apigee -l app=apigee-cassandra --field-selector status.phase=Running
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
- 确定上一个命令返回的哪些 IP 地址将成为多区域种子宿主机。
-
在数据中心 2 中,在替换文件中配置
cassandra.multiRegionSeedHost
,其中multiRegionSeedHost
是上一个命令返回的其中一个 IP:cassandra: hostNetwork: true multiRegionSeedHost: seed_host_IP datacenter: data_center_name rack: rack_name clusterName: cluster_name # must be the same for all regions
例如:
cassandra: hostNetwork: true multiRegionSeedHost: 10.0.0.11 datacenter: "dc-2" rack: "ra-1" clusterName: my-apigee-cluster
- 在新数据中心/区域中,安装 Hybrid 之前,在
overrides.yaml
中设置您在第一个区域中设置的相同 TLS 证书和凭据。
设置新区域
配置种子主机后,您可以设置新区域。
要设置新区域,请执行以下操作:
- 将证书从现有集群复制到新集群。Cassandra 和其他混合组件会将新 CA 根用于 mTLS。因此,务必确保集群具有一致的证书。
- 将上下文设置为原始命名空间:
kubectl config use-context original-cluster-name
- 将当前命名空间配置导出到文件:
kubectl get namespace namespace -o yaml > apigee-namespace.yaml
- 将
apigee-ca
Secret 导出到文件:kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
- 将上下文设置为新区域的集群名称:
kubectl config use-context new-cluster-name
- 将命名空间配置导入新集群。如果您在新区域中使用不同的命名空间,请务必更新文件中的“命名空间”:
kubectl apply -f apigee-namespace.yaml
将密钥导入新集群:
kubectl -n cert-manager apply -f apigee-ca.yaml
- 将上下文设置为原始命名空间:
- 在新区域中安装 Hybrid。请确保
overrides-DC_name.yaml
文件包含在第一个区域中配置的相同 TLS 证书,如上一部分所述。执行以下两个命令以在新区域中安装 Hybrid:
apigeectl init -f overrides/overrides-DC_name.yaml
apigeectl apply -f overrides/overrides-DC_name.yaml
- 通过运行以下命令来验证 Hybrid 安装是否成功:
apigeectl check-ready -f overrides_DC_name.yaml
- 通过运行以下命令来验证 Cassandra 集群设置。输出应显示现有和新的数据中心。
kubectl exec apigee-cassandra-default-0 -n apigee \ -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
显示成功设置的示例:
Datacenter: dc-1 ==================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns Host ID Rack UN 10.132.87.93 68.07 GiB 256 ? fb51465c-167a-42f7-98c9-b6eba1de34de c UN 10.132.84.94 69.9 GiB 256 ? f621a5ac-e7ee-48a9-9a14-73d69477c642 b UN 10.132.84.105 76.95 GiB 256 ? 0561086f-e95b-4232-ba6c-ad519ff30336 d Datacenter: dc-2 ==================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns Host ID Rack UN 10.132.0.8 71.61 GiB 256 ? 8894a98b-8406-45de-99e2-f404ab10b5d6 c UN 10.132.9.204 75.1 GiB 256 ? afa0ffa3-630b-4f1e-b46f-fc3df988092e a UN 10.132.3.133 68.08 GiB 256 ? 25ae39ab-b39e-4d4f-9cb7-de095ab873db b
- 在新数据中心中的所有 pod 上设置 Cassandra。
- 使用以下命令从集群中获取
apigeeorg
:kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
例如:
Ex: kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name" "rg-hybrid-b7d3b9c"
- 创建 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 是您为此元数据指定的名称。您可以使用任意名称。
- NAMESPACE 是
overrides.yaml
中提供的同一命名空间。它通常为“apigee
”。 - APIGEEORG_VALUE 是上一步中
kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
命令的输出值。例如rg-hybrid-b7d3b9c
- SOURCE_REGION 是来源区域,它是来自来源区域 overrides.yaml 的 cassandra 部分下的数据中心值
例如:
apiVersion: apigee.cloud.google.com/v1alpha1 kind: CassandraDataReplication metadata: name: region-expansion namespace: apigee spec: organizationRef: rg-hybrid-b7d3b9c force: false source: region: "dc-1"
- 使用以下命令应用
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 status
命令验证数据大小。kubectl logs apigee-cassandra-default-0 -f -n apigee
kubectl exec apigee-cassandra-default-0 -n apigee -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
以下示例显示了日志条目示例:
INFO 01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens) INFO 01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild INFO 01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB) INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22 INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB) INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22 INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB) INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
- 更新种子主机。从
overrides-DC_name.yaml
中移除multiRegionSeedHost: 10.0.0.11
并重新应用。apigeectl apply -f overrides/overrides-DC_name.yaml
检查 Cassandra 集群状态
以下命令可用于查看该集群在两个数据中心中是否成功设置。该命令将检查两个区域的 nodetool 状态。
kubectl exec apigee-cassandra-default-0 -n apigee -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status Datacenter: dc-1 ======================= 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
AKS
在每个区域中创建虚拟网络
按照此处的 Azure 建议建立跨区域通信:VNet 到 VNet:跨不同区域连接 Azure 中的虚拟网络。
创建多区域集群
在多个具有不同 CIDR 块的区域中设置 Kubernetes 集群。另请参阅“第 1 步:创建集群”。使用您之前创建的位置和虚拟网络名称。
在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口。
配置多区域种子主机
本部分介绍如何将现有 Cassandra 集群扩展到新区域。 此设置允许新区域引导集群并加入现有数据中心。如果没有此配置,多区域 Kubernetes 集群不会相互了解。
- 在原始集群的
overrides.yaml
文件中,确保将cassandra:hostNetwork
设置为true
。例如:cassandra: hostNetwork: true
如需详细了解何时设置
hostNetwork: true
,请参阅前提条件。 - 如果
cassandra:hostNetwork
未设置为true
,请执行以下操作:-
将
cassandra.hostNetwork
更改为true
。 -
使用以下命令应用
overrides.yaml
配置文件:apigeectl apply -f overrides.yaml --datastore
- 等待 Cassandra pod 完成滚动重启。
-
使用以下命令验证 Cassandra 集群的运行状况是否良好:
kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
确保输出中的所有 Cassandra 节点处于 UN(启动/正常)状态:
nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD describecluster
确保输出中未列出任何无法访问的节点。
-
将
- 在检索种子名称之前,将 kubectl 上下文设置为原始集群:
kubectl config use-context original-cluster-name
运行以下
kubectl
命令,确定当前区域中 Cassandra 的种子宿主机地址。种子宿主机地址允许新区域实例在第一次启动时查找原始集群,以了解集群的拓扑。种子主机地址被指定为集群中的联络点。
kubectl get pods -o wide -n apigee -l app=apigee-cassandra --field-selector status.phase=Running
apigee-cassandra-default-0 1/1 Running 0 4d17h 120.38.1.9 aks-agentpool-21207753-vmss000000
-
确定上一个命令返回的哪些 IP 地址将成为多区域种子宿主机。 在本示例中,只有一个节点 Cassandra 集群正在运行时,种子宿主机为
120.38.1.9
。 - 在数据中心 2 中,将替换文件复制到名称包含集群名称的新文件。例如:
overrides_your_cluster_name.yaml
。 - 在数据中心 2 中,在
overrides_your_cluster_name.yaml
中配置cassandra.multiRegionSeedHost
和cassandra.datacenter
,其中multiRegionSeedHost
是上一个命令返回的其中一个 IP:cassandra: multiRegionSeedHost: seed_host_IP datacenter: data_center_name rack: rack_name hostNetwork: true clusterName: cluster_name # must be the same for all regions
例如:
cassandra: multiRegionSeedHost: 120.38.1.9 datacenter: "centralus" rack: "ra-1" hostNetwork: true clusterName: my-apigee-cluster
- 在新数据中心/区域中,安装 Hybrid 之前,在
overrides_your_cluster_name.yaml
中设置您在第一个区域中设置的相同 TLS 证书和凭据。
设置新区域
配置种子主机后,您可以设置新区域。
要设置新区域,请执行以下操作:
- 将证书从现有集群复制到新集群。Cassandra 和其他混合组件会将新 CA 根用于 mTLS。因此,务必确保集群具有一致的证书。
- 将上下文设置为原始命名空间:
kubectl config use-context original-cluster-name
- 将当前命名空间配置导出到文件:
kubectl get namespace namespace -o yaml > apigee-namespace.yaml
- 将
apigee-ca
Secret 导出到文件:kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
- 将上下文设置为新区域的集群名称:
kubectl config use-context new-cluster-name
- 将命名空间配置导入新集群。如果您在新区域中使用不同的命名空间,请务必更新文件中的“命名空间”:
kubectl apply -f apigee-namespace.yaml
将密钥导入新集群:
kubectl -n cert-manager apply -f apigee-ca.yaml
- 将上下文设置为原始命名空间:
- 在新区域中安装 Hybrid。请确保
overrides_your_cluster_name.yaml
文件包含在第一个区域中配置的相同 TLS 证书,如上一部分所述。执行以下两个命令以在新区域中安装 Hybrid:
apigeectl init -f overrides_your_cluster_name.yaml
apigeectl apply -f overrides_your_cluster_name.yaml
- 通过运行以下命令来验证 Hybrid 安装是否成功:
apigeectl check-ready -f overrides_your_cluster_name.yaml
- 通过运行以下命令来验证 Cassandra 集群设置。输出应显示现有和新的数据中心。
kubectl exec apigee-cassandra-default-0 -n apigee \ -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
显示成功设置的示例:
Datacenter: dc-1 ==================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns Host ID Rack UN 10.132.87.93 68.07 GiB 256 ? fb51465c-167a-42f7-98c9-b6eba1de34de c UN 10.132.84.94 69.9 GiB 256 ? f621a5ac-e7ee-48a9-9a14-73d69477c642 b UN 10.132.84.105 76.95 GiB 256 ? 0561086f-e95b-4232-ba6c-ad519ff30336 d Datacenter: dc-2 ==================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns Host ID Rack UN 10.132.0.8 71.61 GiB 256 ? 8894a98b-8406-45de-99e2-f404ab10b5d6 c UN 10.132.9.204 75.1 GiB 256 ? afa0ffa3-630b-4f1e-b46f-fc3df988092e a UN 10.132.3.133 68.08 GiB 256 ? 25ae39ab-b39e-4d4f-9cb7-de095ab873db b
- 在新数据中心中的所有 pod 上设置 Cassandra。
- 使用以下命令从集群中获取
apigeeorg
:kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
例如:
Ex: kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name" "rg-hybrid-b7d3b9c"
- 创建 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 是您为此元数据指定的名称。您可以使用任意名称。
- NAMESPACE 是
overrides.yaml
中提供的同一命名空间。它通常为“apigee
”。 - APIGEEORG_VALUE 是上一步中
kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
命令的输出值。例如rg-hybrid-b7d3b9c
- SOURCE_REGION 是来源区域,它是来自来源区域 overrides.yaml 的 cassandra 部分下的数据中心值
例如:
apiVersion: apigee.cloud.google.com/v1alpha1 kind: CassandraDataReplication metadata: name: region-expansion namespace: apigee spec: organizationRef: rg-hybrid-b7d3b9c force: false source: region: "dc-1"
- 使用以下命令应用
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 status
命令验证数据大小。kubectl logs apigee-cassandra-default-0 -f -n apigee
kubectl exec apigee-cassandra-default-0 -n apigee -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
以下示例显示了日志条目示例:
INFO 01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens) INFO 01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild INFO 01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB) INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22 INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB) INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22 INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB) INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
- 更新种子主机。从
overrides-DC_name.yaml
中移除multiRegionSeedHost: 10.0.0.11
并重新应用。apigeectl apply -f overrides/overrides-DC_name.yaml
检查 Cassandra 集群状态
以下命令可用于查看该集群在两个数据中心中是否成功设置。该命令将检查两个区域的 nodetool 状态。
kubectl exec apigee-cassandra-default-0 -n apigee -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status Datacenter: dc-1 ======================= 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
EKS
在每个区域中创建虚拟网络
按照 AWS 建议建立跨区域通信,如什么是 VPC 对等互连?中所述。用于不同区域的 AWS 术语是“区域间 VPC 对等互连”。
创建多区域集群
在多个具有不同 CIDR 块的区域中设置 Kubernetes 集群。另请参阅“第 1 步:创建集群”。使用您之前创建的位置和虚拟网络名称。
在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口。
配置多区域种子主机
本部分介绍如何将现有 Cassandra 集群扩展到新区域。 此设置允许新区域引导集群并加入现有数据中心。如果没有此配置,多区域 Kubernetes 集群不会相互了解。
- 在原始集群的
overrides.yaml
文件中,确保将cassandra:hostNetwork
设置为true
。例如:cassandra: hostNetwork: true
如需详细了解何时设置
hostNetwork: true
,请参阅前提条件。 - 如果
cassandra:hostNetwork
未设置为true
,请执行以下操作:-
将
cassandra.hostNetwork
更改为true
。 -
使用以下命令应用
overrides.yaml
配置文件:apigeectl apply -f overrides.yaml --datastore
- 等待 Cassandra pod 完成滚动重启。
-
使用以下命令验证 Cassandra 集群的运行状况是否良好:
kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD status
确保输出中的所有 Cassandra 节点处于 UN(启动/正常)状态:
nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD describecluster
确保输出中未列出任何无法访问的节点。
-
将
- 在检索种子名称之前,将 kubectl 上下文设置为原始集群:
kubectl config use-context original-cluster-name
运行以下
kubectl
命令,确定当前区域中 Cassandra 的种子宿主机地址。种子宿主机地址允许新区域实例在第一次启动时查找原始集群,以了解集群的拓扑。种子主机地址被指定为集群中的联络点。
kubectl get pods -o wide -n apigee | grep apigee-cassandra
apigee-cassandra-default-0 1/1 Running 0 4d17h 120.38.1.9 aks-agentpool-21207753-vmss000000
-
确定上一个命令返回的哪些 IP 地址将成为多区域种子宿主机。 在本示例中,只有一个节点 Cassandra 集群正在运行时,种子宿主机为
120.38.1.9
。 - 在数据中心 2 中,将替换文件复制到名称包含集群名称的新文件。例如:
overrides_your_cluster_name.yaml
。 - 在数据中心 2 中,在
overrides_your_cluster_name.yaml
中配置cassandra.multiRegionSeedHost
和cassandra.datacenter
,其中multiRegionSeedHost
是上一个命令返回的其中一个 IP:cassandra: multiRegionSeedHost: seed_host_IP datacenter: data_center_name rack: rack_name hostNetwork: true clusterName: cluster_name # must be the same for all regions
例如:
cassandra: multiRegionSeedHost: 120.38.1.9 datacenter: "centralus" rack: "ra-1" hostNetwork: true clusterName: my-apigee-cluster
- 在新数据中心/区域中,安装 Hybrid 之前,在
overrides_your_cluster_name.yaml
中设置您在第一个区域中设置的相同 TLS 证书和凭据。
设置新区域
配置种子主机后,您可以设置新区域。
要设置新区域,请执行以下操作:
- 将证书从现有集群复制到新集群。Cassandra 和其他混合组件会将新 CA 根用于 mTLS。因此,务必确保集群具有一致的证书。
- 将上下文设置为原始命名空间:
kubectl config use-context original-cluster-name
- 将当前命名空间配置导出到文件:
kubectl get namespace namespace -o yaml > apigee-namespace.yaml
- 将
apigee-ca
Secret 导出到文件:kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
- 将上下文设置为新区域的集群名称:
kubectl config use-context new-cluster-name
- 将命名空间配置导入新集群。如果您在新区域中使用不同的命名空间,请务必更新文件中的“命名空间”:
kubectl apply -f apigee-namespace.yaml
将密钥导入新集群:
kubectl -n cert-manager apply -f apigee-ca.yaml
- 将上下文设置为原始命名空间:
- 在新区域中安装 Hybrid。请确保
overrides_your_cluster_name.yaml
文件包含在第一个区域中配置的相同 TLS 证书,如上一部分所述。执行以下两个命令以在新区域中安装 Hybrid:
apigeectl init -f overrides_your_cluster_name.yaml
apigeectl apply -f overrides_your_cluster_name.yaml
- 通过运行以下命令来验证 Hybrid 安装是否成功:
apigeectl check-ready -f overrides_your_cluster_name.yaml
- 通过运行以下命令来验证 Cassandra 集群设置。输出应显示现有和新的数据中心。
kubectl exec apigee-cassandra-default-0 -n apigee \ -- nodetool -u JMX_user -pw JMX_password status
显示成功设置的示例:
Datacenter: dc-1 ==================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns Host ID Rack UN 10.132.87.93 68.07 GiB 256 ? fb51465c-167a-42f7-98c9-b6eba1de34de c UN 10.132.84.94 69.9 GiB 256 ? f621a5ac-e7ee-48a9-9a14-73d69477c642 b UN 10.132.84.105 76.95 GiB 256 ? 0561086f-e95b-4232-ba6c-ad519ff30336 d Datacenter: dc-2 ==================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns Host ID Rack UN 10.132.0.8 71.61 GiB 256 ? 8894a98b-8406-45de-99e2-f404ab10b5d6 c UN 10.132.9.204 75.1 GiB 256 ? afa0ffa3-630b-4f1e-b46f-fc3df988092e a UN 10.132.3.133 68.08 GiB 256 ? 25ae39ab-b39e-4d4f-9cb7-de095ab873db b
- 在新数据中心中的所有 pod 上设置 Cassandra。
- 使用以下命令从集群中获取
apigeeorg
:kubectl get apigeeorg -n apigee -o json | jq .items[].metadata.name
例如:
Ex: kubectl get apigeeorg -n apigee -o json | jq .items[].metadata.name "rg-hybrid-b7d3b9c"
- 创建 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 是您为此元数据指定的名称。您可以使用任意名称。
- NAMESPACE 是
overrides.yaml
中提供的同一命名空间。它通常为“apigee
”。 - APIGEEORG_VALUE 是上一步中
kubectl get apigeeorg -n apigee -o json | jq .items[].metadata.name
命令的输出值。例如rg-hybrid-b7d3b9c
- SOURCE_REGION 是来源区域,它是来自来源区域 overrides.yaml 的 cassandra 部分下的数据中心值
例如:
apiVersion: apigee.cloud.google.com/v1alpha1 kind: CassandraDataReplication metadata: name: region-expansion namespace: apigee spec: organizationRef: rg-hybrid-b7d3b9c force: false source: region: "dc-1"
- 使用以下命令应用
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 status
命令验证数据大小:kubectl logs apigee-cassandra-default-0 -f -n apigee
kubectl exec apigee-cassandra-default-0 -n apigee -- nodetool -u JMX_user -pw JMX_password status
以下示例显示了日志条目示例:
INFO 01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens) INFO 01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild INFO 01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB) INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22 INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB) INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22 INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB) INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
- 更新种子主机。从
overrides-DC_name.yaml
中移除multiRegionSeedHost: 10.0.0.11
并重新应用。apigeectl apply -f overrides/overrides-DC_name.yaml
检查 Cassandra 集群状态
以下命令可用于查看该集群在两个数据中心中是否成功设置。该命令将检查两个区域的 nodetool 状态。
kubectl exec apigee-cassandra-default-0 -n apigee -- nodetool -u JMX_user -pw JMX_password status Datacenter: dc-1 ======================= Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.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 0.0% a200217d-260b-45cd-b83c-182b27ff4c99 ra-1 UN 10.0.0.21 78.68 KiB 256 0.0% 9f3364b9-a7a1-409c-9356-b7d1d312e52b ra-1 UN 10.0.1.26 15.46 KiB 256 0.0% 1666df0f-702e-4c5b-8b6e-086d0f2e47fa ra-1
OpenShift
配置多区域种子主机
本部分介绍如何将现有 Cassandra 集群扩展到新区域。 此设置允许新区域引导集群并加入现有数据中心。如果没有此配置,多区域 Kubernetes 集群不会相互了解。
- 在原始集群的
overrides.yaml
文件中,确保将cassandra:hostNetwork
设置为true
。例如:cassandra: hostNetwork: true
如需详细了解何时设置
hostNetwork: true
,请参阅前提条件。 - 如果
cassandra:hostNetwork
未设置为true
,请执行以下操作:-
将
cassandra.hostNetwork
更改为true
。 -
使用以下命令应用
overrides.yaml
配置文件:apigeectl apply -f overrides.yaml --datastore
- 等待 Cassandra pod 完成滚动重启。
-
使用以下命令验证 Cassandra 集群的运行状况是否良好:
kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
确保输出中的所有 Cassandra 节点处于 UN(启动/正常)状态:
nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD describecluster
确保输出中未列出任何无法访问的节点。
-
将
- 在检索种子名称之前,将 kubectl 上下文设置为原始集群:
kubectl config use-context original-cluster-name
运行以下
kubectl
命令,确定当前区域中 Cassandra 的种子宿主机地址。种子宿主机地址允许新区域实例在第一次启动时查找原始集群,以了解集群的拓扑。种子主机地址被指定为集群中的联络点。
kubectl get pods -o wide -n apigee -l app=apigee-cassandra --field-selector status.phase=Running
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
-
选择要用作多区域种子主机的源 Cassandra 主机的 IP 地址。在此示例中,这是
apigee-cassandra-default-0
集群运行,种子主机为10.0.0.11
。 - 在数据中心 2 中,将替换文件复制到名称包含集群名称的新文件。例如:
overrides_your_cluster_name.yaml
。 - 在数据中心 2 中,在
overrides_your_cluster_name.yaml
中配置cassandra.multiRegionSeedHost
和cassandra.datacenter
,其中multiRegionSeedHost
是上一个命令返回的其中一个 IP:cassandra: hostNetwork: true multiRegionSeedHost: seed_host_IP # Cassandra pod IP address from the source region. datacenter: data_center_name rack: rack_name clusterName: cluster_name # must be the same for all regions
例如:
cassandra: hostNetwork: true multiRegionSeedHost: 10.0.0.11 datacenter: "dc-2" rack: "ra-1" clusterName: my-apigee-cluster
- 在新数据中心/区域中,安装 Hybrid 之前,在
overrides_your_cluster_name.yaml
中设置您在第一个区域中设置的相同 TLS 证书和凭据。
设置新区域
配置种子主机后,您可以设置新区域。
要设置新区域,请执行以下操作:
- 将证书从现有集群复制到新集群。Cassandra 和其他混合组件会将新 CA 根用于 mTLS。因此,务必确保集群具有一致的证书。
- 将上下文设置为原始命名空间:
kubectl config use-context original-cluster-name
- 将当前命名空间配置导出到文件:
kubectl get namespace namespace -o yaml > apigee-namespace.yaml
- 将
apigee-ca
Secret 导出到文件:kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
- 将上下文设置为新区域的集群名称:
kubectl config use-context new-cluster-name
- 将命名空间配置导入新集群。如果您在新区域中使用不同的命名空间,请务必更新文件中的“命名空间”:
kubectl apply -f apigee-namespace.yaml
将密钥导入新集群:
kubectl -n cert-manager apply -f apigee-ca.yaml
- 将上下文设置为原始命名空间:
- 在新区域中安装 Hybrid。请确保
overrides_your_cluster_name.yaml
文件包含在第一个区域中配置的相同 TLS 证书,如上一部分所述。执行以下两个命令以在新区域中安装 Hybrid:
apigeectl init -f overrides_your_cluster_name.yaml
apigeectl apply -f overrides_your_cluster_name.yaml
- 通过运行以下命令来验证 Hybrid 安装是否成功:
apigeectl check-ready -f overrides_your_cluster_name.yaml
- 通过运行以下命令来验证 Cassandra 集群设置。输出应显示现有和新的数据中心。
kubectl exec apigee-cassandra-default-0 -n apigee \ -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
显示成功设置的示例:
Datacenter: dc-1 ==================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns Host ID Rack UN 10.132.87.93 68.07 GiB 256 ? fb51465c-167a-42f7-98c9-b6eba1de34de c UN 10.132.84.94 69.9 GiB 256 ? f621a5ac-e7ee-48a9-9a14-73d69477c642 b UN 10.132.84.105 76.95 GiB 256 ? 0561086f-e95b-4232-ba6c-ad519ff30336 d Datacenter: dc-2 ==================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns Host ID Rack UN 10.132.0.8 71.61 GiB 256 ? 8894a98b-8406-45de-99e2-f404ab10b5d6 c UN 10.132.9.204 75.1 GiB 256 ? afa0ffa3-630b-4f1e-b46f-fc3df988092e a UN 10.132.3.133 68.08 GiB 256 ? 25ae39ab-b39e-4d4f-9cb7-de095ab873db b
- 在新数据中心中的所有 pod 上设置 Cassandra。
- 使用以下命令从集群中获取
apigeeorg
:kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
例如:
Ex: kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name" "rg-hybrid-b7d3b9c"
- 创建 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 是您为此元数据指定的名称。您可以使用任意名称。
- NAMESPACE 是
overrides.yaml
中提供的同一命名空间。它通常为“apigee
”。 - APIGEEORG_VALUE 是上一步中
kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
命令的输出值。例如rg-hybrid-b7d3b9c
- SOURCE_REGION 是来源区域,它是来自来源区域 overrides.yaml 的 cassandra 部分下的数据中心值
例如:
apiVersion: apigee.cloud.google.com/v1alpha1 kind: CassandraDataReplication metadata: name: region-expansion namespace: apigee spec: organizationRef: rg-hybrid-b7d3b9c force: false source: region: "dc-1"
- 使用以下命令应用
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 status
命令验证数据大小。kubectl logs apigee-cassandra-default-0 -f -n apigee
kubectl exec apigee-cassandra-default-0 -n apigee -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
以下示例显示了日志条目示例:
INFO 01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens) INFO 01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild INFO 01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB) INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36 INFO 01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22 INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB) INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22 INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB) INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete INFO 01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
- 更新种子主机。从
overrides-DC_name.yaml
中移除multiRegionSeedHost: 10.0.0.11
并重新应用。apigeectl apply -f overrides/overrides-DC_name.yaml
检查 Cassandra 集群状态
以下命令可用于查看该集群在两个数据中心中是否成功设置。该命令将检查两个区域的 nodetool 状态。
kubectl exec apigee-cassandra-default-0 -n apigee -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status Datacenter: dc-1 ======================= 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
问题排查
请参阅 Cassandra 数据复制失败。