Load balancing gabungan dengan MetalLB

Dokumen ini menunjukkan cara mengonfigurasi Google Distributed Cloud untuk menggunakan load balancing gabungan dengan load balancer MetalLB. Dokumen ini ditujukan untuk spesialis Jaringan yang mendesain dan membuat arsitektur jaringan untuk organisasi mereka, serta menginstal, mengonfigurasi, dan mendukung peralatan jaringan. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam Google Cloud konten, lihat Peran dan tugas pengguna GKE umum.

Di Google Distributed Cloud, MetalLB berjalan dalam mode layer-2.

Contoh konfigurasi MetalLB

Berikut adalah contoh konfigurasi untuk cluster yang menjalankan load balancer MetalLB:

Konfigurasi load balancer MetalLB.
Konfigurasi load balancer MetalLB

Diagram sebelumnya menunjukkan deployment MetalLB. MetalLB berjalan langsung di node cluster. Dalam contoh ini, cluster admin dan cluster pengguna berada di dua VLAN terpisah, dan setiap cluster berada di subnet terpisah:

Cluster Subnet
Cluster admin 172.16.20.0/24
Cluster pengguna 172.16.40.0/24

admin-cluster.yaml

Bagian berikut dari file konfigurasi cluster admin menunjukkan konfigurasi yang terlihat dalam diagram sebelumnya:

  • Bidang kontrol ketersediaan tinggi

  • Load balancer MetalLB

  • VIP di MetalLB untuk server Kubernetes API cluster admin

network:
  ...
  controlPlaneIPBlock:
    netmask: "255.255.255.0"
    gateway: "172.16.20.1"
    ips:
    - ip: "172.16.20.50"
      hostname: "admin-cp-1"
    - ip: "172.16.20.51"
      hostname: "admin-cp-2"
    - ip: "172.16.20.52"
      hostname: "admin-cp-3"
loadBalancer:
  kind: "MetalLB"
  ...
  vips:
    controlPlaneVIP: "172.16.20.100"
...
adminMaster:
  cpus: 4
  memoryMB: 16384
  replicas: 3

user-cluster.yaml

Bagian berikut dari file konfigurasi cluster pengguna menunjukkan konfigurasi:

  • Kumpulan alamat IP untuk dipilih dan ditetapkan oleh pengontrol MetalLB ke Layanan jenis LoadBalancer. VIP ingress berada di kumpulan ini.

  • VIP yang ditetapkan untuk server Kubernetes API cluster pengguna, dan VIP ingress yang Anda pilih untuk dikonfigurasi untuk proxy ingress.

  • Node pool yang diaktifkan untuk menggunakan MetalLB. MetalLB akan di-deploy di node dalam node pool ini.

enableControlplaneV2: true
...
network:
  hostConfig:
  ...

  ipMode:
    type: "static"
    ipBlockFilePath: "config-folder/user-cluster-ipblock.yaml"
...
  controlPlaneIPBlock:
    netmask: "255.255.255.0"
    gateway: "172.16.40.1"
    ips:
    - ip: "172.16.40.21"
      hostname: "user-cp"
loadBalancer:
  kind: MetalLB
  metalLB:
    addressPools:
    - name: "address-pool-1"
      addresses:
      - "172.16.40.101-172.16.40.112
      avoidBuggyIPs: true
  ...

  vips:
    controlPlaneVIP: "172.16.20.100"
    ingressVIP: "172.16.40.101"
...
nodePools:
- name: "node-pool-1"
  cpus: 4
  memoryMB: 8192
  replicas: 3
  enableLoadBalancer: true

Konfigurasi dalam contoh sebelumnya menentukan kumpulan alamat IP yang tersedia untuk Layanan. Saat developer aplikasi membuat Layanan jenis LoadBalancer di cluster pengguna, pengontrol MetalLB akan memilih alamat IP dari kumpulan ini.

user-cluster-ipblock.yaml

Contoh file blok IP berikut menunjukkan penetapan alamat IP untuk node pekerja di cluster pengguna. Hal ini mencakup alamat IP tambahan yang akan digunakan selama upgrade, update, dan perbaikan otomatis cluster.

blocks:
- netmask: "255.255.255.0"
  gateway: "17.16.40.1"
  ips:
  - ip: 172.16.40.22
    hostname: user-vm-1
  - ip: 172.16.40.23
    hostname: user-vm-2
  - ip: 172.16.40.24
    hostname: user-vm-3
  - ip: 172.16.40.25
    hostname: user-vm-4
  - ip: 172.16.40.26
    hostname: user-vm-5
  - ip: 172.16.40.27
    hostname: user-vm-6

Menyiapkan MetalLB

Membuka port firewall

