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.

Mesh layanan file bantuan Envoy dalam Armada
Mesh layanan file bantuan Envoy dalam Armada (klik untuk memperbesar)

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. Ganti PROJECT_NUMBER dengan nomor project project untuk cluster konfigurasi Anda. Nomor proyek adalah ID numerik proyek Anda.

  • TRAFFICDIRECTOR_MESH_NAME. Tetapkan nilai sebagai berikut, dengan MESH_NAME adalah nilai kolom metadata.name dalam spesifikasi resource Mesh:

    gketd-MESH_NAME
    

    Misalnya, jika nilai metadata.name dalam resource Mesh adalah butterfly-mesh, tetapkan nilai TRAFFICDIRECTOR_MESH_NAME sebagai berikut:

    TRAFFICDIRECTOR_MESH_NAME: "gketd-butterfly-mesh"
    
  • TRAFFICDIRECTOR_NETWORK_NAME. Pastikan nilai TRAFFICDIRECTOR_NETWORK_NAME disetel ke kosong:

    TRAFFICDIRECTOR_NETWORK_NAME=""
    
  1. 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
    
  2. Dalam file specs/01-configmap.yaml, isi kolom TRAFFICDIRECTOR_GCP_PROJECT_NUMBER dan TRAFFICDIRECTOR_MESH_NAME, lalu setel TRAFFICDIRECTOR_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:

  1. Mengonfigurasi TLS untuk injektor file bantuan.
  2. Menginstal injektor file bantuan ke cluster GKE Anda.
  3. [Opsional] Membuka port yang diperlukan di cluster pribadi.
  4. Aktifkan injeksi file bantuan.

Men-deploy layanan store

Di bagian ini, Anda akan men-deploy layanan store di mesh.

  1. 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
    
  2. Terapkan manifes ke gke-1:

    kubectl apply -f store.yaml
    

Membuat mesh layanan

  1. Dalam file mesh.yaml, simpan manifes mesh berikut. Nama resource mesh harus cocok dengan nama mesh yang ditentukan dalam configmap injector. Dalam contoh konfigurasi ini, nama td-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
    
  2. Terapkan manifes mesh ke gke-1, yang membuat mesh logis dengan nama td-mesh:

    kubectl apply -f mesh.yaml
    
  3. Dalam file store-route.yaml, simpan manifes HTTPRoute berikut. Manifes menentukan resource HTTPRoute yang merutekan traffic HTTP yang menentukan nama host example.com ke layanan Kubernetes store di namespace store:

    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
    
  4. Terapkan manifes rute ke gke-1:

    kubectl apply -f store-route.yaml
    

Memvalidasi deployment

  1. Periksa status dan peristiwa Mesh untuk memvalidasi bahwa resource Mesh dan HTTPRoute 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
    
  2. 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.

  3. Untuk memverifikasi deployment, deploy Pod klien yang berfungsi sebagai klien ke layanan store yang ditentukan sebelumnya. Dalam file client.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
    
  4. Deploy spesifikasi:

    kubectl apply -f client.yaml
    

    Injektor file bantuan yang berjalan di cluster secara otomatis memasukkan container Envoy ke dalam Pod klien.

  5. 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.

  1. 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'
    
  2. Kirim permintaan untuk menyimpan layanan dan menampilkan header respons:

    TEST_CMD="curl -v -H 'host: example.com' $VIP"
    
  3. 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",
      ...
    }
    

Langkah selanjutnya