This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Ekstensi Komputasi, Penyimpanan, dan Jaringan

1 - Plugin Jaringan

FEATURE STATE: Kubernetes v1.25 [alpha]

Plugin jaringan di Kubernetes hadir dalam beberapa varian:

  • Plugin CNI : mengikuti spesifikasi appc / CNI, yang dirancang untuk interoperabilitas.
  • Plugin Kubenet : mengimplementasi cbr0 sederhana menggunakan plugin bridge dan host-local CNI

Instalasi

Kubelet memiliki plugin jaringan bawaan tunggal, dan jaringan bawaan umum untuk seluruh kluster. Plugin ini memeriksa plugin-plugin ketika dijalankan, mengingat apa yang ditemukannya, dan mengeksekusi plugin yang dipilih pada waktu yang tepat dalam siklus pod (ini hanya berlaku untuk Docker, karena rkt mengelola plugin CNI sendiri). Ada dua parameter perintah Kubelet yang perlu diingat saat menggunakan plugin:

  • cni-bin-dir: Kubelet memeriksa direktori ini untuk plugin-plugin saat startup
  • network-plugin: Plugin jaringan untuk digunakan dari cni-bin-dir. Ini harus cocok dengan nama yang dilaporkan oleh plugin yang diperiksa dari direktori plugin. Untuk plugin CNI, ini (nilainya) hanyalah "cni".

Persyaratan Plugin Jaringan

Selain menyediakan antarmuka NetworkPlugin untuk mengonfigurasi dan membersihkan jaringan Pod, plugin ini mungkin juga memerlukan dukungan khusus untuk kube-proxy. Proksi iptables jelas tergantung pada iptables, dan plugin ini mungkin perlu memastikan bahwa lalu lintas kontainer tersedia untuk iptables. Misalnya, jika plugin menghubungkan kontainer ke bridge Linux, plugin harus mengatur nilai sysctl net/bridge/bridge-nf-call-iptables menjadi 1 untuk memastikan bahwa proksi iptables berfungsi dengan benar. Jika plugin ini tidak menggunakan bridge Linux (melainkan sesuatu seperti Open vSwitch atau mekanisme lainnya), plugin ini harus memastikan lalu lintas kontainer dialihkan secara tepat untuk proksi.

Secara bawaan jika tidak ada plugin jaringan Kubelet yang ditentukan, plugin noop digunakan, yang menetapkan net/bridge/bridge-nf-call-iptables=1 untuk memastikan konfigurasi sederhana (seperti Docker dengan sebuah bridge) bekerja dengan benar dengan proksi iptables.

CNI

Plugin CNI dipilih dengan memberikan opsi command-line --network-plugin=cni pada Kubelet. Kubelet membaca berkas dari --cni-conf-dir (bawaan /etc/cni/net.d) dan menggunakan konfigurasi CNI dari berkas tersebut untuk mengatur setiap jaringan Pod. Berkas konfigurasi CNI harus sesuai dengan spesifikasi CNI, dan setiap plugin CNI yang diperlukan oleh konfigurasi harus ada di --cni-bin-dir (nilai bawaannya adalah /opt/cni/bin).

Jika ada beberapa berkas konfigurasi CNI dalam direktori, Kubelet menggunakan berkas yang pertama dalam urutan abjad.

Selain plugin CNI yang ditentukan oleh berkas konfigurasi, Kubernetes memerlukan plugin CNI standar lo plugin , minimal pada versi 0.2.0.

Dukungan hostPort

Plugin jaringan CNI mendukung hostPort. Kamu dapat menggunakan plugin portmap resmi yang ditawarkan oleh tim plugin CNI atau menggunakan plugin kamu sendiri dengan fungsionalitas portMapping.

Jika kamu ingin mengaktifkan dukungan hostPort, kamu harus menentukan portMappings capability di cni-conf-dir kamu. Contoh:

{
  "name": "k8s-pod-network",
  "cniVersion": "0.4.0",
  "plugins": [
    {
      "type": "calico",
      "log_level": "info",
      "datastore_type": "kubernetes",
      "nodename": "127.0.0.1",
      "ipam": {
        "type": "host-local",
        "subnet": "usePodCidr"
      },
      "policy": {
        "type": "k8s"
      },
      "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
      }
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true}
    }
  ]
}

Dukungan pembentukan lalu-lintas

Plugin jaringan CNI juga mendukung pembentukan lalu-lintas yang masuk dan keluar dari Pod. Kamu dapat menggunakan plugin resmi bandwidth yang ditawarkan oleh tim plugin CNI atau menggunakan plugin kamu sendiri dengan fungsionalitas kontrol bandwidth.

Jika kamu ingin mengaktifkan pembentukan lalu-lintas, kamu harus menambahkan plugin bandwidth ke berkas konfigurasi CNI kamu (nilai bawaannya adalah /etc/cni/ net.d).

{
  "name": "k8s-pod-network",
  "cniVersion": "0.4.0",
  "plugins": [
    {
      "type": "calico",
      "log_level": "info",
      "datastore_type": "kubernetes",
      "nodename": "127.0.0.1",
      "ipam": {
        "type": "host-local",
        "subnet": "usePodCidr"
      },
      "policy": {
        "type": "k8s"
      },
      "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
      }
    },
    {
      "type": "bandwidth",
      "capabilities": {"bandwidth": true}
    }
  ]
}

Sekarang kamu dapat menambahkan anotasi kubernetes.io/ingress-bandwidth dan kubernetes.io/egress-bandwidth ke Pod kamu. Contoh:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/ingress-bandwidth: 1M
    kubernetes.io/egress-bandwidth: 1M
...

Kubenet

Kubenet adalah plugin jaringan yang sangat mendasar dan sederhana, hanya untuk Linux. Ia, tidak dengan sendirinya, mengimplementasi fitur-fitur yang lebih canggih seperti jaringan cross-node atau kebijakan jaringan. Ia biasanya digunakan bersamaan dengan penyedia layanan cloud yang menetapkan aturan routing untuk komunikasi antar Node, atau dalam lingkungan Node tunggal.

Kubenet membuat bridge Linux bernama cbr0 dan membuat pasangan veth untuk setiap Pod dengan ujung host dari setiap pasangan yang terhubung ke cbr0. Ujung Pod dari pasangan diberi alamat IP yang dialokasikan dari rentang yang ditetapkan untuk Node baik melalui konfigurasi atau oleh controller-manager. cbr0 memiliki MTU yang cocok dengan MTU terkecil dari antarmuka normal yang diaktifkan pada host.

Plugin ini memerlukan beberapa hal:

  • Plugin CNI bridge, lo dan host-local standar diperlukan, minimal pada versi 0.2.0. Kubenet pertama-tama akan mencari mereka di /opt/cni/bin. Tentukan cni-bin-dir untuk menyediakan lokasi pencarian tambahan. Hasil pencarian pertama akan digunakan.
  • Kubelet harus dijalankan dengan argumen --network-plugin=kubenet untuk mengaktifkan plugin
  • Kubelet juga harus dijalankan dengan argumen --non-masquerade-cidr=<clusterCidr> untuk memastikan lalu-lintas ke IP-IP di luar rentang ini akan menggunakan masquerade IP.
  • Node harus diberi subnet IP melalui perintah kubelet --pod-cidr atau perintah controller-manager --allocate-node-cidrs=true --cluster-cidr=<cidr>.

Menyesuaikan MTU (dengan kubenet)

MTU harus selalu dikonfigurasi dengan benar untuk mendapatkan kinerja jaringan terbaik. Plugin jaringan biasanya akan mencoba membuatkan MTU yang masuk akal, tetapi terkadang logika tidak akan menghasilkan MTU yang optimal. Misalnya, jika bridge Docker atau antarmuka lain memiliki MTU kecil, kubenet saat ini akan memilih MTU tersebut. Atau jika kamu menggunakan enkapsulasi IPSEC, MTU harus dikurangi, dan perhitungan ini di luar cakupan untuk sebagian besar plugin jaringan.