MetalLB uses the library memberlist Go untuk melakukan pemilihan pemimpin. Library memberlist menggunakan port TCP 7946 dan port UDP 7946 untuk bertukar informasi. Pastikan port tersebut dapat diakses untuk traffic masuk dan keluar di semua node load balancer.

Mengaktifkan MetalLB untuk cluster admin baru

Di file konfigurasi cluster admin, tetapkan loadBalancer.kind ke "MetalLB".

loadBalancer:
  kind: "MetalLB"

Isi bagian lainnya dari file konfigurasi cluster admin, dan buat cluster admin seperti yang dijelaskan dalam Membuat cluster admin.

Menentukan kumpulan alamat IP

Pengontrol MetalLB menetapkan alamat IP untuk Layanan. Saat developer aplikasi membuat Layanan jenis LoadBalancer di cluster pengguna, pengontrol MetalLB akan otomatis menetapkan alamat IP untuk Layanan. Pengontrol MetalLB memilih alamat IP dari kumpulan alamat IP yang Anda tentukan.

Untuk memastikan cluster pengguna memiliki alamat IP yang cukup, pertimbangkan jumlah maksimum Layanan LoadBalancer yang kemungkinan akan aktif. Kemudian, tentukan alamat IP yang cukup di loadBalancer.metalLB.addressPools bagian dari file konfigurasi cluster pengguna.

Alamat IP dalam kumpulan harus dalam format CIDR atau format rentang. Untuk menentukan alamat IP individual, gunakan CIDR /32. Contoh:

addresses:
  -   "192.0.2.0/26"
  -   "192.0.2.64-192.0.2.72"
  -   "192.0.2.75/32"

Mengecualikan alamat IP yang digunakan untuk tujuan lain

Jangan sertakan alamat IP berikut di kumpulan alamat IP mana pun:

Jika perlu menyesuaikan alamat IP dalam kumpulan setelah cluster dibuat, Anda dapat menggunakan gkectl update cluster. Untuk mengetahui informasi selengkapnya, lihat Memperbarui MetalLB.

Mengaktifkan MetalLB untuk cluster pengguna baru

Di file konfigurasi cluster pengguna :

  • Tetapkan loadBalancer.kind ke "MetalLB".
  • Tentukan satu atau beberapa kumpulan alamat IP untuk Layanan. VIP ingress harus berada di salah satu kumpulan ini.
  • Tetapkan enableLoadBalancer ke true untuk setidaknya satu node pool di cluster Anda. Jika ditetapkan ke true, kolom ini memungkinkan speaker MetalLB berjalan di node dalam kumpulan. Perhatikan bahwa versi node pool load balancer harus cocok dengan versi cluster selama upgrade; versi yang tidak cocok tidak didukung untuk node pool load balancer.

    Perhatikan perbedaan berikut dalam perilaku kolom enableLoadBalancer saat enableAdvancedCluster ditetapkan ke true (cluster lanjutan diaktifkan): Di versi 1.31 saat cluster lanjutan diaktifkan, kolom ini tidak berpengaruh karena speaker MetalLB selalu berjalan di node bidang kontrol cluster pengguna. Di versi 1.32 saat cluster lanjutan diaktifkan, batasan ini telah dihapus, dan Anda harus menentukan setidaknya satu node pool tempat speaker MetalLB berjalan.

Isi bagian lainnya dari file konfigurasi cluster pengguna, dan buat cluster pengguna seperti yang dijelaskan dalam Membuat cluster pengguna.

Penetapan alamat Layanan secara manual

Jika Anda tidak ingin pengontrol MetalLB otomatis menetapkan alamat IP dari kumpulan tertentu ke Layanan, tetapkan kolom manualAssign kumpulan ke true. Kemudian, developer dapat membuat Layanan jenis LoadBalancer dan menentukan salah satu alamat IP dari kumpulan secara manual. Contoh:

loadBalancer:
  metalLB:
    addressPools:
    - name: "my-address-pool-2"
      addresses:
      - "192.0.2.73-192.0.2.80"
      manualAssign: true

Menghindari alamat IP yang bermasalah

Jika Anda menetapkan kolom avoidBuggyIPs kumpulan alamat IP ke true, pengontrol MetalLB tidak akan menggunakan alamat IP dari kumpulan yang diakhiri dengan .0 atau .255. Hal ini menghindari masalah perangkat konsumen yang bermasalah dan secara keliru menghilangkan traffic yang dikirim ke alamat IP khusus tersebut. Contoh:

loadBalancer:
  metalLB:
    addressPools:
    - name: "my-address-pool-1"
      addresses:
      - "192.0.2.0/24"
      avoidBuggyIPs: true

Membuat Layanan jenis LoadBalancer

