Kubernetes용 Apigee APIM Operator로 API 관리 정책 업데이트

이 페이지는 Apigee에 적용되지만 Apigee Hybrid에는 적용되지 않습니다.

Apigee Edge 문서 보기

API 관리 니즈가 증가하고 변경됨에 따라 클러스터에 새 서비스를 추가하거나 기존 경로 및 인그레스 옵션을 업데이트해야 할 수 있습니다. 이 페이지에서는 클러스터를 업데이트하여 다음 태스크를 완료하는 방법을 설명합니다.

시작하기 전에

이 태스크를 시작하기 전에 Kubernetes용 Apigee APIM Operator로 정책 적용에 설명된 단계를 완료해야 합니다. 이 페이지에서는 Google Kubernetes Engine(GKE) 클러스터를 설정하고 Kubernetes용 Apigee APIM Operator를 설치하고 Google Kubernetes Engine(GKE) 게이트웨이를 만들었으며 게이트웨이에 API 관리 정책을 최소 하나 이상 적용했다고 가정합니다.

필요한 역할

Kubernetes용 Apigee APIM Operator 설치의 설명대로 서비스 계정에 필요한 역할을 할당한 경우 이러한 태스크를 완료하는 데 필요한 추가 IAM 역할이나 권한은 없습니다.

Kubernetes에서 기본 제공되는 역할 기반 액세스 제어(RBAC) 메커니즘을 사용하여 Google Kubernetes Engine 클러스터의 리소스에 대한 작업을 승인할 수 있습니다. 자세한 내용은 역할 기반 액세스 제어를 사용하여 클러스터의 작업 승인을 참조하세요.

새 게이트웨이 및 HTTPRoute 추가

이 섹션에서는 새 게이트웨이와 HTTPRoute를 클러스터에 추가합니다. 앞선 태스크 가이드의 예시 구성에서는 외부 GKE 게이트웨이를 사용했습니다. 게이트웨이 여러 개가 같은 리전에 배포된 경우 같은 유형(외부 또는 내부 모두)이어야 합니다. 따라서 이 가이드의 예시 구성에서도 외부 게이트웨이를 사용합니다.

APIM Operator를 내부 또는 외부 GKE 게이트웨이와 함께 사용할 수 있지만 같은 리전에 두 가지 유형의 게이트웨이를 모두 배포할 수 없습니다.

