Mengonfigurasi resource Gateway menggunakan Kebijakan


Halaman ini menunjukkan cara mengonfigurasi load balancer yang dibuat oleh Google Kubernetes Engine (GKE) saat Anda men-deploy Gateway di cluster GKE.

Saat Anda men-deploy Gateway, konfigurasi GatewayClass menentukan load balancer yang dibuat GKE. Load balancer terkelola ini telah dikonfigurasi sebelumnya dengan setelan default yang dapat Anda ubah menggunakan Kebijakan.

Anda dapat menyesuaikan resource Gateway agar sesuai dengan kebutuhan infrastruktur atau aplikasi dengan melampirkan Kebijakan ke Gateway, Layanan, atau ServiceImports. Setelah menerapkan atau mengubah Kebijakan, Anda tidak perlu menghapus atau membuat ulang resource Gateway, Rute, atau Layanan. Kebijakan akan diproses oleh pengontrol Gateway dan resource load balancer yang mendasarinya akan dikonfigurasi (ulang) sesuai dengan Kebijakan (baru).

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Persyaratan GKE Gateway Controller

  • Untuk Standard, GKE versi 1.24 atau yang lebih baru.
  • Untuk Autopilot, GKE versi 1.26 atau yang lebih baru.
  • Google Cloud CLI versi 407.0.0 atau yang lebih baru.
  • Gateway API hanya didukung di cluster native VPC.
  • Jika menggunakan GatewayClass internal, Anda harus mengaktifkan subnet khusus proxy.
  • Cluster Anda harus mengaktifkan add-on HttpLoadBalancing.
  • Jika menggunakan Istio, Anda harus mengupgrade Istio ke salah satu versi berikut:
    • 1.15.2 atau yang lebih baru
    • 1.14.5 atau yang lebih baru
    • 1.13.9 atau yang lebih baru.
  • Jika menggunakan VPC Bersama, maka di project host, Anda perlu menetapkan peran Compute Network User ke akun Layanan GKE untuk project layanan tersebut.

Batasan dan Batasan

Selain pembatasan dan batasan pengontrol Gateway GKE, batasan berikut juga berlaku secara khusus untuk Kebijakan yang diterapkan pada resource Gateway:

  • Resource GCPGatewayPolicy hanya dapat ditambahkan ke gateway.networking.k8s.io Gateway.

  • Resource GCPGatewayPolicy harus ada dalam namespace yang sama dengan Gateway target.

  • Saat menggunakan Gateway cluster tunggal, resource GCPBackendPolicy dan HealthCheckPolicy harus merujuk ke resource Service.

  • Hanya satu GCPGatewayPolicy yang dapat ditambahkan ke Layanan pada satu waktu. Jika dua kebijakan GCPGatewayPolicy dibuat dan menargetkan Service atau ServiceImport yang sama, kebijakan terlama akan diprioritaskan dan kebijakan kedua akan gagal ditambahkan.

  • Kebijakan hierarkis tidak didukung dengan Gateway GKE.

  • Resource HealthCheckPolicy dan GCPBackendPolicy harus ada dalam namespace yang sama dengan resource Service atau ServiceImport target.

  • Resource GCPBackendPolicy dan HealthCheckPolicy disusun sedemikian rupa sehingga hanya dapat mereferensikan satu layanan backend.

Mengonfigurasi Kebijakan SSL untuk mengamankan traffic client-to-load-balancer

Bagian ini menjelaskan fungsionalitas yang tersedia di cluster GKE yang menjalankan versi 1.24 atau yang lebih baru.

Untuk mengamankan traffic client-to-load-balancer, konfigurasikan kebijakan SSL dengan menambahkan nama kebijakan Anda ke GCPGatewayPolicy. Secara default, Gateway tidak memiliki Kebijakan SSL apa pun yang ditentukan dan dilampirkan.

Pastikan Anda membuat kebijakan SSL sebelum merujuk kebijakan di GCPGatewayPolicy Anda.

Manifes GCPGatewayPolicy berikut menentukan kebijakan keamanan bernama gke-gateway-ssl-policy:

apiVersion: networking.gke.io/v1
kind: GCPGatewayPolicy
metadata:
  name: my-gateway-policy
  namespace: team1
spec:
  default:
    sslPolicy: gke-gateway-ssl-policy
  targetRef:
    group: gateway.networking.k8s.io
    kind: Gateway
    name: my-gateway

Mengonfigurasi health check

