Apigee Hybrid에서 Envoy용 Apigee 어댑터 사용

이 예시에서는 Apigee Hybrid 배포와 함께 Envoy용 Apigee 어댑터를 사용하는 방법을 보여줍니다.

기본 요건

시작하기 전에:

개요

이 예시에서는 Apigee Hybrid와 함께 Envoy용 Apigee 어댑터를 사용하는 방법을 설명합니다. 이 예시에서는 Apigee Hybrid가 배포된 동일한 Kubernetes 클러스터에 간단한 HTTP 서비스를 배포합니다. 그런 다음 Envoy용 Apigee 어댑터를 구성하여 Apigee로 이 서비스에 대한 API 호출을 관리합니다.

다음 그림은 Apigee Hybrid 통합의 기본 아키텍처를 보여줍니다.

Apigee Hybrid에 통합된 Envoy 어댑터(관리 영역, 런타임 영역, GCP 서비스 등)의 대략적인 보기

Envoy 프록시는 대상 HTTP 서비스와 Istio 서비스 메시의 Istio 사이드카로 배포됩니다. 사이드카는 대상 서비스에서 송수신되는 API 트래픽을 처리하고 원격 서비스와 통신합니다. 또한 원격 서비스는 하이브리드 관리 영역과 통신하여 API 제품 및 프록시 정보를 검색합니다.

gcloud 구성 확인

  1. gcloud 구성이 하이브리드 조직과 연결된 GCP 프로젝트로 설정되었는지 확인합니다.

    현재 설정을 나열하려면 다음 단계를 따르세요.

    gcloud config list

    필요한 경우 다음 명령어로 올바른 GCP 프로젝트 ID를 설정합니다.

    gcloud config set project project-id
  2. GCP 프로젝트의 Google Cloud SDK(gcloud)로 인증을 받아야 합니다.
    gcloud auth login

Apigee 하이브리드 프로비저닝

이 단계에서는 원격 서비스 CLI를 사용하여 remote-service API 프록시와 하이브리드를 프로비저닝합니다. 프로비저닝 명령어는 Apigee에 인증서를 설정하고 원격 서비스가 Apigee에 다시 연결하는 데 사용할 사용자 인증 정보를 생성합니다.

  1. $CLI_HOME 디렉터리로 이동합니다.
    cd $CLI_HOME
  2. Apigee Hybrid 조직과 연결된 GCP 프로젝트의 소유자가 아닌 경우 GCP 사용자 계정에 Apigee Organization Admin 역할이 포함되어 있는지 확인합니다. 리소스에 대한 액세스 권한 부여, 변경, 취소를 참조하세요.
  3. 다음 명령어를 실행하여 액세스 토큰을 가져옵니다.
    TOKEN=$(gcloud auth print-access-token);echo $TOKEN
  4. 다음의 환경 변수를 만듭니다. 이러한 변수는 프로비저닝 스크립트의 매개변수로 사용됩니다.
    export ORG=organization_name
    export ENV=environment_name
    export RUNTIME=host_alias_url
    export NAMESPACE=hybrid_runtime_namespace
    export AX_SERVICE_ACCOUNT=analytics_service_account

    각 항목의 의미는 다음과 같습니다.

    변수 설명
    organization_name Apigee Hybrid 설치를 위한 Apigee 조직의 이름입니다.
    environment_name Apigee Hybrid 조직의 환경 이름입니다.
    host_alias_url 하이브리드 구성에서 정의된 가상 호스트의 hostAlias가 포함된 URL입니다. URL은 https://으로 시작해야 합니다. 예를 들면 https://apitest.apigee-hybrid-docs.net입니다.
    hybrid_runtime_namepace 하이브리드 런타임 구성요소가 배포되는 네임스페이스입니다. 참고: 하이브리드 배포의 기본 네임스페이스는 apigee입니다.
    analytics_service_account Apigee Analytics Agent 역할이 있는 Google Cloud 서비스 계정 키 JSON 파일의 경로입니다. 이 매개변수에 대한 자세한 설명은 프로비저닝 명령어를 참조하세요.
  5. 다음 명령어를 실행하여 Apigee 하이브리드에 원격 서비스 프록시를 프로비저닝합니다.

    업그레이드하지 않을 경우 다음 명령어를 사용하여 Apigee를 프로비저닝합니다.

    ./apigee-remote-service-cli provision --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --analytics-sa $AX_SERVICE_ACCOUNT --token $TOKEN > config.yaml

    업그레이드하는 경우 다음 명령어를 --force-proxy-install 플래그와 함께 사용하여 Apigee를 프로비저닝합니다.

    ./apigee-remote-service-cli provision --force-proxy-install --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --analytics-sa $AX_SERVICE_ACCOUNT --token $TOKEN > config.yaml
  6. config.yaml 파일의 콘텐츠를 확인합니다. 다음과 같이 나타납니다.
    # Configuration for apigee-remote-service-envoy (platform: GCP)
    # generated by apigee-remote-service-cli provision on 2020-11-20 02:49:28
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        tenant:
          remote_service_api: https://apitest.example.com/remote-service
          org_name: hybrid-gke
          env_name: test
        analytics:
          collection_interval: 10s
        auth:
          jwt_provider_key: https://apitest.example.com/remote-service/token
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: hybrid-gke-new-test-policy-secret
      namespace: apigee
    type: Opaque
    data:
      remote-service.crt: eyJrZXlzIjpbeyJrdHkiOiJSU0EiLCJhbGci...
      remote-service.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURS...
      remote-service.properties: a2lkPTIwMjAtMDctMDZ...
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: hybrid-gke-new-test-analytics-secret
      namespace: apigee
    type: Opaque
    data:
      client_secret.json: ewogICJ0eXBlIjogInNlcnZ...
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
  7. 서비스 구성(프로비저닝 명령어의 파일 출력)을 클러스터에 적용합니다.
    kubectl apply -f $CLI_HOME/config.yaml
  8. 프록시와 인증서를 확인합니다. 다음은 유효한 JSON을 반환해야 합니다.
    curl -i $RUNTIME/remote-service/certs

    결과는 다음과 같이 표시됩니다.

    {
        "keys": [
            {
                "alg": "RS256",
                "e": "AQAB",
                "kid": "2020-05-11T11:32:26-06:00",
                "kty": "RSA",
                "n": "0v-nbTQyAmtVZ-wZRP0ZPIbrVaX91YO9JZ9xCQPb4mOdOSS7yKfTDJGg0KM130sGVYBvR76alN8
                fhrrSDEG5VXG8YYMqPXarwRC7MRJWocCQ_ECYrjDD0_Q018M2HyXZYSd8fhAogi9mVUYsEmCKqJH53Dh1
                jqsHOQzBLKsX0iDO9hEZNFtjbX0UCbSxsUlmBCub7Uj2S-PahA6DEQOMhQjZM7bBMtkTMpFmaJ_RZTmow
                BHP57qMna17R8wHD4kUsO2u_-3HHs5PSj1NrEYoVU2dwLQw0GlkB__ZWeFgXTqot81vb-PmoM9YxwoZrm
                TcHdljugWy_s7xROPzTod0uw"
            }
        ]
    }

