|Index|SUSE Telco Cloud Documentación|Aprovisionamiento de red dirigido totalmente automatizado|Funcionalidades de telecomunicaciones (DPDK, SR-IOV, aislamiento de CPU, páginas enormes, NUMA, etc.)
Se aplica a SUSE Telco Cloud 3.6

54 Funcionalidades de telecomunicaciones (DPDK, SR-IOV, aislamiento de CPU, páginas enormes, NUMA, etc.)

El flujo de trabajo de aprovisionamiento de red dirigido permite automatizar las funcionalidades de telecomunicaciones que se utilizarán en los clústeres descendentes para ejecutar cargas de trabajo de telecomunicaciones sobre esos servidores.

Requisitos

Configuración

Utilizad las dos secciones siguientes como base para inscribir y aprovisionar los hosts:

Las funcionalidades de telecomunicaciones cubiertas en esta sección son las siguientes:

  • DPDK y creación de VFs

  • SR-IOV y asignación de VFs para ser utilizadas por las cargas de trabajo

  • Aislamiento de CPU y ajuste de rendimiento

  • Configuración de páginas enormes

  • Ajuste de parámetros del kernel

Nota
Nota

Para obtener más información sobre las funcionalidades de Telco, consultad Parte VI, “Configuración de las funciones Telco”.

Los cambios necesarios para habilitar las funcionalidades de Telco mostradas anteriormente se encuentran todos dentro del bloque RKE2ControlPlane en el archivo de aprovisionamiento capi-provisioning-example.yaml. El resto de la información dentro del archivo capi-provisioning-example.yaml es la misma que la información proporcionada en la sección de aprovisionamiento (Capítulo 51, Aprovisionamiento de clústeres en sentido descendente con aprovisionamiento de red dirigida (nodo único)).