Bagian ini menjelaskan fungsionalitas yang tersedia di cluster GKE yang menjalankan versi 1.24 atau yang lebih baru.

Anda dapat menggunakan HealthCheckPolicy untuk mengontrol setelan health check load balancer. Setiap jenis health check (http, https, grpc, dan http2) memiliki parameter yang dapat Anda tentukan. Google Cloud membuat health check unik untuk setiap layanan backend untuk setiap Layanan GKE.

Manifes HealthCheckPolicy berikut menunjukkan semua kolom yang tersedia saat mengonfigurasi kebijakan health check:

Layanan

apiVersion: networking.gke.io/v1
kind: HealthCheckPolicy
metadata:
  name: lb-healthcheck
  namespace: lb-service-namespace
spec:
  default:
    checkIntervalSec: INTERVAL
    timeoutSec: TIMEOUT
    healthyThreshold: HEALTHY_THRESHOLD
    unhealthyThreshold: UNHEALTHY_THRESHOLD
    logConfig:
      enabled: ENABLED
    config:
      type: PROTOCOL
      httpHealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
      httpsHealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
      grpcHealthCheck:
        grpcServiceName: GRPC_SERVICE_NAME
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
      http2HealthCheck:
        portSpecification: PORT_SPECIFICATION
        port: PORT
        portName: PORT_NAME
        host: HOST
        requestPath: REQUEST_PATH
        response: RESPONSE
        proxyHeader: PROXY_HEADER
  targetRef:
    group: ""
    kind: Service
    name: lb-service

Ganti kode berikut:

  • INTERVAL: menentukan interval pemeriksaan, dalam detik, untuk setiap pemeriksaan health check. Ini adalah waktu dari awal satu pemeriksaan hingga awal pemeriksaan berikutnya. Jika Anda menghilangkan parameter ini, durasi default Google Cloud adalah 5 detik. Untuk informasi selengkapnya, lihat Beberapa pemeriksaan dan frekuensi.
  • TIMEOUT: menentukan jumlah waktu yang diperlukan Google Cloud untuk menunggu respons terhadap pemeriksaan. Nilai TIMEOUT harus kurang dari atau sama dengan INTERVAL. Unit dalam hitungan detik. Setiap pemeriksaan memerlukan kode respons HTTP 200 (OK) untuk dikirimkan sebelum waktu tunggu pemeriksaan.
  • HEALTHY_THRESHOLDdan UNHEALTHY_THRESHOLD: menentukan jumlah upaya koneksi berurutan yang harus berhasil atau gagal, minimal satu kali, untuk mengubahstatus kondisi dari bagus menjadi tidak bagus atau tidak bagus menjadi bagus. Jika Anda menghilangkan salah satu parameter ini, default Google Cloud adalah 2.
  • PROTOCOL: menentukan protokol yang digunakan oleh sistem pemeriksaan untuk health check. Untuk mengetahui informasi selengkapnya, lihat Kriteria keberhasilan untuk HTTP, HTTPS, dan HTTP/2 serta Kriteria keberhasilan untuk gRPC. Parameter ini wajib diisi.
  • ENABLED: menentukan apakah logging diaktifkan atau dinonaktifkan.
  • PORT_SPECIFICATION: menentukan apakah health check menggunakan port tetap (USE_FIXED_PORT), port bernama (USE_NAMED_PORT), atau port inferensi (USE_SERVING_PORT). Jika tidak ditentukan, health check akan mengikuti perilaku yang ditentukan di kolom port dan portName. Jika port atau portName tidak ditentukan, kolom ini akan ditetapkan secara default ke USE_SERVING_PORT.
  • PATH: menentukan jalur permintaan yang harus terhubung ke sistem pemeriksaan untuk health check HTTP, HTTPS, atau HTTP2. Jika Anda menghapus parameter ini, default Google Cloud adalah /.
  • PORT: HealthCheckPolicy hanya mendukung penentuan port health check load balancer menggunakan nomor port. Jika Anda menghilangkan parameter ini, nilai default Google Cloud adalah 80. Karena load balancer mengirimkan pemeriksaan ke alamat IP Pod secara langsung, Anda harus memilih port yang cocok dengan containerPort Pod yang aktif, meskipun containerPort direferensikan oleh targetPort dari Layanan. Anda tidak dibatasi pada containerPorts yang dirujuk oleh targetPort Layanan.
  • PORT_NAME: menentukan nama port seperti yang ditetapkan dalam InstanceGroup.NamedPort.name. Jika port dan portName ditentukan, Google Cloud akan mempertimbangkan nilai port terlebih dahulu.
  • HOST: nilai header host dalam permintaan health check. Nilai ini menggunakan definisi RFC 1123 dari nama host, kecuali alamat IP numerik tidak diizinkan. Jika tidak ditentukan atau dibiarkan kosong, nilai ini akan ditetapkan secara default ke alamat IP health check.
  • REQUEST_PATH: menentukan jalur permintaan untuk permintaan health check. Jika tidak ditentukan atau dibiarkan kosong, setelan defaultnya adalah /.
  • RESPONSE: menentukan byte yang akan dicocokkan dengan awal data respons. Jika tidak ditentukan atau dibiarkan kosong, GKE akan mengartikan bahwa respons apa pun sebagai responsif. Data respons hanya bisa berupa ASCII.
  • PROXY_HEADER: menentukan jenis header proxy. Anda dapat menggunakan NONE atau PROXY_V1. Setelan defaultnya adalah NONE.
  • GRPC_SERVICE_NAME: nama opsional Layanan gRPC. Hapus kolom ini untuk menentukan semua Layanan.

