Men-deploy Layanan LoadBalancer multi-jaringan

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: Cluster tidak didukung.
  • Layanan yang menargetkan Pod hostNetwork tidak 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:

  1. Ikuti langkah-langkah di Menyiapkan dukungan multi-jaringan untuk Pod guna menyiapkan jaringan VPC dan membuat cluster GKE dengan jaringan tambahan.
  2. Pastikan cluster Anda telah mengaktifkan subsetelan untuk Load Balancer Internal Layer 4. Untuk mengaktifkan fitur ini, gunakan flag --enable-l4-ilb-subsetting saat Anda membuat atau mengupdate cluster.
  3. 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.

  1. 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: 8080
    

    Manifes ini membuat Deployment bernama web-app dengan tiga Pod. Pod memiliki dua antarmuka: eth0 yang terhubung ke jaringan default dan eth1 yang terhubung ke jaringan dmz. Anotasi networking.gke.io/default-interface menetapkan eth1 sebagai antarmuka default untuk Pod.

  2. 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.

  1. 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: LoadBalancer
    

    Manifes ini membuat Layanan dengan properti berikut:

    • networking.gke.io/load-balancer-type: "Internal": Menentukan Load Balancer Jaringan passthrough internal.
    • selector: Memilih Pod dengan label app: web-app yang terhubung ke jaringan dmz.
  2. 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.

  1. 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: LoadBalancer
    

    Manifes 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 label app: web-app yang terhubung ke jaringan dmz.
  2. 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.

  1. Periksa status Layanan:

    kubectl get services
    

    Outputnya 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        43h
    

    Alamat EXTERNAL-IP untuk load balancer internal termasuk dalam jaringan dmz.

  2. Buat daftar aturan penerusan di project Anda:

    gcloud compute forwarding-rules list
    

    Outputnya 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-vp1x1d6a
    
  3. Jelaskan 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=$REGION
    

    Ganti REGION dengan region cluster Anda.

    Outputnya mirip dengan yang berikut ini. Pastikan kolom network dan subnetwork cocok dengan detail jaringan dmz.

    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

  1. Untuk menguji load balancer eksternal, kirim permintaan ke alamat IP eksternalnya:

    curl EXTERNAL_LB_IP:80
    

    Ganti EXTERNAL_LB_IP dengan alamat IP eksternal Layanan web-app-external-lb.

  2. Untuk menguji load balancer internal, kirim permintaan dari host di VPC yang sama dengan load balancer:

    curl INTERNAL_LB_IP:80
    

    Ganti INTERNAL_LB_IP dengan alamat IP Layanan web-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:

  1. Pastikan bahwa ada node pool dengan antarmuka jaringan di jaringan yang digunakan Layanan.
  2. Verifikasi bahwa Pod yang dipilih oleh Layanan sedang berjalan.
  3. Periksa endpoint untuk Layanan:

    kubectl describe endpointslice -l kubernetes.io/service-name=SERVICE_NAME
    

    Pengontrol multinet-endpointslice-controller.gke.io membuat 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