๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค๋กœ ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ GKE ํ™˜๊ฒฝ ์—…๊ทธ๋ ˆ์ด๋“œ

Last reviewed 2022-12-15 UTC

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ Google Kubernetes Engine(GKE) ํ™˜๊ฒฝ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ํ”„๋กœ์„ธ์Šค, ์•„ํ‚คํ…์ฒ˜, ์šฉ์–ด๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋Š” ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ GKE ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฌธ์„œ์™€ ์ด์–ด์ง€๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์„ ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— ๊ฐœ๋… ๋ฌธ์„œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค(MCI), ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ๊ฒŒ์ดํŠธ์›จ์ด(MCG), ๋…๋ฆฝํ˜• ๋„คํŠธ์›Œํฌ ์—”๋“œํฌ์ธํŠธ ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ(LB ๋ฐ ๋…๋ฆฝํ˜• NEG) ๊ฐ„์˜ ์ž์„ธํ•œ ๋น„๊ต๋Š” GKE์šฉ ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ๋ถ€ํ•˜ ๋ถ„์‚ฐ API ์„ ํƒ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ๋ฌธ์„œ๋Š” GKE ํด๋Ÿฌ์Šคํ„ฐ ๊ทธ๋ฃน์„ ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•˜๋Š” Google Cloud ๊ด€๋ฆฌ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

GKE ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ž๋™ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ž๋™ ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” Google Cloud์—์„œ ๊ฒฐ์ •ํ•œ ์ถœ์‹œ ์ผ์ •์— ๋”ฐ๋ผ ํด๋Ÿฌ์Šคํ„ฐ(์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋ฐ ๋…ธ๋“œ)๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์™„์ „ ๊ด€๋ฆฌํ˜• ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šด์˜์ž์˜ ๊ฐœ์ž…์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์‹œ๊ธฐ๋ฅผ ์„ธ๋ถ€์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์•ฑ์ด ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์—…๊ทธ๋ ˆ์ด๋“œ ์ „์— ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋“œ๋ ˆ์ด๋‹ํ•ฉ๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ๋‹ค์Œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด 3๊ฐœ์˜ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ํด๋Ÿฌ์Šคํ„ฐ 2๊ฐœ(blue ๋ฐ green)๋Š” ๊ฐ™์€ ์•ฑ์ด ๋ฐฐํฌ๋œ ๋™์ผํ•œ ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• ์„ ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ํด๋Ÿฌ์Šคํ„ฐ 1๊ฐœ(ingress-config)๋Š” ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ์•ฑ ํด๋Ÿฌ์Šคํ„ฐ 2๊ฐœ(blue ๋ฐ green ํด๋Ÿฌ์Šคํ„ฐ)์— ์ƒ˜ํ”Œ ์•ฑ์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

2๊ฐœ์˜ ๋™์ผํ•œ ํด๋Ÿฌ์Šคํ„ฐ์™€ 1๊ฐœ์˜ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ ์•„ํ‚คํ…์ฒ˜

๋ชฉํ‘œ

  • GKE ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ 3๊ฐœ ๋งŒ๋“ค์–ด Fleet์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜์˜ GKE ํด๋Ÿฌ์Šคํ„ฐ(ingress-config)๋ฅผ ์ค‘์•™ ๊ตฌ์„ฑ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ GKE ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒ˜ํ”Œ ์•ฑ ๋ฐฐํฌ
  • ๋‘ ์•ฑ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์•ฑ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๋„๋ก ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฑ์˜ ๋ถ€ํ•˜ ์ƒ์„ฑ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค์—์„œ ํ•˜๋‚˜์˜ ์•ฑ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ญ์ œ ๋˜๋Š” ๋“œ๋ ˆ์ด๋‹ํ•˜๊ณ  ๋“œ๋ ˆ์ด๋‹๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—…๊ทธ๋ ˆ์ด๋“œ๋œ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค์‹œ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๋น„์šฉ

