Load balancing paket dengan MetalLB

Dokumen ini menunjukkan cara mengonfigurasi GKE di VMware untuk menggunakan load balancing yang dipaketkan dengan load balancer MetalLB.

Di GKE di VMware, 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 (Klik untuk memperbesar)

Diagram sebelumnya menunjukkan deployment MetalLB. MetalLB berjalan langsung pada 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

Contoh file konfigurasi cluster admin berikut menunjukkan konfigurasi yang terlihat dalam diagram sebelumnya tentang:

  • Load balancer MetalLB

  • VIP di MetalLB untuk server Kubernetes API dan add-on cluster admin

network:
  hostConfig:
  ...

  ipMode:
    type: "static"
    ipBlockFilePath: "config-folder/admin-cluster-ipblock.yaml"
...

loadBalancer:
  kind: "MetalLB"
  ...

  vips:
    controlPlaneVIP: "172.16.20.100"
    addonsVIP: "172.16.20.101"

admin-cluster-ipblock.yaml

Contoh file blok IP berikut menunjukkan penetapan alamat IP untuk node di cluster admin. Ini juga mencakup alamat node bidang kontrol untuk cluster pengguna dan alamat IP yang akan digunakan selama upgrade cluster.

blocks:
- netmask: "255.255.255.0"
  gateway: "17.16.20.1"
  ips:
  - ip: 172.16.20.50
    hostname: admin-vm-1
  - ip: 172.16.20.51
    hostname: admin-vm-2
  - ip: 172.16.20.52
    hostname: admin-vm-3
  - ip: 172.16.20.53
    hostname: admin-vm-4
  - ip: 172.16.20.54
    hostname: admin-vm-5

user-cluster.yaml

Contoh file konfigurasi cluster pengguna berikut ini menunjukkan konfigurasi:

  • Kumpulan alamat untuk pengontrol MetalLB yang dapat dipilih dan ditetapkan ke Layanan jenis LoadBalancer. VIP ingress ada di salah satu kumpulan ini.

  • VIP yang ditetapkan untuk server Kubernetes API cluster pengguna, dan VIP ingress yang telah Anda pilih untuk dikonfigurasi untuk proxy ingress. VIP server Kubernetes API berada di subnet cluster admin karena bidang kontrol untuk cluster pengguna berjalan pada node di cluster admin.

  • Kumpulan node yang diaktifkan untuk menggunakan MetalLB. MetalLB akan di-deploy pada node di cluster pengguna yang termasuk dalam kumpulan node tersebut.

network:
  hostConfig:
  ...

  ipMode:
    type: "static"
    ipBlockFilePath: "config-folder/user-cluster-ipblock.yaml"
...

loadBalancer:
  kind: MetalLB
  metalLB:
    addressPools:
    - name: "address-pool-1"
      addresses:
      - "172.16.40.100/32"
      - "172.16.40.101-172.16.40.112
      avoidBuggyIPs: true
  ...

  vips:
    controlPlaneVIP: "172.16.20.102"
    ingressVIP: "172.16.40.102"
...

nodePools:
- name: "node-pool-1"
  cpus: 4
  memoryMB: 8192
  replicas: 3
  enableLoadBalancer: true

Konfigurasi dalam contoh sebelumnya menetapkan kumpulan alamat 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 di cluster pengguna. Ini termasuk alamat IP yang akan digunakan selama upgrade cluster.

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

Menyiapkan MetalLB

Buka port firewall

MetalLB menggunakan library daftar anggota 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 pada semua node load-balancer.

Mengaktifkan MetalLB untuk cluster admin baru

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

loadBalancer:
  kind: "MetalLB"

Isi file konfigurasi cluster admin Anda yang lain, lalu buat cluster admin seperti yang dijelaskan dalam Membuat cluster admin.

Menentukan kumpulan alamat

