Mengonfigurasi Load Balancing HTTP(S) eksternal untuk Anthos Service Mesh terkelola

Ringkasan

Cloud Load Balancing menyediakan banyak kemampuan edge yang dikelola cloud, termasuk load balancing anycast global, sertifikat yang dikelola Google, pengelolaan akses dan identitas, serta firewall atau IDS cloud. Anthos Service Mesh dapat mengintegrasikan kemampuan edge ini dengan lancar dalam model ingress mesh berikut. Gateway cloud mesh layanan memberikan cara terpadu untuk mengonfigurasi gateway ingress Anthos Service Mesh dengan Cloud Load Balancing secara bersamaan melalui Kubernetes Gateway API.

Diagram yang menunjukkan Load Balancer Cloud dengan Anthos Service Mesh

Dibandingkan dengan panduan pengguna kami sebelumnya, Dari tepi ke mesh: Mengekspos aplikasi mesh layanan melalui GKE Ingress, dengan gateway cloud mesh layanan, model ini sekarang dapat di-deploy melalui satu resource Gateway Kubernetes yang menyederhanakan proses deployment cloud dan load balancing yang dihosting di cluster secara bersamaan.

Batasan pratinjau

Untuk rilis Pratinjau fitur ini, batasan berikut berlaku:

  • Gateway Multi-cluster tidak didukung.
  • Cluster Autopilot tidak didukung.
  • Hanya Load Balancer Aplikasi klasik yang didukung. Load Balancer Lanjutan dan Load Balancer HTTP(S) Internal tidak didukung.
  • Traffic antara Load Balancer HTTP(S) eksternal dan ingress gateway Anthos Service Mesh dienkripsi menggunakan TLS. Namun, Load Balancer HTTP(S) eksternal tidak akan memverifikasi sertifikat yang diberikan oleh gateway ingress Anthos Service Mesh. Pembatasan ini berlaku untuk semua pengguna Load Balancer HTTP(S) Google Cloud.
  • Jika GatewayClasses Anthos Service Mesh dihapus dari cluster, cluster tersebut tidak akan diinstal ulang secara otomatis. Namun, hal ini tidak akan memengaruhi kegunaan fitur.
  • Logika pencocokan rute tidak mengikuti spesifikasi Gateway API dan mencocokkan dengan urutan HTTPRoute sebagai gantinya. Hal ini akan berubah pada versi mendatang untuk mengikuti spesifikasi Gateway API.

Persyaratan

  • Anthos Service Mesh Terkelola yang diinstal di cluster Google Kubernetes Engine (GKE) yang menjalankan versi 1.24 atau yang lebih baru. Cluster GKE Enterprise lainnya tidak didukung.
  • Khusus Kubernetes Gateway API versi v1beta1.

Prasyarat

  • Aktifkan API berikut dalam project Anda:

    • compute.googleapis.com
    • container.googleapis.com
    • certificatemanager.googleapis.com
    • serviceusage.googleapis.com
    gcloud services enable \
       compute.googleapis.com \
       container.googleapis.com \
       certificatemanager.googleapis.com \
       serviceusage.googleapis.com
    

Men-deploy gateway cloud mesh layanan untuk mesh cluster tunggal

Bagian ini menunjukkan cara men-deploy resource Gateway Kubernetes yang men-deploy load balancer HTTP(S) eksternal global (klasik) dan gateway ingress Anthos Service Mesh.

Mengaktifkan Gateway API dengan Anthos Service Mesh terkelola

  1. Aktifkan Gateway API di cluster Anda. Cluster GKE harus memiliki versi 1.24 atau yang lebih baru.

  2. Instal Anthos Service Mesh terkelola dengan rapid atau regular sebagai saluran rilisnya.

Men-deploy resource Gateway

Saat men-deploy gateway cloud mesh layanan, resource Gateway Kubernetes digunakan untuk men-deploy gateway masuk Cloud Load Balancing dan Anthos Service Mesh dalam satu langkah. Perhatikan bahwa resource Gateway Kubernetes berbeda dengan resource Gateway Istio.

