Введение

Данное руководство посвящено созданию пользовательских ресурсов на основе уже существующих административных ресурсов, которые были получены от администратора кластера или сети.

Пользовательские ресурсы

Network

Для создания выделенной сети для проекта используется ресурс Network.

apiVersion: network.deckhouse.io/v1alpha1
kind: Network
metadata:
  name: my-network
  namespace: my-namespace
spec:
  networkClass: my-network-class # mandatory

После создания ресурса Network вы можете проверить его статус:

d8 k -n my-namespace get network my-network -o yaml
Пример статуса ресурса `Network`
apiVersion: network.deckhouse.io/v1alpha1
kind: Network
metadata:
...
status:
  bridgeName: d8-br-600
  conditions:
  - lastTransitionTime: "2025-09-29T14:51:26Z"
    message: All node interface attachments are ready
    reason: AllNodeInterfaceAttachmentsAreReady
    status: "True"
    type: AllNodeAttachementsAreReady
  - lastTransitionTime: "2025-09-29T14:51:26Z"
    message: Network is operational
    reason: NetworkReady
    status: "True"
    type: Ready
  nodeAttachementsCount: 1
  observedGeneration: 1
  readyNodeAttachementsCount: 1
  vlanID: 600

Поддерживается статическое определение номера VLAN ID из пула, выданного администратором кластера или сети spec.vlan.id, если значение не указано в спецификации ресурса оно будет назначено динамически.

Подключение дополнительных сетей к подам

Настройка дополнительных сетей осуществляется с помощью аннотации пода:

network.deckhouse.io/networks-spec: |
  [
    {
      "type": "Network",
      "name": "my-network",
      "ifName": "veth_mynet",    # Имя TAP-интерфейса внутри пода (опционально).
      "mac": "aa:bb:cc:dd:ee:ff" # MAC-адрес, который следует назначить TAP-интерфейсу (опционально).
    },
    {
      "type": "ClusterNetwork",
      "name": "my-cluster-network",
      "ifName": "veth_public",
    }
  ]

Подключение физических сетевых интерфейсов к подам (DPDK-приложения)

Для использования физических сетевых интерфейсов (PF/VF) напрямую в поды для DPDK-приложений необходимо:

  1. Убедиться, что ваш namespace был помечен администратором для использования UnderlayNetwork (см. Руководство администратора)
  2. Создать под c аннотацией, запрашивающей устройство из UnderlayNetwork
Создание пода c устройством из UnderlayNetwork

Создайте под, который запрашивает устройство из UnderlayNetwork. В аннотации пода network.deckhouse.io/networks-spec должно быть указано:

  • type: "UnderlayNetwork" — указывает, что это запрос физического устройства
  • name: "underlay-network-name" — имя ресурса UnderlayNetwork, созданного администратором
  • bindingMode — режим привязки устройства (VFIO-PCI, DPDK или NetDev)

Пример конфигурации пода для режима DPDK (универсальный режим, который автоматически выбирает подходящий драйвер для вендора сетевого адаптера):

apiVersion: v1
kind: Pod
metadata:
  name: dpdk-app
  namespace: mydpdk
  annotations:
    network.deckhouse.io/networks-spec: |
      [
        {
          "type": "UnderlayNetwork",
          "name": "dpdk-shared-network",
          "bindingMode": "DPDK"
        }
      ]
spec:
  containers:
  - name: dpdk-container
    image: dpdk-app:latest
    securityContext:
      privileged: false
      capabilities:
        add:
        - NET_ADMIN
        - NET_RAW
        - IPC_LOCK
    volumeMounts:
    - mountPath: /hugepages
      name: hugepage
    resources:
      limits:
        hugepages-2Mi: 4Gi
        memory: 4Gi
        cpu: 4
      requests:
        cpu: 4
        memory: 4Gi
    command: ["/bin/sh", "-c", "sleep infinity"]
  volumes:
  - name: hugepage
    emptyDir:
      medium: HugePages

Для DPDK-приложений важно:

  • Настроить capabilities (NET_ADMIN, NET_RAW, IPC_LOCK) для запуска в непривилегированном режиме вместо использования privileged: true
  • Подключить volumes с hugepages, так как DPDK требует hugepages для эффективного управления памятью

Для VF устройств в режиме Shared можно дополнительно указать vlanID в аннотации для настройки VLAN-тегирования на VF:

network.deckhouse.io/networks-spec: |
  [
    {
      "type": "UnderlayNetwork",
      "name": "dpdk-shared-network",
      "bindingMode": "VFIO-PCI",
      "vlanID": 100
    }
  ]

После создания пода проверьте, что устройство было выделено, проверив аннотацию network.deckhouse.io/networks-status:

d8 k -n mydpdk get pod dpdk-app -o jsonpath='{.metadata.annotations.network\.deckhouse\.io/networks-status}' | jq

Вы также можете проверить ResourceClaim, который был автоматически создан:

d8 k -n mydpdk get resourceclaim
Пример статуса пода с выделенным устройством UnderlayNetwork
apiVersion: v1
kind: Pod
metadata:
  name: dpdk-app
  namespace: mydpdk
  annotations:
    network.deckhouse.io/networks-spec: |
      [
        {
          "type": "UnderlayNetwork",
          "name": "dpdk-shared-network",
          "bindingMode": "DPDK"
        }
      ]
    network.deckhouse.io/networks-status: |
      [
        {
          "type": "UnderlayNetwork",
          "name": "dpdk-shared-network",
          "bindingMode": "DPDK",
          "netDevInterfaces": [
            {
              "name": "ens1f0",
              "mac": "00:1b:21:bb:aa:cc"
            }
          ],
          "conditions": [
            {
              "type": "Configured",
              "status": "True",
              "reason": "InterfaceConfiguredSuccessfully",
              "message": "",
              "lastTransitionTime": "2025-01-15T10:35:00Z"
            },
            {
              "type": "Negotiated",
              "status": "True",
              "reason": "Up",
              "message": "",
              "lastTransitionTime": "2025-01-15T10:35:00Z"
            }
          ]
        }
      ]
status:
  phase: Running
  ...