์ด ๋ฌธ์„œ์—์„œ๋Š” ๋น„์šฉ์ด ์ฒญ๊ตฌ๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Google Cloud๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ธฐ์ค€์œผ๋กœ ์˜ˆ์ƒ ๋น„์šฉ์„ ์‚ฐ์ถœํ•˜๋ ค๋ฉด ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Google Cloud ์‹ ๊ทœ ์‚ฌ์šฉ์ž๋Š” ๋ฌด๋ฃŒ ์ฒดํ—˜ํŒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์— ์„ค๋ช…๋œ ํƒœ์Šคํฌ๋ฅผ ์™„๋ฃŒํ–ˆ์œผ๋ฉด ๋งŒ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜์—ฌ ์ฒญ๊ตฌ๊ฐ€ ๊ณ„์†๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ญ์ œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

  1. ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋‹ค์Œ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋ฐฐํฌ, ์„œ๋น„์Šค ๋“ฑ์˜ ๋™์ผํ•œ ์•ฑ์ด ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ 2๊ฐœ ์ด์ƒ์˜ ํด๋Ÿฌ์Šคํ„ฐ
    • ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ž๋™ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ง€๋จ
    • ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ VPC ๊ธฐ๋ฐ˜ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ณ„์นญ IP ์ฃผ์†Œ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•จ
    • HTTP ๋ถ€ํ•˜ ๋ถ„์‚ฐ์ด ์‚ฌ์šฉ ์„ค์ •๋จ(๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ ์„ค์ •๋จ)
    • gcloud --version์€ 369 ์ด์ƒ์ด์–ด์•ผ ํ•จ GKE ํด๋Ÿฌ์Šคํ„ฐ ๋“ฑ๋ก ๋‹จ๊ณ„๋Š” ์ด ๋ฒ„์ „ ์ด์ƒ์—์„œ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  5. ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    export PROJECT=$(gcloud info --format='value(config.project)')
    gcloud config set project ${PROJECT}
    
  6. GKE, Hub, multiclusteringress API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    gcloud services enable container.googleapis.com \
                           gkehub.googleapis.com \
                           multiclusteringress.googleapis.com \
                           multiclusterservicediscovery.googleapis.com
    

ํ™˜๊ฒฝ ์„ค์ •

  1. Cloud Shell์—์„œ ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•˜์—ฌ ์ด ๊ฐ€์ด๋“œ์— ์‚ฌ์šฉํ•  ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    cd ${HOME}
    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  2. WORKDIR ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    cd kubernetes-engine-samples/networking/gke-multicluster-upgrade-mci/
    export WORKDIR=`pwd`
    

GKE ํด๋Ÿฌ์Šคํ„ฐ ๋งŒ๋“ค๊ธฐ ๋ฐ ํ—ˆ๋ธŒ ๋“ฑ๋ก

์ด ์„น์…˜์—์„œ๋Š” GKE ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ 3๊ฐœ ๋งŒ๋“ค์–ด GKE Enterprise ํ—ˆ๋ธŒ์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

GKE ํด๋Ÿฌ์Šคํ„ฐ ๋งŒ๋“ค๊ธฐ

  1. Cloud Shell์—์„œ GKE ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ 3๊ฐœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    gcloud container clusters create ingress-config --zone us-west1-a \
    --release-channel=None --no-enable-autoupgrade --num-nodes=4 \
    --enable-ip-alias --workload-pool=${PROJECT}.svc.id.goog --quiet --async
    gcloud container clusters create blue --zone us-west1-b --num-nodes=3 \
    --release-channel=None --no-enable-autoupgrade --enable-ip-alias \
    --workload-pool=${PROJECT}.svc.id.goog --quiet --async
    gcloud container clusters create green --zone us-west1-c --num-nodes=3 \
    --release-channel=None --no-enable-autoupgrade --enable-ip-alias \
    --workload-pool=${PROJECT}.svc.id.goog --quiet
    

    ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” us-west1-a, us-west1-b, us-west1-c์˜ ์„ธ ์˜์—ญ์—์„œ ๋‹จ์ผ ๋ฆฌ์ „์— ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฆฌ์ „๊ณผ ์˜์—ญ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์œ„์น˜ ๋ฐ ๋ฆฌ์ „์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  2. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ƒ์„ฑ๋  ๋•Œ๊นŒ์ง€ ๋ช‡ ๋ถ„ ์ •๋„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    gcloud container clusters list
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    NAME: ingress-config
    LOCATION: us-west1-a
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.233.186.135
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 4
    STATUS: RUNNING
    
    NAME: blue
    LOCATION: us-west1-b
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 34.82.35.222
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 3
    STATUS: RUNNING
    
    NAME: green
    LOCATION: us-west1-c
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.185.204.26
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 3
    STATUS: RUNNING
    
  3. kubeconfig ํŒŒ์ผ์„ ๋งŒ๋“  ํ›„ ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐํ•˜์—ฌ kubeconfig ํŒŒ์ผ์— ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    touch gke-upgrade-kubeconfig
    export KUBECONFIG=gke-upgrade-kubeconfig
    gcloud container clusters get-credentials ingress-config \
        --zone us-west1-a --project ${PROJECT}
    gcloud container clusters get-credentials blue --zone us-west1-b \
        --project ${PROJECT}
    gcloud container clusters get-credentials green --zone us-west1-c \
        --project ${PROJECT}
    

    kubeconfig ํŒŒ์ผ์—์„œ ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์‚ฌ์šฉ์ž์™€ ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์ธ์ฆ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. kubeconfig ํŒŒ์ผ์„ ๋งŒ๋“  ํ›„์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„์— ์ปจํ…์ŠคํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. kubeconfig ํŒŒ์ผ์— ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ 3๊ฐœ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    kubectl config view -ojson | jq -r '.clusters[].name'
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    gke_gke-multicluster-upgrades_us-west1-a_ingress-config
    gke_gke-multicluster-upgrades_us-west1-b_blue
    gke_gke-multicluster-upgrades_us-west1-c_green
    
  5. ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํด๋Ÿฌ์Šคํ„ฐ 3๊ฐœ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    export INGRESS_CONFIG_CLUSTER=$(kubectl config view -ojson | jq \
        -r '.clusters[].name' | grep ingress-config)
    export BLUE_CLUSTER=$(kubectl config view -ojson | jq \
        -r '.clusters[].name' | grep blue)
    export GREEN_CLUSTER=$(kubectl config view -ojson | jq \
        -r '.clusters[].name' | grep green)
    echo -e "${INGRESS_CONFIG_CLUSTER}\n${BLUE_CLUSTER}\n${GREEN_CLUSTER}"
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    gke_gke-multicluster-upgrades_us-west1-a_ingress-config
    gke_gke-multicluster-upgrades_us-west1-b_blue
    gke_gke-multicluster-upgrades_us-west1-c_green
    