Para aclarar el proceso, los cambios necesarios en ese bloque (RKE2ControlPlane) para habilitar las funcionalidades de Telco son los siguientes:

  • El archivo de ignición /var/lib/rancher/rke2/server/manifests/configmap-sriov-custom-auto.yaml que se va a utilizar para definir las interfaces, los controladores y el número de VFs que se van a crear y exponer a las cargas de trabajo.

    • Los valores dentro del mapa de configuración sriov-custom-auto-config son los únicos valores que se deben reemplazar por valores reales.

      • ${RESOURCE_NAME1} — El nombre del recurso que se va a utilizar para la primera interfaz PF (por ejemplo, sriov-resource-du1). Se añade al prefijo rancher.io para utilizarlo como etiqueta que emplearán las cargas de trabajo (por ejemplo, rancher.io/sriov-resource-du1).

      • ${SRIOV-NIC-NAME1} — El nombre de la primera interfaz PF que se va a utilizar (por ejemplo, eth0).

      • ${PF_NAME1} — El nombre de la primera función física PF que se va a utilizar. Generad filtros más complejos utilizando esto (por ejemplo, eth0#2-5).

      • ${DRIVER_NAME1} — El nombre del controlador que se va a utilizar para la primera interfaz VF (por ejemplo, vfio-pci).

      • ${NUM_VFS1} — El número de VFs que se van a crear para la primera interfaz PF (por ejemplo, 8).

  • El /var/sriov-auto-filler.sh que se va a utilizar como traductor entre el mapa de configuración de alto nivel sriov-custom-auto-config y el sriovnetworknodepolicy que contiene la información de hardware de bajo nivel. Este script se ha creado para abstraer al usuario de la complejidad de conocer de antemano la información del hardware. No se requieren cambios en este archivo, pero debe estar presente si necesitamos habilitar sr-iov y crear VFs.

  • Los argumentos del kernel que se van a utilizar para habilitar las siguientes funciones:

Parámetro

Valor

Descripción

isolcpus

domain,nohz,managed_irq,1-30,33-62

Aislád los núcleos 1-30 y 33-62.

skew_tick

1

Permite al kernel sesgar las interrupciones del temporizador a través de las CPU aisladas.

nohz

on

Permite al kernel ejecutar el tick del temporizador en una única CPU cuando el sistema está inactivo.

nohz_full

1-30,33-62

el parámetro del kernel de arranque es la interfaz principal actual para configurar dynticks completos junto con el aislamiento de CPU.

rcu_nocbs

1-30,33-62

Permite al kernel ejecutar las devoluciones de llamada RCU en una única CPU cuando el sistema está inactivo.

irqaffinity

0,31,32,63

Permite al kernel ejecutar las interrupciones en una única CPU cuando el sistema está inactivo.

inactivo

poll

Minimiza la latencia de salida del estado inactivo.

iommu

pt

Permite utilizar vfio para las interfaces DPDK.

intel_iommu

on

Habilita el uso de vfio para VFs.

hugepagesz

1 G

Permite establecer el tamaño de las páginas enormes a 1 G.

hugepages

40

Número de páginas enormes definidas anteriormente.

default_hugepagesz

1 G

Valor predeterminado para habilitar páginas enormes.

nowatchdog

 

Deshabilita el watchdog.

nmi_watchdog

0

Deshabilita el watchdog NMI.

  • Los siguientes servicios de systemd se utilizan para habilitar lo siguiente:

    • rke2-preinstall.service para reemplazar automáticamente BAREMETALHOST_UUID y node-name durante el proceso de aprovisionamiento utilizando la información de Ironic.

    • cpu-partitioning.service para habilitar los núcleos de aislamiento de CPU (por ejemplo, 1-30,33-62).

    • performance-settings.service para habilitar el ajuste de rendimiento de la CPU.

    • sriov-custom-auto-vfs.service para instalar el Helm chart de sriov, esperar hasta que se creen los recursos personalizados y ejecutar /var/sriov-auto-filler.sh para reemplazar los valores en el config map sriov-custom-auto-config y crear el sriovnetworknodepolicy que utilizarán las cargas de trabajo.

  • El ${RKE2_VERSION} es la versión de RKE2 que se debe utilizar reemplazando este valor (por ejemplo, v1.35.4+rke2r1).

Con todos estos cambios mencionados, el bloque RKE2ControlPlane en el capi-provisioning-example.yaml tendrá el siguiente aspecto:

apiVersion: controlplane.cluster.x-k8s.io/v1beta2
kind: RKE2ControlPlane
metadata:
  name: single-node-cluster
  namespace: default
spec:
  infrastructureRef:
    apiGroup: infrastructure.cluster.x-k8s.io
    kind: Metal3MachineTemplate
    name: single-node-cluster-controlplane
  replicas: 1
  version: ${RKE2_VERSION}
  rolloutStrategy:
    type: "RollingUpdate"
    rollingUpdate:
      maxSurge: 0
  serverConfig:
    cni: calico
    cniMultusEnable: true
  agentConfig:
    format: ignition
    additionalUserData:
      config: |
        variant: fcos
        version: 1.4.0
        storage:
          files:
          - path: /var/lib/rancher/rke2/server/manifests/configmap-sriov-custom-auto.yaml
            overwrite: true
            contents:
              inline: |
                apiVersion: v1
                kind: ConfigMap
                metadata:
                  name: sriov-custom-auto-config
                  namespace: kube-system
                data:
                  config.json: |
                    [
                        {
                          "resourceName": "${RESOURCE_NAME1}",
                          "interface": "${SRIOV-NIC-NAME1}",
                          "pfname": "${PF_NAME1}",
                          "driver": "${DRIVER_NAME1}",
                          "numVFsToCreate": ${NUM_VFS1}
                        },
                        {
                          "resourceName": "${RESOURCE_NAME2}",
                          "interface": "${SRIOV-NIC-NAME2}",
                          "pfname": "${PF_NAME2}",
                          "driver": "${DRIVER_NAME2}",
                          "numVFsToCreate": ${NUM_VFS2}
                        }
                    ]
            mode: 0644
            user:
              name: root
            group:
              name: root
          - path: /var/lib/rancher/rke2/server/manifests/sriov-crd.yaml
            overwrite: true
            contents:
              inline: |
                apiVersion: helm.cattle.io/v1
                kind: HelmChart
                metadata:
                  name: sriov-crd
                  namespace: kube-system
                spec:
                  chart: oci://registry.suse.com/edge/charts/sriov-crd
                  targetNamespace: sriov-network-operator
                  version: 306.0.4+up1.6.0
                  createNamespace: true
          - path: /var/lib/rancher/rke2/server/manifests/sriov-network-operator.yaml
            overwrite: true
            contents:
              inline: |
                apiVersion: helm.cattle.io/v1
                kind: HelmChart
                metadata:
                  name: sriov-network-operator
                  namespace: kube-system
                spec:
                  chart: oci://registry.suse.com/edge/charts/sriov-network-operator
                  targetNamespace: sriov-network-operator
                  version: 306.0.4+up1.6.0
                  createNamespace: true
        kernel_arguments:
          should_exist:
            - intel_iommu=on
            - iommu=pt
            - idle=poll
            - mce=off
            - hugepagesz=1G hugepages=40
            - hugepagesz=2M hugepages=0
            - default_hugepagesz=1G
            - irqaffinity=${NON-ISOLATED_CPU_CORES}
            - isolcpus=domain,nohz,managed_irq,${ISOLATED_CPU_CORES}
            - nohz_full=${ISOLATED_CPU_CORES}
            - rcu_nocbs=${ISOLATED_CPU_CORES}
            - rcu_nocb_poll
            - nosoftlockup
            - nowatchdog
            - nohz=on
            - nmi_watchdog=0
            - skew_tick=1
            - quiet
        systemd:
          units:
          - name: rke2-preinstall.service
            enabled: true
            contents: |
              [Unit]
              Description=rke2-preinstall
              Wants=network-online.target
              Before=rke2-install.service
              ConditionPathExists=!/run/cluster-api/bootstrap-success.complete
              [Service]
              Type=oneshot
              User=root
              ExecStartPre=/bin/sh -c "mount -L config-2 /mnt"
              ExecStart=/bin/sh -c "sed -i \"s/BAREMETALHOST_UUID/$(jq -r .uuid /mnt/openstack/latest/meta_data.json)/\" /etc/rancher/rke2/config.yaml"
              ExecStart=/bin/sh -c "echo \"node-name: $(jq -r .name /mnt/openstack/latest/meta_data.json)\" >> /etc/rancher/rke2/config.yaml"
              ExecStart=/bin/sh -c "echo \"node-label:\" >> /etc/rancher/rke2/config.yaml"
              ExecStart=/bin/sh -c "echo \"  - metal3.io/uuid=$(jq -r .uuid /mnt/openstack/latest/meta_data.json)\" >> /etc/rancher/rke2/config.yaml"
              ExecStartPost=/bin/sh -c "umount /mnt"
              [Install]
              WantedBy=multi-user.target
          # rke2-traefik-deployment.service unit to be removed once "traefik" being the default ingress controller (starting with RKE2 v1.36)
          - name: rke2-traefik-deployment.service
            enabled: true
            contents: |
              [Unit]
              Description=rke2-traefik-deployment
              Wants=rke2-preinstall.service
              Before=rke2-install.service
              ConditionPathExists=!/run/cluster-api/bootstrap-success.complete
              [Service]
              Type=oneshot
              User=root
              ExecStart=/bin/sh -c "echo \"ingress-controller: traefik\" >> /etc/rancher/rke2/config.yaml"
              [Install]
              WantedBy=multi-user.target
          - name: cpu-partitioning.service
            enabled: true
            contents: |
              [Unit]
              Description=cpu-partitioning
              Wants=network-online.target
              After=network.target network-online.target
              [Service]
              Type=oneshot
              User=root
              ExecStart=/bin/sh -c "echo isolated_cores=${ISOLATED_CPU_CORES} > /etc/tuned/cpu-partitioning-variables.conf"
              ExecStartPost=/bin/sh -c "tuned-adm profile cpu-partitioning"
              ExecStartPost=/bin/sh -c "systemctl enable tuned.service"
              [Install]
              WantedBy=multi-user.target
          - name: performance-settings.service
            enabled: true
            contents: |
              [Unit]
              Description=performance-settings
              Wants=network-online.target
              After=network.target network-online.target cpu-partitioning.service
              [Service]
              Type=oneshot
              User=root
              ExecStart=/bin/sh -c "/opt/performance-settings/performance-settings.sh"
              [Install]
              WantedBy=multi-user.target
          - name: sriov-custom-auto-vfs.service
            enabled: true
            contents: |
              [Unit]
              Description=SRIOV Custom Auto VF Creation
              Wants=network-online.target  rke2-server.target
              After=network.target network-online.target rke2-server.target
              [Service]
              User=root
              Type=forking
              TimeoutStartSec=900
              ExecStart=/bin/sh -c "while ! /var/lib/rancher/rke2/bin/kubectl --kubeconfig=/etc/rancher/rke2/rke2.yaml wait --for condition=ready nodes --all ; do sleep 2 ; done"
              ExecStartPost=/bin/sh -c "while [ $(/var/lib/rancher/rke2/bin/kubectl --kubeconfig=/etc/rancher/rke2/rke2.yaml get sriovnetworknodestates.sriovnetwork.openshift.io --ignore-not-found --no-headers -A | wc -l) -eq 0 ]; do sleep 1; done"
              ExecStartPost=/bin/sh -c "/opt/sriov/sriov-auto-filler.sh"
              RemainAfterExit=yes
              KillMode=process
              [Install]
              WantedBy=multi-user.target
    kubelet:
      extraArgs:
      - provider-id=metal3://BAREMETALHOST_UUID
    nodeName: "localhost.localdomain"

Una vez creado el archivo uniendo los bloques anteriores, se debe ejecutar el siguiente comando en el clúster de gestión para comenzar a aprovisionar el nuevo clúster descendente utilizando las funcionalidades de Telco:

$ kubectl apply -f capi-provisioning-example.yaml