Membuat load balancer eksternal protokol campuran

Dokumen ini menunjukkan cara mengekspos aplikasi yang berjalan di cluster Google Kubernetes Engine (GKE) ke internet menggunakan Layanan LoadBalancer eksternal protokol campuran untuk traffic TCP dan UDP.

Untuk mempelajari lebih lanjut Load Balancer Jaringan passthrough eksternal, lihat Load Balancer Jaringan passthrough eksternal berbasis layanan backend.

Ringkasan

Anda dapat mengekspos aplikasi yang menggunakan protokol TCP dan UDP dengan menggunakan dua Layanan LoadBalancer GKE terpisah dengan alamat IP bersama yang dikoordinasikan secara manual. Namun, pendekatan ini tidak efisien karena memerlukan pengelolaan beberapa Layanan untuk satu aplikasi dan dapat menyebabkan masalah seperti error konfigurasi atau kuota alamat IP yang habis.

Layanan LoadBalancer protokol campuran memungkinkan Anda menggunakan satu Layanan untuk mengelola traffic untuk TCP dan UDP. Menggunakan satu Layanan menyederhanakan konfigurasi Anda dengan memungkinkan Anda menggunakan satu alamat IPv4 dan sekumpulan aturan penerusan yang digabungkan untuk kedua protokol. Fitur ini didukung untuk Load Balancer Jaringan passthrough eksternal.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan perintah gcloud components update. gcloud CLI versi sebelumnya mungkin tidak mendukung menjalankan perintah dalam dokumen ini.

Persyaratan

Untuk membuat Layanan LoadBalancer eksternal yang menggunakan protokol campuran, cluster Anda harus memenuhi persyaratan berikut:

  • Load balancing protokol campuran hanya tersedia di cluster yang baru dibuat pada versi 1.34.1-gke.2190000 atau yang lebih baru.
  • Anda harus mengaktifkan add-on HttpLoadBalancing di cluster Anda.
  • Untuk Service LoadBalancer eksternal baru, guna menerapkan load balancer, tetapkan kolom spec.loadBalancerClass ke networking.gke.io/l4-regional-external dalam manifes Service. Untuk Layanan yang sudah ada, manifes Anda sudah memiliki anotasi cloud.google.com/l4-rbs: "enabled", dan Anda dapat membiarkan anotasi tersebut apa adanya.

Batasan

  • Load balancer protokol campuran hanya mendukung alamat IPv4.
  • Anda tidak dapat menggunakan protokol campuran dalam manifes Layanan dengan finalizer berikut:

    • gke.networking.io/l4-ilb-v1
    • gke.networking.io/l4-netlb-v1

    Jika manifes Anda memiliki finalizer ini, Anda harus menghapus dan membuat ulang Layanan sesuai dengan persyaratan sebelumnya.

Harga

Google Cloud menagih Anda per aturan penerusan, untuk alamat IP eksternal apa pun, dan untuk data yang dikirim. Tabel berikut menjelaskan jumlah aturan penerusan dan alamat IP eksternal yang digunakan untuk konfigurasi tertentu. Untuk mengetahui informasi selengkapnya, lihat Harga jaringan VPC.

Jenis Lapisan Transport Lapisan Internet Jumlah Aturan Penerusan Jumlah Alamat IP Eksternal
Eksternal Tunggal (TCP atau UDP) IPv4 1 1
IPv6 1 1
IPv4 dan IPv6(DualStack) 2 2
Campuran (TCP dan UDP) IPv4 2 1

Men-deploy workload

Bagian ini menunjukkan cara men-deploy contoh workload yang memproses port TCP dan UDP. Perhatikan bahwa konfigurasi Deployment sama, baik Anda menggunakan Layanan LoadBalancer protokol campuran atau dua Layanan LoadBalancer protokol tunggal yang terpisah.

  1. Manifes berikut adalah untuk aplikasi contoh yang memproses traffic TCP dan UDP di port 8080. Simpan manifes berikut sebagai mixed-app-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mixed-app-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: mixed-app
      template:
        metadata:
          labels:
            app: mixed-app
        spec:
          containers:
          - image: gcr.io/kubernetes-e2e-test-images/agnhost:2.6
            name: agnhost
            args: ["serve-hostname", "--port=8080", "--tcp=true", "--udp=true", "--http=false"]
            ports:
              - name: tcp8080
                protocol: TCP
                containerPort: 8080
              - name: udp8080
                protocol: UDP
                containerPort: 8080
    
  2. Terapkan manifes ke cluster Anda:

    kubectl apply -f mixed-app-deployment.yaml
    

Membuat load balancer protokol campuran

Buat Layanan berjenis LoadBalancer yang mengekspos deployment ke traffic TCP dan UDP.

  1. Simpan manifes berikut sebagai mixed-protocol-lb.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: mixed-protocol-lb
    spec:
      loadBalancerClass: "networking.gke.io/l4-regional-external"
      type: LoadBalancer
      selector:
        app: mixed-app
      ports:
      - name: tcp-port
        protocol: TCP
        port: 8080
      - name: udp-port
        protocol: UDP
        port: 8080
    

    Service sebelumnya memiliki dua port, satu untuk TCP dan satu untuk UDP, keduanya di port 8080.

  2. Terapkan manifes ke cluster Anda:

    kubectl apply --server-side -f mixed-protocol-lb.yaml
    

Memverifikasi load balancer protokol campuran