Untuk mengetahui informasi selengkapnya tentang kolom HealthCheckPolicy, lihat referensi healthChecks.

Mengonfigurasi kebijakan keamanan backend Google Cloud Armor untuk mengamankan layanan backend Anda

Bagian ini menjelaskan fungsionalitas yang tersedia di cluster GKE yang menjalankan versi 1.24 atau yang lebih baru.

Konfigurasikan kebijakan keamanan backend Google Cloud Armor dengan menambahkan nama kebijakan keamanan ke GCPBackendPolicy untuk mengamankan layanan backend Anda. Secara default, Gateway tidak menetapkan dan melampirkan kebijakan keamanan backend Google Cloud Armor.

Pastikan Anda membuat kebijakan keamanan backend Google Cloud Armor sebelum merujuk kebijakan di GCPBackendPolicy.

Manifes GCPBackendPolicy berikut menentukan kebijakan keamanan backend bernama example-security-policy:

Layanan

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    securityPolicy: example-security-policy
  targetRef:
    group: ""
    kind: Service
    name: lb-service

Mengonfigurasi IAP

Bagian ini menjelaskan fungsionalitas yang tersedia di cluster GKE yang menjalankan versi 1.24 atau yang lebih baru.

Identity-Aware Proxy (IAP) menerapkan kebijakan kontrol akses pada layanan backend yang terkait dengan HTTPRoute. Dengan penerapan ini, hanya pengguna atau aplikasi terautentikasi dengan peran Identity and Access Management (IAM) yang tepat yang dapat mengakses layanan backend ini.

Secara default, tidak ada IAP yang diterapkan ke layanan backend, Anda perlu mengonfigurasi IAP secara eksplisit dalam GCPBackendPolicy.