Jika diperlukan, kamu dapat menentukan MTU secara eksplisit dengan opsi network-plugin-mtu kubelet. Sebagai contoh, pada AWS eth0 MTU biasanya adalah 9001, jadi kamu dapat menentukan --network-plugin-mtu=9001. Jika kamu menggunakan IPSEC, kamu dapat menguranginya untuk memungkinkan/mendukung overhead enkapsulasi pada IPSEC, contoh: --network-plugin-mtu=8873.

Opsi ini disediakan untuk plugin jaringan; Saat ini hanya kubenet yang mendukung network-plugin-mtu.

Ringkasan Penggunaan

  • --network-plugin=cni menetapkan bahwa kita menggunakan plugin jaringan cni dengan binary-binary plugin CNI aktual yang terletak di --cni-bin-dir (nilai bawaannya /opt/cni/bin) dan konfigurasi plugin CNI yang terletak di --cni-conf-dir (nilai bawaannya /etc/cni/net.d).
  • --network-plugin=kubenet menentukan bahwa kita menggunakan plugin jaringan kubenet dengan bridge CNI dan plugin-plugin host-local yang terletak di /opt/cni/bin atau cni-bin-dir.
  • --network-plugin-mtu=9001 menentukan MTU yang akan digunakan, saat ini hanya digunakan oleh plugin jaringan kubenet.

Selanjutnya

2 - Plugin Perangkat

Gunakan kerangka kerja plugin perangkat Kubernetes untuk mengimplementasikan plugin untuk GPU, NIC, FPGA, InfiniBand, dan sumber daya sejenis yang membutuhkan setelan spesifik vendor.
FEATURE STATE: Kubernetes v1.10 [beta]

Kubernetes menyediakan kerangka kerja plugin perangkat sehingga kamu dapat memakainya untuk memperlihatkan sumber daya perangkat keras sistem ke dalam Kubelet.

Daripada menkustomisasi kode Kubernetes itu sendiri, vendor dapat mengimplementasikan plugin perangkat yang di-deploy secara manual atau sebagai DaemonSet. Perangkat yang dituju termasuk GPU, NIC berkinerja tinggi, FPGA, adaptor InfiniBand, dan sumber daya komputasi sejenis lainnya yang perlu inisialisasi dan setelan spesifik vendor.

Pendaftaran plugin perangkat

Kubelet mengekspor servis gRPC Registration:

service Registration {
	rpc Register(RegisterRequest) returns (Empty) {}
}

Plugin perangkat bisa mendaftarkan dirinya sendiri dengan kubelet melalui servis gRPC. Dalam pendaftaran, plugin perangkat perlu mengirim:

  • Nama Unix socket-nya.
  • Versi API Plugin Perangkat yang dipakai.
  • ResourceName yang ingin ditunjukkan. ResourceName ini harus mengikuti skema penamaan sumber daya ekstensi sebagai vendor-domain/tipe-sumber-daya. (Contohnya, NVIDIA GPU akan dinamai nvidia.com/gpu.)

Setelah registrasi sukses, plugin perangkat mengirim daftar perangkat yang diatur ke kubelet, lalu kubelet kemudian bertanggung jawab untuk mengumumkan sumber daya tersebut ke peladen API sebagai bagian pembaruan status node kubelet. Contohnya, setelah plugin perangkat mendaftarkan hardware-vendor.example/foo dengan kubelet dan melaporkan kedua perangkat dalam node dalam kondisi sehat, status node diperbarui untuk menunjukkan bahwa node punya 2 perangkat “Foo” terpasang dan tersedia.

Kemudian, pengguna dapat meminta perangkat dalam spesifikasi Kontainer seperti meminta tipe sumber daya lain, dengan batasan berikut:

  • Sumber daya ekstensi hanya didukung sebagai sumber daya integer dan tidak bisa overcommitted.
  • Perangkat tidak bisa dibagikan antar Kontainer.

Semisal klaster Kubernetes menjalankan plugin perangkat yang menunjukkan sumber daya hardware-vendor.example/foo pada node tertentu. Berikut contoh Pod yang meminta sumber daya itu untuk menjalankan demo beban kerja:

---
apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
    - name: demo-container-1
      image: k8s.gcr.io/pause:2.0
      resources:
        limits:
          hardware-vendor.example/foo: 2
#
# Pod ini perlu 2 perangkat perangkat-vendor.example/foo
# dan hanya dapat menjadwalkan ke Node yang bisa memenuhi
# kebutuhannya.
#
# Jika Node punya lebih dari 2 perangkat tersedia,
# maka kelebihan akan dapat digunakan Pod lainnya.

Implementasi plugin perangkat

Alur kerja umum dari plugin perangkat adalah sebagai berikut:

  • Inisiasi. Selama fase ini, plugin perangkat melakukan inisiasi spesifik vendor dan pengaturan untuk memastikan perangkat pada status siap.

  • Plugin memulai servis gRPC, dengan Unix socket pada lokasi /var/lib/kubelet/device-plugins/, yang mengimplementasi antarmuka berikut:

    service DevicePlugin {
          // ListAndWatch mengembalikan aliran dari List of Devices
          // Kapanpun Device menyatakan perubahan atau kehilangan Device, ListAndWatch
          // mengembalikan daftar baru
          rpc ListAndWatch(Empty) returns (stream ListAndWatchResponse) {}
    
          // Allocate dipanggil saat pembuatan kontainer sehingga Device
          // Plugin dapat menjalankan operasi spesifik perangkat dan menyuruh Kubelet
          // dari operasi untuk membuat Device tersedia di kontainer
          rpc Allocate(AllocateRequest) returns (AllocateResponse) {}
    }
    
  • Plugin mendaftarkan dirinya sendiri dengan kubelet melalui Unix socket pada lokasi host /var/lib/kubelet/device-plugins/kubelet.sock.

  • Seteleh sukses mendaftarkan dirinya sendiri, plugin perangkat berjalan dalam mode peladen, dan selama itu dia tetap mengawasi kesehatan perangkat dan melaporkan balik ke kubelet terhadap perubahan status perangkat. Dia juga bertanggung jawab untuk melayani request gRPC Allocate. Selama Allocate, plugin perangkat dapat membuat persiapan spesifik-perangkat; contohnya, pembersihan GPU atau inisiasi QRNG. Jika operasi berhasil, plugin perangkat mengembalikan AllocateResponse yang memuat konfigurasi runtime kontainer untuk mengakses perangkat teralokasi. Kubelet memberikan informasi ini ke runtime kontainer.

Menangani kubelet yang restart

Plugin perangkat diharapkan dapat mendeteksi kubelet yang restart dan mendaftarkan dirinya sendiri kembali dengan instance kubelet baru. Pada implementasi sekarang, sebuah instance kubelet baru akan menghapus semua socket Unix yang ada di dalam /var/lib/kubelet/device-plugins ketika dijalankan. Plugin perangkat dapat mengawasi penghapusan socket Unix miliknya dan mendaftarkan dirinya sendiri kembali ketika hal tersebut terjadi.

Deployment plugin perangkat

Kamu dapat melakukan deploy sebuah plugin perangkat sebagai DaemonSet, sebagai sebuah paket untuk sistem operasi node-mu, atau secara manual.

Direktori canonical /var/lib/kubelet/device-plugins membutuhkan akses berprivilese, sehingga plugin perangkat harus berjalan dalam konteks keamanan dengan privilese. Jika kamu melakukan deploy plugin perangkat sebagai DaemonSet, /var/lib/kubelet/device-plugins harus dimuat sebagai Volume pada PodSpec plugin.

Jika kamu memilih pendekatan DaemonSet, kamu dapat bergantung pada Kubernetes untuk meletakkan Pod plugin perangkat ke Node, memulai-ulang Pod daemon setelah kegagalan, dan membantu otomasi pembaruan.

Kecocokan API