새 게이트웨이와 HTTPRoute를 클러스터에 추가하려면 다음 단계를 완료합니다.

  1. 새 외부 GKE 게이트웨이를 설정합니다. 자세한 내용과 단계는 외부 게이트웨이 배포를 참조하세요.
  2. apim 네임스페이스에 gateway2.yaml라는 새 파일을 만듭니다.
  3. 다음 콘텐츠를 새 파일에 복사합니다.
    # gateway2.yaml
    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: Gateway
    metadata:
      name: global-ext-lb2
      spec: null
      gatewayClassName: gke-l7-global-external-managed
      listeners:
        - name: https
          protocol: HTTPS
          allowedRoutes:
            kinds:
              - kind: HTTPRoute
            namespaces:
              from: All
          port: 443
          tls:
            options:
              networking.gke.io/pre-shared-certs: apigee-lb-new-cert-sept
  4. 아래에 강조표시된 대로 /post의 새 HTTPRoute를 같은 파일에 추가합니다.
    # gateway2.yaml
      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: HTTPRoute
      metadata:
        name: http-bin-route-post
        namespace: http
      spec:
        parentRefs:
          - kind: Gateway
            name: global-ext-lb2
            namespace: default
        hostnames:
          - HOST_NAME_2
        rules:
          - matches:
              - path:
                  value: /post
            backendRefs:
              - name: httpbin
                port: 80
                namespace: http
  5. 새 게이트웨이와 HTTPRoute를 적용합니다.
    kubectl apply -f gateway2.yaml
  6. 다음 명령어를 사용하여 HTTPRoute 상태를 확인합니다.
    kubectl -n http get HttpRoute

    출력은 다음과 비슷하게 표시됩니다.

    NAME             HOSTNAMES                                                  AGE
    http-bin-route   ["my-hostname-2"]   12d
    
  7. 다음 명령어를 사용하여 게이트웨이 상태를 확인합니다.
    kubectl get gateway global-ext-lb2

    출력은 다음과 비슷하게 표시됩니다.

    NAME             CLASS                            ADDRESS        PROGRAMMED   AGE
    global-ext-lb2   gke-l7-global-external-managed   34.54.193.92   True         11d
    

    Address 열에 유효한 IP 주소가 포함되어 있고 Programmed 상태가 True인지 확인합니다.

  8. 경로가 연결되었는지 확인할 게이트웨이를 설명합니다.
    kubectl describe gateway global-ext-lb2
  9. 출력은 다음과 비슷하게 표시됩니다.

    ...
    Listeners:
      Attached Routes:  1
      Conditions:
        Last Transition Time:  2024-10-03T03:10:17Z
    ...

    Attached Routes 값이 1인지 확인합니다.

  10. 게이트웨이에 요청을 전송하여 경로가 작동하는지 확인합니다.
    curl -X POST https://GATEWAY_IP_ADDRESS/get -k -H "Host: HOST_NAME"

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

    • GATEWAY_IP_ADDRESS7단계에서 반환된 응답의 Address 열에 표시된 것처럼 게이트웨이의 IP 주소입니다.
    • HOST_NAME은 게이트웨이의 HTTPRoute에 정의된 호스트 이름입니다.

  11. 출력은 다음과 비슷하게 표시됩니다.
      {
        "args": {}, 
        "headers": {
          "Accept": "*/*", 
          "Host": "apigee-apim-operator-test.apigee.net", 
          "User-Agent": "curl/8.7.1", 
          "X-Cloud-Trace-Context": "2bb8a80e29e80662ff9cb89971c447d9/13083106619927322701"
        }, 
        "origin": "67.164.1.10,34.54.193.72", 
        "url": "https://apigee-apim-operator-test.apigee.net/post"
      }
      
  12. 앞선 단계에서 만든 새 게이트웨이의 HTTPRoute를 참조하는 새 API 확장 프로그램 정책을 만듭니다.
    1. apim 네임스페이스에 apim-policy2.yaml라는 새 파일을 만듭니다.
    2. 다음 콘텐츠를 새 파일에 복사합니다.
      # apim-policy2.yaml
      apiVersion: apim.googleapis.com/v1alpha1
      kind: APIMExtensionPolicy
      metadata:
      name: global-ext-lb2-apim-policy-2
      namespace: apigee
      spec:
      location: global
      failOpen: false
      timeout: 1000ms
      targetRef: # identifies the Gateway where the extension should be installed
        name: global-ext-lb2 
        kind: Gateway
        namespace: default
    3. 새 API 확장 프로그램 정책을 적용합니다.
      kubectl apply -f apim-policy2.yaml

      파일이 적용되면 APIM Operator가 백그라운드에 네트워킹 리소스를 만듭니다.

    4. API 확장 프로그램 정책 상태를 확인합니다.
      kubectl -n apigee get APIMExtensionPolicy

      출력은 다음과 비슷하게 표시됩니다.

      NAME                         STATE      ERRORMESSAGE
      global-ext-lb2-apim-policy   RUNNING  
      

      STATE 값이 RUNNING인지 확인합니다.

    5. 변경사항이 모든 부하 분산기 인스턴스에 반영될 때까지 5분 정도 기다린 후 다음 명령어를 사용하여 새 게이트웨이에 대한 요청이 실패하는지 확인합니다.
      curl -X POST https://GATEWAY_IP_ADDRESS/get -k -H "Host: HOSTNAME"

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

      • GATEWAY_IP_ADDRESS앞선 단계에서 가져온 게이트웨이의 IP 주소입니다.
      • HOST_NAME은 게이트웨이의 HTTPRoute에 정의된 호스트 이름입니다.

      다음과 유사한 응답이 표시되면서 요청이 실패합니다.

      {
        "fault": {
          "faultstring": "Raising fault. Fault name : RF-insufficient-request-raise-fault",
          "detail": {
            "errorcode": "steps.raisefault.RaiseFault"
          }
        }
      }

      즉, Apigee에 대한 서비스 확장 프로그램이 활성 상태이고 API 키 및 액세스 토큰 확인이 적용됩니다. 개발자 앱을 만들고 API 키를 가져오고 키로 새 게이트웨이를 테스트하는 데 필요한 단계는 Apigee 서비스 확장 프로그램 테스트를 참조하세요.

API 제품 업데이트