Fleet์— GKE ํด๋Ÿฌ์Šคํ„ฐ ๋“ฑ๋ก

Fleet์— ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ™˜๊ฒฝ์—์„œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Fleet์— ๋“ฑ๋ก๋œ ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ GKE ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GKE ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ Fleet์— ๋“ฑ๋กํ•˜๋ ค๋ฉด Google Cloud ์„œ๋น„์Šค ๊ณ„์ •์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ GKE ํด๋Ÿฌ์Šคํ„ฐ์˜ Kubernetes ์„œ๋น„์Šค ๊ณ„์ •์ด Identity and Access Management ์„œ๋น„์Šค ๊ณ„์ •์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ถŒ์žฅ GKE์šฉ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ œํœด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  1. ํด๋Ÿฌ์Šคํ„ฐ 3๊ฐœ๋ฅผ Fleet์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

    gcloud container fleet memberships register ingress-config \
        --gke-cluster=us-west1-a/ingress-config \
        --enable-workload-identity
    
    gcloud container fleet memberships register blue \
        --gke-cluster=us-west1-b/blue \
        --enable-workload-identity
    
    gcloud container fleet memberships register green \
        --gke-cluster=us-west1-c/green \
        --enable-workload-identity
    
  2. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋“ฑ๋ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    gcloud container fleet memberships list
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    NAME: blue
    EXTERNAL_ID: 401b4f08-8246-4f97-a6d8-cf1b78c2a91d
    
    NAME: green
    EXTERNAL_ID: 8041c36a-9d42-40c8-a67f-54fcfd84956e
    
    NAME: ingress-config
    EXTERNAL_ID: 65ac48fe-5043-42db-8b1e-944754a0d725
    
  3. ํ—ˆ๋ธŒ๋ฅผ ํ†ตํ•ด multiclusteringress ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜์—ฌ ingress-config ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค์˜ ๊ตฌ์„ฑ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    gcloud container fleet ingress enable --config-membership=ingress-config
    

    ์œ„์˜ ๋ช…๋ น์–ด๋Š” MulticlusterIngress ๋ฐ MulticlusterService CRD(์ปค์Šคํ…€ ๋ฆฌ์†Œ์Šค ์ •์˜)๋ฅผ ingress-config ํด๋Ÿฌ์Šคํ„ฐ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” ์™„๋ฃŒ๋˜๋Š” ๋ฐ ๋ช‡ ๋ถ„ ์ •๋„ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

  4. ingress-cluster ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค์— ๋Œ€ํ•ด ์„ฑ๊ณต์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    watch gcloud container fleet ingress describe
    

    ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ์ถœ๋ ฅ์ด ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

    createTime: '2022-07-05T10:21:40.383536315Z'
    membershipStates:
      projects/662189189487/locations/global/memberships/blue:
        state:
          code: OK
          updateTime: '2022-07-08T10:59:44.230329189Z'
      projects/662189189487/locations/global/memberships/green:
        state:
          code: OK
          updateTime: '2022-07-08T10:59:44.230329950Z'
      projects/662189189487/locations/global/memberships/ingress-config:
        state:
          code: OK
          updateTime: '2022-07-08T10:59:44.230328520Z'
    name: projects/gke-multicluster-upgrades/locations/global/features/multiclusteringress
    resourceState:
      state: ACTIVE
    spec:
      multiclusteringress:
        configMembership: projects/gke-multicluster-upgrades/locations/global/memberships/ingress-config
    state:
      state:
        code: OK
        description: Ready to use
        updateTime: '2022-07-08T10:57:33.303543609Z'
    updateTime: '2022-07-08T10:59:45.247576318Z'
    

    watch ๋ช…๋ น์–ด๋ฅผ ์ข…๋ฃŒํ•˜๋ ค๋ฉด Control+C๋ฅผ ๋ˆ„๋ฅด์„ธ์š”.

