Belajar Flannel - Integrasi dengan CNI Plugins
Episode 11 of 23

Belajar Flannel - Integrasi dengan CNI Plugins

Episode ini membedah peran plugin CNI di balik Flannel: bridge, portmap, bandwidth, dan plugin flannel di /opt/cni/bin, isi konfigurasi 10-flannel.conflist, serta integrasi Flannel dengan Multus untuk menghadirkan multiple network interfaces pada satu Pod.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Flannel bukan satu program yang melakukan segalanya. Di belakang layar ada kumpulan plugin CNI yang bekerja sama, masing-masing dengan satu tanggung jawab. Episode ini membuka lemari itu.

Kita akan membedah peran bridge, portmap, bandwidth, dan plugin flannel, membaca konfigurasi 10-flannel.conflist, lalu menjelajahi integrasi dengan Multus untuk menghadirkan beberapa interface jaringan pada satu Pod.

Peran Plugin CNI

Empat Plugin Inti

Setiap Pod yang dibuat Flannel melewati rantai plugin ini:

  • flannel: plugin utama yang membaca subnet.env dan menentukan konfigurasi jaringan.
  • bridge: membuat bridge cni0 dan menghubungkan veth Pod ke bridge tersebut.
  • portmap: menerjemahkan port yang di-expose Pod ke IP host untuk akses dari luar.
  • bandwidth: menegakkan limit bandwidth per Pod lewat token bucket.
Cek plugin CNI terpasang
ls -la /opt/cni/bin/

Output dari ls /opt/cni/bin/ menampilkan binary plugin seperti bridge, portmap, bandwidth, flannel, dan lainnya. Semua binary ini disediakan oleh containernetworking/plugins dan di-mount ke node oleh DaemonSet Flannel.

Direktori /opt/cni/bin

Kubelet memanggil plugin lewat nama binary di direktori ini. Jika salah satu binary hilang, pembuatan Pod yang butuh plugin tersebut akan gagal. Inilah alasan DaemonSet Flannel memastikan semua binary tersedia di setiap node setiap kali DaemonSet di-deploy.

Konfigurasi CNI Flannel

Membaca 10-flannel.conflist

File konfigurasi CNI untuk Flannel bernama 10-flannel.conflist dan berada di /etc/cni/net.d. Kubelet memakai file ini sebagai definisi jaringan Pod:

10-flannel.conflist
{
  "name": "flannel",
  "cniVersion": "0.3.1",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}

Blok pertama memakai plugin flannel yang mendelegasikan pembuatan bridge ke plugin bridge. Blok kedua menambahkan portmap untuk meneruskan port Pod.

Baca konfigurasi CNI di node
cat /etc/cni/net.d/10-flannel.conflist

Perintah cat /etc/cni/net.d/10-flannel.conflist menampilkan file yang sama di node. Kalian bisa melihat kubelet memakai konfigurasi ini setiap kali Pod baru dibuat.

Urutan Plugin Penting

Urutan plugin di conflist menentukan urutan eksekusi saat Pod dibuat dan dibuang. Saat dibuang, urutan dibalik. Ini penting dipahami saat memodifikasi conflist: jangan sampai portmap dieksekusi sebelum jaringan utama terbentuk.

Integrasi dengan Multus

Kapan Butuh Multus

Defaultnya sebuah Pod punya satu interface jaringan utama. Kasus seperti DPDK, SR-IOV, atau aplikasi yang butuh beberapa network sekaligus memerlukan lebih dari satu interface. Multus menjembatani ini dengan memungkinkan Pod meng-attach beberapa network sekunder di atas network utama.

NetworkAttachmentDefinition untuk Flannel

Flannel sebagai network utama bisa dikombinasikan dengan Multus melalui NetworkAttachmentDefinition:

NetworkAttachmentDefinition Multus
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: flannel-net
spec:
  config: '{
    "cniVersion": "0.3.1",
    "type": "flannel",
    "delegate": {
      "isDefaultGateway": true
    }
  }'

Definisi di atas membuat network flannel-net yang bisa di-attach ke Pod. Annotation pada Pod memilih network yang mana:

Pod dengan dua network
apiVersion: v1
kind: Pod
metadata:
  name: multi-net-pod
  annotations:
    k8s.v1.cni.cncf.io/networks: flannel-net
spec:
  containers:
    - name: app
      image: busybox

Perhatikan pola ini: network utama tetap ditangani kubelet, sementara network tambahan dikelola Multus berdasarkan annotation.

Pertimbangan Arsitektur

Menambah Multus menambah kompleksitas operasional. Pastikan kebutuhan multiple networks benar-benar ada sebelum menambahkan lapisan ini. Untuk mayoritas workload, satu network Flannel sudah lebih dari cukup.

Troubleshooting Plugin

Pod Gagal Dibuat

Gejala paling umum saat plugin bermasalah: Pod stuck di status ContainerCreating. Periksa event-nya:

Cek event Pod
kubectl describe pod <nama-pod> | tail -20

Output dari kubectl describe pod menunjukkan error CNI secara spesifik, misalnya plugin bridge tidak ditemukan atau portmap gagal dimuat. Dari pesan itu, kalian bisa tahu plugin mana yang perlu dicek.

Plugin Tidak Terpasang

Jika error menyebut binary yang tidak ada, periksa direktori CNI di node:

Cek ketersediaan plugin
kubectl -n kube-flannel get pods -l k8s-app=flannel -o wide

Pod kube-flannel yang sehat memastikan plugin tersedia di node. Restart DaemonSet biasanya memperbaiki node yang kehilangan binary karena update image.

Penutup

Episode 11 membuka kotak plugin CNI di balik Flannel: peran bridge, portmap, dan bandwidth, isi 10-flannel.conflist, serta integrasi dengan Multus untuk multiple networks.

Inti yang harus dibawa pulang:

  • plugin flannel mendelegasikan pembuatan bridge ke plugin bridge.
  • portmap dan bandwidth melengkapi akses dan pembatasan bandwidth Pod.
  • Semua plugin berada di /opt/cni/bin dan di-mount oleh DaemonSet.
  • 10-flannel.conflist mendefinisikan rantai plugin untuk setiap Pod.
  • Multus memungkinkan multiple network interfaces pada satu Pod.
  • Pod stuck di ContainerCreating biasanya menandakan masalah plugin CNI.

Di episode 12 selanjutnya kita akan memantau kesehatan Flannel: observability dan monitoring dasar — membaca log flanneld, metrik seperti subnet allocations dan healthcheck, serta inspeksi route table, interface VXLAN, dan tabel ARP/FDB.

Belajar Flannel - Integrasi dengan CNI Plugins | Belajar Flannel