Menyiapkan mesh layanan sidecar Envoy
Konfigurasi ini didukung untuk pelanggan Pratinjau, tetapi kami tidak merekomendasikannya untuk pengguna Cloud Service Mesh baru. Untuk 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 sidecar Envoy ke cluster. Injektor memasukkan penampung proxy Envoy ke dalam Pod aplikasi.
- Men-deploy resource Gateway API yang mengonfigurasi sidecar Envoy di
service mesh untuk merutekan permintaan ke contoh layanan 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 injektor sidecar dan nama resource Mesh
harus identik.
Men-deploy injector sidecar 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"
Menerapkan konfigurasi untuk Mutating Webhook
Bagian berikut memberikan petunjuk untuk menerapkan MutatingWebhookConfiguration ke cluster. Saat pod dibuat, pengontrol penerimaan dalam cluster akan dipanggil. Pengontrol penerimaan berkomunikasi dengan penginjek sidecar yang dikelola untuk menambahkan penampung Envoy ke pod.
Terapkan konfigurasi webhook yang mengubah 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
Dalam file
mesh.yaml
, simpan manifesmesh
berikut. Nama resourcemesh
harus cocok 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 yang 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 bahwa 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. Dalam fileclient.yaml
, simpan hal berikut: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
Injektor sidecar yang berjalan di cluster secara otomatis memasukkan penampung Envoy ke dalam Pod klien.
Untuk memverifikasi bahwa penampung Envoy dimasukkan, 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'
Kirim permintaan untuk menyimpan layanan dan menampilkan header respons:
TEST_CMD="curl -v -H 'host: example.com' $VIP"
Jalankan perintah pengujian di penampung 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", ... }