샘플 구성 파일 만들기

apigee-remote-service-cli samples create 명령어를 사용하여 샘플 구성 파일을 생성합니다.

이 예시에는 다음과 같은 생성된 파일이

  • httpbin.yaml - HTTP 서비스의 배포 구성입니다.
  • apigee-envoy-adapter.yaml - Envoy용 원격 서비스 배포 구성
  • envoyfilter-sidecar.yaml - EnvoyFilter를 설치하는 구성입니다. 를 기본 네임스페이스에 추가합니다.

샘플을 구성할 때 필요합니다.

  1. $CLI_HOME 디렉터리로 이동합니다.
  2. 다음 명령어를 실행하여 파일을 생성합니다.

    ./apigee-remote-service-cli samples create -c ./config.yaml

    다음 파일은 ./samples 디렉터리를 출력합니다.

    ls samples
    apigee-envoy-adapter.yaml envoyfilter-sidecar.yaml httpbin.yaml request-authentication.yaml
    

자세한 내용은 샘플 명령어를 참조하세요.

클러스터에 테스트 서비스 배포

이 단계에서는 Apigee Hybrid가 배포된 동일한 클러스터에 간단한 HTTP 요청/응답 테스트 서비스를 배포합니다.

  1. 클러스터의 default 네임스페이스에서 Istio 삽입을 사용 설정합니다. 이후 단계에서는 동일한 클러스터에 Envoy 사이드카를 배포합니다. Istio 삽입을 사용 설정하면 사이드카 배포를 수행할 수 있습니다. 이 예시에서는 default 네임스페이스를 사용하고 이후의 모든 안내에서도 마찬가지라고 가정합니다.
    kubectl label namespace default istio-injection=enabled
  2. 기본 네임스페이스의 클러스터에 기본 httpbin 서비스를 적용합니다.
    kubectl apply -f $CLI_HOME/samples/httpbin.yaml
  3. 이제 서비스를 테스트합니다. 클러스터에서 실행 중인 curl 서비스를 시작하고 터미널을 엽니다.
    kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
  4. 클러스터 내에서 서비스를 호출하여 테스트합니다.
    curl -i httpbin.default.svc.cluster.local/headers

    성공하면 200 상태가 표시되고 서비스가 헤더 목록을 반환합니다. 예:

    HTTP/1.1 200 OK
    server: envoy
    date: Tue, 12 May 2020 17:09:01 GMT
    content-type: application/json
    content-length: 328
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 7
    
    {
      "headers": {
        "Accept": "*/*",
        "Content-Length": "0",
        "Host": "httpbin.default.svc.cluster.local",
        "User-Agent": "curl/7.70.0-DEV",
        "X-B3-Parentspanid": "69f88bc3e322e157",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "8dd725f30e393d8b",
        "X-B3-Traceid": "38093cd817ad30a569f88bc3e322e157"
      }
    }

