Menyiapkan pemilihan rute TLS Gateway

Panduan ini menunjukkan cara menyiapkan gateway ingress berbasis proxy Envoy dengan resource Gateway dan TLSRoute. Anda juga dapat melampirkan resource TLSRoute.

Deployment yang Anda konfigurasikan diilustrasikan dalam diagram berikut. Load Balancer Jaringan passthrough eksternal regional mengarahkan traffic ke proxy Envoy yang bertindak sebagai gateway traffic masuk. Proxy Envoy menggunakan pemilihan rute passthrough TLS dan mengarahkan traffic ke server HTTPS yang berjalan di instance VM backend.

Passthrough TLS dengan gateway masuk
Passthrough TLS dengan gateway ingress (klik untuk memperbesar)

Sebelum memulai

Pastikan Anda menyelesaikan tugas yang dijelaskan dalam Mempersiapkan penyiapan dengan Envoy dan beban kerja tanpa proxy.

Mengonfigurasi aturan firewall

Di bagian ini, Anda akan membuat aturan firewall untuk mengizinkan koneksi health check masuk ke instance VM di jaringan Anda.

  1. Buat aturan firewall:

    gcloud compute firewall-rules create allow-gateway-health-checks \
     --network=NETWORK_NAME \
     --direction=INGRESS \
     --action=ALLOW \
     --rules=tcp \
     --source-ranges="35.191.0.0/16,209.85.152.0/22,209.85.204.0/22" \
     --target-tags=gateway-proxy
    
  2. Konfigurasi aturan firewall untuk mengizinkan traffic dari sumber mana pun. Edit perintah untuk port dan rentang alamat IP sumber Anda:

    gcloud compute firewall-rules create allow-gateway-ingress-traffic \
      --network=NETWORK_NAME \
      --direction=INGRESS \
      --action=ALLOW \
      --rules=tcp:443 \
      --source-ranges="0.0.0.0/0" \
      --target-tags=gateway-proxy
    

Mengonfigurasi izin Identity and Access Management

Di bagian ini, Anda akan menetapkan akun layanan untuk proxy gateway dan menetapkan peran IAM yang benar ke akun layanan.

  1. Buat identitas akun layanan untuk proxy gateway:

    gcloud iam service-accounts create gateway-proxy
    
  2. Tetapkan peran IAM yang diperlukan ke identitas akun layanan:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/trafficdirector.client"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    

Mengonfigurasi resource Gateway

  1. Dalam file bernama gateway443.yaml, buat spesifikasi Gateway untuk traffic HTTP:

    name: gateway443
    scope: gateway-proxy
    ports:
    - 443
    type: OPEN_MESH
    
  2. Buat resource Gateway menggunakan spesifikasi gateway443.yaml:

    gcloud network-services gateways import gateway443 \
        --source=gateway443.yaml \
        --location=global
    

Membuat grup instance terkelola dengan proxy Envoy

Di bagian ini, Anda akan membuat proxy Envoy yang terkait dengan gateway masuk.

  1. Buat template instance untuk VM yang menjalankan proxy layanan Envoy yang di-deploy secara otomatis. Envoy memiliki cakupan yang ditetapkan ke gateway-proxy. Jangan teruskan port penayangan sebagai parameter flag --service-proxy.

    gcloud beta compute instance-templates create gateway-proxy \
      --machine-type=n1-standard-1 \
      --boot-disk-size=10GB \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=gateway-proxy \
      --network-interface=network=NETWORK_NAME,no-address \
      --service-account="gateway-proxy@PROJECT_ID.iam.gserviceaccount.com" \
      --service-proxy=enabled,scope=gateway-proxy
    
  2. Buat grup instance terkelola regional dari template instance:

    gcloud compute instance-groups managed create gateway-proxy \
      --region=REGION \
      --size=1 \
      --template=gateway-proxy
    
  3. Tetapkan nama port penayangan untuk grup instance terkelola:

    gcloud compute instance-groups managed set-named-ports gateway-proxy \
      --named-ports=https:443 \
      --region=REGION
    

