Menyiapkan mesh layanan sidecar Envoy
Konfigurasi ini didukung untuk pelanggan Pratinjau, tetapi kami tidak merekomendasikannya untuk pengguna Cloud Service Mesh baru. Untuk mengetahui informasi selengkapnya, lihat Ringkasan Cloud Service Mesh.
Panduan ini menunjukkan cara mengonfigurasi mesh layanan sederhana di Fleet Anda. Panduan ini mencakup langkah-langkah berikut:
- Men-deploy injector file bantuan Envoy ke cluster. Injector menyuntikkan container proxy Envoy ke dalam Pod aplikasi.
- Men-deploy resource Gateway API yang mengonfigurasi sidecar Envoy di mesh layanan untuk merutekan permintaan ke layanan contoh di namespace
store
. - Men-deploy klien sederhana untuk memverifikasi deployment.
Diagram berikut menunjukkan mesh layanan yang dikonfigurasi.
Anda hanya dapat mengonfigurasi satu Mesh
dalam cluster, karena nama mesh dalam konfigurasi injector sidecar dan nama resource Mesh
harus identik.
Men-deploy injector file bantuan Envoy
Untuk men-deploy injector sidecar:
Mengonfigurasi informasi project
# The project that contains your GKE cluster. export CLUSTER_PROJECT_ID=YOUR_CLUSTER_PROJECT_NUMBER_HERE # The name of your GKE cluster. export CLUSTER=YOUR_CLUSTER_NAME # The channel of your GKE cluster. Eg: rapid, regular, stable. export CHANNEL=YOUR_CLUSTER_CHANNEL # The location of your GKE cluster, Eg: us-central1 for regional GKE cluster, # us-central1-a for zonal GKE cluster export LOCATION=ZONE # The mesh name of the traffic director load balancing API. export MESH_NAME=YOUR_MESH_NAME # The project that holds the mesh resources. export MESH_PROJECT_NUMBER=YOUR_PROJECT_NUMBER_HERE export TARGET=projects/${MESH_PROJECT_NUMBER}/locations/global/meshes/${MESH_NAME} gcloud config set project ${CLUSTER_PROJECT_ID}
Untuk mengetahui
MESH_NAME
, tetapkan nilai sebagai berikut, denganMESH_NAME
adalah nilai kolommetadata.name
dalam spesifikasi resourceMesh
:gketd-MESH_NAME
Misalnya, jika nilai
metadata.name
dalam resourceMesh
adalahbutterfly-mesh
, tetapkan nilaiMESH_NAME
sebagai berikut:export MESH_NAME="gketd-butterfly-mesh"
Terapkan konfigurasi untuk Mutating Webhook
Bagian berikut memberikan petunjuk untuk menerapkan MutatingWebhookConfiguration ke cluster. Saat pod dibuat, pengontrol penerimaan dalam cluster dipanggil. Pengontrol penerimaan berkomunikasi dengan injector sidecar terkelola untuk menambahkan container Envoy ke pod.
Terapkan konfigurasi webhook mutating berikut ke cluster Anda.
cat <<EOF | kubectl apply -f - apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: labels: app: sidecar-injector name: td-mutating-webhook webhooks: - admissionReviewVersions: - v1beta1 - v1 clientConfig: url: https://meshconfig.googleapis.com/v1internal/projects/${CLUSTER_PROJECT_ID}/locations/${LOCATION}/clusters/${CLUSTER}/channels/${CHANNEL}/targets/${TARGET}:tdInject failurePolicy: Fail matchPolicy: Exact name: namespace.sidecar-injector.csm.io namespaceSelector: matchExpressions: - key: td-injection operator: Exists reinvocationPolicy: Never rules: - apiGroups: - "" apiVersions: - v1 operations: - CREATE resources: - pods scope: '*' sideEffects: None timeoutSeconds: 30 EOF
Jika Anda perlu menyesuaikan injector sidecar, ikuti langkah-langkah berikut untuk menyesuaikan injector sidecar ke cluster Anda:
Men-deploy layanan store
Di bagian ini, Anda akan men-deploy layanan store
di mesh.
Dalam file
store.yaml
, simpan manifes berikut:kind: Namespace apiVersion: v1 metadata: name: store --- apiVersion: apps/v1 kind: Deployment metadata: name: store namespace: store spec: replicas: 2 selector: matchLabels: app: store version: v1 template: metadata: labels: app: store version: v1 spec: containers: - name: whereami image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: store namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080
Terapkan manifes ke
gke-1
:kubectl apply -f store.yaml
Membuat mesh layanan
Di file
mesh.yaml
, simpan manifesmesh
berikut. Nama resourcemesh
harus sama dengan nama mesh yang ditentukan dalam configmap injector. Dalam contoh konfigurasi ini, namatd-mesh
digunakan di kedua tempat:apiVersion: net.gke.io/v1alpha1 kind: TDMesh metadata: name: td-mesh namespace: default spec: gatewayClassName: gke-td allowedRoutes: namespaces: from: All
Terapkan manifes
mesh
kegke-1
, yang membuat mesh logis dengan namatd-mesh
:kubectl apply -f mesh.yaml
Dalam file
store-route.yaml
, simpan manifesHTTPRoute
berikut. Manifes menentukan resourceHTTPRoute
yang merutekan traffic HTTP dengan menentukan nama hostexample.com
ke layanan Kubernetesstore
di namespacestore
:apiVersion: gateway.networking.k8s.io/v1alpha2 kind: HTTPRoute metadata: name: store-route namespace: store spec: parentRefs: - name: td-mesh namespace: default group: net.gke.io kind: TDMesh hostnames: - "example.com" rules: - backendRefs: - name: store namespace: store port: 8080
Terapkan manifes rute ke
gke-1
:kubectl apply -f store-route.yaml
Memvalidasi deployment
Periksa status dan peristiwa
Mesh
untuk memvalidasi bahwa resourceMesh
danHTTPRoute
berhasil di-deploy:kubectl describe tdmesh td-mesh
Outputnya mirip dengan hal berikut ini:
... Status: Conditions: Last Transition Time: 2022-04-14T22:08:39Z Message: Reason: MeshReady Status: True Type: Ready Last Transition Time: 2022-04-14T22:08:28Z Message: Reason: Scheduled Status: True Type: Scheduled Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ADD 36s mc-mesh-controller Processing mesh default/td-mesh Normal UPDATE 35s mc-mesh-controller Processing mesh default/td-mesh Normal SYNC 24s mc-mesh-controller SYNC on default/td-mesh was a success
Untuk memastikan injeksi sidecar diaktifkan di namespace default, jalankan perintah berikut:
kubectl get namespace default --show-labels
Jika injeksi sidecar diaktifkan, Anda akan melihat hal berikut dalam output:
istio-injection=enabled
Jika injeksi sidecar tidak diaktifkan, lihat Mengaktifkan injeksi sidecar.
Untuk memverifikasi deployment, deploy Pod klien yang berfungsi sebagai klien ke layanan
store
yang ditentukan sebelumnya. Di fileclient.yaml
, simpan berikut ini:apiVersion: apps/v1 kind: Deployment metadata: labels: run: client name: client namespace: default spec: replicas: 1 selector: matchLabels: run: client template: metadata: labels: run: client spec: containers: - name: client image: curlimages/curl command: - sh - -c - while true; do sleep 1; done
Deploy spesifikasi:
kubectl apply -f client.yaml
Injector file bantuan yang berjalan di cluster akan otomatis memasukkan penampung Envoy ke dalam Pod klien.
Untuk memverifikasi bahwa container Envoy telah disuntikkan, jalankan perintah berikut:
kubectl describe pods -l run=client
Outputnya mirip dengan hal berikut ini:
... Init Containers: # Istio-init sets up traffic interception for the Pod. istio-init: ... # td-bootstrap-writer generates the Envoy bootstrap file for the Envoy container td-bootstrap-writer: ... Containers: # client is the client container that runs application code. client: ... # Envoy is the container that runs the injected Envoy proxy. envoy: ...
Setelah Pod klien disediakan, kirim permintaan dari Pod klien ke layanan store
.
Dapatkan nama Pod klien:
CLIENT_POD=$(kubectl get pod -l run=client -o=jsonpath='{.items[0].metadata.name}') # The VIP where the following request will be sent. Because all requests # from the client container are redirected to the Envoy proxy sidecar, you # can use any IP address, including 10.0.0.2, 192.168.0.1, and others. VIP='10.0.0.1'
Mengirim permintaan ke layanan penyimpanan dan menampilkan header respons:
TEST_CMD="curl -v -H 'host: example.com' $VIP"
Jalankan perintah pengujian di container klien:
kubectl exec -it $CLIENT_POD -c client -- /bin/sh -c "$TEST_CMD"
Outputnya mirip dengan hal berikut ini:
< Trying 10.0.0.1:80... < Connected to 10.0.0.1 (10.0.0.1) port 80 (#0) < GET / HTTP/1.1 < Host: example.com < User-Agent: curl/7.82.0-DEV < Accept: */* < < Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < content-type: application/json < content-length: 318 < access-control-allow-origin: * < server: envoy < date: Tue, 12 Apr 2022 22:30:13 GMT < { "cluster_name": "gke-1", "zone": "us-west1-a", "host_header": "example.com", ... }