Menyiapkan mesh layanan file bantuan Envoy
Konfigurasi ini didukung untuk pelanggan Pratinjau tetapi kami tidak merekomendasikan untuk pengguna Cloud Service Mesh baru. Untuk informasi selengkapnya, lihat Ringkasan Cloud Service Mesh.
Panduan ini menunjukkan cara mengonfigurasi mesh layanan sederhana di Armada. Panduan ini mencakup langkah-langkah berikut:
- Men-deploy injektor file bantuan Envoy ke cluster. Injector menginjeksikan container proxy Envoy ke dalam Pod aplikasi.
- Men-deploy resource Gateway API yang mengonfigurasi file bantuan Envoy
mesh layanan untuk merutekan permintaan ke layanan contoh dalam 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 di
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 project-nya adalah ID numerik project Anda.TRAFFICDIRECTOR_MESH_NAME
. Tetapkan nilai sebagai berikut, denganMESH_NAME
adalah nilai kolommetadata.name
di spesifikasi resourceMesh
:gketd-MESH_NAME
Misalnya, jika nilai
metadata.name
di resourceMesh
adalahbutterfly-mesh
, tetapkan nilaiTRAFFICDIRECTOR_MESH_NAME
sebagai berikut:TRAFFICDIRECTOR_MESH_NAME: "gketd-butterfly-mesh"
TRAFFICDIRECTOR_NETWORK_NAME
. Pastikan bahwa nilaiTRAFFICDIRECTOR_NETWORK_NAME
ditetapkan 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
Di file
specs/01-configmap.yaml
, isi kolomTRAFFICDIRECTOR_GCP_PROJECT_NUMBER
danTRAFFICDIRECTOR_MESH_NAME
, dan dan setelTRAFFICDIRECTOR_NETWORK_NAME
ke kosong.apiVersion: v1 kind: ConfigMap metadata: name: istio namespace: istio-system 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: "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 Anda 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 sesuai dengan nama mesh yang ditentukan dalam konfigurasi injektor. Dalam contoh konfigurasi ini, namatd-mesh
adalah 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
, simpanHTTPRoute
berikut manifes. Manifes menentukan resourceHTTPRoute
yang merutekan HTTP traffic yang menentukan nama hostexample.com
ke layanan Kubernetesstore
dalam 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 bahwaMesh
danHTTPRoute
resource 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 file bantuan diaktifkan di namespace default, jalankan perintah berikut:
kubectl get namespace default --show-labels
Jika injeksi file bantuan diaktifkan, Anda akan melihat hal berikut dalam 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. Di 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
Injector sespan yang berjalan di cluster secara otomatis menginjeksikan Envoy container ke Pod klien.
Untuk memverifikasi bahwa container Envoy sudah 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", ... }