Menyiapkan Load Balancer Jaringan passthrough eksternal regional

Di bagian ini, Anda akan membuat Load Balancer Jaringan passthrough eksternal.

  1. Buat alamat IP regional eksternal statis:

    gcloud compute addresses create xnlb-REGION \
      --region=REGION
    
  2. Dapatkan alamat IP yang dicadangkan untuk load balancer eksternal:

    gcloud compute addresses describe xnlb-REGION \
      --region=REGION --format='value(address)'
    

    Alamat IP ini digunakan sebagai variabel IP_ADDRESS nanti dalam panduan penyiapan ini.

  3. Buat health check untuk proxy gateway:

    gcloud compute health-checks create tcp xnlb-REGION \
      --region=REGION \
      --use-serving-port
    
  4. Buat layanan backend untuk proxy gateway:

    gcloud compute backend-services create xnlb-REGION \
      --health-checks=xnlb-REGION \
      --health-checks-region=REGION \
      --load-balancing-scheme=EXTERNAL \
      --protocol=TCP \
      --region=REGION \
      --port-name=https
    
  5. Tambahkan grup instance terkelola sebagai backend:

    gcloud compute backend-services add-backend xnlb-REGION \
      --instance-group=gateway-proxy \
      --instance-group-region=REGION \
      --region=REGION
    
  6. Buat aturan penerusan untuk merutekan traffic ke proxy gateway:

    gcloud compute forwarding-rules create xnlb-REGION \
      --region=REGION \
      --load-balancing-scheme=EXTERNAL \
      --address=IP_ADDRESS \
      --ip-protocol=TCP \
      --ports=443 \
      --backend-service=xnlb-REGION \
      --backend-service-region=REGION
    

Mengonfigurasi grup instance terkelola yang menjalankan layanan HTTPS