Untuk mengetahui informasi selengkapnya tentang perbedaannya, lihat Gateway Kubernetes dan Gateway Istio. Setiap Gateway Kubernetes memiliki GatewayClass yang menunjukkan jenis dan kemampuan yang melekat. Gateway cloud mesh layanan memiliki GatewayClass yang memiliki kemampuan untuk men-deploy Cloud Load Balancing dan gateway ingress Anthos Service Mesh.

  1. Simpan manifes GatewayClass berikut ke file bernama l7-gateway-class.yaml:

    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: GatewayClass
    metadata:
      name: asm-l7-gxlb
    spec:
      controllerName: mesh.cloud.google.com/gateway
    
  2. Deploy GatewayClass di cluster Anda:

    kubectl apply -f l7-gateway-class.yaml
    
  3. Pastikan GatewayClass ada setelah penginstalan:

    kubectl get gatewayclasses.gateway.networking.k8s.io
    

    Outputnya mirip dengan:

    NAME          CONTROLLER
    asm-l7-gxlb   mesh.cloud.google.com/gateway
    gke-l7-rilb   networking.gke.io/gateway
    gke-l7-gxlb   networking.gke.io/gateway
    

    Diperlukan waktu beberapa menit hingga semua resource di-deploy. Jika tidak melihat output yang diharapkan, pastikan Anda telah memenuhi prasyarat dengan benar.

    Anda juga akan melihat GatewayClass berikut:

    gke-l7-gxlb   networking.gke.io/gateway
    

    Hal ini digunakan untuk men-deploy load balancer HTTP(S) eksternal global Google Cloud yang mendasarinya.

  4. Buat Namespace khusus untuk gateway cloud mesh layanan Anda:

    kubectl create namespace istio-ingress
    
  5. Simpan manifes Gateway berikut ke file bernama gateway.yaml:

    kind: Gateway
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: servicemesh-cloud-gw
      namespace: istio-ingress
    spec:
      gatewayClassName: asm-l7-gxlb
      listeners:
      - name: http
        protocol: HTTP
        port: 80
        allowedRoutes:
          namespaces:
            from: All
    
  6. Deploy Gateway di cluster Anda di Namespace istio-ingress:

    kubectl apply -f gateway.yaml
    
  7. Pastikan objek Kubernetes Gateway API telah dibuat:

    kubectl get gateways.gateway.networking.k8s.io -n istio-ingress
    

    Outputnya mirip dengan:

    NAME                                CLASS         ADDRESS         READY   AGE
    asm-gw-gke-servicemesh-cloud-gw     gke-l7-gxlb   34.111.114.64   True    9m40s
    asm-gw-istio-servicemesh-cloud-gw   istio                                 9m44s
    servicemesh-cloud-gw                asm-l7-gxlb                           9m44s
    

Hal-hal berikut akan terjadi saat objek Kubernetes Gateway API ini di-deploy:

  • Load Balancer HTTP(S) eksternal di-deploy dan dikonfigurasi. Mungkin perlu waktu beberapa menit, tetapi setelah muncul, Gateway akan menunjukkan alamat IP dan akan dianotasi dengan nama resource load balancer Compute Engine yang dibuat.
  • Deployment gateway masuk Anthos Service Mesh dibuat di namespace akses masuk istio-ingress. Tindakan ini akan menghasilkan instance proxy Envoy yang akan menerima traffic dari Load Balancer Cloud.
  • Cloud Load Balancer akan mengenkripsi dan mengarahkan semua traffic ke gateway ingress Anthos Service Mesh.

Anda kini memiliki infrastruktur lengkap yang diperlukan untuk menerima traffic internet ke mesh Anda. Perhatikan bahwa ini adalah deployment Gateway paling sederhana. Di bagian berikut, Anda akan menambahkan kebijakan dan kemampuan tambahan yang akan membuatnya siap diproduksi.