Untuk mengonfigurasi IAP dengan Gateway, lakukan hal berikut:

  1. Aktifkan IAP untuk GKE Jangan mengonfigurasi backend (Mengonfigurasi BackendConfig) karena BackendConfig hanya valid jika terjadi deployment Ingress.

  2. Buat Secret untuk IAP:

    1. Buka halaman Kredensial. Tombol: Membuka halaman Kredensial.

    2. Klik nama klien dan download file klien OAuth.

    3. Dari file klien OAuth, salin secret OAuth di papan klip.

    4. Buat file dengan nama iap-secret.txt.

    5. Tempel secret OAuth di file iap-secret.txt menggunakan perintah berikut:

      echo -n CLIENT_SECRET > iap-secret.txt
      kubectl create secret generic SECRET_NAME --from-file=key=iap-secret.txt
      
  3. Untuk menentukan kebijakan IAP yang merujuk secret:

    1. Buat manifes GCPBackendPolicy berikut, ganti masing-masing SECRET_NAME dan CLIENT_ID. Simpan manifes sebagai backend-policy.yaml:

      Layanan

      apiVersion: networking.gke.io/v1
      kind: GCPBackendPolicy
      metadata:
        name: backend-policy
      spec:
        default:
          iap:
            enabled: true
            oauth2ClientSecret:
              name: SECRET_NAME
            clientID: CLIENT_ID
        targetRef:
          group: ""
          kind: Service
          name: lb-service
      

      Layanan Multi-cluster

      apiVersion: networking.gke.io/v1
      kind: GCPBackendPolicy
      metadata:
        name: backend-policy
      spec:
        default:
          iap:
            enabled: true
            oauth2ClientSecret:
              name: SECRET_NAME
            clientID: CLIENT_ID
        targetRef:
          group: net.gke.io
          kind: ServiceImport
          name: lb-service
      
    2. Terapkan manifes backend-policy.yaml:

      kubectl apply -f backend-policy.yaml
      
  4. Verifikasi konfigurasi Anda:

    1. Pastikan kebijakan diterapkan setelah membuat GCPBackendPolicy dengan IAP:

      kubectl get gcpbackendpolicy
      

      Outputnya mirip dengan hal berikut ini:

      NAME             AGE
      backend-policy   45m
      
    2. Untuk mendapatkan detail selengkapnya, gunakan perintah describe:

      kubectl describe gcpbackendpolicy
      

      Outputnya mirip dengan hal berikut ini:

      Name:         backend-policy
      Namespace:    default
      Labels:       <none>
      Annotations:  <none>
      API Version:  networking.gke.io/v1
      Kind:         GCPBackendPolicy
      Metadata:
        Creation Timestamp:  2023-05-27T06:45:32Z
        Generation:          2
        Resource Version:    19780077
        UID:                 f4f60a3b-4bb2-4e12-8748-d3b310d9c8e5
      Spec:
        Default:
          Iap:
            Client ID:  441323991697-luotsrnpboij65ebfr13hlcpm5a4heke.apps.googleusercontent.com
            Enabled:    true
            oauth2ClientSecret:
              Name:  my-iap-secret
        Target Ref:
          Group:
          Kind:   Service
          Name:   lb-service
      Status:
        Conditions:
          Last Transition Time:  2023-05-27T06:48:25Z
          Message:
          Reason:                Attached
          Status:                True
          Type:                  Attached
      Events:
        Type     Reason  Age                 From                   Message
        ----     ------  ----                ----                   -------
        Normal   ADD     46m                 sc-gateway-controller  default/backend-policy
        Normal   SYNC    44s (x15 over 43m)  sc-gateway-controller  Application of GCPGatewayPolicy "default/backend-policy" was a success
      

Mengonfigurasi waktu tunggu layanan backend

Bagian ini menjelaskan fungsionalitas yang tersedia di cluster GKE yang menjalankan versi 1.24 atau yang lebih baru.

Manifes GCPBackendPolicy berikut menentukan periode waktu tunggu layanan backend selama 40 detik. Setelan default kolom timeoutSec adalah 30 detik.

Layanan

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    timeoutSec: 40
  targetRef:
    group: ""
    kind: Service
    name: lb-service

Mengonfigurasi afinitas sesi

Bagian ini menjelaskan fungsionalitas yang tersedia di cluster GKE yang menjalankan versi 1.24 atau yang lebih baru.

Anda dapat mengonfigurasi afinitas sesi berdasarkan kriteria berikut:

  • Alamat IP klien
  • Cookie yang dihasilkan

Saat Anda mengonfigurasi afinitas sesi untuk Layanan Anda, setelan localityLbPolicy Gateway ditetapkan ke MAGLEV.

Jika Anda menghapus konfigurasi afinitas sesi dari GCPBackendPolicy, Gateway akan mengembalikan setelan localityLbPolicy ke nilai default, ROUND_ROBIN. Nilai ini ditetapkan secara otomatis di layanan backend yang dikelola GKE (dilampirkan ke load balancer) dan tidak tercermin dalam output perintah gcloud CLI, di UI, atau dengan Terraform.

Manifes GCPBackendPolicy berikut menentukan afinitas sesi berdasarkan alamat IP klien:

Layanan

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    sessionAffinity:
      type: CLIENT_IP
  targetRef:
    group: ""
    kind: Service
    name: lb-service

Manifes GCPBackendPolicy berikut menentukan afinitas sesi berdasarkan cookie yang dihasilkan dan mengonfigurasi TTL cookie ke 50 detik:

Layanan

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    sessionAffinity:
      type: GENERATED_COOKIE
      cookieTtlSec: 50
  targetRef:
    group: ""
    kind: Service
    name: lb-service

Anda dapat menggunakan opsi berikut untuk sessionAffinity.type: CLIENT_IP, CLIENT_IP_PROTO, CLIENT_IP_PORT_PROTO, GENERATED_COOKIE, HEADER_FIELD, HTTP_COOKIE, NONE.