๋ธ”๋ฃจ ๋ฐ ๊ทธ๋ฆฐ ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

  1. Cloud Shell์—์„œ ์ƒ˜ํ”Œ whereami ์•ฑ์„ blue ๋ฐ green ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${BLUE_CLUSTER} apply -f ${WORKDIR}/application-manifests
    kubectl --context ${GREEN_CLUSTER} apply -f ${WORKDIR}/application-manifests
    
  2. ๋ช‡ ๋ถ„ ์ •๋„ ๊ธฐ๋‹ค๋ฆฐ ํ›„ blue ๋ฐ green ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ํฌ๋“œ๊ฐ€ Running ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${BLUE_CLUSTER} get pods
    kubectl --context ${GREEN_CLUSTER} get pods
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    NAME                                   READY   STATUS    RESTARTS   AGE
    whereami-deployment-756c7dc74c-zsmr6   1/1     Running   0          74s
    NAME                                   READY   STATUS    RESTARTS   AGE
    whereami-deployment-756c7dc74c-sndz7   1/1     Running   0          68s.
    

๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค ๊ตฌ์„ฑ

์ด ์„น์…˜์—์„œ๋Š” blue ๋ฐ green ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋‘์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํŠธ๋ž˜ํ”ฝ์„ ์ „์†กํ•˜๋Š” ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Cloud Load Balancing์„ ์‚ฌ์šฉํ•˜์—ฌ blue ๋ฐ green ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋‘์—์„œ whereami ์•ฑ์„ ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด MultiClusterIngress์™€ 1๊ฐœ ์ด์ƒ์˜ MultiClusterServices๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. MultiClusterIngress ๋ฐ MultiClusterService ๊ฐ์ฒด๋Š” ๋‹จ์ผ ํด๋Ÿฌ์Šคํ„ฐ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์กด Kubernetes ์ธ๊ทธ๋ ˆ์Šค ๋ฐ ์„œ๋น„์Šค ๋ฆฌ์†Œ์Šค์˜ ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์•„๋‚ ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

  1. Cloud Shell์—์„œ MulticlusterIngress ๋ฆฌ์†Œ์Šค๋ฅผ ingress-config ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/multicluster-manifests/mci.yaml
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    multiclusteringress.networking.gke.io/whereami-mci created
    
  2. MulticlusterService ๋ฆฌ์†Œ์Šค๋ฅผ ingress-config ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/multicluster-manifests/mcs-blue-green.yaml
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    multiclusterservice.networking.gke.io/whereami-mcs created
    
  3. ๋‘ ๋ฆฌ์†Œ์Šค๋ฅผ ๋น„๊ตํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

    • MulticlusterIngress ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

      kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusteringress -o yaml
      

      ์ถœ๋ ฅ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

      spec:
        template:
          spec:
            backend:
              serviceName: whereami-mcs
              servicePort: 8080
      

      MulticlusterIngress ๋ฆฌ์†Œ์Šค๋Š” MulticlusterService ์‚ฌ์–‘์ด serviceName ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  Kubernetes ์ธ๊ทธ๋ ˆ์Šค ๋ฆฌ์†Œ์Šค์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    • MulticlusterService ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

      kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusterservice -o yaml
      

      ์ถœ๋ ฅ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

      spec:
        clusters:
        - link: us-west1-b/blue
        - link: us-west1-c/green
        template:
          spec:
            ports:
            - name: web
              port: 8080
              protocol: TCP
              targetPort: 8080
            selector:
              app: whereami
      

      MulticlusterService ๋ฆฌ์†Œ์Šค๋Š” clusters ์‚ฌ์–‘์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ  Kubernetes ์„œ๋น„์Šค ๋ฆฌ์†Œ์Šค์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. clusters ๊ฐ’์€ MulticlusterService ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋“ฑ๋ก๋œ ํด๋Ÿฌ์Šคํ„ฐ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

    • MulticlusterIngress ๋ฆฌ์†Œ์Šค๊ฐ€ MulticlusterService ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋กœ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋ฅผ ์ƒ์„ฑํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      watch kubectl --context ${INGRESS_CONFIG_CLUSTER} \
            get multiclusteringress -o jsonpath="{.items[].status.VIP}"
      

      ์ตœ๋Œ€ 10๋ถ„ ์ •๋„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ์ถœ๋ ฅ์ด ๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

      34.107.246.9
      

      watch ๋ช…๋ น์–ด๋ฅผ ์ข…๋ฃŒํ•˜๋ ค๋ฉด Control+C๋ฅผ ๋ˆ„๋ฅด์„ธ์š”.

  4. Cloud Shell์—์„œ Cloud Load Balancing VIP๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    export GCLB_VIP=$(kubectl --context ${INGRESS_CONFIG_CLUSTER} \
           get multiclusteringress -o json | jq -r '.items[].status.VIP') \
           && echo ${GCLB_VIP}
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    34.107.246.9
    
  5. curl์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ์™€ ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

    curl ${GCLB_VIP}
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    {
      "cluster_name": "green",
      "host_header": "34.107.246.9",
      "pod_name": "whereami-deployment-756c7dc74c-sndz7",
      "pod_name_emoji": "๐Ÿ˜‡",
      "project_id": "gke-multicluster-upgrades",
      "timestamp": "2022-07-08T14:26:07",
      "zone": "us-west1-c"
    }
    
  6. curl ๋ช…๋ น์–ด๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์€ ๋‘ ํด๋Ÿฌ์Šคํ„ฐ blue ๋ฐ green์— ๋ฐฐํฌ๋œ whereami ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์— ๋ถ€ํ•˜ ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

