์ด ํํ ๋ฆฌ์ผ์์๋ ๋ฉํฐ ํด๋ฌ์คํฐ ์ธ๊ทธ๋ ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํฐ ํด๋ฌ์คํฐ 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
ํด๋ฌ์คํฐ)์ ์ํ ์ฑ์ ๋ฐฐํฌํฉ๋๋ค.
๋ชฉํ
- GKE ํด๋ฌ์คํฐ๋ฅผ 3๊ฐ ๋ง๋ค์ด Fleet์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
- ํ๋์ GKE ํด๋ฌ์คํฐ(
ingress-config
)๋ฅผ ์ค์ ๊ตฌ์ฑ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑํฉ๋๋ค. - ๋ค๋ฅธ GKE ํด๋ฌ์คํฐ์ ์ํ ์ฑ ๋ฐฐํฌ
- ๋ ์ฑ ํด๋ฌ์คํฐ์์ ์คํ ์ค์ธ ์ฑ์ผ๋ก ํด๋ผ์ด์ธํธ ํธ๋ํฝ์ ๋ณด๋ด๋๋ก ๋ฉํฐ ํด๋ฌ์คํฐ ์ธ๊ทธ๋ ์ค๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
- ์ฑ์ ๋ถํ ์์ฑ๊ธฐ๋ฅผ ์ค์ ํ๊ณ ๋ชจ๋ํฐ๋ง์ ๊ตฌ์ฑํฉ๋๋ค.
- ๋ฉํฐ ํด๋ฌ์คํฐ ์ธ๊ทธ๋ ์ค์์ ํ๋์ ์ฑ ํด๋ฌ์คํฐ๋ฅผ ์ญ์ ๋๋ ๋๋ ์ด๋ํ๊ณ ๋๋ ์ด๋๋ ํด๋ฌ์คํฐ๋ฅผ ์ ๊ทธ๋ ์ด๋ํฉ๋๋ค.
- ๋ฉํฐ ํด๋ฌ์คํฐ ์ธ๊ทธ๋ ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทธ๋ ์ด๋๋ ํด๋ฌ์คํฐ๋ก ํธ๋ํฝ์ ๋ค์ ๋ณด๋ ๋๋ค.
๋น์ฉ
์ด ๋ฌธ์์์๋ ๋น์ฉ์ด ์ฒญ๊ตฌ๋ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ Google Cloud๊ตฌ์ฑ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํ๋ก์ ํธ ์ฌ์ฉ๋์ ๊ธฐ์ค์ผ๋ก ์์ ๋น์ฉ์ ์ฐ์ถํ๋ ค๋ฉด ๊ฐ๊ฒฉ ๊ณ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด ๋ฌธ์์ ์ค๋ช ๋ ํ์คํฌ๋ฅผ ์๋ฃํ์ผ๋ฉด ๋ง๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ์ฌ ์ฒญ๊ตฌ๊ฐ ๊ณ์๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ญ์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
์์ํ๊ธฐ ์ ์
- ์ด ํํ ๋ฆฌ์ผ์์๋ ๋ฉํฐ ํด๋ฌ์คํฐ ์ธ๊ทธ๋ ์ค๋ฅผ ์ค์ ํ์ฌ ๋ค์์ ์ค์ ํด์ผ ํฉ๋๋ค.
- ๋ค์์คํ์ด์ค, ๋ฐฐํฌ, ์๋น์ค ๋ฑ์ ๋์ผํ ์ฑ์ด ๋ชจ๋ ํด๋ฌ์คํฐ์์ ์คํ ์ค์ธ 2๊ฐ ์ด์์ ํด๋ฌ์คํฐ
- ๋ชจ๋ ํด๋ฌ์คํฐ์์ ์๋ ์ ๊ทธ๋ ์ด๋๊ฐ ์ฌ์ฉ ์ค์ง๋จ
- ํด๋ฌ์คํฐ๊ฐ VPC ๊ธฐ๋ฐ ํด๋ฌ์คํฐ๋ก ๋ณ์นญ IP ์ฃผ์ ๋ฒ์๋ฅผ ์ฌ์ฉํจ
- HTTP ๋ถํ ๋ถ์ฐ์ด ์ฌ์ฉ ์ค์ ๋จ(๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ ์ค์ ๋จ)
gcloud --version
์ 369 ์ด์์ด์ด์ผ ํจ GKE ํด๋ฌ์คํฐ ๋ฑ๋ก ๋จ๊ณ๋ ์ด ๋ฒ์ ์ด์์์ ๋ฌ๋ผ์ง๋๋ค.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, activate Cloud Shell.
๊ธฐ๋ณธ ํ๋ก์ ํธ๋ฅผ ์ค์ ํฉ๋๋ค.
export PROJECT=$(gcloud info --format='value(config.project)') gcloud config set project ${PROJECT}
GKE, Hub,
multiclusteringress
API๋ฅผ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.gcloud services enable container.googleapis.com \ gkehub.googleapis.com \ multiclusteringress.googleapis.com \ multiclusterservicediscovery.googleapis.com
ํ๊ฒฝ ์ค์
Cloud Shell์์ ์ ์ฅ์๋ฅผ ํด๋ก ํ์ฌ ์ด ๊ฐ์ด๋์ ์ฌ์ฉํ ํ์ผ์ ๊ฐ์ ธ์ต๋๋ค.
cd ${HOME} git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
WORKDIR
๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค.cd kubernetes-engine-samples/networking/gke-multicluster-upgrade-mci/ export WORKDIR=`pwd`
GKE ํด๋ฌ์คํฐ ๋ง๋ค๊ธฐ ๋ฐ ํ๋ธ ๋ฑ๋ก
์ด ์น์ ์์๋ GKE ํด๋ฌ์คํฐ๋ฅผ 3๊ฐ ๋ง๋ค์ด GKE Enterprise ํ๋ธ์ ๋ฑ๋กํฉ๋๋ค.
GKE ํด๋ฌ์คํฐ ๋ง๋ค๊ธฐ
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
์ ์ธ ์์ญ์์ ๋จ์ผ ๋ฆฌ์ ์ ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ญ๋๋ค. ๋ฆฌ์ ๊ณผ ์์ญ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์์น ๋ฐ ๋ฆฌ์ ์ ์ฐธ์กฐํ์ธ์.ํด๋ฌ์คํฐ๊ฐ ๋ชจ๋ ์์ฑ๋ ๋๊น์ง ๋ช ๋ถ ์ ๋ ๊ธฐ๋ค๋ฆฝ๋๋ค. ํด๋ฌ์คํฐ๊ฐ ์คํ ์ค์ธ์ง ํ์ธํฉ๋๋ค.
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
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
ํ์ผ์ ๋ง๋ ํ์๋ ํด๋ฌ์คํฐ ๊ฐ์ ์ปจํ ์คํธ๋ฅผ ๋น ๋ฅด๊ฒ ์ ํํ ์ ์์ต๋๋ค.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
๋์ค์ ์ฌ์ฉํ ์ ์๋๋ก ํด๋ฌ์คํฐ 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์ฉ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
ํด๋ฌ์คํฐ 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
ํด๋ฌ์คํฐ๊ฐ ๋ฑ๋ก๋์๋์ง ํ์ธํฉ๋๋ค.
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
ํ๋ธ๋ฅผ ํตํด
multiclusteringress
๊ธฐ๋ฅ์ ์ฌ์ฉ ์ค์ ํ์ฌingress-config
ํด๋ฌ์คํฐ๋ฅผ ๋ฉํฐ ํด๋ฌ์คํฐ ์ธ๊ทธ๋ ์ค์ ๊ตฌ์ฑ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑํฉ๋๋ค.gcloud container fleet ingress enable --config-membership=ingress-config
์์ ๋ช ๋ น์ด๋
MulticlusterIngress
๋ฐMulticlusterService
CRD(์ปค์คํ ๋ฆฌ์์ค ์ ์)๋ฅผingress-config
ํด๋ฌ์คํฐ์ ์ถ๊ฐํฉ๋๋ค. ์ด ๋ช ๋ น์ด๋ ์๋ฃ๋๋ ๋ฐ ๋ช ๋ถ ์ ๋ ๊ฑธ๋ฆฝ๋๋ค. ๋ค์ ๋จ๊ณ๋ก ์งํํ๊ธฐ ์ ์ ๊ธฐ๋ค๋ฆฝ๋๋ค.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๋ฅผ ๋๋ฅด์ธ์.
๋ธ๋ฃจ ๋ฐ ๊ทธ๋ฆฐ ํด๋ฌ์คํฐ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ
Cloud Shell์์ ์ํ
whereami
์ฑ์blue
๋ฐgreen
ํด๋ฌ์คํฐ์ ๋ฐฐํฌํฉ๋๋ค.kubectl --context ${BLUE_CLUSTER} apply -f ${WORKDIR}/application-manifests kubectl --context ${GREEN_CLUSTER} apply -f ${WORKDIR}/application-manifests
๋ช ๋ถ ์ ๋ ๊ธฐ๋ค๋ฆฐ ํ
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 ์ธ๊ทธ๋ ์ค ๋ฐ ์๋น์ค ๋ฆฌ์์ค์ ๋ฉํฐ ํด๋ฌ์คํฐ ์๋ ๋ก๊ทธ์
๋๋ค.
Cloud Shell์์
MulticlusterIngress
๋ฆฌ์์ค๋ฅผingress-config
ํด๋ฌ์คํฐ์ ๋ฐฐํฌํฉ๋๋ค.kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/multicluster-manifests/mci.yaml
์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
multiclusteringress.networking.gke.io/whereami-mci created
MulticlusterService
๋ฆฌ์์ค๋ฅผingress-config
ํด๋ฌ์คํฐ์ ๋ฐฐํฌํฉ๋๋ค.kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/multicluster-manifests/mcs-blue-green.yaml
์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
multiclusterservice.networking.gke.io/whereami-mcs created
๋ ๋ฆฌ์์ค๋ฅผ ๋น๊ตํ๋ ค๋ฉด ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
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
๋ฅผ ๋๋ฅด์ธ์.
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
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" }
curl
๋ช ๋ น์ด๋ฅผ ๋ฐ๋ณตํด์ ์คํํฉ๋๋ค. ์์ฒญ์ ๋ ํด๋ฌ์คํฐblue
๋ฐgreen
์ ๋ฐฐํฌ๋whereami
์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ๋ถํ ๋ถ์ฐ๋ฉ๋๋ค.
๋ถํ ์์ฑ๊ธฐ ์ค์
์ด ์น์
์์๋ Cloud Load Balancing VIP์ ๋ํ ํด๋ผ์ด์ธํธ ํธ๋ํฝ์ ์์ฑํ๋ loadgenerator
์๋น์ค๋ฅผ ์ค์ ํฉ๋๋ค. ๋จผ์ MulticlusterService
๋ฆฌ์์ค๊ฐ blue
๋ฐ green
ํด๋ฌ์คํฐ์ ํธ๋ํฝ์ ๋ณด๋ด๋๋ก ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ํธ๋ํฝ์ด ๋ ํด๋ฌ์คํฐ๋ก ์ ์ก๋ฉ๋๋ค. ๋์ค์ ๋จ์ผ ํด๋ฌ์คํฐ๋ก ํธ๋ํฝ์ ์ ์กํ๋๋ก MulticlusterService
๋ฆฌ์์ค๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
ํด๋ผ์ด์ธํธ ํธ๋ํฝ์ Cloud Load Balancing์ผ๋ก ๋ณด๋ด๋๋ก
loadgenerator
๋งค๋ํ์คํธ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.TEMPLATE=loadgen-manifests/loadgenerator.yaml.templ && envsubst < ${TEMPLATE} > ${TEMPLATE%.*}
ingress-config
ํด๋ฌ์คํฐ์loadgenerator
์ ๋ฐฐํฌํฉ๋๋ค.kubectl --context ${INGRESS_CONFIG_CLUSTER} apply -f ${WORKDIR}/loadgen-manifests
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 ์ฝ์์ ํตํด ์ด๋ฌํ ์ธก์ ํญ๋ชฉ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ์
๊ทธ๋ ์ด๋๋ฅผ ์ํด ํด๋ฌ์คํฐ๋ฅผ ๋๋ ์ด๋ํ ๋ ๋ชจ๋ํฐ๋งํ ์ ์๋๋ก ๋จผ์ ๋ชจ๋ํฐ๋ง์ ์ค์ ํฉ๋๋ค(๋ค์ ์น์
์ฐธ์กฐ).
๋ฉํฐ ํด๋ฌ์คํฐ ์ธ๊ทธ๋ ์ค์ ๋๋ฌํ๋ ํธ๋ํฝ์ ํ์ํ ๋์๋ณด๋๋ฅผ ๋ง๋ญ๋๋ค.
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]
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"
๋ธ๋ผ์ฐ์ ์์ ์์ ๋ช ๋ น์ด๋ก ์์ฑ๋ URL๋ก ์ด๋ํฉ๋๋ค.
์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํธ๋ํฝ์ ๋ถํ ์์ฑ๊ธฐ์์
blue
๋ฐgreen
ํด๋ฌ์คํฐ๋ก ์ด๋ํฉ๋๋ค(ํด๋ฌ์คํฐ๊ฐ ์๋ ๋ ์์ญ์ผ๋ก ํ์๋จ). ํ์๋ผ์ธ ์ธก์ ํญ๋ชฉ ์ฐจํธ๋ ๋ ๋ฐฑ์๋๋ก ์ด๋ํ๋ ํธ๋ํฝ์ ๋ณด์ฌ์ค๋๋ค.k8s1-
๋ง์ฐ์ค ์ค๋ฒ ๊ฐ์ ๋ ํ๋ฐํธ์๋MulticlusterServices
์ ๋ํ ๋คํธ์ํฌ ์๋ํฌ์ธํธ ๊ทธ๋ฃน(NEG)์ดblue
๋ฐgreen
ํด๋ฌ์คํฐ์์ ์คํ๋๊ณ ์์์ ๋ํ๋ ๋๋ค.
blue
ํด๋ฌ์คํฐ ๋๋ ์ด๋ ๋ฐ ์
๊ทธ๋ ์ด๋
์ด ์น์
์์๋ blue
ํด๋ฌ์คํฐ๋ฅผ ๋๋ ์ด๋ํฉ๋๋ค. ํด๋ฌ์คํฐ๋ฅผ ๋๋ ์ด๋ํ๋ฉด ๋ถํ ๋ถ์ฐ ํ์์ ํด๋ฌ์คํฐ๊ฐ ์ญ์ ๋ฉ๋๋ค. blue
ํด๋ฌ์คํฐ๋ฅผ ๋๋ ์ด๋ํ ํ์๋ ๋์์ด ์ ํ๋ฆฌ์ผ์ด์
์ธ ๋ชจ๋ ํด๋ผ์ด์ธํธ ํธ๋ํฝ์ด green
ํด๋ฌ์คํฐ๋ก ์ด๋ํฉ๋๋ค.
์ด์ ์น์
์ ์ค๋ช
๋๋ก ์ด ํ๋ก์ธ์ค๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ํด๋ฌ์คํฐ๊ฐ ๋๋ ์ด๋๋๋ฉด ๋๋ ์ด๋๋ ํด๋ฌ์คํฐ๋ฅผ ์
๊ทธ๋ ์ด๋ํ ์ ์์ต๋๋ค. ์
๊ทธ๋ ์ด๋ ํ์๋ ๋ถํ ๋ถ์ฐ ํ์ ๋ค์ ๋ฐฐ์นํ ์ ์์ต๋๋ค. ์์ ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ์ฌ ๋ค๋ฅธ ํด๋ฌ์คํฐ๋ ์
๊ทธ๋ ์ด๋ํฉ๋๋ค(์ด ๊ฐ์ด๋์ ํ์๋์ง ์์).
blue
ํด๋ฌ์คํฐ๋ฅผ ๋๋ ์ด๋ํ๋ ค๋ฉด ingress-cluster
ํด๋ฌ์คํฐ์ MulticlusterService
๋ฆฌ์์ค๋ฅผ ์
๋ฐ์ดํธํ๊ณ clusters
์ฌ์์์ blue
ํด๋ฌ์คํฐ๋ฅผ ์ญ์ ํฉ๋๋ค.
๋ธ๋ฃจ ํด๋ฌ์คํฐ ๋๋ ์ด๋
Cloud Shell์์
ingress-config
ํด๋ฌ์คํฐ์MulticlusterService
๋ฆฌ์์ค๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.kubectl --context ${INGRESS_CONFIG_CLUSTER} \ apply -f ${WORKDIR}/multicluster-manifests/mcs-green.yaml
clusters
์ฌ์์green
ํด๋ฌ์คํฐ๋ง ์๋์ง ํ์ธํฉ๋๋ค.kubectl --context ${INGRESS_CONFIG_CLUSTER} get multiclusterservice \ -o json | jq '.items[].spec.clusters'
์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
[ { "link": "us-west1-c/green" } ]
green
ํด๋ฌ์คํฐ๋งclusters
์ฌ์์ ๋์ด๋๋ฏ๋ก ๋ถํ ๋ถ์ฐ ํ์๋green
ํด๋ฌ์คํฐ๋ง ์์ต๋๋ค.Google Cloud ์ฝ์์์ Cloud Load Balancing ์ธก์ ํญ๋ชฉ์ ์ธก์ ํญ๋ชฉ์ ๋ณผ ์ ์์ต๋๋ค. URL์ ์์ฑํฉ๋๋ค.
echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"
๋ธ๋ผ์ฐ์ ์์ ์ด์ ๋ช ๋ น์ด๋ก ์์ฑ๋ URL๋ก ์ด๋ํฉ๋๋ค.
์ฐจํธ์์๋
green
ํด๋ฌ์คํฐ๋ง ํธ๋ํฝ์ ์์ ํ๊ณ ์์์ ๋ณด์ฌ์ค๋๋ค.
blue
ํด๋ฌ์คํฐ๋ฅผ ์
๊ทธ๋ ์ด๋ํฉ๋๋ค.
์ด์ blue
ํด๋ฌ์คํฐ๊ฐ ๋ ์ด์ ํด๋ผ์ด์ธํธ ํธ๋ํฝ์ ์์ ํ์ง ์์ผ๋ฏ๋ก ํด๋ฌ์คํฐ(์ปจํธ๋กค ํ๋ ์ธ ๋ฐ ๋
ธ๋)๋ฅผ ์
๊ทธ๋ ์ด๋ํ ์ ์์ต๋๋ค.
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
์ด ๊ฐ์ด๋๋ฅผ ์๋ฃํ๋ ์๊ธฐ์ ๋ฐ๋ผ ํด๋ฌ์คํฐ ๋ฒ์ ์ด ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
์์ญ์์ ์ฌ์ฉ ๊ฐ๋ฅํ
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" ]
์์ญ์์ ์ฌ์ฉ ๊ฐ๋ฅํ
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" ]
MasterVersions
๋ฐNodeVersions
๋ชฉ๋ก์ ์๊ณblue
ํด๋ฌ์คํฐ์ ํ์ฌ ๋ฒ์ ๋ณด๋ค ๋์MasterVersion
๋ฐNodeVersion
๋ฒ์ ์ ๋ํ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.export UPGRADE_VERSION="1.22.10-gke.600"
์ด ๊ฐ์ด๋์์๋
1.22.10-gke.600
๋ฒ์ ์ ์ฌ์ฉํฉ๋๋ค. ํด๋ฌ์คํฐ ๋ฒ์ ์ ์ด ๊ฐ์ด๋๋ฅผ ์๋ฃํ๋ ์๊ธฐ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฒ์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ ๊ทธ๋ ์ด๋์ ๋ํ ์์ธํ ๋ด์ฉ์ ํด๋ฌ์คํฐ ๋ฐ ๋ ธ๋ ํ ์ ๊ทธ๋ ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.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].
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].
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
ํด๋ฌ์คํฐ๋ฅผ ๋ถํ ๋ถ์ฐ ํ์ ๋ค์ ์ถ๊ฐํฉ๋๋ค.
Cloud Shell์์ ๋ถํ ๋ถ์ฐ ํ์ ๋ค์ ์ถ๊ฐํ๊ธฐ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๊ฐ
blue
ํด๋ฌ์คํฐ์์ ์คํ ์ค์ธ์ง ํ์ธํฉ๋๋ค.kubectl --context ${BLUE_CLUSTER} get pods
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
NAME READY STATUS RESTARTS AGE whereami-deployment-756c7dc74c-xdnb6 1/1 Running 0 17m
MutliclusterService
๋ฆฌ์์ค๋ฅผ ์ ๋ฐ์ดํธํ์ฌblue
ํด๋ฌ์คํฐ๋ฅผ ๋ถํ ๋ถ์ฐ ํ์ ๋ค์ ์ถ๊ฐํฉ๋๋ค.kubectl --context ${INGRESS_CONFIG_CLUSTER} apply \ -f ${WORKDIR}/multicluster-manifests/mcs-blue-green.yaml
ํด๋ฌ์คํฐ ์ฌ์์
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
์ฌ์์ ์์ต๋๋ค.Google Cloud ์ฝ์์์ Cloud Load Balancing ์ธก์ ํญ๋ชฉ์ ์ธก์ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. URL์ ์์ฑํฉ๋๋ค.
echo "https://console.cloud.google.com/monitoring/dashboards/builder/${DASH_ID}/?project=${PROJECT}&timeDomain=1h"
๋ธ๋ผ์ฐ์ ์์ ์ด์ ๋ช ๋ น์ด๋ก ์์ฑ๋ URL๋ก ์ด๋ํฉ๋๋ค.
์ฐจํธ์์๋ ๋ธ๋ฃจ ๋ฐ ๊ทธ๋ฆฐ ํด๋ฌ์คํฐ ๋ชจ๋ ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ ์์ฑ๊ธฐ์์ ํธ๋ํฝ์ ์์ ํ๊ณ ์์์ ๋ณด์ฌ์ค๋๋ค.
์๊ณ ํ์ จ์ต๋๋ค. ๋ฉํฐ ํด๋ฌ์คํฐ ์ธ๊ทธ๋ ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํฐ ํด๋ฌ์คํฐ ์ํคํ ์ฒ์์ GKE ํด๋ฌ์คํฐ๋ฅผ ์ ๊ทธ๋ ์ด๋ํ์ต๋๋ค.
green
ํด๋ฌ์คํฐ๋ฅผ ์ ๊ทธ๋ ์ด๋ํ๋ ค๋ฉด ๋ธ๋ฃจ ํด๋ฌ์คํฐ๋ฅผ ๋๋ ์ด๋ํ๊ณ ์ ๊ทธ๋ ์ด๋ํ๋ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ณตํฉ๋๋ค. ์ฌ๊ธฐ์blue
๋ฅผgreen
์ผ๋ก ๋ฐ๊ฟ๋๋ค.
์ญ์
์ด ํํ ๋ฆฌ์ผ์์ ์ฌ์ฉ๋ ๋ฆฌ์์ค ๋น์ฉ์ด Google Cloud ๊ณ์ ์ ์ฒญ๊ตฌ๋์ง ์๋๋ก ํ๋ ค๋ฉด ๋ฆฌ์์ค๊ฐ ํฌํจ๋ ํ๋ก์ ํธ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ํ๋ก์ ํธ๋ฅผ ์ ์งํ๊ณ ๊ฐ๋ณ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ์ธ์.
๋น์ฉ์ด ์ฒญ๊ตฌ๋์ง ์๋๋ก ํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ํํ ๋ฆฌ์ผ์์ ๋ง๋ Google Cloud ํ๋ก์ ํธ๋ฅผ ์ญ์ ํ๋ ๊ฒ์ ๋๋ค. ๋๋ ๊ฐ๋ณ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
ํด๋ฌ์คํฐ ์ญ์
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
ingress-config
ํด๋ฌ์คํฐ์์MuticlusterIngress
๋ฆฌ์์ค๋ฅผ ์ญ์ ํฉ๋๋ค.kubectl --context ${INGRESS_CONFIG_CLUSTER} delete -f ${WORKDIR}/multicluster-manifests/mci.yaml
์ด ๋ช ๋ น์ด๋ ํ๋ก์ ํธ์์ Cloud Load Balancing ๋ฆฌ์์ค๋ฅผ ์ญ์ ํฉ๋๋ค.
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
๋ชจ๋ ํด๋ฌ์คํฐ๊ฐ ์ญ์ ๋์๋์ง ํ์ธํฉ๋๋ค.
gcloud container clusters list
์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
*<null>*
kubeconfig
ํ์ผ์ ์ฌ์ค์ ํฉ๋๋ค.unset KUBECONFIG
WORKDIR
ํด๋๋ฅผ ์ญ์ ํฉ๋๋ค.cd ${HOME} rm -rf ${WORKDIR}
ํ๋ก์ ํธ ์ญ์
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
๋ค์ ๋จ๊ณ
- ๋ฉํฐ ํด๋ฌ์คํฐ ์ธ๊ทธ๋ ์ค ์์ธํ ์์๋ณด๊ธฐ
- ํด๋ฌ์คํฐ์ ๋ฉํฐ ํด๋ฌ์คํฐ ์ธ๊ทธ๋ ์ค๋ฅผ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ
- Google Cloud์ ๋ํ ์ฐธ์กฐ ์ํคํ ์ฒ, ๋ค์ด์ด๊ทธ๋จ, ๊ถ์ฅ์ฌํญ ์ดํด๋ณด๊ธฐ. Cloud ์ํคํ ์ฒ ์ผํฐ ์ดํด๋ณด๊ธฐ