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.multiRegionSeedHost ๋ฐ cassandra.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์€ ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์ง€์ •ํ•  ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์—๋Š” ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.
      • 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: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 ๋ฐ์ดํ„ฐ ๋ณต์ œ ์‹คํŒจ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.