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
HttpLoadBalancingdi cluster Anda. - Untuk load balancer internal, cluster harus mengaktifkan GKE subsetting
- Untuk Service LoadBalancer internal baru, di manifes Service, tetapkan nilai kolom
spec.loadBalancerClasskenetworking.gke.io/l4-regional-internal. Untuk Service internal yang ada, manifes Anda sudah memiliki anotasinetworking.gke.io/load-balancer-type: "Internal", dan Anda dapat membiarkan anotasi tersebut seperti apa adanya. - Untuk Service LoadBalancer eksternal baru, tetapkan kolom
spec.loadBalancerClasskenetworking.gke.io/l4-regional-externaldi manifes Service. Untuk Service eksternal yang ada, manifes Anda sudah memiliki anotasicloud.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-v1ataugke.networking.io/l4-netlb-v1tidak 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.
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: 8080Terapkan 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.
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: 8080Untuk membuat load balancer internal, tetapkan nilai kolom
spec.loadBalancerClasskenetworking.gke.io/l4-regional-internal.Service sebelumnya memiliki dua port, satu untuk TCP dan satu untuk UDP, keduanya di port 8080.
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.
Periksa Service:
kubectl describe service SERVICE_NAMEGanti
SERVICE_NAMEdengan 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.ipdiisi. - 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-ruleservice.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.
- Untuk IPv4:
- Bagian
Eventstidak berisi pesan error.
- Kolom
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.
Dapatkan detail Service Anda:
kubectl describe service SERVICE_NAMEGanti
SERVICE_NAMEdengan nama Service Anda.Tinjau bagian
Eventsdi 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-sidedengankubectl apply:kubectl apply --server-side -f YOUR_SERVICE_MANIFEST.yamlGanti
YOUR_SERVICE_MANIFESTdengan nama manifes Service Anda.Untuk go-client: Jangan gunakan patch gabungan. Sebagai gantinya, gunakan panggilan update untuk mengganti Service. Hal ini memerlukan permintaan HTTP
PUTdengan seluruh spesifikasi objek Service.
Langkah berikutnya
- Pelajari lebih lanjut cara mengekspos aplikasi menggunakan Service.
- Baca tentang Service LoadBalancer.