Membuat load balancer protokol campuran

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

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

Ringkasan

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

Service LoadBalancer protokol campuran memungkinkan Anda menggunakan satu Service untuk mengelola traffic TCP dan UDP. Menggunakan satu Service akan menyederhanakan konfigurasi Anda dengan memungkinkan Anda menggunakan satu alamat IP dan kumpulan aturan penerusan gabungan untuk kedua protokol. Fitur ini didukung untuk Load Balancer Jaringan passthrough eksternal regional dan Load Balancer Jaringan passthrough internal.

GKE mendukung Service protokol campuran dengan konfigurasi IPv4, IPv6, dan dual-stack. Service protokol campuran menggunakan aturan penerusan Lapisan 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 Service 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 tidak sah mencapai node Anda. Untuk mengetahui informasi selengkapnya, lihat Aturan firewall Service GKE.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Mengaktifkan 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.
  • Pastikan Anda memiliki cluster Autopilot atau Standar yang sudah ada. Untuk membuat cluster baru, lihat Membuat cluster Autopilot.

Persyaratan

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

  • Load balancing protokol campuran umumnya tersedia 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 addon HttpLoadBalancing di cluster Anda.
  • Untuk load balancer internal, cluster harus mengaktifkan GKE subsetting
  • Untuk Service LoadBalancer internal baru, di manifes Service, tetapkan nilai kolom spec.loadBalancerClass ke networking.gke.io/l4-regional-internal. Untuk Service internal yang ada, manifes Anda sudah memiliki anotasi networking.gke.io/load-balancer-type: "Internal", dan Anda dapat membiarkan anotasi tersebut seperti apa adanya.
  • Untuk Service LoadBalancer eksternal baru, tetapkan kolom spec.loadBalancerClass ke networking.gke.io/l4-regional-external di manifes Service. Untuk Service eksternal yang ada, manifes Anda sudah memiliki anotasi cloud.google.com/l4-rbs: "enabled", dan Anda dapat membiarkan anotasi tersebut seperti apa adanya.

Batasan

  • Pada versi 1.34.1-gke.2190000 hingga 1.36.2-gke.1498000, load balancer protokol campuran hanya mendukung alamat IPv4.
  • Service yang 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 Service ini, Anda harus menghapus dan membuat ulang Service sesuai dengan persyaratan sebelumnya.
  • Memperbarui port di Service dapat menyebabkan gangguan traffic singkat untuk semua traffic yang dirutekan melalui load balancer.
  • Anda tidak dapat melampirkan Private Service Connect ke Service protokol campuran.

Harga

Cloud de Confiance 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 Service LoadBalancer protokol campuran atau dua Service LoadBalancer protokol tunggal terpisah.

  1. Manifes berikut adalah untuk contoh aplikasi yang memproses 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 Service 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 Service, verifikasi bahwa GKE berhasil membuat load balancer.

  1. Periksa Service:

    kubectl describe service SERVICE_NAME
    

    Ganti SERVICE_NAME dengan nama Service 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, pastikan 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, pastikan 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 di load balancer protokol campuran dengan mengedit manifes Service. Untuk mengedit Service, jalankan perintah berikut:

kubectl edit service SERVICE_NAME

Ganti SERVICE_NAME dengan nama Service Anda.

Memperbarui port

Untuk memperbarui port di load balancer protokol campuran, ubah bagian ports dari 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 Service 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 khusus 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 Service LoadBalancer protokol campuran, jalankan perintah berikut:

kubectl delete service SERVICE_NAME

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

GKE secara otomatis menghapus semua resource load balancer yang dibuat untuk Service.

Pemecahan masalah

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

Memeriksa peristiwa error

Langkah pertama dalam pemecahan masalah adalah memeriksa peristiwa yang terkait dengan Service Anda.

  1. Dapatkan detail Service Anda:

    kubectl describe service SERVICE_NAME
    

    Ganti SERVICE_NAME dengan nama Service Anda.

  2. Tinjau bagian Events di akhir output untuk mengetahui pesan error.

Error: Mixed Protocol is not supported for LoadBalancer

Jika Anda membuat Service dengan cloud.google.com/l4-rbs: "enabled" anotasi, 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 tidak ada setelah update

Gejala:

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

Penyebab:

Masalah ini sering terjadi di Kubernetes. Saat Anda memperbarui Service dengan beberapa protokol di port yang sama, perhitungan 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 flag --server-side dengan kubectl apply:

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

    Ganti YOUR_SERVICE_MANIFEST dengan nama manifes Service Anda.

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

Langkah berikutnya