Berikut adalah dua manifes: satu untuk Deployment dan satu untuk Layanan:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      greeting: hello
  replicas: 3
  template:
    metadata:
      labels:
        greeting: hello
    spec:
      containers:
      - name: hello
        image: gcr.io/google-samples/hello-app:2.0
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  selector:
    greeting: hello
  ports:
  - name: metal-lb-example-port
    protocol: TCP
    port: 60000
    targetPort: 8080

Perhatikan bahwa manifes Layanan tidak menentukan alamat IP eksternal. Pengontrol MetalLB akan memilih alamat IP eksternal dari kumpulan alamat IP yang Anda tentukan dalam file konfigurasi cluster pengguna.

Simpan manifes dalam file bernama my-dep-svc.yaml. Kemudian, buat objek Deployment dan Layanan:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-dep-svc.yaml

Lihat Layanan:

kubectl --kubeconfig USER_CLUSTER_KUBECONIFG get service my-service --output wide

Output menunjukkan alamat IP eksternal yang otomatis ditetapkan ke Layanan. Contoh:

NAME         TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)           AGE   SELECTOR
my-service   LoadBalancer   10.96.2.166   192.0.2.2   60000:31914/TCP   28s

Pastikan alamat IP eksternal yang ditetapkan diambil dari kumpulan alamat IP yang Anda tentukan dalam file konfigurasi cluster pengguna. Misalnya, 192.0.2.2 berada di kumpulan alamat IP ini:

metalLB:
  addressPools:
  - name: "address-pool-1"
    addresses:
     - "192.0.2.0/24"
     - "198.51.100.1-198.51.100.3"

Panggil Layanan:

curl EXTERNAL_IP_ADDRESS:60000

Output menampilkan pesan Hello, world!:

Hello, world!
Version: 2.0.0

Memperbarui MetalLB

Setelah membuat cluster, Anda dapat memperbarui kumpulan alamat IP MetalLB dan kolom enableLoadBalancer di node pool. Buat perubahan yang diinginkan di file konfigurasi cluster pengguna, lalu panggil gkectl update cluster:

gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG

Pod dan ConfigMap MetalLB

Pengontrol MetalLB berjalan sebagai Deployment, dan speaker MetalLB berjalan sebagai DaemonSet di node dalam kumpulan yang memiliki enableLoadBalancer yang ditetapkan ke true. Pengontrol MetalLB mengelola alamat IP yang ditetapkan ke Layanan. Speaker MetalLB melakukan pemilihan pemimpin dan mengumumkan VIP Layanan.

Lihat semua Pod MetalLB:

kubectl --kubeconfig USER_CLUSTER_KUBECONIFG get pods --namespace kube-system --selector app=metallb

Anda dapat menggunakan log dari Pod MetalLB untuk memecahkan masalah.

Konfigurasi MetalLB disimpan dalam ConfigMap dalam format yang dikenal oleh MetalLB. Jangan ubah ConfigMap secara langsung. Sebagai gantinya, gunakan gkectl update cluster seperti yang dijelaskan sebelumnya. Untuk melihat ConfigMap guna memecahkan masalah:

kubectl --kubeconfig USER_CLUSTER_KUBECONIFG get configmap metallb-config --namespace kube-system

Manfaat menggunakan MetalLB

  • MetalLB berjalan langsung di node cluster Anda, sehingga tidak memerlukan VM tambahan.

  • Pengontrol MetalLB melakukan pengelolaan alamat IP untuk Layanan, sehingga Anda tidak perlu memilih alamat IP untuk setiap Layanan secara manual.

  • Instance MetalLB aktif untuk berbagai Layanan dapat berjalan di node yang berbeda.

  • Anda dapat membagikan alamat IP di antara berbagai Layanan.

Perbandingan MetalLB dengan F5 BIG-IP dan Seesaw

  • VIP harus berada di subnet yang sama dengan node cluster. Hal ini juga merupakan persyaratan untuk Seesaw, tetapi tidak untuk F5 BIG-IP.

  • Tidak ada metrik untuk traffic.

  • Tidak ada failover tanpa gangguan; koneksi yang ada akan direset selama failover.

  • Traffic eksternal ke Pod Layanan tertentu melewati satu node yang menjalankan speaker MetalLB. Artinya, alamat IP klien biasanya tidak terlihat oleh container yang berjalan di Pod.

  • Cisco Application Centric Infrastructure (ACI) dengan Dataplane IP Learning tidak kompatibel dengan load balancer Seesaw dan MetalLB. Sebaiknya gunakan load balancing manual, atau nonaktifkan Dataplane IP Learning saat menggunakan Seesaw atau MetalLB sebagai load balancer. Selain itu, Seesaw berada dalam mode pemeliharaan. Mulai Google Distributed Cloud versi 1.32, upgrade diblokir untuk cluster yang menggunakan Seesaw. Anda harus memigrasikan cluster ke fitur yang direkomendasikan sebelum mengupgrade ke 1.32.