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.

Mesh layanan sidecar Envoy di Fleet
Mesh layanan sidecar Envoy di Fleet (klik untuk memperbesar)

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,

  1. 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, 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 MESH_NAME sebagai berikut:

    export MESH_NAME="gketd-butterfly-mesh"
    
  2. 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:

  3. Mengonfigurasi TLS untuk injector sidecar.

  4. Aktifkan injeksi sidecar.

  5. Opsi untuk injeksi Envoy otomatis

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

  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 sidecar yang berjalan di cluster secara otomatis memasukkan penampung Envoy ke dalam Pod klien.

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

  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 berikutnya