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.

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

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

    gketd-MESH_NAME
    

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

    TRAFFICDIRECTOR_MESH_NAME: "gketd-butterfly-mesh"
    
  • TRAFFICDIRECTOR_NETWORK_NAME. Pastikan bahwa nilai TRAFFICDIRECTOR_NETWORK_NAME ditetapkan 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. Di file specs/01-configmap.yaml, isi kolom TRAFFICDIRECTOR_GCP_PROJECT_NUMBER dan TRAFFICDIRECTOR_MESH_NAME, dan dan setel TRAFFICDIRECTOR_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:

  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 sesuai dengan nama mesh yang ditentukan dalam konfigurasi injektor. Dalam contoh konfigurasi ini, nama td-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
    
  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 HTTPRoute berikut manifes. Manifes menentukan resource HTTPRoute yang merutekan HTTP traffic yang menentukan nama host example.com ke layanan Kubernetes store dalam 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 Mesh dan HTTPRoute 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
    
  2. 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.

  3. Untuk memverifikasi deployment, deploy Pod klien yang berfungsi sebagai klien ke layanan store yang ditentukan sebelumnya. Di 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
    

    Injector sespan yang berjalan di cluster secara otomatis menginjeksikan Envoy container ke Pod klien.

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

  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