Plugin Jaringan
Kubernetes v1.22 [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 pluginbridge
danhost-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 startupnetwork-plugin
: Plugin jaringan untuk digunakan daricni-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.3.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.3.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
danhost-local
standar diperlukan, minimal pada versi 0.2.0. Kubenet pertama-tama akan mencari mereka di/opt/cni/bin
. Tentukancni-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 jaringancni
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 jaringankubenet
denganbridge
CNI dan plugin-pluginhost-local
yang terletak di/opt/cni/bin
ataucni-bin-dir
.--network-plugin-mtu=9001
menentukan MTU yang akan digunakan, saat ini hanya digunakan oleh plugin jaringankubenet
.