Untuk tujuan demonstrasi, buat layanan backend dengan VM yang diskalakan secara otomatis di grup instance terkelola. VM akan menampilkan detail tentang permintaan web menggunakan protokol HTTPS di port 443.

  1. Buat template instance dengan layanan HTTPS yang diekspos di port 443:

    gcloud compute instance-templates create td-https-vm-template \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --tags=https-td-server \
      --image-family=debian-10 \
      --image-project=debian-cloud \
      --metadata=startup-script='#! /bin/bash
    
    sudo rm -rf /var/lib/apt/lists/*
    sudo apt-get -y clean
    sudo apt-get -y update
    sudo apt-get -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common
    sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
    sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
    sudo apt-get -y update
    sudo apt-get -y install docker-ce
    sudo which docker
    echo "{ \"registry-mirrors\": [\"https://mirror.gcr.io\"] }" | sudo tee -a /etc/docker/daemon.json
    sudo service docker restart
    sudo docker run -e HTTPS_PORT=9999 -p 443:9999 --rm -dt mendhak/http-https-echo:22'
    
  2. Buat grup instance terkelola berdasarkan template instance:

    gcloud compute instance-groups managed create https-td-mig-us-REGION \
      --zone=ZONE \
      --size=2 \
      --template=td-https-vm-template
    
  3. Tetapkan nama port penayangan untuk grup instance terkelola:

    gcloud compute instance-groups managed set-named-ports https-td-mig-us-REGION \
      --named-ports=https:443 \
      --zone=ZONE
    
  4. Membuat health check:

    gcloud compute health-checks create https https-helloworld-health-check \
      --port=443
    
  5. Buat aturan firewall untuk mengizinkan koneksi health check masuk ke instance di jaringan Anda:

    gcloud compute firewall-rules create https-vm-allow-health-checks \
       --network NETWORK_NAME --action allow --direction INGRESS \
       --source-ranges 35.191.0.0/16,130.211.0.0/22 \
       --target-tags https-td-server \
       --rules tcp:443
    
  6. Buat layanan backend global dengan skema load balancing INTERNAL_SELF_MANAGED dan tambahkan health check:

    gcloud compute backend-services create https-helloworld-service \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --port-name=https \
      --health-checks https-helloworld-health-check
    
  7. Tambahkan grup instance terkelola sebagai backend ke layanan backend:

    gcloud compute backend-services add-backend https-helloworld-service \
      --instance-group=https-td-mig-us-REGION \
      --instance-group-zone=ZONE \
      --global
    

Menyiapkan pemilihan rute dengan resource TLSRoute

Di bagian sebelumnya, Anda telah mengonfigurasi resource Gateway dan server HTTPS. Selanjutnya, hubungkan keduanya menggunakan resource TLSRoute yang mengaitkan nama host SNI dengan layanan backend.

  1. Dalam file bernama tls_route.yaml, buat spesifikasi TLSRoute:

    name: helloworld-tls-route
    gateways:
    - projects/PROJECT_NUMBER/locations/global/gateways/gateway443
    rules:
    - matches:
      - sniHost:
        - example.com
        alpn:
        - h2
      action:
       destinations:
       - serviceName: projects/PROJECT_NUMBER/locations/global/backendServices/https-helloworld-service
    

    Dalam petunjuk sebelumnya, TLSRoute cocok dengan example.com sebagai SNI dan h2 sebagai ALPN. Jika kecocokan diubah sebagai berikut, TLSRoute akan cocok dengan SNI atau ALPN:

    - matches:
      - sniHost:
        - example.com
      - alpn:
        - h2
    
  2. Gunakan spesifikasi tls_route.yaml untuk membuat resource TLSRoute:

    gcloud network-services tls-routes import helloworld-tls-route \
        --source=tls_route.yaml \
        --location=global
    

Cloud Service Mesh dikonfigurasi untuk melakukan load balancing traffic untuk layanan yang ditentukan dalam resource TLSRoute di seluruh backend dalam grup instance terkelola.

Memvalidasi deployment

Di bagian ini, Anda akan memverifikasi bahwa Anda dapat mengakses layanan dari klien eksternal melalui Load Balancer Jaringan passthrough eksternal dan resource Gateway Cloud Service Mesh.

  1. Jalankan perintah curl berikut untuk memverifikasi konektivitas HTTP ke layanan pengujian yang Anda buat:

    curl https://example.com --resolve example.com:443:IP_ADDRESS -k
    

Perintah ini akan menampilkan respons dari salah satu VM dalam grup instance terkelola. Outputnya adalah sebagai berikut:

 "path": "/",
  "headers": {
    "host": "example.com",
    "user-agent": "curl/7.81.0",
    "accept": "*/*"
  },
  "method": "GET",
  "body": "",
  "fresh": false,
  "hostname": "example.com",
  "ip": "::ffff:10.142.0.2",
  "ips": [],
  "protocol": "https",
  "query": {},
  "subdomains": [],
  "xhr": false,
  "os": {
    "hostname": "0cd3aec9b351"
  },
  "connection": {
    "servername": "example.com"
  }
}

Memverifikasi dengan verifikasi negatif

Anda juga dapat menjalankan verifikasi negatif. Jika Anda menjalankan perintah di bagian ini, permintaan akan dihapus karena tidak cocok dengan kriteria kecocokan TLSRoute.

Dalam perintah berikut, SNI tidak cocok dengan example.com, sehingga Gateway menolak koneksi:

curl https://invalid-server.com --resolve invalid-server.com:443:IP_ADDRESS -k

Dalam perintah berikut, ALPN tidak cocok dengan h2 (protokol HTTP2), sehingga Gateway menolak koneksi:

curl https://example.com --resolve example.com:443:IP_ADDRESS -k --http1.1

Dalam perintah berikut, klien membuat koneksi teks biasa (tidak dienkripsi), sehingga Gateway menolak koneksi:

curl example.com:443 --resolve example.com:443:IP_ADDRESS -k

Semua perintah sebelumnya menampilkan error berikut:

curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection.

Langkah selanjutnya

  • Untuk informasi tentang cara mencantumkan resource rute yang terkait dengan resource Mesh atau Gateway, lihat Mencantumkan resource Route. Fitur ini masih dalam Pratinjau.