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
La imagen generada mediante
EIB, tal como se describe en la sección anterior (Capítulo 49, Preparar la imagen del clúster descendente para escenarios conectados), debe estar ubicada en el clúster de gestión exactamente en la ruta que configuraste en esta sección (Nota).La imagen generada mediante
EIBdebe incluir los paquetes de telecomunicaciones específicos siguiendo esta sección (Sección 49.2.5, “Configuración adicional para cargas de trabajo de Telco”).El servidor de gestión creado y disponible para ser utilizado en las siguientes secciones. Para obtener más información, consultad la sección del Clúster de gestión: Parte V, “Configuración del clúster de gestión”.
Configuración
Utilizad las dos secciones siguientes como base para inscribir y aprovisionar los hosts:
Aprovisionamiento de clúster en sentido descendente con aprovisionamiento de red dirigido (nodo único) (Capítulo 51, Aprovisionamiento de clústeres en sentido descendente con aprovisionamiento de red dirigida (nodo único))
Aprovisionamiento de clúster en sentido descendente con aprovisionamiento de red dirigido (nodos múltiples) (Capítulo 52, Aprovisionamiento de clúster descendente con aprovisionamiento de red dirigido (multinodo))
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
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.yamlque se va a utilizar para definir las interfaces, los controladores y el número deVFsque se van a crear y exponer a las cargas de trabajo.Los valores dentro del mapa de configuración
sriov-custom-auto-configson los únicos valores que se deben reemplazar por valores reales.${RESOURCE_NAME1}— El nombre del recurso que se va a utilizar para la primera interfazPF(por ejemplo,sriov-resource-du1). Se añade al prefijorancher.iopara 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 interfazPFque se va a utilizar (por ejemplo,eth0).${PF_NAME1}— El nombre de la primera función físicaPFque 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 interfazVF(por ejemplo,vfio-pci).${NUM_VFS1}— El número deVFsque se van a crear para la primera interfazPF(por ejemplo,8).
El
/var/sriov-auto-filler.shque se va a utilizar como traductor entre el mapa de configuración de alto nivelsriov-custom-auto-configy elsriovnetworknodepolicyque 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 habilitarsr-iovy crearVFs.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.servicepara reemplazar automáticamenteBAREMETALHOST_UUIDynode-namedurante el proceso de aprovisionamiento utilizando la información de Ironic.cpu-partitioning.servicepara habilitar los núcleos de aislamiento deCPU(por ejemplo,1-30,33-62).performance-settings.servicepara habilitar el ajuste de rendimiento de la CPU.sriov-custom-auto-vfs.servicepara instalar el Helm chart desriov, esperar hasta que se creen los recursos personalizados y ejecutar/var/sriov-auto-filler.shpara reemplazar los valores en el config mapsriov-custom-auto-configy crear elsriovnetworknodepolicyque utilizarán las cargas de trabajo.
El
${RKE2_VERSION}es la versión deRKE2que 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