이 문서에서는 Google Kubernetes Engine (GKE) 게이트웨이 컨트롤러를 사용하여 Cloud CDN을 구성하는 방법을 설명합니다. Cloud CDN 개념, 권장사항, 문제 해결에 대한 자세한 내용은 Cloud CDN 문서를 참조하세요.
Cloud CDN은 사용자에게 가까운 콘텐츠를 캐시하여 최종 사용자 지연 시간을 개선하고 원본 부하를 줄입니다. GCPHTTPFilter CustomResourceDefinition을 사용하여 Cloud CDN 캐싱 기능을 사용 설정할 수 있습니다.
이 문서는 조직의 네트워크를 설계하는 애플리케이션 개발자, 클라우드 설계자, 네트워킹 전문가를 대상으로 합니다. 콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE 사용자 역할 및 태스크를 참조하세요. Cloud de Confiance
개요
Cloud CDN과 GKE 게이트웨이를 통합하면 Kubernetes 기본 리소스를 사용하여 에지 캐싱을 관리할 수 있습니다. GCPHTTPFilter 리소스를 사용하면 트래픽의 여러 슬라이스에 대한 캐시 모드 및 TTL (수명)과 같은 구성을 미세 조정할 수 있습니다.
GCPHTTPFilter 객체를 만들고 HTTPRoute 규칙에서 객체를 참조하여 Cloud CDN을 사용 설정합니다. 여러 GCPHTTPFilter 객체를 만들어 여러 유형의 트래픽에 대해 서로 다른 캐싱 동작을 정의할 수 있습니다. 예를 들어 정적 이미지용 필터 하나와 Cloud CDN 권장 기본값을 사용하는 기본 정책용 필터 하나를 만들 수 있습니다.
GCPHTTPFilter 리소스를 사용하면 다음을 구성할 수 있습니다.
- 캐시 모드: Cloud CDN이 원본의 응답을 캐시하는 방식을 제어합니다.
- TTL (수명) 구성: 객체가 캐시에 보관되는 기간을 구성합니다.
- 캐시 키: 캐시 키를 생성하는 데 사용되는 요청의 요소 (헤더, 쿠키, 쿼리 문자열)를 정의합니다.
- 음성 캐싱: 장애 발생 시 원본 부하를 줄이기 위해 일반적인 오류 응답 또는 리디렉션을 캐시합니다.
- 캐시 정책: Cloud CDN이 캐시 가능한
요청을 처리하는 방식을 제어합니다. 예를 들어 Cloud CDN이 다음 작업을 수행하도록 사용 설정할 수 있습니다.
- 백엔드 서비스를 사용할 수 없게 되더라도 캐시된 콘텐츠를 계속 제공하여 고가용성을 유지합니다.
- 캐시를 우회하여 백엔드에서 직접 데이터를 가져오는 특정 요청 헤더를 정의합니다.
- 동일한 리소스에 대한 여러 동시 요청을 단일 요청으로 병합하여 백엔드 부하를 줄입니다.
GCPHTTPFilter 리소스는 연결된 HTTPRoute 리소스와 동일한 네임스페이스에 있어야 합니다. GCPHTTPFilter를 구성하면 필터가 경로의 필터 체인으로 병합됩니다.
다음 다이어그램은 GCPHTTPFilter를 사용하여 HTTPRoute 내의 특정 트래픽 슬라이스에 서로 다른 캐싱 구성을 적용하는 방법을 보여줍니다.
이 아키텍처를 사용하면 세분화된 자동 에지 캐싱 관리를 구성할 수 있습니다. HTTPRoute는 요청 경로와 같은 속성을 기반으로 수신 트래픽을 일치시켜 수신 요청이 처리되는 방식을 구성합니다. 특정 경로에 캐싱을 사용 설정하려면 GCPHTTPFilter가 HTTPRoute 내의 규칙에 연결됩니다. 각 GCPHTTPFilter는 이미지, 웹 애셋, 기타 콘텐츠에 대해 서로 다른 캐싱 로직을 지정할 수 있습니다. 이 캐싱 로직은 캐시된 콘텐츠를 클라이언트에 제공하는 Cloud CDN에 의해 적용됩니다.
요구사항 및 제한사항
- 클러스터가 GKE 버전 1.35.2-gke.1751000 이상에 있어야 합니다.
- 전역 외부 게이트웨이를
gke-l7-global-external-managed또는gke-l7-global-external-managed-mcGatewayClass를 사용하여 구성해야 합니다. - HTTPRoute 리소스를 구성해야 합니다.
- 동일한 게이트웨이에서 IAP (Identity-Aware Proxy)와 Cloud CDN을 모두 사용 설정할 수는 없습니다. IAP가 필요한 경우 GCPBackendPolicy를 사용 설정하기 전에 GCPHTTPFilter 객체를 삭제해야 합니다.
- HTTPRoute 내의 특정 경로 규칙에 GCPHTTPFilter 객체를 하나만 연결할 수 있습니다.
가격 책정
캐싱이 사용 설정되면 Cloud CDN 가격 책정이 적용됩니다. 자세한 내용은 Cloud CDN 가격 책정을 참조하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면
설치한 후
초기화합니다.
gcloud CLI를 이전에 gcloud CLI를 설치했으면 최신
버전을
gcloud components update명령어를 실행하여 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
역할 및 권한
구성된 Cloud de Confiance 리소스를 보려면
roles/compute.networkViewerIAM 역할이 있어야 합니다.GKE 클러스터에 액세스할 수 있고 필요한 작업을 수행할 권한이 있는지 확인합니다. 다음 스니펫은 필요한 최소 RBAC 권한을 보여줍니다.
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: gateway-caching-admin rules: # 1. Full access to manage HTTPRoutes - apiGroups: ["gateway.networking.k8s.io"] resources: ["httproutes"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # 2. Read-only access to view the Gateway - apiGroups: ["gateway.networking.k8s.io"] resources: ["gateways"] verbs: ["get", "list", "watch"] # 3. Full access to manage caching filters - apiGroups: ["networking.gke.io"] resources: ["gcphttpfilters"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
RBAC 및 IAM 사용에 대한 자세한 내용은 Identity and Access Management(IAM)와 상호작용을 참조하세요.
GCPHTTPFilter로 캐싱 구성
Cloud CDN을 사용 설정하고 구성하려면 하나 이상의 GCPHTTPFilter 리소스를 만든 후 HTTPRoute 객체에서 참조합니다.
GCPHTTPFilter 만들기
GCPHTTPFilter 리소스는 캐싱 정책을 정의합니다. 다음 예에서는 세 개의 GCPHTTPFilters를 만듭니다.
- 첫 번째 필터는 최종 사용자에게 더 빠르게 전송하기 위해 정적 이미지를 캐시합니다.
- 두 번째 필터는 CSS 파일과 같은 웹 애셋을 캐시합니다.
- 세 번째 필터는 나머지 트래픽의 'catch-all' 역할을 합니다.
다음 매니페스트를
store-caching-images-filter.yaml로 저장하여 첫 번째 필터를 만듭니다.apiVersion: networking.gke.io/v1 kind: GCPHTTPFilter metadata: name: store-caching-images-filter spec: cachePolicy: cacheKeyPolicy: includeQueryString: false cacheMode: CACHE_ALL_STATIC defaultTTL: 12h이 매니페스트에서는 다음이 적용됩니다.
includeQueryString: Cloud CDN에 캐시 키의 쿼리 매개변수를 무시하도록 지시합니다. 이렇게 하면 동일한 이미지에 대한 여러 사용자 요청이 동일한 캐시된 사본을 수신할 수 있습니다.cacheMode:CACHE_ALL_STATIC으로 설정되어 이미지와 같은 정적 콘텐츠를 자동으로 캐시합니다.defaultTTL: Cloud CDN에 이미지를 12시간 동안 캐시하도록 지시합니다. 시간 (h), 분 (m), 초 (s) 단위로 시간을 지정할 수 있습니다.
두 번째 필터를 만듭니다. 다음 매니페스트를
store-caching-webassets-filter.yaml로 저장합니다.apiVersion: networking.gke.io/v1 kind: GCPHTTPFilter metadata: name: store-caching-webassets-filter spec: cachePolicy: cacheKeyPolicy: includeQueryString: false serveWhileStale: 24h cacheMode: CACHE_ALL_STATIC defaultTTL: 24h이 매니페스트는 다음과 같은 차이점을 제외하고 첫 번째 필터와 동일한 설정을 포함합니다.
serveWhileStale: 24시간으로 설정됩니다. 웹 애셋 (예: CSS 파일)이defaultTTL후에 만료되면 Cloud CDN은 최대 24시간 동안 캐시에서 오래된 애셋을 계속 제공하고 백그라운드에서 콘텐츠의 유효성을 다시 검사합니다.defaultTTL: 24시간의 더 긴 기간으로 설정됩니다.
매개변수 없이 기본 캐싱 정책을 정의하는 세 번째 필터를 만듭니다. 다음 매니페스트를
store-caching-default-filter.yaml로 저장합니다.apiVersion: networking.gke.io/v1 kind: GCPHTTPFilter metadata: name: store-caching-default-filter spec: cachePolicy: {}GCPHTTPFilter 리소스에서 매개변수를 지정하지 않으면 GKE는 캐싱에 기본값을 사용합니다.
클러스터에 필터를 적용합니다.
kubectl apply -f store-caching-images-filter.yaml kubectl apply -f store-caching-webassets-filter.yaml kubectl apply -f store-caching-default-filter.yaml
HTTPRoute에 필터 연결
캐싱 정책을 적용하려면 기존 HTTPRoute 매니페스트를 업데이트하여 필터를 참조합니다.
동일한 HTTPRoute 객체 내에서 여러 필터를 참조하여 일관된 캐싱 규칙을 적용할 수 있습니다. 점진적 출시 중에 여러 백엔드 버전 간에 트래픽을 분할할 때와 같이 여러 규칙에서 동일한 필터를 재사용할 수도 있습니다.
기존 HTTPRoute 매니페스트 (예:
store-route-external.yaml)를 수정하여 라우팅 규칙에filters섹션을 포함합니다.kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1 metadata: name: store-external spec: parentRefs: - kind: Gateway name: external-http hostnames: - "store.example.com" rules: # RULE 1: Default /img/ traffic to store-v1 - matches: - path: value: /img/ filters: - type: ExtensionRef extensionRef: group: networking.gke.io kind: GCPHTTPFilter name: store-caching-images-filter backendRefs: - name: store-v1 port: 8080 # RULE 2: Default /web/ traffic to store-v1 - matches: - path: value: /web/ filters: - type: ExtensionRef extensionRef: group: networking.gke.io kind: GCPHTTPFilter name: store-caching-webassets-filter backendRefs: - name: store-v1 port: 8080 # RULE 3: Canary /img/ traffic (header + path match) to store-v2 - matches: - headers: - name: env value: canary path: value: /img/ filters: - type: ExtensionRef extensionRef: group: networking.gke.io kind: GCPHTTPFilter name: store-caching-images-filter backendRefs: - name: store-v2 port: 8080 # RULE 4: Canary /web/ traffic (header + path match) to store-v2 - matches: - headers: - name: env value: canary path: value: /web/ filters: - type: ExtensionRef extensionRef: group: networking.gke.io kind: GCPHTTPFilter name: store-caching-webassets-filter backendRefs: - name: store-v2 port: 8080 # RULE 5: Default (catch-all) traffic to store-v1 - backendRefs: - name: store-v1 port: 8080 # If you need caching for default traffic, it can be enabled by placing # filters directly under backendRefs filters: - type: ExtensionRef extensionRef: group: networking.gke.io kind: GCPHTTPFilter name: store-caching-default-filter클러스터에 업데이트된 HTTPRoute 구성을 적용합니다.
kubectl apply -f store-route-external.yamlHTTPRoute 및 게이트웨이가 배포되었는지 확인합니다.
kubectl describe httproute store-external kubectl describe gateway external-http출력에서 HTTPRoute 리소스에 Cloud CDN이 사용 설정되어 있음을 확인할 수 있습니다. Cloud CDN은 구성된 캐싱 정책을 트래픽에 적용하고 정적 이미지, 웹 애셋, 기타 트래픽의 전송 속도를 높입니다.
캐시된 콘텐츠 무효화
캐시에서 오래된 콘텐츠를 삭제하려면 무효화 요청을 제출해야 합니다. 무효화 작동 방식에 대한 자세한 내용은 캐시된 콘텐츠 무효화에 대한 Cloud CDN 문서를 참조하세요.
게이트웨이와 연결된 URL 맵을 찾습니다.
kubectl describe gateway external-httpnetworking.gke.io/url-maps주석을 찾습니다. 예를 들면 다음과 같습니다.Name: external-http Namespace: foo API Version: gateway.networking.k8s.io Kind: Gateway Annotations: networking.gke.io/backend-services: gkegw-service1 networking.gke.io/firewalls: gkegw-l7-fw networking.gke.io/forwarding-rules: gkegw-fr1 networking.gke.io/health-checks: gkegw-hc1 networking.gke.io/ssl-certificates: networking.gke.io/target-proxies: gkegw-tp1 networking.gke.io/url-maps: gkegw-url-map1호스트, 경로, 캐시 태그, 응답 상태 코드, MIME 유형, 백엔드를 비롯한 여러 무효화 일치자를 사용하여 콘텐츠를 무효화할 수 있습니다. 예를 들어 호스트 및 상태 코드 일치자를 사용하여 무효화 요청을 제출하려면 다음 명령어를 실행합니다.
gcloud compute url-maps invalidate-cdn-cache URL_MAP_NAME --host="store.example.com" --status=404URL_MAP_NAME을 이전 단계에서 식별된 이름(예:gkegw-url-map1)으로 바꿉니다.
Cloud CDN 성능 모니터링
Cloud Logging 및 Cloud Monitoring을 사용하여 캐시 적중률과 성능을 추적할 수 있습니다.
Cloud CDN 로그는 GKE 게이트웨이 컨트롤러에서 프로비저닝한 부하 분산기와 연결됩니다. 로그는 부하 분산기의 전달 규칙 및 URL 맵으로 색인이 생성됩니다. 최근 로그를 검색하려면 다음 명령어를 실행합니다.
gcloud logging read 'resource.type="http_load_balancer" AND
resource.labels.url_map_name="URL_MAP_NAME" AND
logName="projects/PROJECT_ID/logs/cloudcdn_googleapis_com%2Frequests"'
--project PROJECT_ID --limit 100 --format json
Cloud CDN은 측정항목을 Cloud Monitoring으로 내보냅니다. 모니터링 쿼리에서 matched_url_path_rule 필터를 사용하여 측정항목을 특정 HTTPRoute로 좁힐 수 있습니다.
Cloud CDN의 로그 보기 및 모니터링에 대한 자세한 내용은 캐싱의 로그 및 측정항목을 참조하세요.
Cloud CDN 사용 중지
캐싱을 사용 중지하려면 HTTPRoute에서 GCPHTTPFilter 참조를 삭제합니다.
HTTPRoute 매니페스트를 수정하고 GCPHTTPFilter를 참조하는
filters블록을 삭제합니다. 다음 예는 필터가 삭제된 HTTPRoute 매니페스트를 보여줍니다.kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1 metadata: name: store-external spec: parentRefs: - kind: Gateway name: external-http hostnames: - "store.example.com" rules: # RULE 1: Default /img/ traffic to store-v1 - matches: - path: value: /img/ backendRefs: - name: store-v1 port: 8080 # RULE 2: Canary /img/ traffic (header match) to store-v2 - matches: - headers: - name: env value: canary path: value: /img/ backendRefs: - name: store-v2 port: 8080 # RULE 3: Default (catch-all) traffic to store-v1 - backendRefs: - name: store-v1 port: 8080클러스터에 업데이트된 HTTPRoute 매니페스트를 적용합니다.
kubectl apply -f store-route-external.yaml
다음 단계
- Cloud CDN 개요를 읽습니다.
- 콘텐츠 전송 권장사항을 읽습니다.
- Cloud CDN 관련 문제를 해결하는 방법을 알아봅니다.
- GatewayClass 기능에 대해 알아봅니다.