Menyiapkan mesh layanan sidecar 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 Fleet Anda. Panduan ini mencakup langkah-langkah berikut:

  • Men-deploy injector file bantuan Envoy ke cluster. Injector menyuntikkan container proxy Envoy ke dalam Pod aplikasi.
  • Men-deploy resource Gateway API yang mengonfigurasi sidecar Envoy di mesh layanan untuk merutekan permintaan ke layanan contoh 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 dalam Fleet (klik untuk memperbesar)

Anda hanya dapat mengonfigurasi satu Mesh dalam cluster, karena nama mesh dalam konfigurasi injector sidecar dan nama resource Mesh harus identik.

Men-deploy injector file bantuan 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. Terapkan konfigurasi untuk Mutating Webhook

    Bagian berikut memberikan petunjuk untuk menerapkan MutatingWebhookConfiguration ke cluster. Saat pod dibuat, pengontrol penerimaan dalam cluster dipanggil. Pengontrol penerimaan berkomunikasi dengan injector sidecar terkelola untuk menambahkan container Envoy ke pod.

    Terapkan konfigurasi webhook mutating 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 penyuntik 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. Di file mesh.yaml, simpan manifes mesh berikut. Nama resource mesh harus sama 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 dengan 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 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. Di file client.yaml, simpan berikut ini:

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

  5. Untuk memverifikasi bahwa container Envoy telah disuntikkan, 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. Mengirim permintaan ke layanan penyimpanan dan menampilkan header respons:

    TEST_CMD="curl -v -H 'host: example.com' $VIP"
    
  3. Jalankan perintah pengujian di container 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