Merutekan traffic dari Layanan Cloud Run ke workload Cloud Service Mesh di GKE
Halaman ini menunjukkan cara merutekan traffic jaringan dengan aman dari Layanan Cloud Run ke beban kerja Cloud Service Mesh di GKE untuk menggunakan Istio API dan memanfaatkan sidecar Envoy yang dikelola sepenuhnya.
Sebelum memulai
Bagian berikut mengasumsikan bahwa Anda memiliki cluster GKE dengan Cloud Service Mesh yang diaktifkan.
Jika Anda belum men-deploy Layanan GKE, gunakan perintah berikut untuk men-deploy layanan contoh:
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
Mengonfigurasi Domain Kustom untuk host VirtualService
Layanan virtual menentukan aturan perutean traffic. Setiap traffic yang cocok kemudian dikirim ke layanan tujuan bernama
Membuat zona terkelola baru:
gcloud dns managed-zones create ZONE_NAME \ --description="zone for service mesh routes" \ --dns-name=DNS_SUFFIX. \ --networks=default \ --visibility=private
dengan:
- ZONE_NAME adalah nama untuk zona Anda (contoh: 'prod').
- DNS_SUFFIX adalah host DNS yang valid (contoh: 'mesh.private').
Buat kumpulan data resource:
IP=10.0.0.1 gcloud dns record-sets create '*.'"DNS_SUFFIX." --type=A --zone="ZONE_NAME" \ --rrdatas=10.0.0.1 --ttl 3600
Pastikan IP (RFC 1918 diperlukan) tidak digunakan. Atau, cadangkan IP internal statis.
Mengekspor
VirtualService
untuk Klien Cloud Run Eksternal: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
dengan:
- VIRTUAL_SERVICE_NAME adalah nama untuk
VirtualService
Anda. - NAMESPACE adalah
default
jika Anda menggunakan layanan contoh yang disediakan; jika tidak, ganti NAMESPACE dengan nama namespace Anda. - GKE_SERVICE_NAME adalah
ads
jika Anda menggunakan layanan contoh yang disediakan; jika tidak, ganti GKE_SERVICE_NAME dengan nama untuk layanan GKE Anda.
- VIRTUAL_SERVICE_NAME adalah nama untuk
Meskipun dapat menambahkan gateway external-mesh
sebagai target ke VirtualService
yang sudah ada, Anda harus membuat VirtualService
yang berbeda untuk mengekspor layanan Kubernetes ke klien Cloud Run eksternal. Memiliki
VirtualService
terpisah akan memfasilitasi pengelolaan layanan yang diekspor dan
konfigurasinya tanpa memengaruhi klien GKE yang ada.
Selain itu, beberapa kolom di VirtualServices
diabaikan untuk VirtualServices
eksternal mesh, tetapi terus berfungsi seperti yang diharapkan untuk layanan
GKE. Jadi, mengelola dan memecahkan masalah VirtualServices
secara terpisah mungkin
memiliki manfaat.
Agar klien GKE juga menerima konfigurasi VirtualService
, gateway mesh
atau mesh/default
harus ditambahkan.
VirtualService
eksternal mesh harus ditentukan dalam namespace yang sama dengan
Layanan Kubernetes di tujuan VirtualService
.
Mengonfigurasi Layanan Cloud Run untuk bergabung ke mesh layanan
Untuk bergabung dengan Layanan Cloud Run ke mesh layanan, lakukan langkah-langkah berikut:
Tentukan ID mesh yang mendukung cluster GKE Cloud Service Mesh:
MESH=$(kubectl get controlplanerevision --namespace istio-system -o json | jq -r '.items[0].metadata.annotations["mesh.cloud.google.com/external-mesh"]')
Deploy Layanan Cloud Run menggunakan ID mesh, pastikan juga terhubung ke jaringan VPC cluster:
gcloud alpha run deploy --mesh "$MESH" --network default \ mesh-svc --image=fortio/fortio \ --region=REGION --project=PROJECT_ID --no-allow-unauthenticated
Pastikan layanan Cloud Run dapat mengirim permintaan ke beban kerja 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"
Output harus berupa respons HTTP 200 yang valid.
Pemecahan masalah
Bagian ini menunjukkan cara memecahkan masalah error umum pada Cloud Service Mesh dan Cloud Run.
Log Sidecar Cloud Run
Error Envoy dicatat di Cloud Logging.
Misalnya, error seperti berikut akan dicatat ke dalam log jika akun layanan Cloud Run tidak diberi peran klien trafficdirector dalam project mesh:
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
Status klien trafficdirector dapat diambil menggunakan CSDS:
gcloud alpha container fleet mesh debug proxy-status --membership=<CLUSTER_MEMBERSHIP> --location=<CLUSTER_LOCATION>
External Clients:
....