๋ถ€ํ•˜ ์ƒ์„ฑ๊ธฐ ์„ค์ •

์ด ์„น์…˜์—์„œ๋Š” Cloud Load Balancing VIP์— ๋Œ€ํ•œ ํด๋ผ์ด์–ธํŠธ ํŠธ๋ž˜ํ”ฝ์„ ์ƒ์„ฑํ•˜๋Š” loadgenerator ์„œ๋น„์Šค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € MulticlusterService ๋ฆฌ์†Œ์Šค๊ฐ€ blue ๋ฐ green ํด๋Ÿฌ์Šคํ„ฐ์— ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๋„๋ก ์„ค์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋ž˜ํ”ฝ์ด ๋‘ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹จ์ผ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „์†กํ•˜๋„๋ก MulticlusterService ๋ฆฌ์†Œ์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ ํŠธ๋ž˜ํ”ฝ์„ Cloud Load Balancing์œผ๋กœ ๋ณด๋‚ด๋„๋ก loadgenerator ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    TEMPLATE=loadgen-manifests/loadgenerator.yaml.templ && envsubst < ${TEMPLATE} > ${TEMPLATE%.*}
    
  2. ingress-config ํด๋Ÿฌ์Šคํ„ฐ์— loadgenerator์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/loadgen-manifests
    
  3. ingress-config ํด๋Ÿฌ์Šคํ„ฐ์˜ loadgenerator ํฌ๋“œ๊ฐ€ ๋ชจ๋‘ Running ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} get pods
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    NAME                             READY   STATUS    RESTARTS   AGE
    loadgenerator-5498cbcb86-hqscp   1/1     Running   0          53s
    loadgenerator-5498cbcb86-m2z2z   1/1     Running   0          53s
    loadgenerator-5498cbcb86-p56qb   1/1     Running   0          53s
    

    ํฌ๋“œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ Running ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋ช‡ ๋ถ„ ์ •๋„ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ๋ช…๋ น์–ด๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์„ธ์š”.

ํŠธ๋ž˜ํ”ฝ ๋ชจ๋‹ˆํ„ฐ๋ง