새 API 확장 프로그램 정책을 참조하도록 기존 API 제품을 수정합니다.

  1. apim 네임스페이스에 api-product-2.yaml라는 새 파일을 만듭니다.
  2. 다음 콘텐츠를 새 파일에 복사합니다.
    # api-product-2.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: APIProduct
    metadata:
    name: api-product-2
    namespace: apigee-apim
    spec:
    approvalType: auto
    description: Http bin GET calls
    displayName: api-product-2
    EnforcementRefs:
      - name: global-ext-lb1-apim-policy 
        kind: APIMExtensionPolicy
        group: apim.googleapis.com
        namespace: apigee-apim
      - name: global-ext-lb2-apim-policy 
        kind: APIMExtensionPolicy
        group: apim.googleapis.com
        namespace: apigee-apim
    attributes:
      - name: access
        value: private
  3. 새 API 제품 파일을 적용합니다.
    kubectl apply -f api-product-2.yaml

    변경사항이 클러스터 전체에 적용되는 데 약 3분 정도 걸립니다.

이 예시에서는 yaml의 강조 표시된 부분과 같이 API 제품 api-product-2EnforcementRefs 섹션이 global-ext-lb1-apim-policyglobal-ext-lb2-apim-policy 모두 참조하도록 업데이트됩니다.

새 API 제품 만들기

새 API 제품을 만듭니다.

  1. apim 네임스페이스에 api-product-2.yaml라는 새 파일을 만듭니다.
  2. 다음 콘텐츠를 새 파일에 복사합니다.
    # api-product-2.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: APIProduct
    metadata:
     name: api-product-2
     namespace: apigee-apim
    spec:
      approvalType: auto
      description: Http bin GET calls
      displayName: api-product-2
      enforcementRefs:
        - name: global-ext-lb2-apim-policy 
          kind: APIMExtensionPolicy
          group: apim.googleapis.com
          namespace: apim
      attributes:
        - name: access
          value: private
  3. 새 API 제품 파일을 적용합니다.
    kubectl apply -f api-product-2.yaml

    변경사항이 클러스터 전체에 적용되는 데 약 3분 정도 걸립니다.

이 예시에서는 yaml의 강조 표시된 부분과 같이 새 API 제품 api-product-2EnforcementRefs 섹션이 global-ext-lb2-apim-policy를 참조하도록 생성됩니다.

새 API 작업 세트 만들기

새 API 작업 세트를 만듭니다.

  1. apim 네임스페이스에 item-set-post.yaml라는 새 파일을 만듭니다.
  2. 다음 콘텐츠를 새 파일에 복사합니다.
    # item-set-post.yaml
    apiVersion: apim.googleapis.com/v1alpha1
    kind: APIOperationSet
    metadata:
      name: item-set-post
      namespace: apigee-apim
    spec:
      apiProductRefs:
        - name: api-product-1
          kind: APIProduct
          group: apim.googleapis.com
          namespace: apigee-apim
      quota:
        limit: 1
        interval: 1
        timeUnit: minute
      restOperations:
        - name: PostItems
          path: "/post"
          methods:
          - POST
  3. 새 API 작업 세트 파일을 적용합니다.
    kubectl apply -f item-set-post.yaml

    변경사항이 클러스터 전체에 적용되는 데 약 3분 정도 걸립니다.

이 예시에서는 파일의 강조 표시된 부분과 같이 새 API 작업 세트 item-set-postrestOperations 값이 /post 경로를 참조하도록 생성됩니다.

새 게이트웨이 구성 테스트

새 게이트웨이 구성을 테스트하려면 다음 요청을 새 /post 경로에 보냅니다.

curl -X POST https://GATEWAY_IP_ADDRESS/post -k -H "Host: HOST_NAME"

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

  • GATEWAY_IP_ADDRESS앞선 단계에서 가져온 게이트웨이의 IP 주소입니다.
  • HOST_NAME은 게이트웨이의 HTTPRoute에 정의된 호스트 이름입니다.

요청이 성공하고 다음과 유사한 응답을 반환해야 합니다.

{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "apigee-apim-operator-test.apigee.net",
    "User-Agent": "curl/8.7.1",
    "X-Api-Key": "f0N6sXXXclGXXXe0oP5XXXdA20PjgrP2x8xXXh7z4XXXKiYt",
    "X-Cloud-Trace-Context": "bb3a768787099bda628781188bfb318b/15554891713516675739"
  },
  "origin": "34.54.193.72",
  "url": "https://34.54.193.72/get"
}

문제 해결

APIM Operator와 함께 사용되는 API 관리 정책을 업데이트하고 확장할 때 문제가 발생하면 APIM Operator 문제 해결에서 일반적인 오류의 해결 방법을 참조하세요.

다음 단계