Перейти к содержанию

Подключение физических устройств напрямую к контейнерам

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
2. Подключить данный объект внутрь 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 модуль ядра на ноде:

modprobe vfio
modprobe vfio_iommu_type1
modprobe vfio_pci

2. В директории /sys/bus/pci/devices найти ID устройства.

3. С помощью утилиты driverctl связать устройство с vfio-драйвером

driverctl set-override <ID устройства> vfio-pci
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"
    }
  }'
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
После применения данных объектов в контейнерах, созданных в рамках деплоймента, появиться новый сетевой интерфейс.