Deployment aplikasi dan perutean

Untuk mendemonstrasikan kemampuan sepenuhnya, Anda akan men-deploy aplikasi ke Anthos Service Mesh dan menerima traffic internet melalui Gateway Anda untuk contoh tujuan.

  1. Beri label Namespace default untuk mengaktifkan injeksi file bantuan.

    kubectl label namespace default istio-injection=enabled istio.io/rev- --overwrite
    
  2. Simpan manifes Gateway berikut ke file bernama whereami.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: whereami-v1
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: whereami-v1
      template:
        metadata:
          labels:
            app: whereami-v1
        spec:
          containers:
          - name: whereami
            image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1.2.20
            ports:
              - containerPort: 8080
            env:
            - name: METADATA
              value: "whereami-v1"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: whereami-v1
    spec:
      selector:
        app: whereami-v1
      ports:
      - port: 8080
        targetPort: 8080
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: whereami-v2
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: whereami-v2
      template:
        metadata:
          labels:
            app: whereami-v2
        spec:
          containers:
          - name: whereami
            image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1.2.20
            ports:
              - containerPort: 8080
            env:
            - name: METADATA
              value: "whereami-v2"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: whereami-v2
    spec:
      selector:
        app: whereami-v2
      ports:
      - port: 8080
        targetPort: 8080
    

    Manifes ini membuat Service/whereami-v1, Service/whereami-v2, Deployment/whereami-v1, dan Deployment/whereami-v2 untuk whereami, aplikasi sederhana yang menghasilkan JSON untuk menunjukkan identitas dan lokasinya. Anda akan men-deploy dua versi yang berbeda.

  3. Buat Layanan dan Deployment:

    kubectl apply -f whereami.yaml
    

    Setelah aktif dan berjalan, Anda akan memiliki empat Pod Whereami yang berjalan di cluster Anda.

  4. Pastikan keempat Pod berjalan:

    kubectl get pods
    

    Outputnya mirip dengan:

    whereami-v1-7c76d89d55-qg6vs       2/2     Running   0          28s
    whereami-v1-7c76d89d55-vx9nm       2/2     Running   0          28s
    whereami-v2-67f6b9c987-p9kqm       2/2     Running   0          27s
    whereami-v2-67f6b9c987-qhj76       2/2     Running   0          27s
    
  5. Simpan manifes HTTPRoute berikut ke file bernama http-route.yaml:

    kind: HTTPRoute
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: where-route
    spec:
     parentRefs:
     - kind: Gateway
       name: servicemesh-cloud-gw
       namespace: istio-ingress
     hostnames:
     - "where.example.com"
     rules:
     - matches:
       - headers:
         - name: version
           value: v2
       backendRefs:
       - name: whereami-v2
         port: 8080
     - backendRefs:
       - name: whereami-v1
         port: 8080
    
  6. Deploy http-route.yaml ke cluster Anda:

    kubectl apply -f http-route.yaml
    

    HTTPRoute ini mereferensikan servicemesh-cloud-gw yang berarti akan mengonfigurasi gateway cloud mesh layanan agar mengonfigurasi gateway masuk Anthos Service Mesh yang mendasarinya dengan aturan perutean ini. HTTPRoute memiliki fungsi yang sama dengan Istio VirtualService, tetapi menggunakan Kubernetes Gateway API untuk melakukannya. Karena Gateway API adalah spesifikasi OSS dengan banyak implementasi yang mendasarinya, Gateway API adalah API terbaik yang cocok untuk menentukan perutean di berbagai kombinasi load balancer yang berbeda (seperti proxy Anthos Service Mesh dan Cloud Load Balancer).

  7. Ambil alamat IP dari Gateway agar Anda dapat mengirim traffic ke aplikasi:

    VIP=$(kubectl get gateways.gateway.networking.k8s.io asm-gw-gke-servicemesh-cloud-gw -o=jsonpath="{.status.addresses[0].value}" -n istio-ingress)
    

    Output-nya adalah alamat IP.

    echo $VIP
    
    34.111.61.135
    
  8. Kirim traffic ke alamat IP Gateway untuk memvalidasi bahwa penyiapan ini berfungsi dengan benar. Kirim satu permintaan dengan header version: v2 dan satu permintaan tanpa untuk menentukan bahwa perutean dilakukan dengan benar di kedua versi aplikasi.

    curl ${VIP} -H "host: where.example.com"
    
    {
      "cluster_name": "gke1",
      "host_header": "where.example.com",
      "metadata": "whereami-v1",
      "node_name": "gke-gke1-default-pool-9b3b5b18-hw5z.c.church-243723.internal",
      "pod_name": "whereami-v1-67d9c5d48b-zhr4l",
      "pod_name_emoji": "⚒",
      "project_id": "church-243723",
      "timestamp": "2021-02-08T18:55:01",
      "zone": "us-central1-a"
    }
    
    curl ${VIP} -H "host: where.example.com" -H "version: v2"
    
    {
      "cluster_name": "gke1",
      "host_header": "where.example.com",
      "metadata": "whereami-v2",
      "node_name": "gke-gke1-default-pool-9b3b5b18-hw5z.c.church-243723.internal",
      "pod_name": "whereami-v2-67d9c5d48b-zhr4l",
      "pod_name_emoji": "⚒",
      "project_id": "church-243723",
      "timestamp": "2021-02-08T18:55:01",
      "zone": "us-central1-a"
    }
    