์ด ์„น์…˜์—์„œ๋Š” Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ whereami ์•ฑ์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ์„น์…˜์—์„œ Cloud Load Balancing VIP๋ฅผ ํ†ตํ•ด whereami ์•ฑ์— ์•ก์„ธ์Šคํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ํŠธ๋ž˜ํ”ฝ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” loadgenerator ๋ฐฐํฌ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. Google Cloud ์ฝ˜์†”์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์ธก์ •ํ•ญ๋ชฉ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์œ„ํ•ด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋“œ๋ ˆ์ด๋‹ํ•  ๋•Œ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ๋จผ์ € ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(๋‹ค์Œ ์„น์…˜ ์ฐธ์กฐ).

  1. ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค์— ๋„๋‹ฌํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ํ‘œ์‹œํ•  ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    export DASH_ID=$(gcloud monitoring dashboards create \
        --config-from-file=dashboards/cloud-ops-dashboard.json \
        --format=json | jq  -r ".name" | awk -F '/' '{print $4}')
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    Created [721b6c83-8f9b-409b-a009-9fdf3afb82f8]
    
  2. Google Cloud ์ฝ˜์†”์—์„œ Cloud Load Balancing์˜ ์ธก์ •ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URL์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    https://console.cloud.google.com/monitoring/dashboards/builder/721b6c83-8f9b-409b-a009-9fdf3afb82f8/?project=gke-multicluster-upgrades&timeDomain=1h"
    
  3. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์œ„์˜ ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋œ URL๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠธ๋ž˜ํ”ฝ์€ ๋ถ€ํ•˜ ์ƒ์„ฑ๊ธฐ์—์„œ blue ๋ฐ green ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค(ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ๋Š” ๋‘ ์˜์—ญ์œผ๋กœ ํ‘œ์‹œ๋จ). ํƒ€์ž„๋ผ์ธ ์ธก์ •ํ•ญ๋ชฉ ์ฐจํŠธ๋Š” ๋‘ ๋ฐฑ์—”๋“œ๋กœ ์ด๋™ํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. k8s1- ๋งˆ์šฐ์Šค ์˜ค๋ฒ„ ๊ฐ’์€ ๋‘ ํ”„๋ŸฐํŠธ์—”๋“œ MulticlusterServices์— ๋Œ€ํ•œ ๋„คํŠธ์›Œํฌ ์—”๋“œํฌ์ธํŠธ ๊ทธ๋ฃน(NEG)์ด blue ๋ฐ green ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

    ๋‘ ๋ฐฑ์—”๋“œ๋กœ ์ด๋™ํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋ณด์—ฌ์ฃผ๋Š” ํƒ€์ž„๋ผ์ธ ์ธก์ •ํ•ญ๋ชฉ ์ฐจํŠธ

blue ํด๋Ÿฌ์Šคํ„ฐ ๋“œ๋ ˆ์ด๋‹ ๋ฐ ์—…๊ทธ๋ ˆ์ด๋“œ

์ด ์„น์…˜์—์„œ๋Š” blue ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋“œ๋ ˆ์ด๋‹ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋“œ๋ ˆ์ด๋‹ํ•˜๋ฉด ๋ถ€ํ•˜ ๋ถ„์‚ฐ ํ’€์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. blue ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋“œ๋ ˆ์ด๋‹ํ•œ ํ›„์—๋Š” ๋Œ€์ƒ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ํŠธ๋ž˜ํ”ฝ์ด green ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์„น์…˜์˜ ์„ค๋ช…๋Œ€๋กœ ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋“œ๋ ˆ์ด๋‹๋˜๋ฉด ๋“œ๋ ˆ์ด๋‹๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„์—๋Š” ๋ถ€ํ•˜ ๋ถ„์‚ฐ ํ’€์— ๋‹ค์‹œ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ๋„ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค(์ด ๊ฐ€์ด๋“œ์— ํ‘œ์‹œ๋˜์ง€ ์•Š์Œ).

blue ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋“œ๋ ˆ์ด๋‹ํ•˜๋ ค๋ฉด ingress-cluster ํด๋Ÿฌ์Šคํ„ฐ์˜ MulticlusterService ๋ฆฌ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  clusters ์‚ฌ์–‘์—์„œ blue ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋ฃจ ํด๋Ÿฌ์Šคํ„ฐ ๋“œ๋ ˆ์ด๋‹

  1. Cloud Shell์—์„œ ingress-config ํด๋Ÿฌ์Šคํ„ฐ์˜ MulticlusterService ๋ฆฌ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} \
              apply -f ${WORKDIR}/multicluster-manifests/mcs-green.yaml
    
  2. clusters ์‚ฌ์–‘์— green ํด๋Ÿฌ์Šคํ„ฐ๋งŒ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusterservice \
            -o json | jq '.items[].spec.clusters'
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    [
      {
        "link": "us-west1-c/green"
      }
    ]
    

    green ํด๋Ÿฌ์Šคํ„ฐ๋งŒ clusters ์‚ฌ์–‘์— ๋‚˜์—ด๋˜๋ฏ€๋กœ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ํ’€์—๋Š” green ํด๋Ÿฌ์Šคํ„ฐ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. Google Cloud ์ฝ˜์†”์—์„œ Cloud Load Balancing ์ธก์ •ํ•ญ๋ชฉ์˜ ์ธก์ •ํ•ญ๋ชฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URL์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"
    
  4. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด์ „ ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋œ URL๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐจํŠธ์—์„œ๋Š” green ํด๋Ÿฌ์Šคํ„ฐ๋งŒ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

    `๊ทธ๋ฆฐ` ํด๋Ÿฌ์Šคํ„ฐ๋กœ๋งŒ ์ด๋™ํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ

blue ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ blue ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋” ์ด์ƒ ํด๋ผ์ด์–ธํŠธ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํด๋Ÿฌ์Šคํ„ฐ(์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋ฐ ๋…ธ๋“œ)๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Cloud Shell์—์„œ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ˜„์žฌ ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    gcloud container clusters list
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    NAME: ingress-config
    LOCATION: us-west1-a
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.233.186.135
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 4
    STATUS: RUNNING
    
    NAME: blue
    LOCATION: us-west1-b
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 34.82.35.222
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 3
    STATUS: RUNNING
    
    NAME: green
    LOCATION: us-west1-c
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.185.204.26
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 3
    STATUS: RUNNING
    

    ์ด ๊ฐ€์ด๋“œ๋ฅผ ์™„๋ฃŒํ•˜๋Š” ์‹œ๊ธฐ์— ๋”ฐ๋ผ ํด๋Ÿฌ์Šคํ„ฐ ๋ฒ„์ „์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ์˜์—ญ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ MasterVersions ๋ฒ„์ „ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    gcloud container get-server-config --zone us-west1-b --format=json | jq \
    '.validMasterVersions[0:20]'
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    [
      "1.24.1-gke.1400",
      "1.23.7-gke.1400",
      "1.23.6-gke.2200",
      "1.23.6-gke.1700",
      "1.23.6-gke.1501",
      "1.23.6-gke.1500",
      "1.23.5-gke.2400",
      "1.23.5-gke.1503",
      "1.23.5-gke.1501",
      "1.22.10-gke.600",
      "1.22.9-gke.2000",
      "1.22.9-gke.1500",
      "1.22.9-gke.1300",
      "1.22.8-gke.2200",
      "1.22.8-gke.202",
      "1.22.8-gke.201",
      "1.22.8-gke.200",
      "1.21.13-gke.900",
      "1.21.12-gke.2200",
      "1.21.12-gke.1700"
    ]
    
  3. ์˜์—ญ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ NodeVersions ๋ฒ„์ „ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    gcloud container get-server-config --zone us-west1-b --format=json | jq \
    '.validNodeVersions[0:20]'
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    [
      "1.24.1-gke.1400",
      "1.23.7-gke.1400",
      "1.23.6-gke.2200",
      "1.23.6-gke.1700",
      "1.23.6-gke.1501",
      "1.23.6-gke.1500",
      "1.23.5-gke.2400",
      "1.23.5-gke.1503",
      "1.23.5-gke.1501",
      "1.22.10-gke.600",
      "1.22.9-gke.2000",
      "1.22.9-gke.1500",
      "1.22.9-gke.1300",
      "1.22.8-gke.2200",
      "1.22.8-gke.202",
      "1.22.8-gke.201",
      "1.22.8-gke.200",
      "1.22.7-gke.1500",
      "1.22.7-gke.1300",
      "1.22.7-gke.900"
    ]
    
  4. MasterVersions ๋ฐ NodeVersions ๋ชฉ๋ก์— ์žˆ๊ณ  blue ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ˜„์žฌ ๋ฒ„์ „๋ณด๋‹ค ๋†’์€ MasterVersion ๋ฐ NodeVersion ๋ฒ„์ „์— ๋Œ€ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    export UPGRADE_VERSION="1.22.10-gke.600"
    

    ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” 1.22.10-gke.600 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ๋ฒ„์ „์€ ์ด ๊ฐ€์ด๋“œ๋ฅผ ์™„๋ฃŒํ•˜๋Š” ์‹œ๊ธฐ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ ๋…ธ๋“œ ํ’€ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  5. blue ํด๋Ÿฌ์Šคํ„ฐ์˜ control plane ๋…ธ๋“œ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.

    gcloud container clusters upgrade blue \
        --zone us-west1-b --master --cluster-version ${UPGRADE_VERSION}
    

    ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด Y๋ฅผ ๋ˆ„๋ฅด์„ธ์š”.

    ๊ณผ์ •์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๋ช‡ ๋ถ„ ์ •๋„ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ณ„์† ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ์—…๋ฐ์ดํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    Updated
    [https://container.googleapis.com/v1/projects/gke-multicluster-upgrades/zones/us-west1-b/clusters/blue].
    
  6. blue ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.

    gcloud container clusters upgrade blue \
        --zone=us-west1-b --node-pool=default-pool \
        --cluster-version ${UPGRADE_VERSION}
    

    ์—…๋ฐ์ดํŠธ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด Y๋ฅผ ๋ˆ„๋ฅด์„ธ์š”.

    ๊ณผ์ •์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๋ช‡ ๋ถ„ ์ •๋„ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋…ธ๋“œ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ณ„์† ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    Upgrading blue... Done with 3 out of 3 nodes (100.0%): 3 succeeded...done.
    Updated [https://container.googleapis.com/v1/projects/gke-multicluster-upgrades/zones/us-west1-b/clusters/blue].
    
  7. blue ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์—…๊ทธ๋ ˆ์ด๋“œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    gcloud container clusters list
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    NAME: ingress-config
    LOCATION: us-west1-a
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.233.186.135
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 4
    STATUS: RUNNING
    
    NAME: blue
    LOCATION: us-west1-b
    MASTER_VERSION: 1.22.10-gke.600
    MASTER_IP: 34.82.35.222
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.10-gke.600
    NUM_NODES: 3
    STATUS: RUNNING
    
    NAME: green
    LOCATION: us-west1-c
    MASTER_VERSION: 1.22.8-gke.202
    MASTER_IP: 35.185.204.26
    MACHINE_TYPE: e2-medium
    NODE_VERSION: 1.22.8-gke.202
    NUM_NODES: 3
    STATUS: RUNNING
    

๋ถ€ํ•˜ ๋ถ„์‚ฐ ํ’€์— blue ํด๋Ÿฌ์Šคํ„ฐ ๋‹ค์‹œ ์ถ”๊ฐ€

์ด ์„น์…˜์—์„œ๋Š” blue ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ํ’€์— ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  1. Cloud Shell์—์„œ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ํ’€์— ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ๊ฐ€ blue ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${BLUE_CLUSTER} get pods
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    NAME                                   READY   STATUS    RESTARTS   AGE
    whereami-deployment-756c7dc74c-xdnb6   1/1     Running   0          17m
    
  2. MutliclusterService ๋ฆฌ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ blue ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ํ’€์— ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} apply \
            -f ${WORKDIR}/multicluster-manifests/mcs-blue-green.yaml
    
  3. ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์–‘์— blue ๋ฐ green ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋ชจ๋‘ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusterservice \
            -o json | jq '.items[].spec.clusters'
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    [
      {
        "link": "us-west1-b/blue"
      },
      {
        "link": "us-west1-c/green"
      }
    ]
    

    blue ๋ฐ green ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ด์ œ clusters ์‚ฌ์–‘์— ์žˆ์Šต๋‹ˆ๋‹ค.

  4. Google Cloud ์ฝ˜์†”์—์„œ Cloud Load Balancing ์ธก์ •ํ•ญ๋ชฉ์˜ ์ธก์ •ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URL์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"
    
  5. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด์ „ ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋œ URL๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ์ฐจํŠธ์—์„œ๋Š” ๋ธ”๋ฃจ ๋ฐ ๊ทธ๋ฆฐ ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋‘ ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€ํ•˜ ์ƒ์„ฑ๊ธฐ์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

    ๋‘ ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋‘ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

    ์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ ์•„ํ‚คํ…์ฒ˜์—์„œ GKE ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค.

  6. green ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๋ฉด ๋ธ”๋ฃจ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋“œ๋ ˆ์ด๋‹ํ•˜๊ณ  ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ blue๋ฅผ green์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์‚ญ์ œ

์ด ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์‚ฌ์šฉ๋œ ๋ฆฌ์†Œ์Šค ๋น„์šฉ์ด Google Cloud ๊ณ„์ •์— ์ฒญ๊ตฌ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ๋ฆฌ์†Œ์Šค๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜์„ธ์š”.

๋น„์šฉ์ด ์ฒญ๊ตฌ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ๋งŒ๋“  Google Cloud ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ์‚ญ์ œ

  1. Cloud Shell์—์„œ blue ๋ฐ green ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋“ฑ๋ก ์ทจ์†Œํ•˜๊ณ  ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    gcloud container fleet memberships unregister blue --gke-cluster=us-west1-b/blue
    gcloud container clusters delete blue --zone us-west1-b --quiet
    
    gcloud container fleet memberships unregister green --gke-cluster=us-west1-c/green
    gcloud container clusters delete green --zone us-west1-c --quiet
    
  2. ingress-config ํด๋Ÿฌ์Šคํ„ฐ์—์„œ MuticlusterIngress ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    kubectl --context ${INGRESS_CONFIG_CLUSTER} delete -f ${WORKDIR}/multicluster-manifests/mci.yaml
    

    ์ด ๋ช…๋ น์–ด๋Š” ํ”„๋กœ์ ํŠธ์—์„œ Cloud Load Balancing ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  3. ingress-config ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋“ฑ๋ก ์ทจ์†Œํ•˜๊ณ  ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    gcloud container fleet memberships unregister ingress-config --gke-cluster=us-west1-a/ingress-config
    gcloud container clusters delete ingress-config --zone us-west1-a --quiet
    
  4. ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    gcloud container clusters list
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    *&lt;null&gt;*
    
  5. kubeconfig ํŒŒ์ผ์„ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    unset KUBECONFIG
    
  6. WORKDIR ํด๋”๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    cd ${HOME}
    rm -rf ${WORKDIR}
    

ํ”„๋กœ์ ํŠธ ์‚ญ์ œ

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

๋‹ค์Œ ๋‹จ๊ณ„