GKE 및 GKE On-Prem의 멀티 리전 배포

이 주제에서는 GKE의 Apigee Hybrid 및 온프렘에 배포된 Anthos GKE의 멀티 리전 배포를 설명합니다.

멀티 리전 배포를 위한 토폴로지는 다음과 같습니다.

  • 활성-활성: 애플리케이션이 여러 지리적 위치에 배포되고 배포에 대한 지연 시간이 짧은 API 응답이 필요한 경우. 클라이언트와 가장 가까운 여러 지리적 위치에 하이브리드를 배포할 수 있는 옵션이 있습니다. 예를 들면 미국 서부 해안, 미국 동부 해안, 유럽, APAC이 있습니다.
  • 활성-수동: 기본 리전과 장애 조치 또는 재해 복구 리전이 있는 경우.

다음 이미지와 같이 멀티 리전 하이브리드 배포의 리전은 Cassandra를 통해 통신합니다.

MART 연결 부하 분산

각 리전별 클러스터에는 자체 MART IP 및 호스트 이름이 있어야 합니다. 그러나 관리 영역을 그중 하나에만 연결해야 합니다. Cassandra는 모든 클러스터에 정보를 전달합니다. MART의 고가용성을 위한 최선의 방법은 개별 MART IP 주소를 부하 분산하여 부하 분산된 MART URL과 통신하도록 조직을 구성하는 것입니다.

기본 요건

여러 지역에 하이브리드를 구성하기 전에 다음 기본 요건을 만족해야 합니다.

  • 다양한 CIDR 블록으로 복수의 리전에 Kubernetes 클러스터 설정
  • 리전 간 통신 설정
  • Cassandra 멀티 리전 요구사항:
    • 포드 네트워크 네임스페이스에 방화벽, VPN, VPC 피어링, vNet 피어링을 비롯한 리전 간 연결이 있는지 확인합니다. 이는 대부분의 GKE 설치에 해당됩니다.
    • 포드 네트워크 네임스페이스에 서로 다른 클러스터(GKE On-Prem 설치에서와 같이 '섬(Island) 네트워크 모드'로 실행되는 클러스터)의 포드 간 연결이 없으면 Apigee Hybrid 멀티 리전 설치에서 모든 리전에 대한 재정의 파일에 cassandra.hostNetwork: true를 설정하여 Kubernetes hostNetwork 기능을 사용 설정합니다.

      Kubernetes hostNetwork 기능에 대한 자세한 내용은 Kubernetes 문서의 호스트 네임스페이스를 참조하세요.

    • 멀티 리전 구성을 새 리전으로 확장하기 전에 기존 클러스터에서 hostNetwork를 사용 설정합니다.
    • hostNetwork가 사용 설정되면 워커 노드에서 역방향 DNS 조회를 수행할 수 있는지 확인합니다. Apigee cassandra는 정방향 및 역방향 DNS 조회를 모두 사용하여 시작 중에 호스트 IP를 획득합니다.
    • 모든 리전의 Kubernetes 클러스터 간에 Cassandra 포트 7000 및 7001을 열어 워커 노드가 리전과 데이터 센터 간에서 통신하도록 사용 설정합니다. 포트 구성을 참조하세요.

자세한 내용은 Kubernetes 문서를 참조하세요.

멀티 리전 시드 호스트 구성

이 섹션에서는 기존 Cassandra 클러스터를 새 리전으로 확장하는 방법을 설명합니다. 이 설정을 사용하면 새 리전에서 클러스터를 부트스트랩하고 기존 데이터 센터에 연결할 수 있습니다. 이 구성이 없으면 멀티 리전 Kubernetes 클러스터가 서로를 알지 못합니다.

  1. 다음 kubectl 명령어를 실행하여 현재 리전의 Cassandra의 시드 호스트 주소를 식별합니다.

    시드 호스트 주소를 사용하면 새 리전 인스턴스가 첫 번째 시작할 때 원래의 클러스터를 찾아 클러스터의 토폴로지를 학습할 수 있습니다. 시드 호스트 주소는 클러스터의 연락 지점으로 지정됩니다.

    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
  2. 이전 명령어에서 반환된 IP 중 멀티 리전 시드 호스트가 될 IP를 결정합니다.
  3. 이 단계의 구성은 GKE 또는 GKE On-Prem에 있는지에 따라 다릅니다.

    GKE만 해당: 데이터 센터 2에서 런타임 영역 구성요소 관리cassandra.multiRegionSeedHostcassandra.datacenter를 구성합니다. 여기서 multiRegionSeedHost는 이전 명령어로 반환한 IP 중 하나입니다.

    cassandra:
      multiRegionSeedHost: seed_host_IP
      datacenter: data_center_name
      rack: rack_name
      hostNetwork: false # Set this to true for Non GKE platforms.

    예를 들면 다음과 같습니다.

    cassandra:
      multiRegionSeedHost: 10.0.0.11
      datacenter: "dc-2"
      rack: "ra-1"
      hostNetwork: false

    GKE On-Prem만 해당: 데이터 센터 2에서 재정의 파일에 cassandra.multiRegionSeedHost를 구성합니다. 여기서 multiRegionSeedHost는 이전 명령어로 반환한 IP 중 하나입니다.

    cassandra:
      hostNetwork: true
      multiRegionSeedHost: seed_host_IP
      datacenter: data_center_name
    

    예를 들면 다음과 같습니다.

    cassandra:
      hostNetwork: true
      multiRegionSeedHost: 10.0.0.11
      datacenter: "dc-2"
    
  4. 새 데이터 센터/리전에서 하이브리드를 설치하기 전에 첫 번째 리전에서 설정한 것과 동일하게 TLS 인증서 및 사용자 인증 정보를 overrides.yaml에 설정합니다.

