Menyiapkan mesh layanan file bantuan 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 Armada Anda. Panduan ini mencakup langkah-langkah berikut:
- Men-deploy injektor file bantuan Envoy ke dalam cluster. Injektor memasukkan container proxy Envoy ke dalam Pod aplikasi.
- Men-deploy resource Gateway API yang mengonfigurasi file bantuan Envoy di
mesh layanan untuk mengarahkan permintaan ke layanan contoh di
store
namespace. - 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 file bantuan dan nama resource Mesh
harus
identik.
Men-deploy injektor file bantuan Envoy
Untuk men-deploy injektor file bantuan, Anda harus memberikan dua nilai.
TRAFFICDIRECTOR_GCP_PROJECT_NUMBER
. GantiPROJECT_NUMBER
dengan nomor project project untuk cluster konfigurasi Anda. Nomor proyek adalah ID numerik proyek Anda.TRAFFICDIRECTOR_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 nilaiTRAFFICDIRECTOR_MESH_NAME
sebagai berikut:TRAFFICDIRECTOR_MESH_NAME: "gketd-butterfly-mesh"
TRAFFICDIRECTOR_NETWORK_NAME
. Pastikan nilaiTRAFFICDIRECTOR_NETWORK_NAME
disetel ke kosong:TRAFFICDIRECTOR_NETWORK_NAME=""
Download paket injektor file bantuan:
wget https://storage.googleapis.com/traffic-director/td-sidecar-injector-xdsv3.tgz tar -xzvf td-sidecar-injector-xdsv3.tgz cd td-sidecar-injector-xdsv3
Dalam file
specs/01-configmap.yaml
, isi kolomTRAFFICDIRECTOR_GCP_PROJECT_NUMBER
danTRAFFICDIRECTOR_MESH_NAME
, lalu setelTRAFFICDIRECTOR_NETWORK_NAME
ke kosong.apiVersion: v1 kind: ConfigMap metadata: name: injector-mesh namespace: istio-control data: mesh: |- defaultConfig: discoveryAddress: trafficdirector.googleapis.com:443 # Envoy proxy port to listen on for the admin interface. # This port is bound to 127.0.0.1. proxyAdminPort: 15000 proxyMetadata: # Google Cloud Project number that your Fleet belongs to. # This is the numeric identifier of your project TRAFFICDIRECTOR_GCP_PROJECT_NUMBER: "PROJECT_NUMBER" # TRAFFICDIRECTOR_NETWORK_NAME must be empty when # TRAFFICDIRECTOR_MESH_NAME is set. TRAFFICDIRECTOR_NETWORK_NAME="" # The value of `metadata.name` in the `Mesh` resource. When a # sidecar requests configurations from Cloud Service Mesh, # Cloud Service Mesh will only return configurations for the # specified mesh. TRAFFICDIRECTOR_MESH_NAME: "gketd-td-mesh"
Setelah menyelesaikan petunjuk sebelumnya, ikuti langkah-langkah berikut untuk men-deploy injektor file bantuan ke cluster Anda:
- Mengonfigurasi TLS untuk injektor file bantuan.
- Menginstal injektor file bantuan ke cluster GKE Anda.
- [Opsional] Membuka port yang diperlukan di cluster pribadi.
- Aktifkan injeksi file bantuan.
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: gcr.io/google-samples/whereami:v1.2.20 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 injeksi file bantuan diaktifkan di namespace default, jalankan perintah berikut:
kubectl get namespace default --show-labels
Jika injeksi file bantuan diaktifkan, Anda akan melihat hasil berikut di output:
istio-injection=enabled
Jika injeksi file bantuan tidak diaktifkan, lihat Mengaktifkan injeksi file bantuan.
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 file bantuan yang berjalan di cluster secara otomatis memasukkan container Envoy ke dalam Pod klien.
Untuk memastikan container Envoy telah 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", ... }