Pengontrol MetalLB melakukan pengelolaan alamat IP untuk Layanan. Jadi, saat developer aplikasi membuat Layanan jenis LoadBalancer di cluster pengguna, mereka tidak perlu menentukan alamat IP untuk Layanan secara manual. Sebagai gantinya, pengontrol MetalLB memilih alamat IP dari kumpulan alamat yang Anda tentukan saat waktu pembuatan cluster.

Pikirkan tentang berapa banyak Layanan jenis LoadBalancer yang kemungkinan akan aktif di cluster pengguna Anda pada waktu tertentu. Kemudian, di bagian loadBalancer.metalLB.addressPools pada file konfigurasi cluster pengguna Anda, tentukan alamat IP yang cukup untuk mengakomodasi Layanan tersebut.

VIP masuk untuk cluster pengguna harus termasuk dalam alamat yang Anda tentukan dalam kumpulan alamat. Hal ini karena proxy masuk terekspos oleh Layanan jenis LoadBalancer.

Jika developer aplikasi Anda tidak perlu membuat Layanan jenis LoadBalancer, Anda tidak perlu menentukan alamat apa pun selain VIP masuk.

Alamat harus dalam format CIDR atau format rentang. Jika Anda ingin menentukan alamat individual, gunakan CIDR /32. Contoh:

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

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

Mengaktifkan MetalLB untuk cluster pengguna baru

Dalam file konfigurasi cluster pengguna:

  • Tetapkan loadBalancer.kind ke "MetalLB".
  • Tentukan satu atau beberapa kumpulan alamat untuk Layanan. VIP ingress harus berada di salah satu kumpulan ini.
  • Tetapkan enableLoadBalancer ke true untuk minimal satu kumpulan node di cluster Anda.

Isi file konfigurasi cluster pengguna Anda yang lain, lalu buat cluster pengguna seperti yang dijelaskan dalam Membuat cluster pengguna.

Penetapan alamat Layanan secara manual

Jika Anda tidak ingin pengontrol MetalLB menetapkan alamat IP secara otomatis dari kumpulan tertentu ke Layanan, tetapkan kolom manualAssign kumpulan ke true. Kemudian, developer dapat membuat Layanan jenis LoadBalancer dan menentukan salah satu alamat 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 berisi bug

Jika Anda menetapkan kolom avoidBuggyIPs kumpulan alamat ke true, pengontrol MetalLB tidak akan menggunakan alamat dari kumpulan yang berakhiran .0 atau .255. Hal ini menghindari masalah perangkat konsumen yang berisi bug yang secara keliru meninggalkan 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 ini 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

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

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

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

Lihat Service:

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

Output menunjukkan alamat IP eksternal yang ditetapkan secara otomatis 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 yang Anda tentukan dalam file konfigurasi cluster pengguna. Misalnya, 192.0.2.2 ada dalam kumpulan alamat ini:

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

Hubungi Layanan:

curl EXTERNAL_IP_ADDRESS:60000

Output menampilkan pesan Hello, world!:

Hello, world!
Version: 2.0.0

Mengupdate MetalLB

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

gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONIFG --config USER_CLUSTER_CONFIG

Pod MetalLB dan ConfigMap

Pengontrol MetalLB berjalan sebagai Deployment, dan speaker MetalLB berjalan sebagai DaemonSet pada node dalam kumpulan yang memiliki enableLoadBalancer yang ditetapkan ke true. Pengontrol MetalLB mengelola alamat IP yang ditetapkan ke Layanan. Pembicara MetalLB memilih 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 di ConfigMap dalam format yang dikenal oleh MetalLB. Jangan mengubah ConfigMap secara langsung. Sebagai gantinya, gunakan gkectl update cluster seperti yang dijelaskan sebelumnya. Untuk melihat ConfigMap untuk pemecahan masalah:

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

Manfaat menggunakan MetalLB

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

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

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

  • Anda dapat berbagi alamat IP di antara berbagai Layanan.

MetalLB dibandingkan 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 hit; koneksi yang ada akan direset selama failover.

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