4๋‹จ๊ณ„: AKS์— ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์„ค์น˜

ํด๋Ÿฌ์Šคํ„ฐ์— ๊ตฌ์„ฑ ์ ์šฉ

ํด๋Ÿฌ์Šคํ„ฐ์— Apigee Hybrid๋ฅผ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ํ˜„์žฌ ์œ„์น˜๊ฐ€ hybrid-base-directory/hybrid-files ๋””๋ ‰ํ„ฐ๋ฆฌ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. init ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    $APIGEECTL_HOME/apigeectl init -f overrides/overrides-aks.yaml

    init ๋ช…๋ น์–ด๋Š” Apigee ๋ฐฐํฌ ์„œ๋น„์Šค์ธ Apigee ๋ฐฐํฌ ์ปจํŠธ๋กค๋Ÿฌ, Apigee ํ—ˆ์šฉ ์›นํ›…์„ ์„ค์น˜ํ•˜๊ณ  Apigee ์ด์™ธ์˜ ๊ตฌ์„ฑ์š”์†Œ์ธ Istio ๋ฐ Cert Manager๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    $APIGEECTL_HOME/apigeectl check-ready -f overrides/overrides-aks.yaml

    ๊ทธ๋ฆฌ๊ณ 

    kubectl get pods -n apigee-system

    ๊ทธ๋ฆฌ๊ณ 

    kubectl get pods -n istio-system

    ํฌ๋“œ๊ฐ€ ์ค€๋น„๋˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  4. 'ํ…Œ์ŠคํŠธ ์‹คํ–‰' ์„ค์น˜๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. --dry-run=true ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ apply ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    $APIGEECTL_HOME/apigeectl apply -f overrides/overrides-aks.yaml --dry-run=true
  5. ์˜ค๋ฅ˜๊ฐ€ ์—†์œผ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์— Apigee ๊ด€๋ จ ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    $APIGEECTL_HOME/apigeectl apply -f overrides/overrides-aks.yaml
  6. ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    $APIGEECTL_HOME/apigeectl check-ready -f overrides/overrides-aks.yaml

    pod๊ฐ€ ๋ชจ๋‘ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ์ด ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. pod๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๋ฐ ๋ช‡ ๋ถ„ ์ •๋„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™๊ธฐํ™” ๋‹ด๋‹น์ž ์•ก์„ธ์Šค ์‚ฌ์šฉ ์„ค์ •

  1. GCP ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  ์ด ๊ณ„์ •์— Apigee ์กฐ์ง ๊ด€๋ฆฌ์ž ์—ญํ• ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค ๊ณ„์ •์€ ์ดํ›„ ๋‹จ๊ณ„์—์„œ ์ˆ˜ํ–‰ํ•  API ํ˜ธ์ถœ์„ ์ธ์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. GCP Console์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋น„์Šค ๊ณ„์ •์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GCP ๋ฌธ์„œ์˜ ์„œ๋น„์Šค ๊ณ„์ • ๋งŒ๋“ค๊ธฐ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  2. ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค๋ฅผ ์‹œ์Šคํ…œ์— ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. GCP ๋ฌธ์„œ์˜ ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค ๋งŒ๋“ค๊ธฐ์˜ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  3. ๋‹ค์šด๋กœ๋“œํ•œ ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค๋ฅผ ์„œ๋น„์Šค ๊ณ„์ • ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. /hybrid-base-directory/hybrid-files/service-accounts
  4. ๋‹ค์Œ ๋‘ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ† ํฐ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    export GOOGLE_APPLICATION_CREDENTIALS=org-admin-service-account-file
    export TOKEN=$(gcloud auth application-default print-access-token)

    ์—ฌ๊ธฐ์„œ org-admin-service-account-file์€ Apigee ์กฐ์ง ๊ด€๋ฆฌ์ž ์—ญํ• ๋กœ ๋‹ค์šด๋กœ๋“œํ•œ ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

  5. setSyncAuthorization API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋™๊ธฐํ™” ๋‹ด๋‹น์ž์— ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    curl -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type:application/json" \
      "https://apigee.googleapis.com/v1/organizations/your_org_name:setSyncAuthorization" \
       -d '{"identities":["serviceAccount:synchronizer-manager-service-account-email"]}'
    

    ๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • your_org_name: ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์กฐ์ง์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • synchronizer-manager-service-account-email: Apigee ๋™๊ธฐํ™” ๋‹ด๋‹น์ž ๊ด€๋ฆฌ์ž ์—ญํ• ์ด ์žˆ๋Š” ์„œ๋น„์Šค ๊ณ„์ •์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ์ด๋ฉ”์ผ ์ฃผ์†Œ ํ˜•์‹๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด apigee-synchronizer@my-project.iam.gserviceaccount.com์ž…๋‹ˆ๋‹ค.

    ์˜ˆ์‹œ:

    curl -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type:application/json" \
      "https://apigee.googleapis.com/v1/organizations/my_org:setSyncAuthorization" \
       -d '{"identities":["serviceAccount:apigee-synchronizer@my-project.iam.gserviceaccount.com"]}'
    
  6. ์„œ๋น„์Šค ๊ณ„์ •์ด ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์„œ๋น„์Šค ๊ณ„์ • ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    curl -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type:application/json" \
      "https://apigee.googleapis.com/v1/organizations/your_org_name:getSyncAuthorization" \
       -d ''
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

    {
       "identities":[
          "serviceAccount:my-synchronizer-manager-service_account@my_project_id.iam.gserviceaccount.com"
       ],
       "etag":"BwWJgyS8I4w="
    }
        

