Membuat load balancer protokol campuran

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

Untuk mempelajari load balancer L4 lebih lanjut, lihat Tentang Layanan LoadBalancer.

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. Penggunaan satu Layanan menyederhanakan konfigurasi Anda dengan memungkinkan Anda menggunakan satu alamat IP dan sekumpulan aturan penerusan yang digabungkan untuk kedua protokol. Fitur ini didukung untuk Load Balancer Jaringan passthrough eksternal regional dan Load Balancer Jaringan passthrough internal.

GKE mendukung Layanan protokol campuran dengan konfigurasi IPv4, IPv6, dan dual-stack. Layanan protokol campuran menggunakan aturan penerusan Layer 3 (L3). Menurut desainnya, aturan ini meneruskan semua traffic yang tiba di alamat IP virtual (VIP) load balancer langsung ke node cluster.

Untuk menjaga keamanan, GKE secara otomatis membuat dan mengelola aturan firewall dengan prioritas 999 yang hanya mengizinkan traffic TCP dan UDP tertentu yang ditentukan dalam manifes Layanan Anda. Semua traffic tidak sah lainnya yang diarahkan ke alamat VIP load balancer diblokir oleh aturan firewall yang dikelola GKE menggunakan prioritas 1000. Jika Anda membuat aturan firewall dengan prioritas yang lebih tinggi, pastikan aturan tersebut tidak secara tidak sengaja mengizinkan traffic yang tidak sah menjangkau node Anda. Untuk mengetahui informasi selengkapnya, lihat Aturan firewall Layanan GKE.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Untuk 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. Versi gcloud CLI yang lebih lama mungkin tidak mendukung menjalankan perintah dalam dokumen ini.

Persyaratan

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

  • Load balancing protokol campuran tersedia secara umum mulai dari GKE versi 1.36.2-gke.1498000 dan yang lebih baru. Versi yang tersedia secara umum mendukung load balancer eksternal dan internal dengan konfigurasi IPv4, IPv6, dan dual stack.
  • Untuk versi 1.34.1-gke.2190000 hingga 1.36.2-gke.1498000, load balancing protokol campuran hanya didukung untuk load balancer eksternal yang menggunakan alamat IPv4.
  • Anda harus mengaktifkan add-on HttpLoadBalancing di cluster Anda.
  • Untuk load balancer internal, cluster harus mengaktifkan subsetelan GKE.
  • Untuk Layanan LoadBalancer internal baru, di manifes Service, tetapkan nilai kolom spec.loadBalancerClass ke networking.gke.io/l4-regional-internal. Untuk Layanan internal yang ada, manifes Anda sudah memiliki anotasi networking.gke.io/load-balancer-type: "Internal", dan Anda dapat membiarkan anotasi tersebut apa adanya.
  • Untuk Layanan LoadBalancer eksternal baru, pastikan load balancer adalah Load Balancer Jaringan passthrough eksternal regional berbasis layanan backend. Di GKE 1.37 dan yang lebih baru, konfigurasi ini adalah default. Pada versi sebelumnya, tetapkan kolom spec.loadBalancerClass ke networking.gke.io/l4-regional-external dalam manifes Layanan. Untuk Layanan eksternal yang sudah ada, manifes Anda sudah memiliki anotasi cloud.google.com/l4-rbs: "enabled", dan Anda dapat membiarkan anotasi sebagaimana adanya.

Batasan

  • Pada versi 1.34.1-gke.2190000 hingga 1.36.2-gke.1498000, load balancer protokol campuran hanya mendukung alamat IPv4.
  • Layanan yang sudah ada yang memiliki finalizer gke.networking.io/l4-ilb-v1 atau gke.networking.io/l4-netlb-v1 tidak dapat digunakan untuk load balancing protokol campuran. Jika ingin menggunakan protokol campuran di Layanan ini, Anda harus menghapus dan membuat ulang Layanan sesuai dengan persyaratan sebelumnya.
  • Memperbarui port di Layanan dapat menyebabkan gangguan traffic singkat untuk semua traffic yang dirutekan melalui load balancer.
  • Anda tidak dapat melampirkan Private Service Connect ke Layanan protokol campuran.

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
Internal Tunggal atau campuran (TCP, UDP, atau keduanya) IPv4 1 0
IPv6 1 0
IPv4 dan IPv6 (DualStack) 2 0
Eksternal Tunggal atau campuran (TCP, UDP, atau keduanya) IPv4 1 1
IPv6 1 1
IPv4 dan IPv6 (DualStack) 2 2

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 dengan protokol campuran atau dua Layanan LoadBalancer dengan protokol tunggal yang terpisah.

  1. Manifes berikut adalah untuk aplikasi contoh yang memproses di port 8080 untuk traffic TCP dan UDP. 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. Anda dapat membuat load balancer eksternal atau internal.

  1. Untuk membuat load balancer eksternal, simpan manifes berikut sebagai mixed-protocol-lb.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: mixed-protocol-external-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
    

    Untuk membuat load balancer internal, tetapkan nilai kolom spec.loadBalancerClass ke networking.gke.io/l4-regional-internal.

    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 SERVICE_NAME
    

    Ganti SERVICE_NAME dengan nama Layanan Anda (misalnya, mixed-protocol-lb).

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

    • Kolom status.loadBalancer.ingress.ip diisi.
    • Untuk cluster pada versi 1.34.1-gke.2190000 hingga 1.36.2-gke.1498000, verifikasi bahwa anotasi berikut untuk load balancer eksternal Anda ada:
      • service.kubernetes.io/tcp-forwarding-rule
      • service.kubernetes.io/udp-forwarding-rule
    • Untuk cluster yang dibuat pada versi setelah 1.36.2-gke.1498000, verifikasi bahwa anotasi berikut untuk load balancer Anda ada, bergantung pada konfigurasi Anda:
      • Untuk IPv4: service.kubernetes.io/l3-forwarding-rule
      • Untuk IPv6: service.kubernetes.io/l3-forwarding-rule-ipv6
      • Untuk dual-stack: kedua anotasi.
    • 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"  # for internal LB, use: "networking.gke.io/l4-regional-internal"
  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" # for internal LB, use: "networking.gke.io/l4-regional-internal"
  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" # for internal LB, use: "networking.gke.io/l4-regional-internal"
  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 protokol campuran, jalankan perintah berikut:

kubectl delete service SERVICE_NAME

Ganti SERVICE_NAME dengan nama Layanan Anda (misalnya, mixed-protocol-external-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 SERVICE_NAME
    

    Ganti SERVICE_NAME dengan nama Layanan Anda.

  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 patch 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. Tindakan ini memerlukan permintaan PUT HTTP dengan spesifikasi objek Service secara keseluruhan.

Langkah berikutnya