Тема
Подключение физических устройств напрямую к контейнерам
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: rw2. Подключить данный объект внутрь 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-0PCI Pass Through
PCI Pass Through позволяет получить доступ до физических устройств из контейнеров с минимальными задержками.
Для подключения сетевой карты необходимо: 1. Загрузить vfio модуль ядра на ноде:
modprobe vfio
modprobe vfio_iommu_type1
modprobe vfio_pci2. В директории /sys/bus/pci/devices найти ID устройства.
3. С помощью утилиты driverctl связать устройство с vfio-драйвером
driverctl set-override <ID устройства> vfio-pci4. Создать объект 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"
}
}'5. Добавить в Deployment аннотацию, определяющую использование устройства:
apiVersion: apps/v1
kind: Deployment
metadata:
name: linux-app
labels:
app: linux-app
spec:
replicas: 1
selector:
matchLabels:
app: linux-app
template:
metadata:
labels:
app: linux-app
annotations:
k8s.v1.cni.cncf.io/networks: pci-pt-interface-1После применения данных объектов в контейнерах, созданных в рамках деплоймента, появиться новый сетевой интерфейс.