Deployment gateway produksi

Bagian sebelumnya menunjukkan contoh yang sangat sederhana dari gateway cloud mesh layanan. Langkah-langkah berikut dibuat berdasarkan contoh sederhana untuk menunjukkan penyiapan siap produksi yang menunjukkan manfaat mendelegasikan beberapa fungsi perutean masuk ke load balancer cloud.

Pada contoh berikut, Anda akan mengambil servicemesh-cloud-gw dari bagian sebelumnya dan akan menambahkan kemampuan berikut untuk membuat Gateway yang lebih aman dan mudah dikelola:

  • Deploy Gateway dengan alamat IP statis yang akan dipertahankan meskipun infrastruktur yang mendasarinya berubah.
  • Konversi Gateway untuk menerima traffic HTTPS dengan sertifikat yang ditandatangani sendiri.
  1. Buat alamat IP eksternal statis. IP statis berguna karena infrastruktur dasar dapat berubah di masa depan, tetapi alamat IP dapat dipertahankan.

    gcloud compute addresses create whereami-ip \
        --global \
        --project PROJECT_ID
    
  2. Buat sertifikat yang ditandatangani sendiri untuk domain where-example-com:

    openssl genrsa -out key.pem 2048
    cat <<EOF >ca.conf
    [req]
    default_bits              = 2048
    req_extensions            = extension_requirements
    distinguished_name        = dn_requirements
    prompt                    = no
    [extension_requirements]
    basicConstraints          = CA:FALSE
    keyUsage                  = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName            = @sans_list
    [dn_requirements]
    0.organizationName        = example
    commonName                = where.example.com
    [sans_list]
    DNS.1                     = where.example.com
    EOF
    
    openssl req -new -key key.pem \
        -out csr.pem \
        -config ca.conf
    
    openssl x509 -req \
        -signkey key.pem \
        -in csr.pem \
        -out cert.pem \
        -extfile ca.conf \
        -extensions extension_requirements \
        -days 365
    
    gcloud compute ssl-certificates create where-example-com \
        --certificate=cert.pem \
        --private-key=key.pem \
        --global \
        --project PROJECT_ID
    

    Ada banyak cara untuk membuat sertifikat TLS. Token ini dapat dibuat secara manual di command line, yang dibuat menggunakan sertifikat yang dikelola Google, atau dapat dibuat secara internal oleh sistem infrastruktur kunci publik (PKI) perusahaan Anda. Dalam contoh ini, Anda secara manual membuat sertifikat yang ditandatangani sendiri. Meskipun sertifikat yang ditandatangani sendiri biasanya tidak digunakan untuk layanan publik, sertifikat ini menunjukkan konsep ini dengan lebih mudah.

    Untuk informasi selengkapnya tentang cara membuat sertifikat yang ditandatangani sendiri melalui Kubernetes Secret, lihat Mengamankan Gateway.

  3. Update gateway.yaml dengan manifes berikut:

    kind: Gateway
    apiVersion: gateway.networking.k8s.io/v1beta1
    metadata:
      name: servicemesh-cloud-gw
      namespace: istio-ingress
    spec:
      gatewayClassName: asm-l7-gxlb
      listeners:
      - name: http
        protocol: HTTP
        port: 80
        allowedRoutes:
          namespaces:
            from: All
      - name: https
        protocol: HTTPS
        port: 443
        allowedRoutes:
          namespaces:
            from: All
        tls:
          mode: Terminate
          options:
            networking.gke.io/pre-shared-certs: where-example-com
      addresses:
      - type: NamedAddress
        value: whereami-ip
    
  4. Deploy ulang Gateway di cluster Anda:

    kubectl apply -f gateway.yaml
    
  5. Dapatkan alamat IP dari IP statis:

    VIP=$(gcloud compute addresses describe whereami-ip --global --format="value(address)")
    
  6. Gunakan curl untuk mengakses domain Gateway. Karena DNS tidak dikonfigurasi untuk domain ini, gunakan opsi --resolve untuk memberi tahu curl agar me-resolve nama domain ke alamat IP Gateway:

    curl https://where.example.com --resolve where.example.com:443:${VIP} --cacert cert.pem -v
    

    Setelah selesai, outputnya mirip dengan:

    ...
    * TLSv1.2 (OUT), TLS handshake, Client hello (1):
    * TLSv1.2 (IN), TLS handshake, Server hello (2):
    * TLSv1.2 (IN), TLS handshake, Certificate (11):
    * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
    * TLSv1.2 (IN), TLS handshake, Server finished (14):
    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (OUT), TLS handshake, Finished (20):
    * TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (IN), TLS handshake, Finished (20):
    * SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305
    * ALPN, server accepted to use h2
    * Server certificate:
    *  subject: O=example; CN=where.example.com
    *  start date: Apr 19 15:54:50 2021 GMT
    *  expire date: Apr 19 15:54:50 2022 GMT
    *  common name: where.example.com (matched)
    *  issuer: O=example; CN=where.example.com
    *  SSL certificate verify ok.
    ...
    {
      "cluster_name": "gke1",
      "host_header": "where.example.com",
      "metadata": "where-v1",
      "node_name": "gke-gw-default-pool-51ccbf30-yya8.c.agmsb-k8s.internal",
      "pod_name": "where-v1-84b47c7f58-tj5mn",
      "pod_name_emoji": "😍",
      "project_id": "agmsb-k8s",
      "timestamp": "2021-04-19T16:30:08",
      "zone": "us-west1-a"
    }
    

Output panjang mencakup handshake TLS yang berhasil diikuti dengan respons dari aplikasi seperti output berikut. Hal ini membuktikan bahwa TLS dihentikan di Gateway dengan benar dan aplikasi merespons klien dengan aman.

Anda telah berhasil men-deploy arsitektur berikut:

Arsitektur ASM

servicemesh-cloud-gw dan GatewayClass asm-l7-gxlb telah memisahkan beberapa komponen infrastruktur internal untuk menyederhanakan pengalaman pengguna. Cloud Load Balancing menghentikan traffic TLS menggunakan sertifikat internal dan juga melakukan health check pada lapisan proxy gateway ingress Anthos Service Mesh. whereami-route yang di-deploy di Deployment Aplikasi & Perutean mengonfigurasi proxy gateway masuk Anthos Service Mesh untuk mengarahkan traffic ke Layanan yang dihosting mesh yang benar.

Langkah selanjutnya