Dokumen ini menjelaskan cara menyiapkan virtualisasi input/output root tunggal (SR-IOV) untuk Google Distributed Cloud. SR-IOV menyediakan virtualisasi I/O untuk membuat kartu antarmuka jaringan (NIC), tersedia sebagai perangkat jaringan di Linux {i>kernel<i}. Hal ini memungkinkan Anda mengelola dan menetapkan koneksi jaringan ke pod Anda. Performa meningkat karena paket berpindah langsung antara NIC dan pod.
Gunakan fitur ini jika Anda memerlukan jaringan yang cepat ke workload pod Anda. SR-IOV untuk Google Distributed Cloud memungkinkan Anda mengonfigurasi fungsi virtual (VF) di perangkat yang didukung dari node cluster Anda. Anda juga dapat menentukan modul {i>kernel<i} untuk mengikat ke VF.
Fitur ini tersedia untuk cluster yang menjalankan workload, seperti hibrida, mandiri, dan cluster pengguna. Fitur jaringan SR-IOV mengharuskan cluster memiliki minimal dua node.
Proses penyiapan terdiri dari langkah-langkah tingkat tinggi berikut:
- Konfigurasi cluster untuk mengaktifkan jaringan SR-IOV.
- Konfigurasi operator SR-IOV, resource kustom
SriovOperatorConfig
. - Siapkan kebijakan SR-IOV dan konfigurasikan VF Anda.
- Buat resource kustom
NetworkAttachmentDefinition
yang mereferensikan VF.
Persyaratan
Fitur jaringan SR-IOV memerlukan {i>driver<i} resmi untuk jaringan
adaptor yang ada di node cluster. Instal {i>driver<i} sebelum menggunakan
operator SR-IOV. Selain itu, agar dapat menggunakan modul vfio-pci
untuk VF, pastikan
bahwa modul tersedia pada {i>
node <i}tempatnya akan digunakan.
Mengaktifkan jaringan SR-IOV untuk cluster
Untuk mengaktifkan jaringan SR-IOV untuk Google Distributed Cloud, tambahkan
multipleNetworkInterfaces
dan
sriovOperator
ke bagian clusterNetwork
pada objek Cluster dan tetapkan kedua kolom
ke true
.
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
spec:
clusterNetwork:
multipleNetworkInterfaces: true
sriovOperator: true
...
Kolom sriovOperator
dapat diubah, dan dapat diubah setelah pembuatan cluster.
Mengonfigurasi operator SR-IOV
Resource kustom SriovOperatorConfig
menyediakan konfigurasi global untuk
fitur jaringan SR-IOV. Resource khusus yang dipaketkan ini memiliki nama default
dan berada dalam namespace gke-operators
. Kustom SriovOperatorConfig
resource hanya diterima untuk nama dan namespace ini.
Anda dapat mengedit objek ini dengan perintah berikut:
kubectl -n gke-operators edit sriovoperatorconfigs.sriovnetwork.k8s.cni.cncf.io default
Berikut adalah contoh konfigurasi resource kustom SriovOperatorConfig
:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovOperatorConfig
metadata:
name: default
namespace: gke-operators
spec:
configDaemonNodeSelector:
nodePool: "withSriov"
disableDrain: false
logLevel: 0
Bagian configDaemonNodeSelector
memungkinkan Anda membatasi node mana yang digunakan oleh SR-IOV
dapat ditangani oleh operator. Dalam contoh sebelumnya, operator dibatasi hanya untuk
node yang memiliki label nodePool: withSriov
. Jika configDaemonNodeSelector
kolom tidak ditentukan, label default berikut akan diterapkan:
beta.kubernetes.io/os: linux
node-role.kubernetes.io/worker: ""
Kolom disableDrain
menentukan apakah akan melakukan pengurasan node Kubernetes
sebelum {i>node<i} harus dimulai ulang
atau sebelum {i>node<i} VF tertentu
jika konfigurasi berubah.
Membuat kebijakan SR-IOV
Untuk mengonfigurasi VF tertentu dalam cluster, Anda harus membuat
Resource kustom SriovNetworkNodePolicy
di namespace gke-operators
.
Berikut contoh manifes untuk resource kustom SriovNetworkNodePolicy
:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: policy-1
namespace: gke-operators
spec:
deviceType: "netdevice"
mtu: 1600
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0
deviceID: "1015"
rootDevices:
- 0000:01:00.0
vendor: "15b3"
numVfs: 4
priority: 80
resourceName: "mlnx"
Bagian nodeSelector
memungkinkan Anda membatasi lebih jauh node tempat VF
harus dibuat. Keterbatasan ini berada di atas
pemilih dari
SriovOperatorConfig
dijelaskan di bagian sebelumnya.
Kolom deviceType
menentukan modul kernel yang akan digunakan untuk VF. Tersedia
opsi untuk deviceType
adalah:
netdevice
untuk modul kernel standar khusus VFvfio-pci
untuk driver VFIO-PCI
resourceName
menentukan nama VF yang direpresentasikan dalam
Node Kubernetes.
Setelah proses konfigurasi selesai, node cluster yang Anda pilih
berisi sumber daya yang didefinisikan seperti yang ditunjukkan dalam contoh berikut (perhatikan
gke.io/mlnx
):
apiVersion: v1
kind: Node
metadata:
name: worker-01
spec:
…
status:
allocatable:
cpu: 47410m
ephemeral-storage: "210725550141"
gke.io/mlnx: "4"
hugepages-1Gi: "0"
hugepages-2Mi: "0"
memory: 59884492Ki
pods: "250"
capacity:
cpu: "48"
ephemeral-storage: 228651856Ki
gke.io/mlnx: "4"
hugepages-1Gi: "0"
hugepages-2Mi: "0"
memory: 65516492Ki
pods: "250"
Operator akan selalu menambahkan awalan gke.io/
ke setiap resource yang Anda tentukan
dengan SriovNetworkNodePolicy
.
Menentukan pemilih NIC
Agar SriovNetworkNodePolicy
berfungsi dengan baik, tentukan minimal satu
di bagian nicSelector
. Bidang ini berisi
beberapa opsi tentang
cara mengidentifikasi fungsi fisik tertentu (PF) di node cluster Anda. Sebagian besar
informasi yang dibutuhkan oleh isian ini ditemukan untuk Anda dan disimpan dalam
Resource kustom SriovNetworkNodeState
. Akan ada objek per setiap node
yang dapat ditangani operator ini.
Gunakan perintah berikut untuk melihat semua node yang tersedia:
kubectl -n gke-operators get sriovnetworknodestates.sriovnetwork.k8s.cni.cncf.io -o yaml
Berikut adalah contoh node:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodeState
metadata:
name: worker-01
namespace: gke-operators
spec:
dpConfigVersion: "6368949"
status:
interfaces:
- deviceID: "1015"
driver: mlx5_core
eSwitchMode: legacy
linkSpeed: 10000 Mb/s
linkType: ETH
mac: 1c:34:da:5c:2b:9c
mtu: 1500
name: enp1s0f0
pciAddress: "0000:01:00.0"
totalvfs: 4
vendor: 15b3
- deviceID: "1015"
driver: mlx5_core
linkSpeed: 10000 Mb/s
linkType: ETH
mac: 1c:34:da:5c:2b:9d
mtu: 1500
name: enp1s0f1
pciAddress: "0000:01:00.1"
totalvfs: 2
vendor: 15b3
syncStatus: Succeeded
Menyetel partisi Fungsi Fisik
Berikan perhatian khusus pada kolom pfNames
di bagian nicSelector
. Di beberapa
selain menentukan PF yang tepat untuk digunakan, ini memungkinkan
Anda menentukan VF yang tepat untuk
digunakan untuk PF dan resource
yang ditentukan dalam kebijakan.
Berikut contohnya:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: policy-1
namespace: gke-operators
spec:
deviceType: "netdevice"
mtu: 1600
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0#3-6
deviceID: "1015"
rootDevices:
- 0000:01:00.0
vendor: "15b3"
numVfs: 7
priority: 80
resourceName: "mlnx"
Pada contoh sebelumnya, resource gke.io/mlnx
hanya menggunakan VF bernomor 3-6
dan hanya menampilkan empat VF yang tersedia. Karena VF selalu dibuat dari
indeks nol, jumlah VF yang Anda minta, numVfs
, minimal harus setinggi
sebagai nilai penutup rentang (dihitung dari nol). Logika penomoran ini adalah mengapa
Dalam contoh sebelumnya, numVfs
disetel ke 7
. Jika Anda menetapkan rentang dari 3 hingga 4
(enp65s0f0#3-4
), numVfs
Anda minimal harus 5
.
Jika partisi tidak ditentukan, numVfs
akan menentukan rentang VF yang
yang digunakan, yang selalu
dimulai dari nol. Misalnya, jika Anda menetapkan numVfs=3
tanpa menentukan partisi, VF 0-2
akan digunakan.
Memahami prioritas kebijakan
Anda dapat menentukan beberapa objek SriovNetworkNodePolicy
untuk menangani berbagai
vendor atau konfigurasi VF yang berbeda. Mengelola banyak objek dan vendor
bisa menjadi masalah ketika banyak
kebijakan merujuk pada PF yang sama. Untuk ditangani
situasi tersebut, kolom priority
akan menyelesaikan konflik per node.
Berikut adalah logika penentuan prioritas untuk kebijakan PF yang tumpang-tindih:
Kebijakan dengan prioritas yang lebih tinggi akan menimpa kebijakan dengan prioritas yang lebih rendah hanya jika Partisi PF tumpang tindih.
Kebijakan prioritas yang sama digabungkan:
- Kebijakan diurutkan berdasarkan nama dan diproses dalam urutan tersebut
- Kebijakan dengan partisi PF yang tumpang-tindih akan ditimpa
- Kebijakan dengan partisi PF yang tidak tumpang-tindih akan digabungkan dan semuanya ada
Kebijakan prioritas tinggi adalah kebijakan dengan nilai numerik yang lebih rendah dalam priority
kolom tersebut. Misalnya, prioritasnya lebih tinggi untuk kebijakan dengan priority: 10
,
dibandingkan dengan kebijakan dengan priority: 20
.
Bagian berikut memberikan contoh kebijakan untuk berbagai partisi konfigurasi standar.
PF yang dipartisi
Men-deploy dua manifes SriovNetworkNodePolicy
berikut akan menghasilkan dua
resource yang tersedia: gke.io/dev-kernel
dan gke.io/dev-vfio
. Setiap resource
memiliki dua VF yang tidak tumpang-tindih.
kind: SriovNetworkNodePolicy
metadata:
name: policy-1
spec:
deviceType: "netdevice"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0#0-1
numVfs: 2
priority: 70
resourceName: "dev-kernel"
kind: SriovNetworkNodePolicy
metadata:
name: policy-2
spec:
deviceType: "vfio-pci"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0#2-3
numVfs: 4
priority: 70
resourceName: "dev-vfio"
Partisi PF yang tumpang-tindih
Men-deploy dua manifes SriovNetworkNodePolicy
berikut hanya menghasilkan
resource gke.io/dev-vfio
tersedia. Rentang VF policy-1
adalah
0-2
, yang tumpang-tindih dengan policy-2
. Karena penamaan, policy-2
diproses
setelah policy-1
. Oleh karena itu, hanya resource yang ditentukan dalam policy-2
,
gke.io/dev-vfio
, tersedia.
kind: SriovNetworkNodePolicy
metadata:
name: policy-1
spec:
deviceType: "netdevice"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0
numVfs: 3
priority: 70
resourceName: "dev-kernel"
kind: SriovNetworkNodePolicy
metadata:
name: policy-2
spec:
deviceType: "vfio-pci"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0#2-3
numVfs: 4
priority: 70
resourceName: "dev-vfio"
Partisi PF yang tidak tumpang-tindih dengan prioritas yang berbeda
Men-deploy dua manifes SriovNetworkNodePolicy
berikut akan menghasilkan dua
resource yang tersedia: gke.io/dev-kernel
dan gke.io/dev-vfio
. Setiap resource
memiliki dua VF yang tidak tumpang-tindih. Meskipun policy-1
memiliki prioritas yang lebih tinggi
daripada policy-2
, karena partisi PF tidak tumpang-tindih, kita menggabungkan keduanya
kebijakan izin yang relevan.
kind: SriovNetworkNodePolicy
metadata:
name: policy-1
spec:
deviceType: "netdevice"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0
numVfs: 2
priority: 10
resourceName: "dev-kernel"
kind: SriovNetworkNodePolicy
metadata:
name: policy-2
spec:
deviceType: "vfio-pci"
nodeSelector:
baremetal.cluster.gke.io/node-pool: node-pool-1
nicSelector:
pfNames:
- enp65s0f0#2-3
numVfs: 4
priority: 70
resourceName: "dev-vfio"
Memeriksa status penyiapan kebijakan SR-IOV
Saat menerapkan kebijakan SR-IOV, Anda dapat melacak dan melihat
konfigurasi node dalam resource kustom SriovNetworkNodeState
untuk
ke node tertentu. Di bagian status
, kolom syncStatus
mewakili
tahap saat ini untuk daemon konfigurasi. Status Succeeded
menunjukkan
konfigurasi tersebut selesai. Bagian spec
dari
Resource kustom SriovNetworkNodeState
menentukan status akhir VF
untuk Node tersebut, berdasarkan jumlah kebijakan dan
prioritas Anda. Semua VF yang dibuat akan dicantumkan di bagian status
untuk
PF yang ditentukan.
Berikut adalah contoh resource kustom SriovNetworkNodeState
:
apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
kind: SriovNetworkNodeState
metadata:
name: worker-02
namespace: gke-operators
spec:
dpConfigVersion: "9022068"
interfaces:
- linkType: eth
name: enp1s0f0
numVfs: 2
pciAddress: "0000:01:00.0"
vfGroups:
- deviceType: netdevice
policyName: policy-1
resourceName: mlnx
vfRange: 0-1
status:
interfaces:
- Vfs:
- deviceID: "1016"
driver: mlx5_core
mac: 96:8b:39:d8:89:d2
mtu: 1500
name: enp1s0f0np0v0
pciAddress: "0000:01:00.2"
vendor: 15b3
vfID: 0
- deviceID: "1016"
driver: mlx5_core
mac: 82:8e:65:fe:9b:cb
mtu: 1500
name: enp1s0f0np0v1
pciAddress: "0000:01:00.3"
vendor: 15b3
vfID: 1
deviceID: "1015"
driver: mlx5_core
eSwitchMode: legacy
linkSpeed: 10000 Mb/s
linkType: ETH
mac: 1c:34:da:5c:2b:9c
mtu: 1500
name: enp1s0f0
numVfs: 2
pciAddress: "0000:01:00.0"
totalvfs: 2
vendor: 15b3
- deviceID: "1015"
driver: mlx5_core
linkSpeed: 10000 Mb/s
linkType: ETH
mac: 1c:34:da:5c:2b:9d
mtu: 1500
name: enp1s0f1
pciAddress: "0000:01:00.1"
totalvfs: 2
vendor: 15b3
syncStatus: Succeeded
Membuat resource kustom NetworkAttachmentDefinition
Setelah Anda berhasil mengonfigurasi VF di cluster, dan VF tersebut akan terlihat di
Node Kubernetes sebagai resource, Anda harus membuat
NetworkAttachmentDefinition
yang mereferensikan resource. Buat referensi
dengan anotasi k8s.v1.cni.cncf.io/resourceName
.
Berikut adalah contoh manifes NetworkAttachmentDefinition
yang mereferensikan
Resource gke.io/mlnx
:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: gke-sriov-1
annotations:
k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx
spec:
config: '{
"cniVersion": "0.3.0",
"name": "mynetwork",
"type": "sriov",
"ipam": {
"type": "whereabouts",
"range": "21.0.108.0/21",
"range_start": "21.0.111.16",
"range_end": "21.0.111.18"
}
}'
NetworkAttachmentDefinition
harus memiliki sriov
sebagai jenis CNI.
Merujuk ke resource kustom NetworkAttachmentDefinition
yang di-deploy di
pod dengan anotasi k8s.v1.cni.cncf.io/networks
.
Berikut contoh cara mereferensikan
NetworkAttachmentDefinition
resource kustom dalam pod:
apiVersion: v1
kind: Pod
metadata:
name: samplepod
annotations:
k8s.v1.cni.cncf.io/networks: gke-sriov-1
spec:
containers:
...
Saat merujuk ke resource kustom NetworkAttachmentDefinition
dalam workload,
Anda tidak perlu mengkhawatirkan Pod definisi sumber daya, atau penempatan dalam
Node tertentu, yang
dilakukan secara otomatis untuk Anda.
Contoh berikut menunjukkan resource kustom NetworkAttachmentDefinition
dengan
konfigurasi VLAN. Dalam contoh ini, setiap VF adalah milik VLAN 100
:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: gke-sriov-vlan-100
annotations:
k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx
spec:
config: '{
"cniVersion": "0.3.0",
"name": "mynetwork",
"type": "sriov",
"vlan": 100,
"ipam": {
"type": "whereabouts",
"range": "21.0.100.0/21"
}
}'
Informasi tambahan
Bagian berikut berisi informasi untuk membantu Anda mengonfigurasi SR-IOV berjejaring (netrworking){b>.<b}
Memulai ulang node
Ketika operator SR-IOV mengkonfigurasi {i> node<i}, {i>node<i} mungkin perlu dimulai ulang. Mulai ulang node mungkin diperlukan selama konfigurasi VF atau kernel. Tujuan konfigurasi {i>kernel<i} melibatkan pengaktifan dukungan fungsionalitas SR-IOV dalam yang dibutuhkan serta sistem operasi.
Adaptor Jaringan yang Didukung
Tabel berikut mencantumkan adaptor jaringan yang didukung untuk versi 1.30.x cluster:
Nama | ID Vendor | ID Perangkat | ID perangkat VF |
---|---|---|---|
Intel i40e XXV710 | 8086 | 158a | 154c |
Intel i40e 25G SFP28 | 8086 | 158 M | 154c |
Intel i40e 10G X710 SFP | 8086 | 1572 | 154c |
Intel i40e XXV710 N3000 | 8086 | 0h58 | 154c |
Intel i40e 40G XL710 QSFP | 8086 | 1583 | 154c |
Intel Ice Columbiaville E810-CQDA2 2CQDA2 | 8086 | 1.592 | 1889 |
Intel es Columbiaville E810-XXVDA4 | 8086 | 1593 | 1889 |
Intel es Columbiaville E810-XXVDA2 | 8086 | 159 M | 1889 |
Nvidia MLX5 ConnectX-4 | 15b3 | 1013 | 1014 |
Nvidia MLX5 ConnectX-4LX | 15b3 | 1015 | 1016 |
Nvidia MLX5 ConnectX-5 | 15b3 | 1017 | 1018 |
Nvidia MLX5 ConnectX-5 Ex | 15b3 | 1019 | 101a |
Nvidia MLX5 ConnectX-6 | 15b3 | 101b | 101c |
Nvidia MLX5 ConnectX-6_Dx | 15b3 | 101h | 101e |
Nvidia mlx5 MT42822 BlueField-2 ConnectX-6 Dx terintegrasi | 15b3 | A2D6 | 101e |
Broadcom BCM57414 2x25G | 14 h | 16h | 16dc |
Broadcom BCM75508 2x100G | 14 h | 1750 | 1806 |