Mengonfigurasi waktu tunggu pengosongan koneksi

Bagian ini menjelaskan fungsionalitas yang tersedia di cluster GKE yang menjalankan versi 1.24 atau yang lebih baru.

Anda dapat mengonfigurasi waktu tunggu pengosongan koneksi menggunakan GCPBackendPolicy. Waktu tunggu pengosongan koneksi adalah waktu, dalam detik, untuk menunggu koneksi dikosongkan. Durasi waktu tunggu bisa dari 0 hingga 3600 detik. Nilai defaultnya adalah 0, yang juga menonaktifkan pengosongan koneksi.

Manifes GCPBackendPolicy berikut menentukan waktu tunggu pengosongan koneksi selama 60 detik:

Layanan

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    connectionDraining:
      drainingTimeoutSec: 60
  targetRef:
    group: ""
    kind: Service
    name: lb-service

Selama durasi waktu tunggu yang ditentukan, GKE menunggu penyelesaian permintaan yang ada ke backend yang dihapus. Load balancer tidak mengirim permintaan baru ke backend yang dihapus. Setelah durasi waktu tunggu tercapai, GKE akan menutup semua koneksi yang tersisa ke backend.

Logging akses HTTP

Bagian ini menjelaskan fungsionalitas yang tersedia di cluster GKE yang menjalankan versi 1.24 atau yang lebih baru.

Secara default:

  • Pengontrol Gateway mencatat semua permintaan HTTP dari klien ke Cloud Logging.
  • Frekuensi sampling adalah 1.000.000, yang berarti semua permintaan dicatat.

Anda dapat menonaktifkan logging akses di Gateway menggunakan GCPBackendPolicy dengan tiga cara:

  • Anda dapat keluar dari GCPBackendPolicy tanpa bagian logging
  • Anda dapat menetapkan logging.enabled ke false
  • Anda dapat menetapkan logging.enabled ke true dan menetapkan logging.sampleRate ke 0

Anda juga dapat mengonfigurasi frekuensi sampling logging akses.

Manifes GCPBackendPolicy berikut mengubah frekuensi sampel default logging akses dan menetapkannya ke 50% permintaan HTTP untuk resource Layanan tertentu:

Layanan

apiVersion: networking.gke.io/v1
kind: GCPBackendPolicy
metadata:
  name: my-backend-policy
  namespace: lb-service-namespace
spec:
  default:
    logging:
      enabled: true
      sampleRate: 500000
  targetRef:
    group: ""
    kind: Service
    name: lb-service

Manifes ini memiliki kolom berikut:

  • enable: true: secara eksplisit mengaktifkan logging akses. Log tersedia di Logging.
  • sampleRate: 500000: menentukan bahwa 50% paket dicatat ke dalam log. Anda dapat menggunakan nilai antara 0 dan 1.000.000. GKE mengonversi nilai ini menjadi nilai floating point di rentang [0, 1] dengan membagi dengan 1.000.000. Kolom ini hanya relevan jika enable ditetapkan ke true. sampleRate adalah kolom opsional, tetapi jika dikonfigurasi, enable: true juga harus ditetapkan. Jika enable ditetapkan ke true dan sampleRate tidak disediakan, GKE menetapkan enable ke false.

Pemecahan masalah

Beberapa GCPBackendPolicy dilampirkan ke Service yang sama

Gejala:

Kondisi status berikut mungkin terjadi saat Anda melampirkan GCPBackendPolicy ke Service atau ServiceImport:

status:
  conditions:
    - lastTransitionTime: "2023-09-26T20:18:03Z"
      message: conflicted with GCPBackendPolicy "[POLICY_NAME]" of higher precedence, hence not applied
      reason: Conflicted
      status: "False"
      type: Attached

Alasan:

Kondisi status ini menunjukkan bahwa Anda mencoba menerapkan GCPBackendPolicy kedua ke Service atau ServiceImport yang sudah memiliki GCPBackendPolicy terlampir.

Beberapa GCPBackendPolicy yang dilampirkan ke Service atau ServiceImport yang sama tidak didukung dengan Gateway GKE. Lihat Pembatasan dan Batasan untuk mengetahui detail selengkapnya.

Solusi:

Konfigurasikan satu GCPBackendPolicy yang mencakup semua konfigurasi kustom dan lampirkan ke Service atau ServiceImport.

Langkah selanjutnya