12 Conexiones de red de Edge #
En esta sección se describe el enfoque de la configuración de redes en la solución SUSE Edge. Se explica cómo configurar NetworkManager en SUSE Linux Micro de forma declarativa y cómo se integran las herramientas relacionadas.
12.1 Descripción general de NetworkManager #
NetworkManager es una herramienta que gestiona la conexión de red principal y otras interfaces de conexión.
NetworkManager almacena las configuraciones de redes como archivos de
conexión que contienen el estado deseado en el directorio
/etc/NetworkManager/system-connections/
.
Encontrará más información sobre NetworkManager en la documentación de SUSE Linux Micro.
12.2 Descripción general de nmstate #
nmstate es una biblioteca de amplia adopción (que incluye una herramienta de interfaz de línea de comandos) que ofrece una API declarativa para configuraciones de red a través de un esquema predefinido.
Encontrará información sobre nmstate en la documentación original.
12.3 NetworkManager Configurator (nmc) #
Para acceder a las opciones de personalización de redes disponibles en SUSE Edge se usa una herramienta de interfaz de línea de comandos llamada NetworkManager Configurator, o nmc para abreviar. Aprovecha la funcionalidad que ofrece la biblioteca nmstate y es capaz de configurar por si sola direcciones IP estáticas, servidores DNS, VLAN, vinculaciones, puentes, etc. Esta herramienta permite generar configuraciones de redes a partir de estados predefinidos deseados y aplicarlas de forma automatizada en muchos nodos diferentes.
Encontrará información sobre NetworkManager Configurator (nmc) en el repositorio original.
12.4 ¿Cómo se usa NetworkManager Configurator en SUSE Edge? #
SUSE Edge usa nmc para personalizar las redes en los distintos modelos de aprovisionamiento:
Configuraciones de red personalizadas en casos de aprovisionamiento de red dirigida (Capítulo 1, Despliegues automatizados de BMC con Metal3)
Configuraciones estáticas declarativas en casos de aprovisionamiento basado en imágenes (Capítulo 3, Clústeres independientes con Edge Image Builder)
12.5 Configuración con Edge Image Builder #
Edge Image Builder (EIB) es una herramienta que permite configurar varios hosts con una sola imagen del sistema operativo. En esta sección, se muestra cómo se puede utilizar un enfoque declarativo para describir los estados de red deseados, cómo se convierten en las respectivas conexiones de NetworkManager y cómo se aplican durante el proceso de aprovisionamiento.
12.5.1 Requisitos previos #
Si está siguiendo esta guía, se entiende que ya dispone de lo siguiente:
Un host físico (o máquina virtual) AMD64/Intel 64 que ejecute SLES 15 SP6 u openSUSE Leap 15.6
Un entorno de ejecución de contenedores disponible (por ejemplo, Podman)
Una copia de la imagen RAW de SUSE Linux Micro 6.1 que se encuentra aquí
12.5.2 Obtención de la imagen del contenedor de Edge Image Builder #
La imagen del contenedor de EIB está disponible públicamente y se puede descargar desde el registro de SUSE Edge ejecutando:
podman pull registry.suse.com/edge/3.3/edge-image-builder:1.2.1
12.5.3 Creación del directorio de configuración de imágenes #
Para empezar, se crea el directorio de configuración:
export CONFIG_DIR=$HOME/eib
mkdir -p $CONFIG_DIR/base-images
Ahora, hay que asegurarse de que la copia de la imagen base descargada se traslade al directorio de configuración:
mv /path/to/downloads/SL-Micro.x86_64-6.1-Base-GM.raw $CONFIG_DIR/base-images/
NotaEIB nunca modificará la imagen base introducida. Creará una nueva imagen con sus modificaciones.
El directorio de configuración en este momento debería tener el siguiente aspecto:
└── base-images/
└── SL-Micro.x86_64-6.1-Base-GM.raw
12.5.4 Creación del archivo de definición de imagen #
El archivo de definición describe la mayoría de las opciones configurables que admite Edge Image Builder.
Comencemos con un archivo de definición muy básico para nuestra imagen del sistema operativo:
cat << EOF > $CONFIG_DIR/definition.yaml
apiVersion: 1.2
image:
arch: x86_64
imageType: raw
baseImage: SL-Micro.x86_64-6.1-Base-GM.raw
outputImageName: modified-image.raw
operatingSystem:
users:
- username: root
encryptedPassword: $6$jHugJNNd3HElGsUZ$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
EOF
La sección image
es obligatoria y especifica la imagen de
entrada, su arquitectura y su tipo, así como el nombre que se le dará a la
imagen de salida. La sección operatingSystem
es opcional
y contiene la configuración para habilitar el inicio de sesión en los
sistemas aprovisionados con el nombre de usuario/contraseña
root/eib
.
NotaPuede usar libremente su propia contraseña cifrada ejecutando
openssl passwd -6 <contraseña>
.
El directorio de configuración en este momento debería tener el siguiente aspecto:
├── definition.yaml
└── base-images/
└── SL-Micro.x86_64-6.1-Base-GM.raw
12.5.5 Definición de las configuraciones de redes #
Las configuraciones de redes deseadas no forman parte del archivo de
definición de imagen que se acaba de crear. Se introducen ahora en el
directorio network/
especial. Vamos a crearlo:
mkdir -p $CONFIG_DIR/network
Como se mencionó anteriormente, la herramienta NetworkManager Configurator (nmc) espera una entrada en forma de esquema predefinido. Encontrará cómo configurar una amplia variedad de opciones de red diferentes en la documentación de ejemplos de NMState original.
En esta guía se explica cómo configurar la red en tres nodos diferentes:
Un nodo que usa dos interfaces Ethernet
Un nodo que usa vinculación de interfaces de red
Un nodo que usa un puente de redes
No se recomienda utilizar configuraciones de redes completamente diferentes en entornos de producción, especialmente si se configuran clústeres de Kubernetes. Las configuraciones de redes deben ser, por lo general, homogéneas entre los nodos o, al menos, entre las funciones dentro de un clúster determinado. Esta guía incluye varias opciones diferentes solo a modo de referencia.
NotaEn el ejemplo siguiente se entiende que se usa una red
libvirt
predeterminada con un rango de direcciones IP192.168.122.1/24
. Ajústelo según las necesidades concretas de su entorno.
Vamos a crear los estados deseados para el primer nodo, al que llamaremos
node1.suse.com
:
cat << EOF > $CONFIG_DIR/network/node1.suse.com.yaml
routes:
config:
- destination: 0.0.0.0/0
metric: 100
next-hop-address: 192.168.122.1
next-hop-interface: eth0
table-id: 254
- destination: 192.168.122.0/24
metric: 100
next-hop-address:
next-hop-interface: eth0
table-id: 254
dns-resolver:
config:
server:
- 192.168.122.1
- 8.8.8.8
interfaces:
- name: eth0
type: ethernet
state: up
mac-address: 34:8A:B1:4B:16:E1
ipv4:
address:
- ip: 192.168.122.50
prefix-length: 24
dhcp: false
enabled: true
ipv6:
enabled: false
- name: eth3
type: ethernet
state: down
mac-address: 34:8A:B1:4B:16:E2
ipv4:
address:
- ip: 192.168.122.55
prefix-length: 24
dhcp: false
enabled: true
ipv6:
enabled: false
EOF
En este ejemplo, definimos el estado deseado de dos interfaces Ethernet (eth0 y eth3), sus direcciones IP solicitadas, el enrutamiento y la resolución DNS.
Debe asegurarse de que las direcciones MAC de todas las interfaces Ethernet estén incluidas en la lista. Estas direcciones se utilizan durante el proceso de aprovisionamiento como identificadores de los nodos y sirven para determinar qué configuraciones deben aplicarse. De esta manera, podemos configurar varios nodos utilizando una sola imagen ISO o RAW.
El siguiente es el segundo nodo, al que llamaremos
node2.suse.com
y que utilizará vinculación de interfaces
de red:
cat << EOF > $CONFIG_DIR/network/node2.suse.com.yaml
routes:
config:
- destination: 0.0.0.0/0
metric: 100
next-hop-address: 192.168.122.1
next-hop-interface: bond99
table-id: 254
- destination: 192.168.122.0/24
metric: 100
next-hop-address:
next-hop-interface: bond99
table-id: 254
dns-resolver:
config:
server:
- 192.168.122.1
- 8.8.8.8
interfaces:
- name: bond99
type: bond
state: up
ipv4:
address:
- ip: 192.168.122.60
prefix-length: 24
enabled: true
link-aggregation:
mode: balance-rr
options:
miimon: '140'
port:
- eth0
- eth1
- name: eth0
type: ethernet
state: up
mac-address: 34:8A:B1:4B:16:E3
ipv4:
enabled: false
ipv6:
enabled: false
- name: eth1
type: ethernet
state: up
mac-address: 34:8A:B1:4B:16:E4
ipv4:
enabled: false
ipv6:
enabled: false
EOF
En este ejemplo definimos un estado deseado de dos interfaces Ethernet (eth0 y eth1) que no permiten el direccionamiento IP, así como una vinculación con una directiva round-robin y su dirección respectiva que se utilizará para reenviar el tráfico de red.
Por último, crearemos el tercer y último archivo de estado deseado, que
usará un puente de red y al que llamaremos
node3.suse.com
:
cat << EOF > $CONFIG_DIR/network/node3.suse.com.yaml
routes:
config:
- destination: 0.0.0.0/0
metric: 100
next-hop-address: 192.168.122.1
next-hop-interface: linux-br0
table-id: 254
- destination: 192.168.122.0/24
metric: 100
next-hop-address:
next-hop-interface: linux-br0
table-id: 254
dns-resolver:
config:
server:
- 192.168.122.1
- 8.8.8.8
interfaces:
- name: eth0
type: ethernet
state: up
mac-address: 34:8A:B1:4B:16:E5
ipv4:
enabled: false
ipv6:
enabled: false
- name: linux-br0
type: linux-bridge
state: up
ipv4:
address:
- ip: 192.168.122.70
prefix-length: 24
dhcp: false
enabled: true
bridge:
options:
group-forward-mask: 0
mac-ageing-time: 300
multicast-snooping: true
stp:
enabled: true
forward-delay: 15
hello-time: 2
max-age: 20
priority: 32768
port:
- name: eth0
stp-hairpin-mode: false
stp-path-cost: 100
stp-priority: 32
EOF
El directorio de configuración en este momento debería tener el siguiente aspecto:
├── definition.yaml
├── network/
│ │── node1.suse.com.yaml
│ │── node2.suse.com.yaml
│ └── node3.suse.com.yaml
└── base-images/
└── SL-Micro.x86_64-6.1-Base-GM.raw
NotaLos nombres de los archivos del directorio
network/
son intencionados. Corresponden a los nombres de host que se establecerán durante el proceso de aprovisionamiento.
12.5.6 Creación de la imagen del sistema operativo #
Ahora que todas las configuraciones necesarias están listas, podemos crear la imagen ejecutando:
podman run --rm -it -v $CONFIG_DIR:/eib registry.suse.com/edge/3.3/edge-image-builder:1.2.1 build --definition-file definition.yaml
El resultado debe ser parecido a esto:
Generating image customization components...
Identifier ................... [SUCCESS]
Custom Files ................. [SKIPPED]
Time ......................... [SKIPPED]
Network ...................... [SUCCESS]
Groups ....................... [SKIPPED]
Users ........................ [SUCCESS]
Proxy ........................ [SKIPPED]
Rpm .......................... [SKIPPED]
Systemd ...................... [SKIPPED]
Elemental .................... [SKIPPED]
Suma ......................... [SKIPPED]
Embedded Artifact Registry ... [SKIPPED]
Keymap ....................... [SUCCESS]
Kubernetes ................... [SKIPPED]
Certificates ................. [SKIPPED]
Building RAW image...
Kernel Params ................ [SKIPPED]
Image build complete!
El fragmento anterior nos indica que el componente
Network
se ha configurado correctamente y que podemos
continuar con el aprovisionamiento de nuestros nodos periféricos.
NotaEs posible inspeccionar un archivo de registro (
network-config.log
) y los respectivos archivos de conexión de NetworkManager en el directorio_build
resultante, dentro de un directorio con marca de hora de la ejecución de la imagen.
12.5.7 Aprovisionamiento de los nodos periféricos #
Vamos a copiar la imagen RAW resultante:
mkdir edge-nodes && cd edge-nodes
for i in {1..4}; do cp $CONFIG_DIR/modified-image.raw node$i.raw; done
Notará que hemos copiado la imagen creada cuatro veces, pero solo especificamos las configuraciones de redes para tres nodos. Esto se debe a que también queremos mostrar lo que sucederá si aprovisionamos un nodo que no coincide con ninguna de las configuraciones deseadas.
NotaEn esta guía se usará virtualización para los ejemplos de aprovisionamiento de nodos. Asegúrese de que estén habilitadas las extensiones necesarias en el BIOS (consulte este documento para obtener más detalles).
Utilizaremos virt-install
para crear máquinas virtuales
utilizando los discos sin procesar copiados. Cada máquina virtual utilizará
10 GB de RAM y 6 CPU virtuales.
12.5.7.1 Aprovisionamiento del primer nodo #
Vamos a crear la máquina virtual:
virt-install --name node1 --ram 10000 --vcpus 6 --disk path=node1.raw,format=raw --osinfo detect=on,name=sle-unknown --graphics none --console pty,target_type=serial --network default,mac=34:8A:B1:4B:16:E1 --network default,mac=34:8A:B1:4B:16:E2 --virt-type kvm --import
NotaEs importante que creemos las interfaces de red con las mismas direcciones MAC que las del estado deseado que hemos descrito anteriormente.
Una vez completada la operación, veremos algo similar a lo siguiente:
Starting install...
Creating domain...
Running text console command: virsh --connect qemu:///system console node1
Connected to domain 'node1'
Escape character is ^] (Ctrl + ])
Welcome to SUSE Linux Micro 6.0 (x86_64) - Kernel 6.4.0-18-default (tty1).
SSH host key: SHA256:XN/R5Tw43reG+QsOw480LxCnhkc/1uqMdwlI6KUBY70 (RSA)
SSH host key: SHA256:/96yGrPGKlhn04f1rb9cXv/2WJt4TtrIN5yEcN66r3s (DSA)
SSH host key: SHA256:Dy/YjBQ7LwjZGaaVcMhTWZNSOstxXBsPsvgJTJq5t00 (ECDSA)
SSH host key: SHA256:TNGqY1LRddpxD/jn/8dkT/9YmVl9hiwulqmayP+wOWQ (ED25519)
eth0: 192.168.122.50
eth1:
Configured with the Edge Image Builder
Activate the web console with: systemctl enable --now cockpit.socket
node1 login:
Ahora podemos iniciar sesión con el par de credenciales
root:eib
. Si lo preferimos, también podemos conectarnos
por SSH al host, en lugar de a la consola virsh
que se
presenta aquí.
Cuando haya iniciado sesión, confirmaremos que todos los ajustes estén correctos.
Verifique que el nombre de host esté configurado correctamente:
node1:~ # hostnamectl
Static hostname: node1.suse.com
...
Verifique que la configuración de enrutamiento sea correcta:
node1:~ # ip r
default via 192.168.122.1 dev eth0 proto static metric 100
192.168.122.0/24 dev eth0 proto static scope link metric 100
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.50 metric 100
Verifique que la conexión a Internet esté disponible:
node1:~ # ping google.com
PING google.com (142.250.72.78) 56(84) bytes of data.
64 bytes from den16s09-in-f14.1e100.net (142.250.72.78): icmp_seq=1 ttl=56 time=13.2 ms
64 bytes from den16s09-in-f14.1e100.net (142.250.72.78): icmp_seq=2 ttl=56 time=13.4 ms
^C
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 13.248/13.304/13.361/0.056 ms
Verifique que haya exactamente dos interfaces Ethernet configuradas y que solo una de ellas esté activa:
node1:~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 34:8a:b1:4b:16:e1 brd ff:ff:ff:ff:ff:ff
altname enp0s2
altname ens2
inet 192.168.122.50/24 brd 192.168.122.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 34:8a:b1:4b:16:e2 brd ff:ff:ff:ff:ff:ff
altname enp0s3
altname ens3
node1:~ # nmcli -f NAME,UUID,TYPE,DEVICE,FILENAME con show
NAME UUID TYPE DEVICE FILENAME
eth0 dfd202f5-562f-5f07-8f2a-a7717756fb70 ethernet eth0 /etc/NetworkManager/system-connections/eth0.nmconnection
eth1 7e211aea-3d14-59cf-a4fa-be91dac5dbba ethernet -- /etc/NetworkManager/system-connections/eth1.nmconnection
Notará que la segunda interfaz es eth1
en lugar de la
predefinida en nuestro estado de red deseado, eth3
. Esto
se debe a que NetworkManager Configurator (nmc) es
capaz de detectar que el sistema operativo ha asignado un nombre diferente a
la tarjeta de red con la dirección MAC 34:8a:b1:4b:16:e2
y ajusta su configuración en consecuencia.
Verifique que, efectivamente, esto sea así inspeccionando la fase de Combustion del aprovisionamiento:
node1:~ # journalctl -u combustion | grep nmc
Apr 23 09:20:19 localhost.localdomain combustion[1360]: [2024-04-23T09:20:19Z INFO nmc::apply_conf] Identified host: node1.suse.com
Apr 23 09:20:19 localhost.localdomain combustion[1360]: [2024-04-23T09:20:19Z INFO nmc::apply_conf] Set hostname: node1.suse.com
Apr 23 09:20:19 localhost.localdomain combustion[1360]: [2024-04-23T09:20:19Z INFO nmc::apply_conf] Processing interface 'eth0'...
Apr 23 09:20:19 localhost.localdomain combustion[1360]: [2024-04-23T09:20:19Z INFO nmc::apply_conf] Processing interface 'eth3'...
Apr 23 09:20:19 localhost.localdomain combustion[1360]: [2024-04-23T09:20:19Z INFO nmc::apply_conf] Using interface name 'eth1' instead of the preconfigured 'eth3'
Apr 23 09:20:19 localhost.localdomain combustion[1360]: [2024-04-23T09:20:19Z INFO nmc] Successfully applied config
Ahora, aprovisionaremos el resto de los nodos, pero solo mostraremos las diferencias en la configuración final. No dude en aplicar cualquiera de las comprobaciones anteriores, o todas ellas, a todos los nodos que vaya a aprovisionar.
12.5.7.2 Aprovisionamiento del segundo nodo #
Vamos a crear la máquina virtual:
virt-install --name node2 --ram 10000 --vcpus 6 --disk path=node2.raw,format=raw --osinfo detect=on,name=sle-unknown --graphics none --console pty,target_type=serial --network default,mac=34:8A:B1:4B:16:E3 --network default,mac=34:8A:B1:4B:16:E4 --virt-type kvm --import
Cuando la máquina virtual esté activa y en funcionamiento, se puede confirmar que este nodo está utilizando interfaces vinculadas:
node2:~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond99 state UP group default qlen 1000
link/ether 34:8a:b1:4b:16:e3 brd ff:ff:ff:ff:ff:ff
altname enp0s2
altname ens2
3: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond99 state UP group default qlen 1000
link/ether 34:8a:b1:4b:16:e3 brd ff:ff:ff:ff:ff:ff permaddr 34:8a:b1:4b:16:e4
altname enp0s3
altname ens3
4: bond99: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 34:8a:b1:4b:16:e3 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.60/24 brd 192.168.122.255 scope global noprefixroute bond99
valid_lft forever preferred_lft forever
Confirme que el enrutamiento utiliza la vinculación de interfaces:
node2:~ # ip r
default via 192.168.122.1 dev bond99 proto static metric 100
192.168.122.0/24 dev bond99 proto static scope link metric 100
192.168.122.0/24 dev bond99 proto kernel scope link src 192.168.122.60 metric 300
Asegúrese de que los archivos de conexión estática se utilicen correctamente:
node2:~ # nmcli -f NAME,UUID,TYPE,DEVICE,FILENAME con show
NAME UUID TYPE DEVICE FILENAME
bond99 4a920503-4862-5505-80fd-4738d07f44c6 bond bond99 /etc/NetworkManager/system-connections/bond99.nmconnection
eth0 dfd202f5-562f-5f07-8f2a-a7717756fb70 ethernet eth0 /etc/NetworkManager/system-connections/eth0.nmconnection
eth1 0523c0a1-5f5e-5603-bcf2-68155d5d322e ethernet eth1 /etc/NetworkManager/system-connections/eth1.nmconnection
12.5.7.3 Aprovisionamiento del tercer nodo #
Vamos a crear la máquina virtual:
virt-install --name node3 --ram 10000 --vcpus 6 --disk path=node3.raw,format=raw --osinfo detect=on,name=sle-unknown --graphics none --console pty,target_type=serial --network default,mac=34:8A:B1:4B:16:E5 --virt-type kvm --import
Cuando la máquina virtual está activa y en funcionamiento, se puede confirmar que este nodo está utilizando un puente de red:
node3:~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master linux-br0 state UP group default qlen 1000
link/ether 34:8a:b1:4b:16:e5 brd ff:ff:ff:ff:ff:ff
altname enp0s2
altname ens2
3: linux-br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 34:8a:b1:4b:16:e5 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.70/24 brd 192.168.122.255 scope global noprefixroute linux-br0
valid_lft forever preferred_lft forever
Confirme que el enrutamiento utiliza el puente:
node3:~ # ip r
default via 192.168.122.1 dev linux-br0 proto static metric 100
192.168.122.0/24 dev linux-br0 proto static scope link metric 100
192.168.122.0/24 dev linux-br0 proto kernel scope link src 192.168.122.70 metric 425
Asegúrese de que los archivos de conexión estática se utilicen correctamente:
node3:~ # nmcli -f NAME,UUID,TYPE,DEVICE,FILENAME con show
NAME UUID TYPE DEVICE FILENAME
linux-br0 1f8f1469-ed20-5f2c-bacb-a6767bee9bc0 bridge linux-br0 /etc/NetworkManager/system-connections/linux-br0.nmconnection
eth0 dfd202f5-562f-5f07-8f2a-a7717756fb70 ethernet eth0 /etc/NetworkManager/system-connections/eth0.nmconnection
12.5.7.4 Aprovisionamiento del cuarto nodo #
Por último, se aprovisionará un nodo que no coincida con ninguna de las configuraciones predefinidas por una dirección MAC. En estos casos, utilizaremos DHCP de forma predeterminada para configurar las interfaces de red.
Vamos a crear la máquina virtual:
virt-install --name node4 --ram 10000 --vcpus 6 --disk path=node4.raw,format=raw --osinfo detect=on,name=sle-unknown --graphics none --console pty,target_type=serial --network default --virt-type kvm --import
Cuando la máquina virtual esté activa y en funcionamiento, podemos confirmar que este nodo utiliza una dirección IP aleatoria para su interfaz de red:
localhost:~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:56:63:71 brd ff:ff:ff:ff:ff:ff
altname enp0s2
altname ens2
inet 192.168.122.86/24 brd 192.168.122.255 scope global dynamic noprefixroute eth0
valid_lft 3542sec preferred_lft 3542sec
inet6 fe80::5054:ff:fe56:6371/64 scope link noprefixroute
valid_lft forever preferred_lft forever
Verifique que nmc no ha podido aplicar configuraciones estáticas para este nodo:
localhost:~ # journalctl -u combustion | grep nmc
Apr 23 12:15:45 localhost.localdomain combustion[1357]: [2024-04-23T12:15:45Z ERROR nmc] Applying config failed: None of the preconfigured hosts match local NICs
Verifique que la interfaz Ethernet se haya configurado mediante DHCP:
localhost:~ # journalctl | grep eth0
Apr 23 12:15:29 localhost.localdomain NetworkManager[704]: <info> [1713874529.7801] manager: (eth0): new Ethernet device (/org/freedesktop/NetworkManager/Devices/2)
Apr 23 12:15:29 localhost.localdomain NetworkManager[704]: <info> [1713874529.7802] device (eth0): state change: unmanaged -> unavailable (reason 'managed', sys-iface-state: 'external')
Apr 23 12:15:29 localhost.localdomain NetworkManager[704]: <info> [1713874529.7929] device (eth0): carrier: link connected
Apr 23 12:15:29 localhost.localdomain NetworkManager[704]: <info> [1713874529.7931] device (eth0): state change: unavailable -> disconnected (reason 'carrier-changed', sys-iface-state: 'managed')
Apr 23 12:15:29 localhost.localdomain NetworkManager[704]: <info> [1713874529.7944] device (eth0): Activation: starting connection 'Wired Connection' (300ed658-08d4-4281-9f8c-d1b8882d29b9)
Apr 23 12:15:29 localhost.localdomain NetworkManager[704]: <info> [1713874529.7945] device (eth0): state change: disconnected -> prepare (reason 'none', sys-iface-state: 'managed')
Apr 23 12:15:29 localhost.localdomain NetworkManager[704]: <info> [1713874529.7947] device (eth0): state change: prepare -> config (reason 'none', sys-iface-state: 'managed')
Apr 23 12:15:29 localhost.localdomain NetworkManager[704]: <info> [1713874529.7953] device (eth0): state change: config -> ip-config (reason 'none', sys-iface-state: 'managed')
Apr 23 12:15:29 localhost.localdomain NetworkManager[704]: <info> [1713874529.7964] dhcp4 (eth0): activation: beginning transaction (timeout in 90 seconds)
Apr 23 12:15:33 localhost.localdomain NetworkManager[704]: <info> [1713874533.1272] dhcp4 (eth0): state changed new lease, address=192.168.122.86
localhost:~ # nmcli -f NAME,UUID,TYPE,DEVICE,FILENAME con show
NAME UUID TYPE DEVICE FILENAME
Wired Connection 300ed658-08d4-4281-9f8c-d1b8882d29b9 ethernet eth0 /var/run/NetworkManager/system-connections/default_connection.nmconnection
12.5.8 Configuraciones unificadas de nodos #
Hay ocasiones en las que no es posible basarse en direcciones MAC
conocidas. En esos casos, podemos optar por la denominada
configuración unificada, que permite especificar los
ajustes en un archivo _all.yaml
que luego se aplicará a
todos los nodos aprovisionados.
Crearemos y aprovisionaremos un nodo periférico con una estructura de configuración diferente. Siga todos los pasos desde la Sección 12.5.3, “Creación del directorio de configuración de imágenes” hasta la Sección 12.5.5, “Definición de las configuraciones de redes”.
En este ejemplo, definimos un estado deseado de dos interfaces Ethernet (eth0 y eth1): una utiliza DHCP y a la otra se le asigna una dirección IP estática.
mkdir -p $CONFIG_DIR/network
cat <<- EOF > $CONFIG_DIR/network/_all.yaml
interfaces:
- name: eth0
type: ethernet
state: up
ipv4:
dhcp: true
enabled: true
ipv6:
enabled: false
- name: eth1
type: ethernet
state: up
ipv4:
address:
- ip: 10.0.0.1
prefix-length: 24
enabled: true
dhcp: false
ipv6:
enabled: false
EOF
Vamos a crear la imagen:
podman run --rm -it -v $CONFIG_DIR:/eib registry.suse.com/edge/3.3/edge-image-builder:1.2.1 build --definition-file definition.yaml
Cuando la imagen se haya creado correctamente, crearemos una máquina virtual con dicha imagen:
virt-install --name node1 --ram 10000 --vcpus 6 --disk path=$CONFIG_DIR/modified-image.raw,format=raw --osinfo detect=on,name=sle-unknown --graphics none --console pty,target_type=serial --network default --network default --virt-type kvm --import
El proceso de aprovisionamiento puede tardar unos minutos. Una vez finalizado, inicie sesión en el sistema con las credenciales proporcionadas.
Verifique que la configuración de enrutamiento sea correcta:
localhost:~ # ip r
default via 192.168.122.1 dev eth0 proto dhcp src 192.168.122.100 metric 100
10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.1 metric 101
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.100 metric 100
Verifique que la conexión a Internet esté disponible:
localhost:~ # ping google.com
PING google.com (142.250.72.46) 56(84) bytes of data.
64 bytes from den16s08-in-f14.1e100.net (142.250.72.46): icmp_seq=1 ttl=56 time=14.3 ms
64 bytes from den16s08-in-f14.1e100.net (142.250.72.46): icmp_seq=2 ttl=56 time=14.2 ms
^C
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 14.196/14.260/14.324/0.064 ms
Verifique que las interfaces Ethernet estén configuradas y activas:
localhost:~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:26:44:7a brd ff:ff:ff:ff:ff:ff
altname enp1s0
inet 192.168.122.100/24 brd 192.168.122.255 scope global dynamic noprefixroute eth0
valid_lft 3505sec preferred_lft 3505sec
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:ec:57:9e brd ff:ff:ff:ff:ff:ff
altname enp7s0
inet 10.0.0.1/24 brd 10.0.0.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
localhost:~ # nmcli -f NAME,UUID,TYPE,DEVICE,FILENAME con show
NAME UUID TYPE DEVICE FILENAME
eth0 dfd202f5-562f-5f07-8f2a-a7717756fb70 ethernet eth0 /etc/NetworkManager/system-connections/eth0.nmconnection
eth1 0523c0a1-5f5e-5603-bcf2-68155d5d322e ethernet eth1 /etc/NetworkManager/system-connections/eth1.nmconnection
localhost:~ # cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
autoconnect=true
autoconnect-slaves=-1
id=eth0
interface-name=eth0
type=802-3-ethernet
uuid=dfd202f5-562f-5f07-8f2a-a7717756fb70
[ipv4]
dhcp-client-id=mac
dhcp-send-hostname=true
dhcp-timeout=2147483647
ignore-auto-dns=false
ignore-auto-routes=false
method=auto
never-default=false
[ipv6]
addr-gen-mode=0
dhcp-timeout=2147483647
method=disabled
localhost:~ # cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
autoconnect=true
autoconnect-slaves=-1
id=eth1
interface-name=eth1
type=802-3-ethernet
uuid=0523c0a1-5f5e-5603-bcf2-68155d5d322e
[ipv4]
address0=10.0.0.1/24
dhcp-timeout=2147483647
method=manual
[ipv6]
addr-gen-mode=0
dhcp-timeout=2147483647
method=disabled
12.5.9 Configuraciones de red personalizadas #
Ya hemos tratado la configuración de red predeterminada para Edge Image Builder, que se basa en NetworkManager Configurator. Sin embargo, también existe la opción de modificarla mediante un guion personalizado. Aunque esta opción es muy flexible y tampoco depende de la dirección MAC, su limitación radica en el hecho de que su uso resulta mucho menos práctico cuando se arrancan varios nodos con una sola imagen.
NotaSe recomienda utilizar la configuración de red predeterminada mediante archivos que describen los estados de red deseados en el directorio
/network
. Utilice guiones personalizados únicamente cuando ese comportamiento no sea aplicable a su caso de uso.
Crearemos y aprovisionaremos un nodo periférico con una estructura de configuración diferente. Siga todos los pasos desde la Sección 12.5.3, “Creación del directorio de configuración de imágenes” hasta la Sección 12.5.5, “Definición de las configuraciones de redes”.
En este ejemplo, crearemos un guion personalizado que aplica una
configuración estática para la interfaz eth0
en todos los
nodos aprovisionados, además de eliminar e inhabilitar las conexiones con
cable que haya creado automáticamente NetworkManager. Esto resulta útil en
situaciones en las que se desea garantizar que todos los nodos del clúster
tengan una configuración de red idéntica, por lo que no es necesario
preocuparse por la dirección MAC de cada nodo antes de crear la imagen.
Para empezar, se almacena el archivo de conexión en el directorio
/custom/files
:
mkdir -p $CONFIG_DIR/custom/files
cat << EOF > $CONFIG_DIR/custom/files/eth0.nmconnection
[connection]
autoconnect=true
autoconnect-slaves=-1
autoconnect-retries=1
id=eth0
interface-name=eth0
type=802-3-ethernet
uuid=dfd202f5-562f-5f07-8f2a-a7717756fb70
wait-device-timeout=60000
[ipv4]
dhcp-timeout=2147483647
method=auto
[ipv6]
addr-gen-mode=eui64
dhcp-timeout=2147483647
method=disabled
EOF
Ahora que ya hemos creado la configuración estática, también crearemos nuestro guion de red personalizado:
mkdir -p $CONFIG_DIR/network
cat << EOF > $CONFIG_DIR/network/configure-network.sh
#!/bin/bash
set -eux
# Remove and disable wired connections
mkdir -p /etc/NetworkManager/conf.d/
printf "[main]\nno-auto-default=*\n" > /etc/NetworkManager/conf.d/no-auto-default.conf
rm -f /var/run/NetworkManager/system-connections/* || true
# Copy pre-configured network configuration files into NetworkManager
mkdir -p /etc/NetworkManager/system-connections/
cp eth0.nmconnection /etc/NetworkManager/system-connections/
chmod 600 /etc/NetworkManager/system-connections/*.nmconnection
EOF
chmod a+x $CONFIG_DIR/network/configure-network.sh
NotaEl binario de nmc seguirá estando incluido por defecto, por lo que también se puede utilizar en el guion
configure-network.sh
si es necesario.
El guion personalizado siempre debe proporcionarse en
/network/configure-network.sh
en el directorio de
configuración. Si está presente, se ignorarán todos los demás archivos. NO
es posible configurar una red utilizando simultáneamente configuraciones
estáticas en formato YAML y un guion personalizado.
El directorio de configuración en este momento debería tener el siguiente aspecto:
├── definition.yaml
├── custom/
│ └── files/
│ └── eth0.nmconnection
├── network/
│ └── configure-network.sh
└── base-images/
└── SL-Micro.x86_64-6.1-Base-GM.raw
Vamos a crear la imagen:
podman run --rm -it -v $CONFIG_DIR:/eib registry.suse.com/edge/3.3/edge-image-builder:1.2.1 build --definition-file definition.yaml
Cuando la imagen se haya creado correctamente, crearemos una máquina virtual con dicha imagen:
virt-install --name node1 --ram 10000 --vcpus 6 --disk path=$CONFIG_DIR/modified-image.raw,format=raw --osinfo detect=on,name=sle-unknown --graphics none --console pty,target_type=serial --network default --virt-type kvm --import
El proceso de aprovisionamiento puede tardar unos minutos. Una vez finalizado, inicie sesión en el sistema con las credenciales proporcionadas.
Verifique que la configuración de enrutamiento sea correcta:
localhost:~ # ip r
default via 192.168.122.1 dev eth0 proto dhcp src 192.168.122.185 metric 100
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.185 metric 100
Verifique que la conexión a Internet esté disponible:
localhost:~ # ping google.com
PING google.com (142.250.72.78) 56(84) bytes of data.
64 bytes from den16s09-in-f14.1e100.net (142.250.72.78): icmp_seq=1 ttl=56 time=13.6 ms
64 bytes from den16s09-in-f14.1e100.net (142.250.72.78): icmp_seq=2 ttl=56 time=13.6 ms
^C
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 13.592/13.599/13.606/0.007 ms
Verifique que se ha configurado de forma estática una interfaz Ethernet utilizando nuestro archivo de conexión y que esta interfaz esté activa:
localhost:~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:31:d0:1b brd ff:ff:ff:ff:ff:ff
altname enp0s2
altname ens2
inet 192.168.122.185/24 brd 192.168.122.255 scope global dynamic noprefixroute eth0
localhost:~ # nmcli -f NAME,UUID,TYPE,DEVICE,FILENAME con show
NAME UUID TYPE DEVICE FILENAME
eth0 dfd202f5-562f-5f07-8f2a-a7717756fb70 ethernet eth0 /etc/NetworkManager/system-connections/eth0.nmconnection
localhost:~ # cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
autoconnect=true
autoconnect-slaves=-1
autoconnect-retries=1
id=eth0
interface-name=eth0
type=802-3-ethernet
uuid=dfd202f5-562f-5f07-8f2a-a7717756fb70
wait-device-timeout=60000
[ipv4]
dhcp-timeout=2147483647
method=auto
[ipv6]
addr-gen-mode=eui64
dhcp-timeout=2147483647
method=disabled