새 리전 설정

시드 호스트를 구성한 후에 새 리전을 설정할 수 있습니다.

새 리전을 설정 절차:

  1. 기존 클러스터에서 새 클러스터로 인증서를 복사합니다. 새 CA 루트는 Cassandra 및 mTLS용 기타 하이브리드 구성요소에서 사용됩니다. 따라서 클러스터 간에 일관된 인증서가 있어야 합니다.
    1. 컨텍스트를 원래 네임스페이스로 설정합니다.
      kubectl config use-context original-cluster-name
    2. 현재 네임스페이스 구성을 파일로 내보냅니다.
      kubectl get namespace namespace -o yaml > apigee-namespace.yaml
    3. apigee-ca 보안 비밀을 파일로 내보냅니다.
      kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
    4. 컨텍스트를 새 리전의 클러스터 이름으로 설정합니다.
      kubectl config use-context new-cluster-name
    5. 네임스페이스 구성을 새 클러스터로 가져옵니다. 새 리전에서 다른 네임스페이스를 사용하는 경우 파일의 '네임스페이스'를 업데이트해야 합니다.
      kubectl apply -f apigee-namespace.yaml
    6. 보안 비밀을 새 클러스터로 가져옵니다.

      kubectl -n cert-manager apply -f apigee-ca.yaml
  2. 새 리전에 하이브리드를 설치합니다. 이전 섹션에 설명된 대로 overrides-DC_name.yaml 파일에 첫 번째 리전에서 구성된 동일한 TLS 인증서가 포함되어 있는지 확인합니다.

    다음 두 명령어를 실행하여 새 리전에 하이브리드를 설치합니다.

    apigeectl init -f overrides/overrides-DC_name.yaml
    apigeectl apply -f overrides/overrides-DC_name.yaml
  3. 다음 명령어를 실행하여 하이브리드 설치가 성공하는지 확인합니다.
    apigeectl check-ready -f overrides_your_cluster_name.yaml
  4. 다음 명령어를 실행하여 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
  5. 새 데이터 센터의 모든 포드에 Cassandra를 설정합니다.
    1. 다음 명령어를 사용하여 클러스터에서 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"
      
    2. 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은 이 메타데이터에 지정할 이름입니다. 이름에는 제한이 없습니다.
      • NAMESPACEoverrides.yaml에 제공된 네임스페이스와 동일합니다. 일반적으로 'apigee'입니다.
      • APIGEEORG_VALUE는 이전 단계의 kubectl get apigeeorg -n apigee -o json | jq .items[].metadata.name 명령어에서 출력된 값입니다. 예를 들면 rg-hybrid-b7d3b9c입니다.
      • SOURCE_REGION은 소스 리전의 데이터 센터 이름입니다. overrides.yamlcassandra:datacenter:에 대해 설정된 값입니다.

      예를 들면 다음과 같습니다.

      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"
    3. 다음 명령어를 사용하여 CassandraDataReplication을 적용합니다.
      kubectl apply -f datareplication.yaml
    4. 다음 명령어를 사용하여 다시 빌드 상태를 확인합니다.
      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
      }
  6. 로그에서 재빌드 프로세스를 확인합니다. 또한 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
  7. 시드 호스트를 업데이트합니다. 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: dc-2
================
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

문제 해결

Cassandra 데이터 복제 실패를 참조하세요.