Подключение физических устройств напрямую к контейнерам
Container Device Interface (CDI)
Container Device Interface - спецификация, описывающая процесс получения доступа к системным ресурсам хоста (сетевые интерфейсы, графические процессоры и т.д.) напрямую из контейнера.
Например, для того, чтобы подключить сетевую карту напрямую в pod kubernetes, нужно выполнить следующие шаги:
1. Создать на ноде в директории CDI (/etc/cdi/) описание объекта:
cdiVersion: 0.6.0
kind: vendor.com/device
devices:
- name: pci-nic-0
containerEdits:
deviceNodes:
- hostPath: /dev/vfio/vfio
path: /dev/vfio/vfio
type: c
permissions: rw
- hostPath: /dev/vfio/1
path: /dev/vfio/1
type: c
permissions: rw
podа:
apiVersion: v1
kind: Pod
metadata:
name: network-pod
spec:
containers:
- name: app-container
image: my-network-app
resources:
devices:
- deviceName: vendor.com/device=pci-nic-0
PCI Pass Through
PCI Pass Through позволяет получить доступ до физических устройств из контейнеров с минимальными задержками.
Для подключения сетевой карты необходимо: 1. Загрузить vfio модуль ядра на ноде:
2. В директории /sys/bus/pci/devices найти ID устройства.
3. С помощью утилиты driverctl связать устройство с vfio-драйвером
4. Создать объект Kubernetes с описанием устройстваapiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: pci-pt-interface-1
spec:
config: '{
"cniVersion": "0.4.0",
"name": "net1",
"type": "host-device",
"pciBusID": "ID устройства",
"ipam": {
"type": "whereabouts",
"range": "10.77.50.0/24",
"routes": [
{ "dst": "0.0.0.0/0" }
],
"gateway": "10.77.50.1"
}
}'
Deployment аннотацию, определяющую использование устройства:После применения данных объектов в контейнерах, созданных в рамках деплоймента, появиться новый сетевой интерфейс.