์ด ์ฃผ์ ์์๋ GKE์์ Apigee Hybrid์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ฌ์ฉ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
Apigee Hybrid AKS ๋๋ EKS๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ AKS ๋ฐ EKS์์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด ์ฌ์ฉ ์ค์ ์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
๊ฐ์
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ GKE(Google Kubernetes Engine) ๋ด์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด Google Cloud ์๋น์ค์ ์ก์ธ์คํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ์ ๊ฐ์๋ ๋ค์์ ์ฐธ์กฐํ์ธ์.
- ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์๊ฐ: GKE ์ ํ๋ฆฌ์ผ์ด์ ์ธ์ฆ ๊ฐ์
- ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ฌ์ฉ
Google Cloud IAM ์๋น์ค ๊ณ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด Google API์ ์์ฒญ์ ์ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ID์ ๋๋ค. ๋ฌธ์์์๋ ์ด๋ฌํ ์๋น์ค ๊ณ์ ์ GSA(Google ์๋น์ค ๊ณ์ )๋ผ๊ณ ํฉ๋๋ค. GSA์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋น์ค ๊ณ์ ์ ์ฐธ์กฐํ์ธ์.
์ด์ ๋ณ๋๋ก Kubernetes์๋ ์๋น์ค ๊ณ์ ๊ฐ๋ ๋ ์์ต๋๋ค. ์๋น์ค ๊ณ์ ์ ํฌ๋์์ ์คํ๋๋ ํ๋ก์ธ์ค์ ID๋ฅผ ์ ๊ณตํฉ๋๋ค. Kubernetes ์๋น์ค ๊ณ์ ์ Kubernetes ๋ฆฌ์์ค์ด๊ณ Google ์๋น์ค ๊ณ์ ์ Google Cloud์๋ง ํด๋น๋ฉ๋๋ค. Kubernetes ์๋น์ค ๊ณ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ Kubernetes ๋ฌธ์์ ํฌ๋์ ์๋น์ค ๊ณ์ ๊ตฌ์ฑ์ ์ฐธ์กฐํ์ธ์.
Apigee๋ ๊ฐ ๊ตฌ์ฑ ์์ ์ ํ์ ๋ํด Helm ์ฐจํธ๋ฅผ ์ฒ์ ์ค์นํ ๋ Kubernetes ์๋น์ค ๊ณ์ ์ ๋ง๋ค๊ณ ์ฌ์ฉํฉ๋๋ค. ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ฌ์ฉ ์ค์ ํ๋ฉด ํ์ด๋ธ๋ฆฌ๋ ๊ตฌ์ฑ์์๊ฐ Kubernetes ์๋น์ค ๊ณ์ ๊ณผ ์ํธ์์ฉํ ์ ์์ต๋๋ค.
์ด ์ ์ฐจ์์ ์ฌ์ฉ๋ ํ๊ฒฝ ๋ณ์
์ด ๋จ๊ณ์์๋ ๋ค์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ช ๋ น์ด ์ ธ์์ ์ด๋ค์ ์ค์ ํ๊ฑฐ๋ ์ฝ๋ ์ํ์์ ์ค์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
PROJECT_ID
: Google Cloud ํ๋ก์ ํธ์ IDORG_NAME
: Apigee ์กฐ์ง์ ์ด๋ฆENV_NAME
: Apigee ํ๊ฒฝ์ ์ด๋ฆNAMESPACE
: Apigee ๋ค์์คํ์ด์ค(์ผ๋ฐ์ ์ผ๋กapigee
)CLUSTER_LOCATION
: Kubernetes ํด๋ฌ์คํฐ์ ๋ฆฌ์ ๋๋ ์์ญ(์:us-west1
)CLUSTER_NAME
: ํด๋ฌ์คํฐ ์ด๋ฆ์ ๋๋ค.
ํ๊ฒฝ ๋ณ์ ํ์ธ:
echo $PROJECT_IDecho $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_LOCATION
echo $CLUSTER_NAME
ํ์ํ ๋ณ์ ์ด๊ธฐํ:
export PROJECT_ID=my-project-idexport ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee
export CLUSTER_LOCATION=my-cluster-location
export CLUSTER_NAME=my-cluster-name
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ๋ฐ ์๋น์ค ๊ณ์ ํค ํ์ผ
GKE์์ Apigee Hybrid๋ฅผ ์คํํ ๋ ํ์ค ๋ฐฉ์์ ๊ฐ ์๋น์ค ๊ณ์ ์ ๋น๊ณต๊ฐ ํค(.json
ํ์ผ)๋ฅผ ๋ง๋ค๊ณ ๋ค์ด๋ก๋ํ๋ ๊ฒ์
๋๋ค. ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ฌ์ฉํ ๋๋ ์๋น์ค ๊ณ์ ๋น๊ณต๊ฐ ํค๋ฅผ ๋ค์ด๋ก๋ํ๊ณ GKE ํด๋ฌ์คํฐ์ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค.
Apigee Hybrid ์ค์น์ ์ผ๋ถ๋ก ์๋น์ค ๊ณ์ ํค ํ์ผ์ ๋ค์ด๋ก๋ํ ๊ฒฝ์ฐ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ฌ์ฉ ์ค์ ํ ํ ์ญ์ ํ ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ค์น์์๋ ๊ฐ ๊ตฌ์ฑ์์ ์ฐจํธ์ ๋๋ ํฐ๋ฆฌ์ ์์ต๋๋ค.
Apigee Hybrid์ฉ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ฌ์ฉ ์ค์
์๋ด์ ๋ฐ๋ผ ํ๋ก์ ํธ์ ๋ํด ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ๊ตฌ์ฑ ์ค๋น
- ์ฌ์ ์ ํ์ผ์์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๊ฐ ์ฌ์ฉ ์ค์ ๋์๋์ง ํ์ธํฉ๋๋ค. ์ฌ์ ์ ํ์ผ์์ ์ฌ์ฉ ์ค์ ํด์ผ ํ๋ฉฐ ๋ค์ ๊ตฌ์ฑ ์์ฑ์ ๋ํ ๊ฐ์ด ์์ด์ผ ํฉ๋๋ค.
- ๋ชจ๋ ์ค์น์์
gcp.workloadIdentity.enabled
๋true
์ฌ์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.gcp: workloadIdentity: enabled: true
- ํ๋ก๋์ ์ค์น:
- ๋นํ๋ก๋์
์ค์น์ ๊ฒฝ์ฐ
gcp.workloadIdentity.gsa
์์ฑ์ ๋นํ๋ก๋์ GSA์ ์ฃผ์(ํ์ํ ๋ชจ๋ IAM ์ญํ ํฌํจ)๋ฅผ ์ ๊ณตํ์ธ์.
- ๋ชจ๋ ์ค์น์์
- ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ
gcloud
๊ตฌ์ฑ์ด Google Cloud ํ๋ก์ ํธ ID๋ก ์ค์ ๋์๋์ง ํ์ธํฉ๋๋ค.gcloud config get project
- GKE ํด๋ฌ์คํฐ์ ๋ํ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๊ฐ ์ฌ์ฉ ์ค์ ๋์๋์ง ํ์ธํฉ๋๋ค. 1๋จ๊ณ: ํด๋ฌ์คํฐ ๋ง๋ค๊ธฐ์์ ํด๋ฌ์คํฐ๋ฅผ ๋ง๋ ๊ฒฝ์ฐ 6๋จ๊ณ๋ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ฌ์ฉ ์ค์ ํ๋ ๊ฒ์ด์์ต๋๋ค. ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํ์ฌ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๊ฐ ์ฌ์ฉ ์ค์ ๋์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๋ฆฌ์ ํด๋ฌ์คํฐ
gcloud container clusters describe $CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten 'workloadIdentityConfig'
์์ญ ํด๋ฌ์คํฐ
gcloud container clusters describe $CLUSTER_NAME \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten 'workloadIdentityConfig'
๋ค์๊ณผ ์ ์ฌํ๊ฒ ์ถ๋ ฅ๋ฉ๋๋ค.
--- workloadPool: PROJECT_ID.svc.id.goog
๊ฒฐ๊ณผ์
null
๊ฐ ๋์ ํ์๋๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ํด๋ฌ์คํฐ์ ๋ํด ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.๋ฆฌ์ ํด๋ฌ์คํฐ
gcloud container clusters update $CLUSTER_NAME \ --workload-pool=$PROJECT_ID.svc.id.goog \ --project $PROJECT_ID \ --region $CLUSTER_LOCATION
์์ญ ํด๋ฌ์คํฐ
gcloud container clusters update $CLUSTER_NAME \ --workload-pool=$PROJECT_ID.svc.id.goog \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID
-
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ๊ฐ ๋ ธ๋ ํ์ ๋ํด ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ฌ์ฉ ์ค์ ํฉ๋๋ค. ์ด ์์ ์ ๊ฐ ๋ ธ๋์ ๋ํด ์ต๋ 30๋ถ ์ ๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
๋ฆฌ์ ํด๋ฌ์คํฐ
gcloud container node-pools update NODE_POOL_NAME \ --cluster=$CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID \ --workload-metadata=GKE_METADATA
์์ญ ํด๋ฌ์คํฐ
gcloud container node-pools update NODE_POOL_NAME \ --cluster=$CLUSTER_NAME \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID \ --workload-metadata=GKE_METADATA
์ฌ๊ธฐ์ NODE_POOL_NAME๋ ๊ฐ ๋ ธ๋ ํ์ ์ด๋ฆ์ ๋๋ค. ๋๋ถ๋ถ์ Apigee Hybrid ์ค์น์์ ๋ ๊ธฐ๋ณธ ๋ ธ๋ ํ์ ์ด๋ฆ์
apigee-data
๋ฐapigee-runtime
์ ๋๋ค. - ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์ ๋
ธ๋ ํ์์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๊ฐ ์ฌ์ฉ ์ค์ ๋์๋์ง ํ์ธํฉ๋๋ค.
๋ฆฌ์ ํด๋ฌ์คํฐ
gcloud container node-pools describe apigee-data \ --cluster $CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten "config:"
gcloud container node-pools describe apigee-runtime \ --cluster $CLUSTER_NAME \ --region $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten "config:"
์์ญ ํด๋ฌ์คํฐ
gcloud container node-pools describe apigee-data \ --cluster $CLUSTER_NAME \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten "config:"
gcloud container node-pools describe apigee-runtime \ --cluster $CLUSTER_NAME \ --zone $CLUSTER_LOCATION \ --project $PROJECT_ID \ --flatten "config:"
๋ค์๊ณผ ๋น์ทํ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
--- diskSizeGb: 100 diskType: pd-standard ... workloadMetadataConfig: mode: GKE_METADATA
ํ์ํ ๊ฒฝ์ฐ ํ์ฌ gcloud
๊ตฌ์ฑ์ ์ค์ ํฉ๋๋ค.
gcloud config set project $PROJECT_ID
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ๊ตฌ์ฑ
๋ค์ ํ์ด๋ธ๋ฆฌ๋ ๊ตฌ์ฑ์์์ ๋ํด ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ฌ์ฉ ์ค์ ํ๋ ค๋ฉด ๋ค์ ์ ์ฐจ๋ฅผ ๋ฐ๋ฅด์ธ์.
apigee-datastore
apigee-telemetry
apigee-org
apigee-env
apigee-datastore
, apigee-env
, apigee-org
, apigee-telemetry
์ฐจํธ์ --dry-run
๋๋ --dry-run=server
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ helm upgrade
๋ฅผ ์คํํ๋ฉด ์ฌ๋ฐ๋ฅธ GSA ๋ฐ KSA ์ด๋ฆ์ผ๋ก ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ํ ๋ช
๋ น์ด๊ฐ ์ถ๋ ฅ์ ํฌํจ๋ฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
helm upgrade datastore apigee-datastore/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run=server
NAME: datastore ... For Cassandra backup GKE Workload Identity, please make sure to add the below membership to the IAM policy binding using the respective kubernetes SA (KSA). gcloud iam service-accounts add-iam-policy-binding my-gsa@my-project-id.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:my-project-id.svc.id.goog[apigee/apigee-cassandra-default]" \ --project my-project-id kubectl annotate serviceaccount apigee-cassandra-default \ iam.gke.io/gcp-service-account=my-gsa@my-project-id.iam.gserviceaccount.com \ --namespace apigee
apigee-datastore
์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ค์ ํ๋ ๋ช ๋ น์ด๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ๋ ฅ์์NOTES:
์๋์ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.helm upgrade datastore apigee-datastore/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run=server
apigee-telemetry
์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ค์ ํ๋ ๋ช ๋ น์ด๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ๋ ฅ์์NOTES:
์๋์ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.helm upgrade telemetry apigee-telemetry/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run
apigee-org
์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ค์ ํ๋ ๋ช ๋ น์ด๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ๋ ฅ์์NOTES:
์๋์ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.helm upgrade $ORG_NAME apigee-org/ \ --namespace $NAMESPACE \ -f overrides.yaml \ --dry-run
apigee-env
์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ๋ฅผ ์ค์ ํ๋ ๋ช ๋ น์ด๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ๋ ฅ์์NOTES:
์๋์ ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.helm upgrade $ENV_NAME apigee-env/ \ --namespace $NAMESPACE \ --set env=$ENV_NAME \ -f overrides.yaml \ --dry-run
์ค์น์ ๊ฐ ํ๊ฒฝ์์ ์ด ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ์ธ
- ๋จ๊ณ๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํฉ๋๋ค.
gcloud config set project $PROJECT_ID
kubectl run --rm -it --image google/cloud-sdk:slim \ --namespace $NAMESPACE workload-identity-test\ -- gcloud auth list
๋ช ๋ น์ด ํ๋กฌํํธ๊ฐ ๋ณด์ด์ง ์์ผ๋ฉด Enter๋ฅผ ๋๋ฌ ๋ณด์ธ์.
๋จ๊ณ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์คํ๋์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ต์ด ํ์๋์ด์ผ ํฉ๋๋ค.
Credentialed Accounts ACTIVE ACCOUNT * GSA@PROJECT_ID.iam.gserviceaccount.com
- ์ด์ ์ค์น์์ ์
๊ทธ๋ ์ด๋ํ๋ ๊ฒฝ์ฐ ์๋น์ค ๊ณ์ ๋น๊ณต๊ฐ ํค๊ฐ ํฌํจ๋ ๋ณด์ ๋น๋ฐ์ ์ญ์ ํฉ๋๋ค.
kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
- ๋ก๊ทธ ํ์ธ:
kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer
- (์ ํ์ฌํญ) Google Cloud console์ Kubernetes: ์ํฌ๋ก๋ ๊ฐ์ ํ์ด์ง์์ Kubernetes ์๋น์ค ๊ณ์ ์ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.