์กฐ์ง์— MART IP ์ถ”๊ฐ€

MART ์—”๋“œํฌ์ธํŠธ์˜ IP ์ฃผ์†Œ๋ฅผ Apigee ์กฐ์ง์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์žฌ์ •์˜ ํŒŒ์ผ์—์„œ mart.hostAlias ์†์„ฑ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์ „์— ์ด ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ ์˜์—ญ์—๋Š” MART๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„ ์˜์—ญ๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ์ฃผ์†Œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์กฐ์ง์— MART IP๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. mart.hostAlias ์†์„ฑ์˜ ์žฌ์ •์˜ ํŒŒ์ผ์—์„œ ์ด์ „์— ์„ค์ •ํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. MART๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ํ˜ธ์ŠคํŠธ ๋ณ„์นญ์ด ์ •๊ทœํ™”๋œ ๋„๋ฉ”์ธ ์ด๋ฆ„์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด์ „์— ๋™๊ธฐํ™” ๋‹ด๋‹น์ž ์•ก์„ธ์Šค ์‚ฌ์šฉ ์„ค์ • ์„น์…˜์—์„œ ๋‹ค์šด๋กœ๋“œํ•œ Apigee ์กฐ์ง ๊ด€๋ฆฌ์ž ์—ญํ• ์ด ์žˆ๋Š” ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  3. ๋‹ค์Œ ๋‘ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ† ํฐ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    export GOOGLE_APPLICATION_CREDENTIALS=org-admin-service-account-file
    export TOKEN=$(gcloud auth application-default print-access-token)

    ์—ฌ๊ธฐ์„œ org-admin-service-account-file์€ Apigee ์กฐ์ง ๊ด€๋ฆฌ์ž ์—ญํ• ๋กœ ๋‹ค์šด๋กœ๋“œํ•œ ์„œ๋น„์Šค ๊ณ„์ • ํ‚ค์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

  4. ๋‹ค์Œ Management API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ MART ์—”๋“œํฌ์ธํŠธ๋กœ ์กฐ์ง์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
    curl -v -X PUT \
       https://apigee.googleapis.com/v1/organizations/your_org_name \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer $TOKEN" \
      -d '{
      "name" : "your_org_name",
      "properties" : {
        "property" : [ {
          "name" : "features.hybrid.enabled",
          "value" : "true"
        }, {
          "name" : "features.mart.server.endpoint",
          "value" : "https://HOST_ALIAS_DNS"
        } ]
      }
    }'

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ์ด๋ฆ„์— ํ”„๋ฆฌํ”ฝ์Šค 'https://'๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    curl -v -X PUT \
       https://apigee.googleapis.com/v1/organizations/my_organization \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer $TOKEN" \
      -d '{
      "name" : "my_organization",
      "properties" : {
        "property" : [ {
          "name" : "features.hybrid.enabled",
          "value" : "true"
        }, {
          "name" : "features.mart.server.endpoint",
          "value" : "https://foo-mart.example.com"
        } ]
      }
    }'

์žฌ์ •์˜ ํŒŒ์ผ ์ €์žฅ

์žฌ์ •์˜ ํŒŒ์ผ์„ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์— ํ–ฅํ›„ ์—…๊ทธ๋ ˆ์ด๋“œ, ํŒจ์น˜ ๋˜๋Š” ๊ธฐํƒ€ ๋‹ค๋ฅธ ์ˆ˜์ •์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์ด ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.