이 페이지는 Apigee 및 Apigee Hybrid에 적용됩니다.
Apigee Edge 문서 보기
이 예시에서는 Apigee Hybrid 배포와 함께 Envoy용 Apigee 어댑터를 사용하는 방법을 보여줍니다.
기본 요건
시작하기 전에: |
---|
|
|
개요
이 예시에서는 Apigee Hybrid와 함께 Envoy용 Apigee 어댑터를 사용하는 방법을 설명합니다. 이 예시에서는 Apigee Hybrid가 배포된 동일한 Kubernetes 클러스터에 간단한 HTTP 서비스를 배포합니다. 그런 다음 Envoy용 Apigee 어댑터를 구성하여 Apigee로 이 서비스에 대한 API 호출을 관리합니다.
다음 그림은 Apigee Hybrid 통합의 기본 아키텍처를 보여줍니다.
Envoy 프록시는 대상 HTTP 서비스와 Istio 서비스 메시의 Istio 사이드카로 배포됩니다. 사이드카는 대상 서비스에서 송수신되는 API 트래픽을 처리하고 원격 서비스와 통신합니다. 또한 원격 서비스는 하이브리드 관리 영역과 통신하여 API 제품 및 프록시 정보를 검색합니다.
gcloud 구성 확인
gcloud
구성이 하이브리드 조직과 연결된 GCP 프로젝트로 설정되었는지 확인합니다.현재 설정을 나열하려면 다음 단계를 따르세요.
gcloud config list
필요한 경우 다음 명령어로 올바른 GCP 프로젝트 ID를 설정합니다.
gcloud config set project project-id
- GCP 프로젝트의 Google Cloud SDK(gcloud)로 인증을 받아야 합니다.
gcloud auth login
Apigee Hybrid 프로비저닝
이 단계에서는 원격 서비스 CLI를 사용하여 remote-service
API 프록시와 하이브리드를 프로비저닝합니다. 프로비저닝 명령어는 Apigee에 인증서를 설정하고 원격 서비스가 Apigee에 다시 연결하는 데 사용할 사용자 인증 정보를 생성합니다.
$CLI_HOME
디렉터리로 이동합니다.cd $CLI_HOME
- Apigee Hybrid 조직과 연결된 GCP 프로젝트의 소유자가 아닌 경우 GCP 사용자 계정에
Apigee Organization Admin
역할이 포함되어 있는지 확인합니다. 리소스에 대한 액세스 권한 부여, 변경, 취소를 참조하세요. - 다음 명령어를 실행하여 액세스 토큰을 가져옵니다.
TOKEN=$(gcloud auth print-access-token);echo $TOKEN
- 다음의 환경 변수를 만듭니다. 이러한 변수는 프로비저닝 스크립트의 매개변수로 사용됩니다.
export ORG=organization_name
export ENV=environment_name
export RUNTIME=host_alias_url
export NAMESPACE=hybrid_runtime_namespace
각 항목의 의미는 다음과 같습니다.
변수 설명 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
입니다. - 다음 명령어를 실행하여 Apigee 하이브리드에 원격 서비스 프록시를 프로비저닝합니다.
업그레이드하지 않을 경우 다음 명령어를 사용하여 Apigee를 프로비저닝합니다.
./apigee-remote-service-cli provision --organization $ORG --environment $ENV \ --runtime $RUNTIME --namespace $NAMESPACE --token $TOKEN > config.yaml
업그레이드하는 경우 다음 명령어를
--force-proxy-install
플래그와 함께 사용하여 Apigee를 프로비저닝합니다../apigee-remote-service-cli provision --force-proxy-install --organization $ORG --environment $ENV \ --runtime $RUNTIME --namespace $NAMESPACE --token $TOKEN > config.yaml
config.yaml
파일의 콘텐츠를 확인합니다. 다음과 같이 나타납니다.# Configuration for apigee-remote-service-envoy # generated by apigee-remote-service-cli provision on 2020-07-06 18:03:58 apiVersion: v1 kind: ConfigMap metadata: name: apigee-remote-service-envoy namespace: apigee data: config.yaml: | tenant: remote_service_api: https://apitest.apigee-hybrid-docs.net/remote-service org_name: hybrid-docs env_name: envoy allow_unverified_ssl_cert: true analytics: collection_interval: 10s fluentd_endpoint: apigee-udca-hybrid-docs-envoy.apigee:20001 tls: ca_file: /opt/apigee/tls/ca.crt key_file: /opt/apigee/tls/tls.key cert_file: /opt/apigee/tls/tls.crt --- apiVersion: v1 kind: Secret metadata: name: hybrid-docs-envoy-policy-secret namespace: apigee type: Opaque data: remote-service.crt: eyJrZXlzIjpbeyJrdHkiOiJSU0EiLCJhbGci... remote-service.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURS... remote-service.properties: a2lkPTIwMjAtMDctMDZ...
- 서비스 구성(프로비저닝 명령어의 파일 출력)을 클러스터에 적용합니다.
kubectl apply -f $CLI_HOME/config.yaml
- 프록시와 인증서를 확인합니다. 다음은 유효한 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를 설치하는 구성입니다. 를 기본 네임스페이스에 추가합니다.
샘플을 구성할 때 필요합니다.
$CLI_HOME
디렉터리로 이동합니다.다음 명령어를 실행하여 파일을 생성합니다.
./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 요청/응답 테스트 서비스를 배포합니다.
- 클러스터의
default
네임스페이스에서 Istio 삽입을 사용 설정합니다. 이후 단계에서는 동일한 클러스터에 Envoy 사이드카를 배포합니다. Istio 삽입을 사용 설정하면 사이드카 배포를 수행할 수 있습니다. 이 예시에서는default
네임스페이스를 사용하고 이후의 모든 안내에서도 마찬가지라고 가정합니다.kubectl label namespace default istio-injection=enabled
- 기본 네임스페이스의 클러스터에 기본
httpbin
서비스를 적용합니다.kubectl apply -f $CLI_HOME/samples/httpbin.yaml
- 이제 서비스를 테스트합니다. 클러스터에서 실행 중인
curl
서비스를 시작하고 터미널을 엽니다.kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
- 클러스터 내에서 서비스를 호출하여 테스트합니다.
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
서비스가 포함된 사이드카도 설치합니다.
- Apigee 원격 서비스를 서비스 메시에 적용합니다.
kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
- 기본 네임스페이스의 Istio 사이드카에
EnvoyFilter
를 적용합니다.EnvoyFilter
를 사용하면httpbin
사이드카가 Apigee 원격 서비스와 통신할 수 있습니다.kubectl apply -f $CLI_HOME/samples/envoyfilter-sidecar.yaml
설치 테스트
- 이제 클러스터에 테스트 서비스 배포 단계에서 연 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
- API 키를 가져오는 방법의 설명에 따라 API 제품을 구성하고 API 키를 가져옵니다.
- 키를 사용하여 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를 사용하여 토큰을 관리 및 생성하고 바인딩을 제어합니다. CLI에 대한 자세한 내용은 참조를 확인하세요.