Dukungan pada plugin perangkat Kubernetes sedang dalam beta. API dapat berubah hingga stabil, dalam cara yang tidak kompatibel. Sebagai proyek, Kubernetes merekomendasikan para developer plugin perangkat:

  • Mengamati perubahan pada rilis mendatang.
  • Mendukung versi API plugin perangkat berbeda untuk kompatibilitas-maju/mundur.

Jika kamu menyalakan fitur DevicePlugins dan menjalankan plugin perangkat pada node yang perlu diperbarui ke rilis Kubernetes dengan versi API plugin yang lebih baru, perbarui plugin perangkatmu agar mendukung kedua versi sebelum membarui para node ini. Memilih pendekatan demikian akan menjamin fungsi berkelanjutan dari alokasi perangkat selama pembaruan.

Mengawasi Sumber Daya Plugin Perangkat

FEATURE STATE: Kubernetes v1.15 [beta]

Dalam rangka mengawasi sumber daya yang disediakan plugin perangkat, agen monitoring perlu bisa menemukan kumpulan perangkat yang terpakai dalam node dan mengambil metadata untuk mendeskripsikan pada kontainer mana metrik harus diasosiasikan. Metrik prometheus diekspos oleh agen pengawas perangkat harus mengikuti Petunjuk Instrumentasi Kubernetes, mengidentifikasi kontainer dengan label prometheus pod, namespace, dan container.

Kubelet menyediakan servis gRPC untuk menyalakan pencarian perangkat yang terpakai, dan untuk menyediakan metadata untuk perangkat berikut:

// PodResourcesLister adalah layanan yang disediakan kubelet untuk menyediakan informasi tentang
// sumber daya node yang dikonsumsi Pod dan kontainer pada node
service PodResourcesLister {
    rpc List(ListPodResourcesRequest) returns (ListPodResourcesResponse) {}
}

Servis gRPC dilayani lewat socket unix pada /var/lib/kubelet/pod-resources/kubelet.sock. Agen pengawas untuk sumber daya plugin perangkat dapat di-deploy sebagai daemon, atau sebagai DaemonSet. Direktori canonical /var/lib/kubelet/pod-resources perlu akses berprivilese, sehingga agen pengawas harus berjalan dalam konteks keamanan dengan privilese. Jika agen pengawas perangkat berjalan sebagai DaemonSet, /var/lib/kubelet/pod-resources harus dimuat sebagai Volume pada plugin PodSpec.

Dukungan untuk "servis PodResources" butuh gerbang fitur KubeletPodResources untuk dinyalakan. Mulai dari Kubernetes 1.15 nilai bawaannya telah dinyalakan.

Integrasi Plugin Perangkat dengan Topology Manager

FEATURE STATE: Kubernetes v1.17 [alpha]

Topology Manager adalah komponen Kubelet yang membolehkan sumber daya untuk dikoordinasi secara selaras dengan Topology. Untuk melakukannya, API Plugin Perangkat telah dikembangkan untuk memasukkan struct TopologyInfo.

message TopologyInfo {
	repeated NUMANode nodes = 1;
}

message NUMANode {
    int64 ID = 1;
}

Plugin Perangkat yang ingin memanfaatkan Topology Manager dapat mengembalikan beberapa struct TopologyInfo sebagai bagian dari pendaftaran perangkat, bersama dengan ID perangkat dan status kesehatan perangkat. Manajer perangkat akan memakai informasi ini untuk konsultasi dengan Topology Manager dan membuat keputusan alokasi sumber daya.

TopologyInfo mendukung kolom nodes yang bisa nil (sebagai bawaan) atau daftar node NUMA. Ini membuat Plugin Perangkat mengumumkan apa saja yang bisa meliputi node NUMA.

Contoh struct TopologyInfo untuk perangkat yang dipopulate oleh Plugin Perangkat:

pluginapi.Device{ID: "25102017", Health: pluginapi.Healthy, Topology:&pluginapi.TopologyInfo{Nodes: []*pluginapi.NUMANode{&pluginapi.NUMANode{ID: 0,},}}}

Contoh plugin perangkat

Berikut beberapa contoh implementasi plugin perangkat:

Selanjutnya