Setelah membuat Layanan, pastikan GKE berhasil membuat load balancer.

  1. Periksa Layanan:

    kubectl describe service mixed-protocol-lb
    

    Output akan menampilkan alamat IP eksternal load balancer dan aturan penerusan untuk TCP dan UDP. Verifikasi detail berikut dalam output:

    • Kolom status.loadBalancer.ingress.ip diisi.
    • Pastikan anotasi berikut untuk load balancer eksternal Anda ada:
      • service.kubernetes.io/tcp-forwarding-rule
      • service.kubernetes.io/udp-forwarding-rule
    • Bagian Events tidak berisi pesan error.

Memperbarui load balancer protokol campuran

Anda dapat memperbarui port pada load balancer protokol campuran dengan mengedit manifes Service. Untuk mengedit Service, jalankan perintah berikut:

kubectl edit service SERVICE_NAME

Ganti SERVICE_NAME dengan nama Layanan Anda.

Memperbarui port

Untuk memperbarui port pada load balancer protokol campuran, ubah bagian ports manifes Service. Anda dapat menambahkan, menghapus, atau mengubah port.

Contoh berikut menambahkan port UDP untuk streaming dan port TCP untuk metadata server game:

apiVersion: v1
kind: Service
metadata:
  name: mixed-protocol-lb
spec:
  loadBalancerClass: "networking.gke.io/l4-regional-external"
  type: LoadBalancer
  selector:
    app: mixed-app
  ports:
  - name: tcp-port
    protocol: TCP
    port: 8080
  - name: streaming
    protocol: UDP
    port: 10100
  - name: gameserver-metadata
    protocol: TCP
    port: 10400
  - name: https
    protocol: TCP
    port: 443

Memperbarui load balancer protokol tunggal ke protokol campuran

Untuk mengubah load balancer protokol tunggal menjadi load balancer protokol campuran, edit Layanan untuk menyertakan port untuk protokol TCP dan UDP.

Contoh berikut menambahkan port UDP untuk DNS ke load balancer khusus TCP yang ada:

apiVersion: v1
kind: Service
metadata:
  name: already-existing-single-protocol-lb
spec:
  loadBalancerClass: "networking.gke.io/l4-regional-external"
  type: LoadBalancer
  selector:
    app: mixed-app
  ports:
  - name: http
    protocol: TCP
    port: 80
  - name: https
    protocol: TCP
    port: 443
  - name: dns
    protocol: UDP
    port: 53

Memperbarui load balancer protokol campuran ke protokol tunggal

Untuk mengubah load balancer protokol campuran menjadi load balancer protokol tunggal, hapus semua port untuk salah satu protokol.

Contoh berikut menghapus port UDP untuk DNS, yang mengonversi load balancer menjadi hanya TCP:

apiVersion: v1
kind: Service
metadata:
  name: already-existing-mixed-protocol-lb
spec:
  loadBalancerClass: "networking.gke.io/l4-regional-external"
  type: LoadBalancer
  selector:
    app: mixed-app
  ports:
  - name: http
    protocol: TCP
    port: 80
  - name: https
    protocol: TCP
    port: 443

Menghapus LoadBalancer protokol campuran

Untuk menghapus Layanan LoadBalancer eksternal mixed-protocol-lb, jalankan perintah berikut:

kubectl delete service mixed-protocol-lb

GKE akan otomatis menghapus semua resource load balancer yang dibuat untuk Layanan.

Pemecahan masalah

Bagian ini menjelaskan cara menyelesaikan masalah umum terkait Layanan LoadBalancer dengan protokol campuran.

Memeriksa peristiwa error

Langkah pertama dalam memecahkan masalah adalah memeriksa peristiwa yang terkait dengan Layanan Anda.

  1. Dapatkan detail Layanan Anda:

    kubectl describe service mixed-protocol-lb
    
  2. Tinjau bagian Events di akhir output untuk melihat pesan error.

Error: Protokol Campuran tidak didukung untuk LoadBalancer

Jika Anda membuat Layanan dengan anotasi cloud.google.com/l4-rbs: "enabled", Anda mungkin melihat peristiwa peringatan dari pengontrol layanan asli setelah membuat load balancer protokol campuran: mixed-protocol is not supported for LoadBalancer.

Anda dapat mengabaikan pesan ini dengan aman karena pengontrol baru, yang mendukung protokol campuran, menyediakan load balancer dengan benar.

Definisi port hilang setelah update

Gejala:

Saat Anda memperbarui Layanan yang menggunakan port yang sama untuk TCP dan UDP (misalnya, port 8080), salah satu definisi port tidak ada dalam Layanan yang diperbarui.

Penyebab:

Ini adalah masalah umum di Kubernetes. Saat Anda memperbarui Layanan dengan beberapa protokol di port yang sama, penghitungan patch sisi klien dapat menggabungkan daftar port secara salah, yang menyebabkan salah satu definisi port dihapus. Masalah ini memengaruhi klien yang menggunakan patching sisi klien, seperti kubectl apply dan klien Go dengan patch gabungan.

Solusi:

Solusi untuk masalah ini bergantung pada klien Anda.

  • Untuk kubectl: Gunakan tanda --server-side dengan kubectl apply:

    kubectl apply --server-side -f YOUR_SERVICE_MANIFEST.yaml
    

    Ganti YOUR_SERVICE_MANIFEST dengan nama Manifes layanan Anda.

  • Untuk go-client: Jangan gunakan patch gabungan. Sebagai gantinya, gunakan panggilan update untuk mengganti Layanan. Hal ini memerlukan permintaan PUT HTTP dengan spesifikasi objek Service secara keseluruhan.

Langkah berikutnya