์ด ์ฃผ์ ์์๋ AKS ๋ฐ EKS ํ๋ซํผ์์ Apigee Hybrid ์ค์น์ ๋ํด ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด๋ฅผ ์ฌ์ฉ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
GKE์ ์ค์นํ๋ ๊ฒฝ์ฐ GKE์์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ฌ์ฉ ์ค์ ์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
๊ฐ์
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด๋ฅผ ์ฌ์ฉํ๋ฉด Google Cloud ์ธ๋ถ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ธ๋ถ ID ๊ณต๊ธ์ ์ฒด์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ Google Cloud Platform ์๋น์ค ๊ณ์ ์ ๊ฐ์ฅํ ์ ์์ต๋๋ค.
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ ํ๊ฒฝ์์ ์ ๊ณต๋๋ ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํจ์ผ๋ก์จ ๋ณด์์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์๊ณ ์๋น์ค ๊ณ์ ํค ๊ต์ฒด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๊ฐ์๋ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด ์ฌ์ฉ ๊ถ์ฅ์ฌํญ์ ์ฐธ์กฐํ์ธ์.
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด ์ค์
Apigee Hybrid์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ ํ Apigee Hybrid ์ค์น์ ๊ธฐ๋ฅ์ ์ ์ฉํฉ๋๋ค.
์์ํ๊ธฐ ์ ์
์ด ์๋ด์์๋ ์ด๋ฏธ Apigee Hybrid ์ค์น๋ฅผ ์ค์ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. IAM ์๋น์ค ๊ณ์ ๊ณผ Kubernetes ์๋น์ค ๊ณ์ ์ ์ด๊ธฐ ์ค์น ์ค์ ์์ฑ๋ฉ๋๋ค. Apigee Hybrid ์ค์น ๊ฐ์๋ ๊ฐ์๋ฅผ ์ฐธ์กฐํ์ธ์.
AKS์ ์ค์นํ๋ ๊ฒฝ์ฐ OpenID Connect(OIDC) ๋ฐ๊ธ๊ธฐ๊ด์ ์ฌ์ฉ ์ค์ ํด์ผ ํฉ๋๋ค. ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด์์ OpenID Connect ๋ฉํ๋ฐ์ดํฐ์ ํด๋ฌ์คํฐ์ JSON ์น ํค ์งํฉ(JWKS)์ ์ก์ธ์คํ ์ ์๋๋ก ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉ ์ค์ ํด์ผ ํฉ๋๋ค.
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด๋ฅผ ์ฌ์ฉํ๋๋ก ํด๋ฌ์คํฐ ๊ตฌ์ฑ
-
๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ
gcloud
๊ตฌ์ฑ์ด Google Cloud ํ๋ก์ ํธ ID๋ก ์ค์ ๋์๋์ง ํ์ธํฉ๋๋ค.gcloud config get project
-
๋ณด์ ํ ํฐ ์๋น์ค API๋ฅผ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด์ ํ ํฐ ์๋น์ค API๊ฐ ์ฌ์ฉ ์ค์ ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
gcloud services list --enabled --project PROJECT_ID | grep sts.googleapis.com
API๊ฐ ์ฌ์ฉ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
์ฝ์
Enable the Security Token Service API.
๋ช ๋ น์ค
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ API๋ฅผ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.
gcloud services enable sts.googleapis.com --project PROJECT_ID
-
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ ๋ฐ ๊ณต๊ธ์
์ฒด ๋ง๋ค๊ธฐ
ํ์ํ ์ญํ
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ํ์ํ ๊ถํ์ ์ป์ผ๋ ค๋ฉด ๊ด๋ฆฌ์์๊ฒ ํ๋ก์ ํธ์ ๋ํ ๋ค์ IAM ์ญํ ์ ๋ถ์ฌํด ๋ฌ๋ผ๊ณ ์์ฒญํ์ธ์.
-
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ ๊ด๋ฆฌ์(
roles/iam.workloadIdentityPoolAdmin
) -
์๋น์ค ๊ณ์ ๊ด๋ฆฌ์(
roles/iam.serviceAccountAdmin
)
์ญํ ๋ถ์ฌ์ ๋ํ ์์ธํ ๋ด์ฉ์ ํ๋ก์ ํธ, ํด๋, ์กฐ์ง์ ๋ํ ์ก์ธ์ค ๊ด๋ฆฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ปค์คํ ์ญํ ์ด๋ ๋ค๋ฅธ ์ฌ์ ์ ์๋ ์ญํ ์ ํตํด ํ์ํ ๊ถํ์ ์ป์ ์๋ ์์ต๋๋ค.
๋๋ IAM ์์ ์(roles/owner
) ๊ธฐ๋ณธ ์ญํ ์๋ ID ์ ํด๋ฅผ ๊ตฌ์ฑํ๋ ๊ถํ๋ ํฌํจ๋ฉ๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์๋ ๊ธฐ๋ณธ ์ญํ ์ ๋ถ์ฌํ์ง ๋ง์์ผ ํ์ง๋ง ๊ฐ๋ฐ ํ๊ฒฝ ๋๋ ํ ์คํธ ํ๊ฒฝ์์๋ ๋ถ์ฌํด๋ ๋ฉ๋๋ค.์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ๊ณผ ๊ณต๊ธ์ ์ฒด๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
-
AKS ํด๋ฌ์คํฐ์ ๋ฐ๊ธ๊ธฐ๊ด URL์ ํ์ธํฉ๋๋ค.
AKS
az aks show -n NAME -g RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv
๋ค์์ ๋ฐ๊ฟ๋๋ค.
NAME
: ํด๋ฌ์คํฐ์ ์ด๋ฆ์ ๋๋ค.RESOURCE_GROUP
: ํด๋ฌ์คํฐ์ ๋ฆฌ์์ค ๊ทธ๋ฃน์ ๋๋ค.
์ด ๋ช ๋ น์ด๋ ๋ฐ๊ธ๊ธฐ๊ด URL์ ์ถ๋ ฅํฉ๋๋ค. ๋ค์ ๋จ๊ณ ์ค ํ๋์์ ๋ฐ๊ธ๊ธฐ๊ด URL์ด ํ์ํฉ๋๋ค.
๋ช ๋ น์ด๊ฐ ๋ฐ๊ธ๊ธฐ๊ด URL์ ๋ฐํํ์ง ์์ผ๋ฉด OIDC ๋ฐ๊ธ๊ธฐ๊ด ๊ธฐ๋ฅ์ ์ฌ์ฉ ์ค์ ํ๋์ง ํ์ธํฉ๋๋ค.
EKS
aws eks describe-cluster --name NAME --query "cluster.identity.oidc.issuer" --output text
NAME
์ ํด๋ฌ์คํฐ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ๋๋ค.์ด ๋ช ๋ น์ด๋ ๋ฐ๊ธ๊ธฐ๊ด URL์ ์ถ๋ ฅํฉ๋๋ค. ๋ค์ ๋จ๊ณ ์ค ํ๋์์ ๋ฐ๊ธ๊ธฐ๊ด URL์ด ํ์ํฉ๋๋ค.
๊ธฐํ Kubernetes
-
Kubernetes ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐํ๊ณ `kubectl`์ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ์ ๋ฐ๊ธ๊ธฐ๊ด URL์ ํ์ธํฉ๋๋ค.
kubectl get --raw /.well-known/openid-configuration | jq -r .issuer
๋ค์ ๋จ๊ณ ์ค ํ๋์์ ๋ฐ๊ธ๊ธฐ๊ด URL์ด ํ์ํฉ๋๋ค.
-
์ ํ์ฌํญ: OIDC ๋ฐ๊ธ๊ธฐ๊ด์์ ๊ณต๊ฐ์ ์ผ๋ก ์ก์ธ์คํ ์ ์๋ ๊ฒฝ์ฐ ํด๋ฌ์คํฐ์ JSON ์น ํค ์ธํธ(JWKS)๋ฅผ ๋ค์ด๋ก๋ํฉ๋๋ค.
kubectl get --raw /openid/v1/jwks > cluster-jwks.json
OIDC ์ ๊ณต์ ์ฒด๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋์ง ํ์ธํ๋ ค๋ฉด CURL ๋ช ๋ น์ด๋ก ์ ๊ณต์ ์ฒด URL์ ์ก์ธ์คํ์ฌ 200 ์๋ต์ ์์ ํ ์ ์์ด์ผ ํฉ๋๋ค.
-
์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ์ ๋ง๋ญ๋๋ค.
gcloud iam workload-identity-pools create POOL_ID \ --location="global" \ --description="DESCRIPTION" \ --display-name="DISPLAY_NAME"
๋ค์์ ๋ฐ๊ฟ๋๋ค.
POOL_ID
: ํ์ ๊ณ ์ IDDISPLAY_NAME
: (์ ํ์ฌํญ) ํ์ ์ด๋ฆDESCRIPTION
: (์ ํ์ฌํญ) ์ ํํ ํ์ ๋ํ ์ค๋ช . (์ด ์ค๋ช ์ ํ ID์ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ ๋ ํ์๋ฉ๋๋ค.)
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
gcloud iam workload-identity-pools create my-wi-pool --display-name="My workload pool" --description="My workload pool description"
-
ํด๋ฌ์คํฐ๋ฅผ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ ๊ณต๊ธ์
์ฒด๋ก ์ถ๊ฐํฉ๋๋ค. OIDC ๋ฐ๊ธ๊ธฐ๊ด์์ ๊ณต๊ฐ์ ์ผ๋ก ์ก์ธ์ค ๊ฐ๋ฅํ์ง ๋๋ ๊ณต๊ฐ์ ์ผ๋ก ์ก์ธ์ค ๋ถ๊ฐ๋ฅํ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ์ ๊ณต์
์ฒด๋ฅผ ์์ฑํ๋ ๋ช
๋ น์ด๋ฅผ ์ ํํฉ๋๋ค.
๊ณต๊ฐ์ ์ผ๋ก ์ก์ธ์ค ๊ฐ๋ฅ
OIDC ๋ฐ๊ธ๊ธฐ๊ด์ ๊ณต๊ฐ์ ์ผ๋ก ์ก์ธ์คํ ์ ์๋ ๊ฒฝ์ฐ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ณต๊ธ์ ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \ --location="global" \ --workload-identity-pool="POOL_ID" \ --issuer-uri="ISSUER" \ --attribute-mapping="google.subject=assertion.sub"
๊ณต๊ฐ์ ์ผ๋ก ์ก์ธ์คํ ์ ์์
OIDC ๋ฐ๊ธ๊ธฐ๊ด์ ๊ณต๊ฐ์ ์ผ๋ก ์ก์ธ์คํ ์ ์๋ ๊ฒฝ์ฐ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ณต์ ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \ --location="global" \ --workload-identity-pool="POOL_ID" \ --issuer-uri="ISSUER" \ --jwks-file="cluster-jwks.json" \ --attribute-mapping="google.subject=assertion.sub"
๋ค์์ ๋ฐ๊ฟ๋๋ค.
WORKLOAD_PROVIDER_ID
: ์ ํํ ๊ณ ์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ ๊ณต๊ธ์ ์ฒด IDPOOL_ID
: ์์์ ๋ง๋ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ ID-
ISSUER
: ์ด์ ์ ํ์ธํ ๋ฐ๊ธ๊ธฐ๊ด URL.
attribute-mapping="google.subject=assertion.sub"
๋ Kubernetes ์ฃผ์ฒด๋ฅผ IAM ์ฃผ์ฒด์ ๋งคํํฉ๋๋ค.
-
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ ๊ด๋ฆฌ์(
ํ์ํ ๊ฒฝ์ฐ ํ์ฌ gcloud
๊ตฌ์ฑ์ ์ค์ ํฉ๋๋ค.
gcloud config set project PROJECT_ID
์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ตฌ์ฑ ํ์ผ ๋ง๋ค๊ธฐ
Google Cloud ๋ฆฌ์์ค์ ์ก์ธ์คํ ์ ์๋ Kubernetes ์ํฌ๋ก๋๋ฅผ ๋ฐฐํฌํ๋ ค๋ฉด ๋จผ์ ๊ฐ IAM ์๋น์ค ๊ณ์ ์ ๋ํ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ตฌ์ฑ ํ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
-
๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ IAM ์๋น์ค ๊ณ์ ('Google ์๋น์ค ๊ณ์ '์ด๋ผ๊ณ ๋ ํจ)์ ๋์ดํฉ๋๋ค.
gcloud iam service-accounts list --project PROJECT_ID
๋ค์ IAM ์๋น์ค ๊ณ์ ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ตฌ์ฑ ํ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
ํ๋ก๋์
ํ๋ก๋์ ํ๊ฒฝ์ ๊ฒฝ์ฐ:
DISPLAY NAME EMAIL DISABLED apigee-cassandra apigee-cassandra@my_project_id.iam.gserviceaccount.com False apigee-mart apigee-mart@my_project_id.iam.gserviceaccount.com False apigee-metrics apigee-metrics@my_project_id.iam.gserviceaccount.com False apigee-runtime apigee-runtime@my_project_id.iam.gserviceaccount.com False apigee-synchronizer apigee-synchronizer@my_project_id.iam.gserviceaccount.com False apigee-udca apigee-udca@my_project_id.iam.gserviceaccount.com False apigee-watcher apigee-watcher@my_project_id.iam.gserviceaccount.com False
๋นํ๋ก๋์
๋นํ๋ก๋์ ํ๊ฒฝ์ ๊ฒฝ์ฐ:
DISPLAY NAME EMAIL DISABLED apigee-non-prod apigee-non-prod@my_project_id.iam.gserviceaccount.com False
-
์ด์ ๋ชฉ๋ก์ ์๋ ๊ฐ IAM ์๋น์ค ๊ณ์ ์ ๋ํ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ตฌ์ฑ ํ์ผ์ ๋ง๋ญ๋๋ค. ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด๋ฅผ ์ฌ์ฉํ๋๋ก Apigee Hybrid๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด ๋ค์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ตฌ์ฑ ํ์ผ์ด ํ์ํฉ๋๋ค.
์ฝ๋
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \ --service-account=SERVICE_ACCOUNT_EMAIL \ --credential-source-file=/var/ --credential-source-type=text \ --output-file=SERVICE_ACCOUNT_NAME-credential-configuration.json
์
gcloud iam workload-identity-pools create-cred-config \ projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider \ --service-account=apigee-cassandra@myhybridporg.iam.gserviceaccount.com \ --credential-source-file=/var/ --credential-source-type=text \ --output-file=apigee-cassandra-credential-configuration.json
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
PROJECT_NUMBER
: ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ์ด ํฌํจ๋ ํ๋ก์ ํธ์ ํ๋ก์ ํธ ๋ฒํธ. ํ๋ก์ ํธ ID๊ฐ ์๋ ํ๋ก์ ํธ ๋ฒํธ์ฌ์ผ ํฉ๋๋ค. -
POOL_ID
: ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ์ ID -
WORKLOAD_PROVIDER_ID
: ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ ๊ณต๊ธ์ ์ฒด์ ID -
SERVICE_ACCOUNT_EMAIL
: Kubernetes ServiceAccount์์ IAM ์๋น์ค ๊ณ์ ๊ฐ์ฅ์ ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑํ ๊ฒฝ์ฐ ์๋น์ค ๊ณ์ ์ ์ด๋ฉ์ผ ์ฃผ์
์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉํ๋ฉด [Cloud ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ](/apis/docs/cloud-client-libraries), gcloud CLI, Terraform์์ ๋ค์์ ํ์ธํ ์ ์์ต๋๋ค.
- ์ธ๋ถ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์์น
- ์ฌ์ฉํ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ ๋ฐ ๊ณต๊ธ์ ์ฒด
- ๊ฐ์ฅํ ์๋น์ค ๊ณ์
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด๋ฅผ ์ฌ์ฉํ๋๋ก Apigee Hybrid ๊ตฌ์ฑ
-
๊ฐ ์ถ๋ ฅ ํ์ผ(
SERVICE_ACCOUNT_NAME-credential-configuration.json
)์ ๋ค์ ์ฐจํธ ๋๋ ํฐ๋ฆฌ(๋๋ ํ์ ๋๋ ํฐ๋ฆฌ)์ ๋ณต์ฌํ๊ฑฐ๋ ์ด๋ํฉ๋๋ค. ์ด ํ์ผ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ตฌ์ฑ ํ์ผ ๋ง๋ค๊ธฐ ๋จ๊ณ์์ ๋ง๋ ํ์ผ์ ๋๋ค.ํ๋ก๋์
์๋น์ค ๊ณ์ Apigee Helm ์ฐจํธ ๋๋ ํฐ๋ฆฌ apigee-cassandra
apigee-datastore/
apigee-mart
apigee-org/
apigee-metrics
apigee-telemetry/
apigee-runtime
apigee-env/
apigee-synchronizer
apigee-env/
apigee-udca
apigee-org/
apigee-env/
apigee-watcher
apigee-org/
๋นํ๋ก๋์
์๋น์ค ๊ณ์ Apigee Helm ์ฐจํธ apigee-non-prod
apigee-datastore/
apigee-telemetry/
apigee-org/
apigee-env/
-
ํด๋ฌ์คํฐ์ ์ฌ์ ์ ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ญ์ ์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
์ฝ๋
gcp: workloadIdentity: enabled: false # must be set to false to use Workload Identity Federation federatedWorkloadIdentity: enabled: true audience: "AUDIENCE" credentialSourceFile: "/var/run/service-account/token"
์
gcp: workloadIdentity: enabled: false federatedWorkloadIdentity: enabled: true audience: "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider" credentialSourceFile: "/var/run/service-account/token"
์ฌ๊ธฐ์์ AUDIENCE๋ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ๊ณต๊ธ์ ์ฒด์ ํ์ฉ๋๋ ๋์์ ๋๋ค. ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ตฌ์ฑ ํ์ผ์์
audience:
๋ผ๋ ์ฉ์ด๋ฅผ ๊ฒ์ํ์ฌ ๊ฐ์ ์ฐพ์ ์ ์์ต๋๋ค. ์ ์ฌ๊ณ ๊ฐ ๊ฐ์ ๊ฐ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ตฌ์ฑ ํ์ผ์์ ๋์ผํฉ๋๋ค.์๋ฅผ ๋ค์ด ๋ค์ ์ํ
apigee-udca-credential-configuration.json
ํ์ผ์์{ "universe_domain": "googleapis.com", "type": "external_account:," "audience": "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider", "subject_token_type": "urn:ietf:params:oauth: token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "service "impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/apigee-udca@myhybridproject.iam.gserviceaccount.com:generateAccessToken", "credential_source": { "file": "/var/run/service-account/token", "format": { "type": "text" } } }
์ ์ฌ๊ณ ๊ฐ ๊ฐ์
//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider
์ ๋๋ค. -
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๊ตฌ์ฑ์์์ ๋ํ ์ฌ์ ์๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ์ค์น์ ๋ฐ๋ผ ์ธ์ฆ์ ํ์ผ, Kubernetes ๋ณด์ ๋น๋ฐ, Vault ์๋ด๋ฅผ ์ ํํฉ๋๋ค.
์ธ์ฆ์ ํ์ผ
serviceAccountPath
๊ฐ์ ํด๋น IAM ์๋น์ค ๊ณ์ ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ์์ค ํ์ผ๋ก ๋ฐ๊ฟ๋๋ค. ์ด ๊ฒฝ๋ก๋ ์ฐจํธ ๋๋ ํฐ๋ฆฌ์ ์๋ ๊ฒฝ๋ก์ฌ์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.envs: - name: ENVIRONMENT_NAME serviceAccountPaths: synchronizer: apigee-synchronizer-credential-configuration.json runtime: apigee-runtime-credential-configuration.json udca: apigee-udca-credential-configuration.json mart: serviceAccountPath: apigee-mart-credential-configuration.json connectAgent: serviceAccountPath: apigee-mart-credential-configuration.json metrics: serviceAccountPath: apigee-metrics-credential-configuration.json udca: serviceAccountPath: apigee-udca-credential-configuration.json watcher: serviceAccountPath: apigee-watcher-credential-configuration.json
K8s ๋ณด์ ๋น๋ฐ
-
๊ฐ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ์์ค ํ์ผ์ ์ฌ์ฉํ์ฌ ์๋ก์ด Kubernetes ๋ณด์ ๋น๋ฐ์ ๋ง๋ญ๋๋ค.
kubectl create secret -n APIGEE_NAMESPACE generic SECRET_NAME --from-file="client_secret.json=CREDENTIAL_CONFIGURATION_FILE"
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
kubectl create secret -n apigee generic udca-workoad-identity-secret --from-file="client_secret.json=./apigee-udca-credential-configuration.json"
-
serviceAccountRef
์ ๊ฐ์ ์ ๋ณด์ ๋น๋ฐ๋ก ๋ฐ๊ฟ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.udca: serviceAccountRef: udca-workoad-identity-secret
Vault
Vault์์ ๊ฐ ์๋น์ค ๊ณ์ ์ ์๋น์ค ๊ณ์ ํค
SAKEY
๋ฅผ ํด๋น ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ์์ค ํ์ผ์ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ ์ฐจ๋ ๋ชจ๋ ๊ตฌ์ฑ์์์ ์ ์ฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด UDCA์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.SAKEY=$(cat .apigee-udca-credential-configuration.json); kubectl -n APIGEE_NAMESPACE exec vault-0 -- vault kv patch secret/apigee/orgsakeys udca="$SAKEY"
์์ธํ ๋ด์ฉ์
Storing service account keys in Hashicorp Vault
๋ฅผ ์ฐธ์กฐํ์ธ์. -
๊ฐ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ์์ค ํ์ผ์ ์ฌ์ฉํ์ฌ ์๋ก์ด Kubernetes ๋ณด์ ๋น๋ฐ์ ๋ง๋ญ๋๋ค.
-
helm upgrade
๋ช ๋ น์ด๋ก ์ํฅ์ ๋ฐ๋ ๊ฐ ๊ตฌ์ฑ์์์ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํฉ๋๋ค.Vault ์๋น์ค ๊ณ์ ํค๋ฅผ ์ ๋ฐ์ดํธํ ๊ฒฝ์ฐ
apigee-operator
์ฐจํธ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.helm upgrade operator apigee-operator/ \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
์ํฅ์ ๋ฐ๋ ๋๋จธ์ง ์ฐจํธ๋ ๋ค์ ์์๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
helm upgrade datastore apigee-datastore/ \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
helm upgrade telemetry apigee-telemetry/ \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
helm upgrade $ORG_NAME apigee-org/ \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
๊ฐ ํ๊ฒฝ์
apigee-env
์ฐจํธ๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ๋งค๋ฒ $ENV_RELEASE_NAME ๋ฐ ENV_NAME์ ๋ฐ๊ฟ๋๋ค.helm upgrade $ENV_RELEASE_NAME apigee-env/ \ --namespace APIGEE_NAMESPACE \ --atomic \ --set env=$ENV_NAME \ -f overrides.yaml
๊ตฌ์ฑ์์ ๋ฐ ํด๋น ์ฐจํธ ๋ชฉ๋ก์ Apigee Hybrid Helm ์ฐธ์กฐ๋ฅผ ํ์ธํ์ธ์.
Kubernetes ์๋น์ค ๊ณ์ ์ ๋ํ ์ก์ธ์ค ๊ถํ ๋ถ์ฌ
-
๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ Kubernetes ์๋น์ค ๊ณ์ ์ ๋์ดํฉ๋๋ค.
kubectl get sa -n APIGEE_NAMESPACE
-
๋ค์ ํ์ ํ์๋ ๋๋ก ์ฐ๊ฒฐ๋ IAM ์๋น์ค ๊ณ์ ์ ๊ฐ์ฅํ ์ ์๋ ์ก์ธ์ค ๊ถํ์ Kubernetes ์๋น์ค ๊ณ์ ์ ๋ถ์ฌํฉ๋๋ค. ์ด ํ์๋ ๊ธฐ๋ณธ Apigee IAM ์๋น์ค ๊ณ์ ์ด๋ฆ์ด ํ์๋ฉ๋๋ค. ์ปค์คํ
์๋น์ค ๊ณ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํด๋น IAM ์๋น์ค ๊ณ์ ์ ์ฌ์ฉํ์ธ์.
Kubernetes ์๋น์ค ๊ณ์ IAM ์๋น์ค ๊ณ์ ์กฐ์ง ์์ค Kubernetes ์๋น์ค ๊ณ์ apigee-connect-agent-ORG_NAME-ORG_HASH_ID
apigee-mart
apigee-mart-ORG_NAME-ORG_HASH_ID
apigee-mart
apigee-metrics-apigee-telemetry
apigee-metrics
apigee-open-telemetry-collector-apigee-telemetry
apigee-metrics
apigee-udca-ORG_NAME-ORG_HASH_ID
apigee-udca
apigee-watcher-ORG_NAME-ORG_HASH_ID
apigee-watcher
ํ๊ฒฝ ์์ค Kubernetes ์๋น์ค ๊ณ์ apigee-runtime-ORG_NAME-ENV_NAME-ENV_HASH_ID
apigee-runtime
apigee-synchronizer-ORG_NAME-ENV_NAME-ENV_HASH_ID
apigee-synchronizer
Cassandra ๋ฐฑ์ ๋ฐ ๋ณต์(์ฌ์ฉ ์ค์ ๋ ๊ฒฝ์ฐ) apigee-cassandra-backup-sa
apigee-cassandra
apigee-cassandra-restore-sa
apigee-cassandra
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ORG_NAME
: ์กฐ์ง ์ด๋ฆ์ ์ฒ์ 15์์ ๋๋ค.ORG_HASH_ID
: ์ ์ฒด ์กฐ์ง ์ด๋ฆ์ ๊ณ ์ ํ ํด์ ID์ ๋๋ค.ENV_NAME
: ํ๊ฒฝ ์ด๋ฆ์ ์ฒ์ 15์์ ๋๋ค.ENV_HASH_ID
: ์กฐ์ง ๋ฐ ํ๊ฒฝ ์ด๋ฆ์ ๊ณ ์ ํ ํด์ ID์ ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
apigee-connect-agent-myhybridorg-123abcd
apigee-runtime-myhybridorg-prodenv-234bcde
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ Kubernetes ์๋น์ค ๊ณ์ ์ ์ ์ ํ IAM ์๋น์ค ๊ณ์ ์ ๊ฐ์ฅํ ์ ์๋ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
gcloud iam service-accounts add-iam-policy-binding \ IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MAPPED_SUBJECT" \ --role=roles/iam.workloadIdentityUser
๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
IAM_SA_NAME
: ์๋น์ค ๊ณ์ ์ ์ด๋ฆ์ ๋๋ค.PROJECT_ID
: Apigee ์กฐ์ง๊ณผ ์ฐ๊ฒฐ๋ ํ๋ก์ ํธ์ ID์ ๋๋ค.PROJECT_NUMBER
: ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ์ ๋ง๋ ํ๋ก์ ํธ์ ํ๋ก์ ํธ ๋ฒํธ์ ๋๋ค.POOL_ID
: ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ํ ID์ ๋๋ค.MAPPED_SUBJECT
:google.subject
์ ๋งคํํ ID ํ ํฐ์ ํด๋ ์์์ ๊ฐ์ ธ์จ Kubernetes ServiceAccount์ ๋๋ค. ์๋ฅผ ๋ค์ดgoogle.subject=assertions.sub
๋ฅผ ๋งคํํ๊ณ ID ํ ํฐ์"sub": "system:serviceaccount:default:my-kubernetes-serviceaccount"
๊ฐ ํฌํจ๋์ด ์์ผ๋ฉดMAPPED_SUBJECT
๋system:serviceaccount:default:my-kubernetes-serviceaccount
์ ๋๋ค.
์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด ๋ฐ ๊ถ์ฅ์ฌํญ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ํฌ๋ก๋ ์์ด๋ดํฐํฐ ์ ํด ์ฌ์ฉ ๊ถ์ฅ์ฌํญ์ ์ฐธ์กฐํ์ธ์.
-