Dokumen ini menunjukkan cara mengekspos Pod multi-jaringan ke klien internal atau eksternal dengan membuat resource Load Balancer Jaringan passthrough eksternal dan Load Balancer Jaringan passthrough internal di GKE. Google Cloud Dokumen ini menjelaskan konfigurasi, kemampuan, dan batasan yang diperlukan untuk Layanan LoadBalancer multi-jaringan.
Jika Anda menghubungkan workload ke beberapa jaringan VPC, gunakan
Layanan Kubernetes berjenis LoadBalancer untuk merutekan traffic ke Pod di jaringan sekunder
tertentu. Saat Anda membuat Layanan, GKE akan membuat Network Load Balancer passthrough untuk mengelola traffic ini.
Untuk mengetahui informasi selengkapnya tentang multi-jaringan di GKE, lihat Tentang dukungan multi-jaringan untuk Pod.
Cara kerja layanan LoadBalancer multi-jaringan
Untuk mengekspos workload multi-jaringan, buat Service dari type: LoadBalancer.
Service harus menyertakan pemilih khusus yang menargetkan Pod berdasarkan
jaringan antarmuka sekundernya. Tambahkan anotasi untuk menentukan apakah akan membuat load balancer internal atau eksternal.
Label networking.gke.io/network di pemilih memfilter endpoint menurut
jaringan. Label ini memastikan bahwa load balancer hanya mengirimkan traffic ke antarmuka Pod yang terhubung ke jaringan yang ditentukan.
Batasan
Load balancer multi-jaringan memiliki batasan berikut:
- Layanan yang menggunakan
externalTrafficPolicy: Clustertidak didukung. - Layanan yang menargetkan Pod
hostNetworktidak didukung. - Jaringan IPv6 dan stack ganda tidak didukung.
- Anda tidak dapat mengubah jaringan Layanan yang ada.
- Hanya jaringan Layer 3 yang didukung.
- Load balancer berdasarkan kumpulan target atau backend grup instance tidak didukung.
- Layanan ClusterIP dan NodePort tidak didukung di jaringan sekunder (non-default).
Sebelum memulai
Sebelum memulai, selesaikan tugas berikut:
- Ikuti langkah-langkah di Menyiapkan dukungan multi-jaringan untuk Pod guna menyiapkan jaringan VPC dan membuat cluster GKE dengan jaringan tambahan.
- Pastikan cluster Anda telah mengaktifkan subsetelan untuk Load Balancer Internal Layer 4. Untuk mengaktifkan fitur ini, gunakan flag
--enable-l4-ilb-subsettingsaat Anda membuat atau mengupdate cluster. - Pastikan cluster Anda menjalankan GKE versi 1.37 atau yang lebih baru.
Men-deploy Pod multi-jaringan
Untuk melampirkan Pod ke jaringan tambahan, buat Deployment dengan anotasi
networking.gke.io/interfaces. Anotasi ini menentukan
jaringan dan antarmuka untuk Pod.
Simpan manifes berikut sebagai
web-app-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: web-app labels: app: web-app spec: replicas: 3 selector: matchLabels: app: web-app template: metadata: labels: app: web-app annotations: networking.gke.io/default-interface: 'eth1' networking.gke.io/interfaces: '[ {"interfaceName":"eth0","network":"default"}, {"interfaceName": "eth1","network": "dmz"} ]' spec: containers: - name: whereami image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1 ports: - containerPort: 8080Manifes ini membuat Deployment bernama
web-appdengan tiga Pod. Pod memiliki dua antarmuka:eth0yang terhubung ke jaringandefaultdaneth1yang terhubung ke jaringandmz. Anotasinetworking.gke.io/default-interfacemenetapkaneth1sebagai antarmuka default untuk Pod.Terapkan manifes ke cluster Anda:
kubectl apply -f web-app-deployment.yaml
Jika Anda menggunakan antarmuka non-default untuk Layanan, Anda harus mengonfigurasi perutean dalam Pod. Untuk mengonfigurasi pemilihan rute, tambahkan initContainer ke spesifikasi Pod yang memiliki kemampuan NET_ADMIN.
Contoh berikut menunjukkan initContainer yang menambahkan rute default untuk antarmuka
eth1:
initContainers:
- name: init-routes-busybox
image: busybox
command: ['sh', '-c', 'ip route add default dev eth1 table 200 && ip rule add from 172.16.1.0/24 table 200']
securityContext:
capabilities:
add: ["NET_ADMIN"]
Dalam perintah initContainer, ganti 172.16.1.0/24 dengan rentang alamat IP sekunder jaringan Pod Anda.
Men-deploy Layanan LoadBalancer internal
Untuk mengekspos Deployment web-app di jaringan dmz, buat Service
LoadBalancer internal.
Simpan manifes berikut sebagai
internal-lb-service.yaml:apiVersion: v1 kind: Service metadata: name: web-app-internal-lb namespace: default annotations: networking.gke.io/load-balancer-type: "Internal" spec: externalTrafficPolicy: Local ports: - port: 80 protocol: TCP targetPort: 8080 selector: networking.gke.io/network: dmz app: web-app type: LoadBalancerManifes ini membuat Layanan dengan properti berikut:
networking.gke.io/load-balancer-type: "Internal": Menentukan Load Balancer Jaringan passthrough internal.selector: Memilih Pod dengan labelapp: web-appyang terhubung ke jaringandmz.
Terapkan manifes ke cluster Anda:
kubectl apply -f internal-lb-service.yaml
Men-deploy Layanan LoadBalancer eksternal
Untuk mengekspos Deployment web-app ke klien eksternal, buat Layanan
LoadBalancer eksternal.
Simpan manifes berikut sebagai
external-lb-service.yaml:apiVersion: v1 kind: Service metadata: name: web-app-external-lb namespace: default annotations: cloud.google.com/l4-rbs: "enabled" spec: externalTrafficPolicy: Local ports: - port: 80 protocol: TCP targetPort: 8080 selector: networking.gke.io/network: dmz app: web-app type: LoadBalancerManifes ini membuat Layanan dengan properti berikut:
cloud.google.com/l4-rbs: "enabled": menentukan Load Balancer Jaringan passthrough eksternal berbasis layanan backend.selector: memilih Pod dengan labelapp: web-appyang terhubung ke jaringandmz.
Terapkan manifes ke cluster Anda:
kubectl apply -f external-lb-service.yaml
Memverifikasi Layanan
Setelah men-deploy Layanan, pastikan load balancer dibuat dan dikonfigurasi dengan benar.
Periksa status Layanan:
kubectl get servicesOutputnya mirip dengan hal berikut ini:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web-app-external-lb LoadBalancer 10.8.47.77 35.239.57.231 80:31550/TCP 5m web-app-internal-lb LoadBalancer 10.8.43.251 172.16.0.43 80:32628/TCP 6m kubernetes ClusterIP 10.8.32.1 <none> 443/TCP 43hAlamat
EXTERNAL-IPuntuk load balancer internal termasuk dalam jaringandmz.Buat daftar aturan penerusan di project Anda:
gcloud compute forwarding-rules listOutputnya mirip dengan hal berikut ini:
NAME REGION IP_ADDRESS IP_PROTOCOL TARGET af901673cc0f24907a6aa8c3ce4afc21 us-central1 35.239.57.231 TCP us-central1/backendServices/k8s2-xhvzqabw-default-web-app-external-lb-u4xbs4ot k8s2-tcp-xhvzqabw-default-web-app-internal-lb-vp1x1d6a us-central1 172.16.0.43 TCP us-central1/backendServices/k8s2-xhvzqabw-default-web-app-internal-lb-vp1x1d6aJelaskan aturan penerusan untuk load balancer internal guna memverifikasi bahwa aturan tersebut terpasang ke jaringan yang benar:
gcloud compute forwarding-rules describe k8s2-tcp-xhvzqabw-default-web-app-internal-lb-vp1x1d6a --region=$REGIONGanti
REGIONdengan region cluster Anda.Outputnya mirip dengan yang berikut ini. Pastikan kolom
networkdansubnetworkcocok dengan detail jaringandmz.IPAddress: 172.16.0.43 IPProtocol: TCP ... loadBalancingScheme: INTERNAL name: k8s2-tcp-xhvzqabw-default-web-app-internal-lb-vp1x1d6a network: https://www.googleapis.com/compute/v1/projects/projectId/global/networks/dmz-vpc ... subnetwork: https://www.googleapis.com/compute/v1/projects/projectId/regions/us-central1/subnetworks/dmz-subnet
Menguji load balancer
Untuk menguji load balancer eksternal, kirim permintaan ke alamat IP eksternalnya:
curl EXTERNAL_LB_IP:80Ganti
EXTERNAL_LB_IPdengan alamat IP eksternal Layananweb-app-external-lb.Untuk menguji load balancer internal, kirim permintaan dari host di VPC yang sama dengan load balancer:
curl INTERNAL_LB_IP:80Ganti
INTERNAL_LB_IPdengan alamat IP Layananweb-app-internal-lb.
Pemecahan masalah
Bagian ini menjelaskan cara memecahkan masalah terkait load balancer multi-jaringan.
Pembuatan load balancer gagal
Jika pembuatan load balancer gagal, periksa peristiwa Layanan untuk melihat pesan error:
kubectl describe service SERVICE_NAME
Ganti SERVICE_NAME dengan nama Layanan Anda.
Pesan error seperti network some-other-network does not exist menunjukkan bahwa jaringan yang ditentukan dalam pemilih Layanan tidak ditentukan di cluster.
Pastikan jaringan ada:
kubectl get networks
Jika jaringan ada, pastikan objek Network mereferensikan resource GKENetworkParamSet yang valid dengan benar. Untuk memeriksa error konfigurasi, periksa status resource Network:
kubectl get networks NETWORK_NAME -o yaml
Ganti NETWORK_NAME dengan nama jaringan Anda.
Dalam konfigurasi yang valid, kondisi ParamsReady dan Ready adalah
True. Jika ParamsReady bukan True, pastikan parametersRef dalam spesifikasi
Network cocok dengan nama, jenis, dan grup resource GKENetworkParamSet yang ada.
Jika resource Network sudah benar, tetapi masih belum siap, periksa status
GKENetworkParamSet yang dirujuk untuk mengetahui apakah ada error, seperti subnet yang tidak ada:
kubectl get gkenetworkparamsets GNP_NAME -o yaml
Ganti GNP_NAME dengan nama GKENetworkParamSet Anda.
Load balancer tidak memiliki backend
Jika load balancer disediakan, tetapi tidak memiliki backend yang berfungsi dengan baik, lakukan hal berikut:
- Pastikan bahwa ada node pool dengan antarmuka jaringan di jaringan yang digunakan Layanan.
- Verifikasi bahwa Pod yang dipilih oleh Layanan sedang berjalan.
Periksa endpoint untuk Layanan:
kubectl describe endpointslice -l kubernetes.io/service-name=SERVICE_NAMEPengontrol
multinet-endpointslice-controller.gke.iomembuat endpoint multi-jaringan. Alamat IP Pod yang tercantum di EndpointSlice adalah milik jaringan yang digunakan Layanan. Jika EndpointSlice tidak memiliki endpoint, pastikan label pemilih Layanan cocok dengan Pod yang sedang berjalan dan pemilih jaringan cocok dengan jaringan Pod.
Langkah berikutnya
- Pelajari dukungan multi-jaringan untuk Pod.
- Pelajari Layanan multi-jaringan.