Cloud Run 서비스에서 GKE의 Cloud Service Mesh 워크로드로 트래픽 라우팅
이 페이지에서는 Cloud Run 서비스에서 GKE의 Cloud Service Mesh 워크로드로 네트워크 트래픽을 안전하게 라우팅하여 Istio API를 사용하고 완전 관리형 Envoy 사이드카를 활용하는 방법을 보여줍니다.
시작하기 전에
다음 섹션에서는 Cloud Service Mesh가 사용 설정된 GKE 클러스터가 있다고 가정합니다.
GKE 서비스가 배포되어 있지 않으면 다음 명령어를 사용하여 샘플 서비스를 배포합니다.
cat <<EOF > /tmp/service.yaml
apiVersion: v1
kind: Service
metadata:
name: ads
spec:
ports:
- port: 9999
targetPort: 8000
selector:
run: ads
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ads
spec:
replicas: 1
selector:
matchLabels:
run: ads
template:
metadata:
labels:
run: ads
spec:
containers:
- image: docker.io/waip/simple-http:v1.0.1
name: my-http2-svc
ports:
- protocol: TCP
containerPort: 8000
securityContext:
fsGroup: 1337
EOF
kubectl apply -f /tmp/service.yaml
VirtualService
호스트의 커스텀 도메인 구성
가상 서비스는 트래픽 라우팅 규칙을 정의합니다. 그러면 일치하는 트래픽이 이름이 지정된 대상 서비스로 전송됩니다.
새 관리형 영역을 만들려면 다음 단계를 따르세요.
gcloud dns managed-zones create ZONE_NAME \ --description="zone for service mesh routes" \ --dns-name=DNS_SUFFIX. \ --networks=default \ --visibility=private
각 항목의 의미는 다음과 같습니다.
- ZONE_NAME은 영역의 이름입니다 (예: 'prod').
- DNS_SUFFIX는 유효한 DNS 호스트입니다 (예: 'mesh.private').
리소스 레코드 세트를 만듭니다.
IP=10.0.0.1 gcloud dns record-sets create '*.'"DNS_SUFFIX." --type=A --zone="ZONE_NAME" \ --rrdatas=10.0.0.1 --ttl 3600
IP (RFC 1918 필요)가 사용되지 않았는지 확인합니다. 또는 고정 내부 IP를 예약합니다.
외부 Cloud Run 클라이언트의
VirtualService
를 내보냅니다.cat <<EOF > virtual-service.yaml apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: VIRTUAL_SERVICE_NAME namespace: NAMESPACE spec: hosts: - GKE_SERVICE_NAME.DNS_SUFFIX gateways: - external-mesh http: - route: - destination: host: GKE_SERVICE_NAME EOF kubectl apply -f virtual-service.yaml
각 항목의 의미는 다음과 같습니다.
- VIRTUAL_SERVICE_NAME은
VirtualService
의 이름입니다. - 제공된 예시 서비스를 사용하는 경우 NAMESPACE는
default
입니다. 그렇지 않으면 NAMESPACE를 네임스페이스 이름으로 바꿉니다. - 제공된 예시 서비스를 사용하는 경우 GKE_SERVICE_NAME은
ads
입니다. 그렇지 않으면 GKE_SERVICE_NAME을 GKE 서비스의 이름으로 바꿉니다.
- VIRTUAL_SERVICE_NAME은
external-mesh
게이트웨이를 기존 VirtualService
에 타겟으로 추가하는 것은 가능하지만 Kubernetes 서비스를 외부 Cloud Run 클라이언트로 내보내려면 별도의 VirtualService
를 설정해야 합니다. 별도의 VirtualService
를 사용하면 기존 GKE 클라이언트에 영향을 주지 않고 내보낸 서비스와 구성을 쉽게 관리할 수 있습니다.
또한 VirtualServices
의 일부 필드는 메시 외부 VirtualServices
에 대해 무시되지만 GKE 서비스에서는 예상대로 계속 작동합니다. 따라서 VirtualServices
를 별도로 관리하고 문제를 해결하는 것이 유리할 수 있습니다.
GKE 클라이언트가 VirtualService
구성도 수신하려면 mesh
또는 mesh/default
게이트웨이를 추가해야 합니다.
메시 외부 VirtualService
는 VirtualService
대상의 Kubernetes 서비스와 동일한 네임스페이스에 정의되어야 합니다.
서비스 메시에 참여하도록 Cloud Run 서비스 구성
Cloud Run 서비스를 서비스 메시에 조인하려면 다음 단계를 따르세요.
Cloud Service Mesh GKE 클러스터를 지원하는 메시 ID를 확인합니다.
MESH=$(kubectl get controlplanerevision --namespace istio-system -o json | jq -r '.items[0].metadata.annotations["mesh.cloud.google.com/external-mesh"]')
메시 ID를 사용하여 Cloud Run 서비스를 배포하고 클러스터의 VPC 네트워크에도 연결합니다.
gcloud alpha run deploy --mesh "$MESH" --network default \ mesh-svc --image=fortio/fortio \ --region=REGION --project=PROJECT_ID --no-allow-unauthenticated
Cloud Run 서비스가 GKE 워크로드에 요청을 전송할 수 있는지 확인합니다.
TEST_SERVICE_URL=$(gcloud run services describe mesh-svc --region REGION --format="value(status.url)" --project=PROJECT_ID) curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$TEST_SERVICE_URL/fortio/fetch/GKE_SERVICE_NAME.DNS_SUFFIX"
출력은 유효한 HTTP 200 응답이어야 합니다.
문제 해결
이 섹션에서는 Cloud Service Mesh 및 Cloud Run의 일반적인 오류를 해결하는 방법을 보여줍니다.
Cloud Run 사이드카 로그
Envoy 오류는 Cloud Logging에 로깅됩니다.
예를 들어 Cloud Run 서비스 계정에 메시 프로젝트에서 trafficdirector 클라이언트 역할이 부여되지 않으면 다음과 같은 오류가 로깅됩니다.
StreamAggregatedResources gRPC config stream to trafficdirector.googleapis.com:443 closed: 7, Permission 'trafficdirector.networks.getConfigs' denied on resource '//trafficdirector.googleapis.com/projects/525300120045/networks/mesh:test-mesh/nodes/003fb3e0c8927482de85f052444d5e1cd4b3956e82b00f255fbea1e114e1c0208dbd6a19cc41694d2a271d1ab04b63ce7439492672de4499a92bb979853935b03d0ad0' (or it may not exist).
CSDS
trafficdirector 클라이언트 상태는 CSDS를 사용하여 검색할 수 있습니다.
gcloud alpha container fleet mesh debug proxy-status --membership=<CLUSTER_MEMBERSHIP> --location=<CLUSTER_LOCATION>
External Clients:
....