Envoy용 원격 서비스 실행

이 단계에서는 Apigee Hybrid가 설치된 서비스 메시에서 Envoy 클라이언트의 원격 서비스를 시작합니다. 이 서비스는 대상 서비스에 설치된 Istio 사이드카에 엔드포인트를 제공합니다. httpbin 서비스가 포함된 사이드카도 설치합니다.

  1. Apigee 원격 서비스를 서비스 메시에 적용합니다.
    kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
  2. 기본 네임스페이스의 Istio 사이드카에 EnvoyFilter를 적용합니다. EnvoyFilter를 사용하면 httpbin 사이드카가 Apigee 원격 서비스와 통신할 수 있습니다.
    kubectl apply -f $CLI_HOME/samples/envoyfilter-sidecar.yaml

설치 테스트

  1. 이제 클러스터에 테스트 서비스 배포 단계에서 연 curl 셸로 돌아가서 httpbin 서비스를 호출합니다.
    curl -i httpbin.default.svc.cluster.local/headers
    

    이제 Apigee가 서비스를 관리하고 있으며 API 키를 제공하지 않았기 때문에 다음 오류가 반환됩니다.

    curl -i httpbin.default.svc.cluster.local/headers
    HTTP/1.1 403 Forbidden
    date: Tue, 12 May 2020 17:51:36 GMT
    server: envoy
    content-length: 0
    x-envoy-upstream-service-time: 11
  2. API 키를 가져오는 방법의 설명에 따라 API 제품을 구성하고 API 키를 가져옵니다.
  3. 키를 사용하여 API를 호출합니다.
    export APIKEY=YOUR_API_KEY
    curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: $APIKEY"

    호출이 성공하면 200 상태가 표시되고 응답에 헤더 목록을 반환해야 합니다. 예:

    curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS"
    HTTP/1.1 200 OK
    server: envoy
    date: Tue, 12 May 2020 17:55:34 GMT
    content-type: application/json
    content-length: 828
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 301
    
    {
      "headers": {
        "Accept": "*/*",
        "Content-Length": "0",
        "Host": "httpbin.default.svc.cluster.local",
        "User-Agent": "curl/7.70.0-DEV",
        "X-Api-Key": "kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS",
        "X-Apigee-Accesstoken": "",
        "X-Apigee-Api": "httpbin.default.svc.cluster.local",
        "X-Apigee-Apiproducts": "httpbin",
        "X-Apigee-Application": "httpbin",
        "X-Apigee-Authorized": "true",
        "X-Apigee-Clientid": "kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS",
        "X-Apigee-Developeremail": "jdoe@example.com",
        "X-Apigee-Environment": "envoy",
        "X-Apigee-Organization": "acme-org",
        "X-Apigee-Scope": "",
        "X-B3-Parentspanid": "1476f9a2329bbdfa",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "1ad5c19bfb4bc96f",
        "X-B3-Traceid": "6f329a34e8ca07811476f9a2329bbdfa"
      }
    }

다음 단계

이제 httpbin 서비스로의 API 트래픽을 Apigee에서 관리합니다. 다음과 같은 기능을 사용해 볼 수 있습니다.

  • API 키를 가져오는 방법의 설명에 따라 API 제품을 구성한 경우 할당량 한도가 분당 요청 5건으로 설정되었습니다. httpbin 서비스를 몇 번 더 호출하여 할당량을 트리거해 보세요. 할당량이 소진되면 HTTP 상태 403 오류가 반환됩니다.
  • Apigee UI에서 Apigee 애널리틱스에 액세스합니다. 분석 > API 측정항목 > API 프록시 성능으로 이동합니다.
  • JWT 토큰을 생성하고 사용하여 API 호출을 인증합니다.
  • CLI를 사용하여 토큰을 관리 및 생성하고 binding을 제어합니다. CLI에 대한 자세한 내용은 참조를 확인하세요.