|Index|SUSE Edge Documentación
SUSE Edge 3.6

SUSE Edge Documentación

Fecha de publicación: 2026-05-27

SUSE Edge 3.6 Documentación

Bienvenido a la documentación de SUSE Edge. Encontrará la visión general de la arquitectura de alto nivel, guías de inicio rápido, diseños validados, orientación sobre el uso de componentes, integraciones de terceros y prácticas recomendadas para gestionar la infraestructura y las cargas de trabajo de edge computing.

1 ¿Qué es SUSE Edge?

SUSE Edge es una solución integral diseñada específicamente, estrechamente integrada y exhaustivamente validada para abordar los desafíos únicos del despliegue de infraestructura y aplicaciones nativas de nube en el edge. Su objetivo principal es proporcionar una plataforma con un enfoque definido, pero altamente flexible, altamente escalable y segura, que abarca desde la creación de imágenes para el despliegue inicial, el aprovisionamiento e incorporación de nodos, el despliegue de aplicaciones, la observabilidad y las operaciones completas del ciclo de vida. La plataforma se ha construido desde cero sobre el mejor software de código abierto, en consonancia tanto con nuestra trayectoria de más de 30 años ofreciendo plataformas SUSE Linux seguras, estables y certificadas, como con nuestra experiencia proporcionando una gestión de Kubernetes altamente escalable y rica en funciones con nuestra cartera Rancher. SUSE Edge se basa en estas capacidades para ofrecer una funcionalidad que puede abordar un gran número de segmentos de mercado, incluidos el comercio minorista, la medicina, el transporte, la logística, las telecomunicaciones, la fabricación inteligente y el IoT industrial.

2 Filosofía de diseño

La solución se ha diseñado con la idea de que no existe una plataforma edge «única para todos» debido a los requisitos y expectativas tan variados de los clientes. Los despliegues en el edge nos obligan a resolver y a evolucionar continuamente algunos de los problemas más desafiantes, como la escalabilidad masiva, la disponibilidad restringida de la red, las limitaciones de espacio físico, las nuevas amenazas de seguridad y vectores de ataque, las variaciones en la arquitectura de hardware y los recursos del sistema, el requisito de desplegar e interactuar con infraestructuras y aplicaciones heredadas, y las soluciones de cliente que tienen ciclos de vida prolongados. Dado que muchos de estos desafíos son diferentes de las formas tradicionales de pensar, por ejemplo, el despliegue de infraestructura y aplicaciones dentro de centros de datos o en la nube pública, tenemos que examinar el diseño con mucho más detalle y replantearnos muchas suposiciones comunes.

Por ejemplo, encontramos valor en el minimalismo, la modularidad y la facilidad de las operaciones. El minimalismo es importante para los entornos edge, ya que cuanto más complejo es un sistema, más probable es que falle. Al observar cientos de ubicaciones, hasta cientos de miles, los sistemas complejos fallarán de formas complejas. La modularidad en nuestra solución permite una mayor elección por parte del usuario al tiempo que elimina la complejidad innecesaria en la plataforma desplegada. También necesitamos equilibrar esto con la facilidad de las operaciones. Los humanos pueden cometer errores al repetir un proceso miles de veces, por lo que la plataforma debe asegurarse de que cualquier posible error sea recuperable, eliminando la necesidad de visitas de técnicos in situ, pero también esforzarse por lograr la coherencia y la estandarización.

3 Arquitectura de alto nivel

La arquitectura de alto nivel del sistema de SUSE Edge se divide en dos categorías principales: clústeres de «gestión» y clústeres en sentido descendente. El clúster de gestión es responsable de la gestión remota de uno o más clústeres en sentido descendente, aunque se reconoce que, en determinadas circunstancias, los clústeres en sentido descendente deben funcionar sin gestión remota, por ejemplo, en situaciones en las que un sitio edge no tiene conectividad externa y necesita funcionar de forma independiente. En SUSE Edge, los componentes técnicos que se utilizan para el funcionamiento tanto del clúster de gestión como de los de sentido descendente son en gran medida comunes, aunque es probable que se diferencien tanto en las especificaciones del sistema como en las aplicaciones que residen en ellos; es decir, el clúster de gestión ejecutaría aplicaciones que permiten la gestión de sistemas y las operaciones de ciclo de vida, mientras que los clústeres en sentido descendente cumplen los requisitos para servir aplicaciones de usuario.

3.1 Componentes utilizados en SUSE Edge

SUSE Edge se compone tanto de componentes existentes de SUSE y Rancher como de características y componentes adicionales creados por el equipo de Edge para permitirnos abordar las limitaciones y complejidades necesarias en edge computing. Los componentes utilizados tanto en el clúster de gestión como en los de sentido descendente se explican a continuación, con un diagrama de arquitectura de alto nivel simplificado, señalando que esta no es una lista exhaustiva:

3.1.1 Clúster de gestión

suse edge management cluster
  • Gestión: Esta es la parte centralizada de SUSE Edge que se utiliza para gestionar el aprovisionamiento y el ciclo de vida de los clústeres en sentido descendente conectados. El clúster de gestión suele incluir los siguientes componentes:

    • Gestión de múltiples clústeres con Rancher Prime (Capítulo 4, Rancher), que permite un panel común para la incorporación de clústeres en sentido descendente y la gestión continua del ciclo de vida de la infraestructura y las aplicaciones, proporcionando además un aislamiento completo de inquilinos e integraciones de IDP (proveedor de identidad), un gran mercado de integraciones y extensiones de terceros, y una API independiente del proveedor.

    • Gestión de sistemas Linux con SUSE Multi-Linux Manager, que permite la gestión automatizada de parches y configuración de Linux del sistema operativo Linux subyacente (*SUSE Linux Micro (Capítulo 7, SUSE Linux Micro)) que se ejecuta en los clústeres en sentido descendente. Tenga en cuenta que, aunque este componente está en contenedores, actualmente necesita ejecutarse en un sistema separado del resto de los componentes de gestión, por lo que aparece etiquetado como "Linux Management" en el diagrama anterior.

    • Un controlador de Lifecycle Management (Capítulo 19, Controlador de actualización) dedicado que gestiona las actualizaciones de los componentes del clúster de gestión a una versión de SUSE Edge determinada.

    • Incorporación remota de sistemas a Rancher Prime con Elemental (Capítulo 10, Elemental), lo que permite la vinculación tardía de nodos edge conectados a los clústeres de Kubernetes deseados y el despliegue de aplicaciones, por ejemplo, mediante GitOps.

    • Un motor GitOps opcional llamado Fleet (Capítulo 6, Fleet) para gestionar el aprovisionamiento y el ciclo de vida de los clústeres en sentido descendente y las aplicaciones que residen en ellos.

    • Como base del propio clúster de gestión se encuentra SUSE Linux Micro (Capítulo 7, SUSE Linux Micro) como sistema operativo base y RKE2 (Capítulo 12, RKE2) como la distribución de Kubernetes que soporta las aplicaciones del clúster de gestión.

3.1.2 Clústeres en sentido descendente

suse edge downstream cluster
  • Sentido descendente: Esta es la parte distribuida de SUSE Edge que se utiliza para ejecutar las cargas de trabajo del usuario en el edge, es decir, el software que se ejecuta en la propia ubicación del edge, y que normalmente se compone de los siguientes componentes:

    • Una selección de distribuciones de Kubernetes, con distribuciones seguras y ligeras como K3s (Capítulo 11, K3s) y RKE2 (Capítulo 12, RKE2) (RKE2 está reforzada, certificada y optimizada para su uso en el gobierno y en sectores regulados).

    • SUSE Security (Capítulo 14, SUSE Security) para habilitar funciones de seguridad como el escaneo de vulnerabilidades de imágenes, la inspección profunda de paquetes y la protección contra amenazas y vulnerabilidades en tiempo real.

    • Almacenamiento en bloques de software con SUSE Storage (Capítulo 13, SUSE Storage) para habilitar un almacenamiento en bloques ligero, persistente, resistente y escalable.

    • Un sistema operativo Linux ligero, optimizado para contenedores y reforzado con SUSE Linux Micro (Capítulo 7, SUSE Linux Micro), que proporciona un SO inmutable y altamente resistente para ejecutar contenedores y máquinas virtuales en el edge. SUSE Linux Micro está disponible tanto para arquitecturas AArch64 como para AMD64/Intel 64, y también es compatible con Real-Time Kernel para aplicaciones sensibles a la latencia (por ejemplo, casos de uso de telecomunicaciones).

    • Para los clústeres conectados (es decir, aquellos que tienen conectividad con el clúster de gestión) se despliegan dos agentes, a saber, Rancher System Agent para gestionar la conectividad con Rancher Prime, y venv-salt-minion para recibir instrucciones de SUSE Multi-Linux Manager para aplicar actualizaciones de software de Linux. Estos agentes no son necesarios para la gestión de clústeres desconectados.

3.2 Conectividad

suse edge connected architecture

La imagen anterior proporciona una visión general de la arquitectura de alto nivel para los clústeres en sentido descendente conectados y su conexión al clúster de gestión. El clúster de gestión puede desplegarse en una amplia variedad de plataformas de infraestructura subyacentes, tanto en capacidades in situ como en la nube, dependiendo de la disponibilidad de red entre los clústeres en sentido descendente y el clúster de gestión de destino. El único requisito para que esto funcione es que las URL de API y de devolución de llamada sean accesibles a través de la red que conecta los nodos del clúster en sentido descendente con la infraestructura de gestión.

Es importante reconocer que existen mecanismos distintos mediante los cuales se establece esta conectividad en relación con el mecanismo de despliegue del clúster en sentido descendente. Los detalles de esto se explican con mucha más profundidad en la siguiente sección, pero para establecer una comprensión básica, existen tres mecanismos principales para que los clústeres en sentido descendente conectados se establezcan como un clúster "gestionado":

  1. Los clústeres en sentido descendente se despliegan inicialmente en una capacidad "desconectada" (por ejemplo, a través de Edge Image Builder (Capítulo 8, Edge Image Builder)) y luego se importan al clúster de gestión si/cuando la conectividad lo permite.

  2. Los clústeres en sentido descendente están configurados para utilizar el mecanismo de incorporación integrado (por ejemplo, a través de Elemental (Capítulo 10, Elemental)), y se registran automáticamente en el clúster de gestión en el primer arranque, lo que permite la vinculación tardía de la configuración del clúster.

  3. Los clústeres en sentido descendente se han aprovisionado con las capacidades de gestión de metal desnudo (CAPI + Metal3) y se importan automáticamente al clúster de gestión una vez que el clúster se ha desplegado y configurado (a través del operador Rancher Turtles).

Nota
Nota

Se recomienda implementar múltiples clústeres de gestión para adaptarse a la escala de grandes despliegues, optimizar las preocupaciones de ancho de banda y latencia en entornos dispersos geográficamente y minimizar la interrupción en caso de una interrupción o actualización del clúster de gestión. Puede encontrar los límites de escalabilidad y los requisitos del sistema actuales del clúster de gestión aquí.

4 Patrones comunes de despliegue edge

Debido al variado conjunto de entornos operativos y requisitos de ciclo de vida, hemos implementado soporte para una serie de patrones de despliegue distintos que se alinean vagamente con los segmentos de mercado y los casos de uso en los que opera SUSE Edge. Hemos documentado una guía de inicio rápido para cada uno de estos patrones de despliegue para ayudarle a familiarizarse con la plataforma SUSE Edge en función de sus necesidades. Los tres patrones de despliegue que admitimos hoy se describen a continuación, con un enlace a la página de inicio rápido respectiva.

4.1 Aprovisionamiento de red «Phone Home»

A veces usted opera en un entorno donde el clúster de gestión central no puede gestionar el hardware directamente (por ejemplo, su red remota está detrás de un cortafuegos o no hay una interfaz de gestión fuera de banda; algo común en hardware de tipo «PC» que a menudo se encuentra en el extremo). En este escenario, proporcionamos herramientas para aprovisionar de forma remota clústeres y sus cargas de trabajo sin necesidad de saber dónde se envía el hardware cuando se arranca. Esto es en lo que piensa la mayoría de la gente cuando piensa en edge computing; son miles o decenas de miles de sistemas algo desconocidos que se inician en ubicaciones edge y que llaman a casa de forma segura, validando quiénes son y recibiendo sus instrucciones sobre lo que se supone que deben hacer. Nuestros requisitos aquí exigen el aprovisionamiento y la gestión del ciclo de vida con muy poca intervención del usuario, salvo que la máquina se haya preconfigurado en fábrica o simplemente se adjunte una imagen de arranque, por ejemplo, mediante USB, y se encienda el sistema. Los principales desafíos en este espacio son abordar la escala, la coherencia, la seguridad y el ciclo de vida de estos dispositivos en el campo.

Esta solución proporciona una gran flexibilidad y coherencia en la forma en que se aprovisionan e incorporan los sistemas, independientemente de su ubicación, tipo o especificación del sistema, o de cuándo se encienden por primera vez. SUSE Edge permite una flexibilidad y personalización completas del sistema a través de Edge Image Builder, y aprovecha las capacidades de registro de la oferta Elemental de Rancher para la incorporación de nodos y el aprovisionamiento de Kubernetes, junto con SUSE Multi-Linux Manager para la aplicación de parches al sistema operativo. El inicio rápido para esta solución se puede encontrar en Capítulo 1, Incorporación de hosts remotos con Elemental.

4.2 Provisión basada en imágenes

Para los clientes que necesitan operar en entornos independientes, en entornos aislados o con conectividad de red limitada, SUSE Edge proporciona una solución que permite generar medios de instalación totalmente personalizados que contienen todos los artefactos de despliegue requeridos para habilitar tanto clústeres de Kubernetes de alta disponibilidad de nodo único como de múltiples nodos en edge, incluyendo cualquier carga de trabajo o componente en capas adicional que se requiera, todo ello sin conectividad de red al mundo exterior y sin la intervención de una plataforma de gestión centralizada. La experiencia del usuario sigue de cerca la solución de «phone home» en el sentido de que se proporcionan medios de instalación a los sistemas de destino, pero la solución se iniciará in situ. En este escenario, es posible conectar los clústeres resultantes a Rancher para su gestión continua (es decir, pasar de un modo de operación «desconectado» a «conectado» sin una reconfiguración o un redespliegue importantes), o pueden seguir operando de forma aislada. Tenga en cuenta que en ambos casos se puede aplicar el mismo mecanismo coherente para automatizar las operaciones del ciclo de vida.

Además, esta solución se puede utilizar para crear rápidamente clústeres de gestión que pueden alojar la infraestructura centralizada que admite tanto los modelos de 'aprovisionamiento de red dirigida' como de 'aprovisionamiento de red «Phone Home»', ya que puede ser la forma más rápida y sencilla de aprovisionar todo tipo de infraestructura edge. Esta solución utiliza intensamente las capacidades de SUSE Edge Image Builder para crear medios de instalación totalmente personalizados y desatendidos; el inicio rápido se puede encontrar en Capítulo 2, Clústeres independientes con Edge Image Builder.

5 Validación de pila de SUSE Edge

Todas las versiones de SUSE Edge se componen de componentes estrechamente integrados y minuciosamente validados que se versionan como uno solo. Como parte de los esfuerzos de integración continua y validación de pila que no solo prueban la integración entre componentes, sino que garantizan que el sistema funcione como se espera en escenarios de fallo forzado, el equipo de SUSE Edge publica todas las ejecuciones de prueba y los resultados al público. Los resultados junto con todos los parámetros de entrada se pueden encontrar en ci.edge.suse.com.

6 Lista completa de componentes

La lista completa de componentes, junto con un enlace a una descripción de alto nivel de cada uno y cómo se utiliza en SUSE Edge, se puede encontrar a continuación:

Parte I Guías de inicio rápido

Inicio rápido aquí

  • 1 Incorporación de hosts remotos con Elemental
  • Esta sección documenta la solución de «aprovisionamiento de red phone home» como parte de SUSE Edge, donde utilizamos Elemental para ayudar con la incorporación de nodos. Elemental es una pila de software que permite el registro de hosts remotos y la gestión centralizada de sistemas operativos nativ…

  • 2 Clústeres independientes con Edge Image Builder
  • Edge Image Builder (EIB) es una herramienta que agiliza el proceso de generación de imágenes de disco personalizadas y listas para arrancar (CRB) para el arranque de máquinas, incluso en escenarios totalmente en un entorno aislado. EIB se utiliza para crear imágenes de despliegue que se usarán en la…

  • 3 SUSE Multi-Linux Manager
  • La versión de SUSE Multi-Linux Manager incluida con SUSE Edge 3.6 (5.0.6) todavía no es compatible con SUSE Linux Micro 6.2. Se actualizará y recibirá soporte en futuras versiones de SUSE Edge 3.6.

1 Incorporación de hosts remotos con Elemental

Esta sección documenta la solución de «aprovisionamiento de red phone home» como parte de SUSE Edge, donde utilizamos Elemental para ayudar con la incorporación de nodos. Elemental es una pila de software que permite el registro de hosts remotos y la gestión centralizada de sistemas operativos nativos de la nube con Kubernetes. En la pila SUSE Edge utilizamos la función de registro de Elemental para permitir la incorporación de hosts remotos a Rancher, de modo que los hosts puedan integrarse en una plataforma de gestión centralizada y, desde allí, desplegar y gestionar clústeres de Kubernetes junto con componentes en capas, aplicaciones y su ciclo de vida, todo desde un lugar común.

Este enfoque puede ser útil en escenarios donde los dispositivos que deseáis controlar no están en la misma red que el clúster de gestión o no tienen un controlador de gestión fuera de banda integrado que permita un control más directo, y donde estáis arrancando muchos sistemas «desconocidos» en el extremo, y necesitáis incorporarlos y gestionarlos de forma segura a escala. Este es un escenario común para casos de uso en comercio minorista, IoT industrial u otros espacios donde tiene poco control sobre la red en la que se instalan sus dispositivos.

1.1 Arquitectura de alto nivel

quickstart elemental architecture

1.2 Recursos necesarios

A continuación se describen los requisitos mínimos del sistema y del entorno para realizar esta guía de inicio rápido:

  • Un host para el clúster de gestión centralizada (el que aloja Rancher y Elemental):

    • Mínimo 8 GB de RAM y 20 GB de espacio en disco para desarrollo o pruebas (consulte aquí para uso en producción)

  • Un nodo de destino que se va a aprovisionar, es decir, el dispositivo edge (se puede utilizar una máquina virtual para fines de demostración o pruebas)

    • Mínimo 4 GB de RAM, 2 núcleos de CPU y 20 GB de disco

  • Un nombre de host resoluble para el clúster de gestión o una dirección IP estática para usar con un servicio como sslip.io

  • Un host para crear el soporte de instalación a través de Edge Image Builder

    • Ejecutar SLES 15 SP6, openSUSE Leap 15.6 u otro sistema operativo compatible que admita Podman.

    • Con Kubectl, Podman y Helm instalados

  • Una unidad flash USB desde la que arrancar (si se utiliza hardware físico)

  • Una copia descargada de la última imagen ISO SelfInstall de SUSE Linux Micro 6.2 que se encuentra aquí.

Nota
Nota

Los datos existentes en las máquinas de destino se sobrescribirán como parte del proceso; por favor, asegúrese de realizar una copia de seguridad de cualquier dato en los dispositivos de almacenamiento USB y discos conectados a los nodos de despliegue de destino.

Esta guía se ha creado utilizando un droplet de Digital Ocean para alojar el clúster ascendente y un Intel NUC como dispositivo descendente. Para crear el soporte de instalación, se utiliza SUSE Linux Enterprise Server.

1.3 Crear clúster de inicio

Comenzad creando un clúster capaz de alojar Rancher y Elemental. Este clúster debe ser enrutable desde la red a la que están conectados los nodos descendentes.

1.3.1 Crear clúster de Kubernetes

Si utilizáis un hiperescalador (como Azure, AWS o Google Cloud), la forma más sencilla de configurar un clúster es utilizando sus herramientas integradas. Para mayor brevedad en esta guía, no detallamos el proceso de cada una de estas opciones.

Si estáis instalando en un equipo sin sistema operativo u otro servicio de alojamiento donde también debéis proporcionar la propia distribución de Kubernetes, recomendamos utilizar RKE2.

1.3.2 Configurar DNS

Antes de continuar, debéis configurar el acceso a vuestro clúster. Al igual que con la configuración del propio clúster, la forma en que configuréis el DNS será diferente dependiendo de dónde esté alojado.

Sugerencia
Sugerencia

Si no queréis gestionar la configuración de registros DNS (por ejemplo, si se trata solo de un servidor de pruebas efímero), podéis utilizar un servicio como sslip.io en su lugar. Con este servicio, podéis resolver cualquier dirección IP con <address>.sslip.io.

1.4 Instalar Rancher

Para instalar Rancher, necesitáis obtener acceso a la API de Kubernetes del clúster que acabáis de crear. Esto tiene un aspecto diferente dependiendo de la distribución de Kubernetes que se esté utilizando.

Para RKE2, el archivo kubeconfig se habrá escrito en /etc/rancher/rke2/rke2.yaml. Guardad este archivo como ~/.kube/config en vuestro sistema local. Es posible que tengáis que editar el archivo para incluir la dirección IP o el nombre de host enrutable externamente correcto.

Instalad Rancher fácilmente con los comandos de la Documentación de Rancher:

Instalad cert-manager:

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
 --namespace cert-manager \
 --create-namespace \
 --set crds.enabled=true

Luego instalad Rancher:

helm repo add rancher-prime https://charts.rancher.com/server-charts/prime
helm repo update
helm install rancher rancher-prime/rancher \
  --namespace cattle-system \
  --create-namespace \
  --set hostname=<DNS or sslip from above> \
  --set replicas=1 \
  --set bootstrapPassword=<PASSWORD_FOR_RANCHER_ADMIN> \
  --version 2.14.2
Nota
Nota

Si este sistema está destinado a producción, utilizad cert-manager para configurar un certificado real (como uno de Let’s Encrypt).

Navegad al nombre de host que configurasteis e iniciad sesión en Rancher con la bootstrapPassword que utilizasteis. Se os guiará a través de un breve proceso de configuración.

1.5 Instalar Elemental

Con Rancher instalado, ahora podéis instalar el operador de Elemental y los CRD necesarios. El gráfico de Helm para Elemental se publica como un artefacto OCI, por lo que la instalación es un poco más sencilla que la de otros gráficos. Se puede instalar desde el mismo shell que utilizasteis para instalar Rancher o en el navegador desde el shell de Rancher.

helm install --create-namespace -n cattle-elemental-system \
 elemental-operator-crds \
 oci://registry.suse.com/rancher/elemental-operator-crds-chart \
 --version 1.9.0

helm install -n cattle-elemental-system \
 elemental-operator \
 oci://registry.suse.com/rancher/elemental-operator-chart \
 --version 1.9.0

1.5.1 (Opcional) Instalar la extensión de interfaz de usuario de Elemental

  1. Para utilizar la interfaz de usuario de Elemental, iniciad sesión en vuestra instancia de Rancher, y haced clic en el menú de tres líneas en la parte superior izquierda:

    Instalando la extensión Elemental 1
  2. Desde la pestaña "Disponible" en esta página, haz clic en "Instalar" en la tarjeta Elemental:

    Instalando la extensión Elemental 2
  3. Confirmad que queréis instalar la extensión:

    Instalando la extensión Elemental 3
  4. Una vez instalada, se os pedirá que recarguéis la página.

    Instalando la extensión Elemental 4
  5. Una vez recarguéis, podréis acceder a la extensión Elemental a través de la aplicación global "Gestión de SO".

    Accediendo a la extensión Elemental

1.6 Configurad Elemental

Por sencillez, recomendamos establecer la variable $ELEM en la ruta completa donde queráis que esté el directorio de configuración:

export ELEM=$HOME/elemental
mkdir -p $ELEM

Para permitir que las máquinas se registren en Elemental, necesitamos crear un objeto MachineRegistration en el espacio de nombres fleet-default.

Vamos a crear una versión básica de este objeto:

cat << EOF > $ELEM/registration.yaml
apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
metadata:
  name: ele-quickstart-nodes
  namespace: fleet-default
spec:
  machineName: "\${System Information/Manufacturer}-\${System Information/UUID}"
  machineInventoryLabels:
    manufacturer: "\${System Information/Manufacturer}"
    productName: "\${System Information/Product Name}"
EOF

kubectl apply -f $ELEM/registration.yaml
Nota
Nota

El comando cat escapa cada $ con una barra invertida (\) para que Bash no los procese como plantillas. Eliminad las barras invertidas si realizáis la copia manualmente.

Una vez creado el objeto, buscad y anotad el punto de conexión que se os asigne:

REGISURL=$(kubectl get machineregistration ele-quickstart-nodes -n fleet-default -o jsonpath='{.status.registrationURL}')

Alternativamente, esto también se puede hacer desde la interfaz de usuario.

Extensión de interfaz de usuario
  1. Desde la extensión de Gestión de SO, haced clic en "Crear punto de conexión de registro":

    Haced clic en Crear registro
  2. Asignad un nombre a esta configuración.

    Añadir nombre
    Nota
    Nota

    Podéis ignorar el campo Configuración de la nube, ya que los datos aquí se sobrescriben en los siguientes pasos con Edge Image Builder.

  3. A continuación, haced clic en "Añadir etiqueta" para cada etiqueta que queráis que tenga el recurso que se cree cuando una máquina se registre. Esto es útil para distinguir las máquinas.

    Añadir etiquetas
  4. Haced clic en "Crear" para guardar la configuración.

  5. Una vez creado el registro, deberíais ver la URL de registro listada y haced clic en "Copiar" para copiar la dirección:

    Copiar URL
    Sugerencia
    Sugerencia

    Si os habéis salido de esa pantalla, podéis hacer clic en "Puntos finales de registro" en el menú de la izquierda y, a continuación, haced clic en el nombre del punto final que acabáis de crear.

    Esta URL se utiliza en el siguiente paso.

1.7 Construid la imagen

Aunque la versión actual de Elemental dispone de una forma de crear su propio soporte de instalación, en SUSE Edge 3.6 lo hacemos con Kiwi y Edge Image Builder, por lo que el sistema resultante se construye con SUSE Linux Micro como sistema operativo base.

Sugerencia
Sugerencia

Para obtener más detalles sobre Kiwi, seguid el proceso de Kiwi Image Builder (Capítulo 26, Creación de imágenes actualizadas de SUSE Linux Micro con Kiwi) para crear imágenes nuevas, y para Edge Image Builder, consultad la guía de introducción a Edge Image Builder (Capítulo 2, Clústeres independientes con Edge Image Builder) y también la documentación de componentes (Capítulo 8, Edge Image Builder).

Desde un sistema Linux con Podman instalado, cread los directorios y colocad la imagen base que Kiwi está construyendo:

mkdir -p $ELEM/eib_quickstart/base-images
cp /path/to/{micro-base-image-iso} $ELEM/eib_quickstart/base-images/
mkdir -p $ELEM/eib_quickstart/elemental
curl $REGISURL -o $ELEM/eib_quickstart/elemental/elemental_config.yaml
cat << EOF > $ELEM/eib_quickstart/eib-config.yaml
apiVersion: 1.3
image:
    imageType: iso
    arch: x86_64
    baseImage: SL-Micro.x86_64-6.2-Base-SelfInstall-GM.install.iso
    outputImageName: elemental-image.iso
operatingSystem:
  time:
    timezone: Europe/London
    ntp:
      forceWait: true
      pools:
        - 2.suse.pool.ntp.org
      servers:
        - 10.0.0.1
        - 10.0.0.2
  isoConfiguration:
    installDevice: /dev/vda
  users:
    - username: root
      encryptedPassword: \$6\$jHugJNNd3HElGsUZ\$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
  packages:
    sccRegistrationCode: XXX
EOF
Nota
Nota
  • La sección time es opcional, pero se recomienda encarecidamente configurarla para evitar posibles problemas con los certificados y el desfase horario. Los valores proporcionados en este ejemplo son solo para fines ilustrativos. Ajustadlos para que se adapten a vuestros requisitos específicos.

  • La contraseña sin codificar es eib.

  • El sccRegistrationCode es necesario para descargar e instalar los RPM necesarios desde las fuentes oficiales (alternativamente, los RPM elemental-register y elemental-system-agent pueden cargarse manualmente de forma lateral).

  • El comando cat escapa cada $ con una barra invertida (\) para que Bash no los procese como plantillas. Eliminad las barras invertidas si realizáis la copia manualmente.

  • El dispositivo de instalación se borrará durante la instalación.

podman run --privileged --rm -it -v $ELEM/eib_quickstart/:/eib \
 registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 \
 build --definition-file eib-config.yaml

Si arrancáis un dispositivo físico, grabad la imagen en una unidad flash USB. Esto puede realizarse de esta forma:

sudo dd if=/eib_quickstart/elemental-image.iso of=/dev/<PATH_TO_DISK_DEVICE> status=progress

1.8 Arrancad los nodos descendentes

Ahora que hemos creado el medio de inicialización, podemos arrancar nuestros nodos descendentes con él.

Para cada uno de los sistemas que queráis controlar con Elemental, añadid el medio de inicialización y arrancad el dispositivo. Tras la instalación, se reiniciará y se registrará automáticamente.

Si estáis utilizando la extensión de la interfaz de usuario, deberíais ver aparecer vuestro nodo en el «Inventory of Machines».

Nota
Nota

No retiréis el medio de inicialización hasta que hayáis visto el aviso de inicio de sesión; durante el primer arranque, todavía se accede a los archivos de la unidad flash USB.

1.9 Cread clústeres descendentes

Hay dos objetos que debemos crear al aprovisionar un nuevo clúster utilizando Elemental.

  • Linux
  • Extensión de la interfaz de usuario

El primero es el MachineInventorySelectorTemplate. Este objeto nos permite especificar una asignación entre clústeres y las máquinas del inventario.

  1. Cread un selector que coincida con cualquier máquina del inventario con una etiqueta:

    cat << EOF > $ELEM/selector.yaml
    apiVersion: elemental.cattle.io/v1beta1
    kind: MachineInventorySelectorTemplate
    metadata:
      name: location-123-selector
      namespace: fleet-default
    spec:
      template:
        spec:
          selector:
            matchLabels:
              locationID: '123'
    EOF
  2. Aplicad el recurso al clúster:

    kubectl apply -f $ELEM/selector.yaml
  3. Obtened el nombre de la máquina y añadid la etiqueta coincidente:

    MACHINENAME=$(kubectl get MachineInventory -n fleet-default | awk 'NR>1 {print $1}')
    
    kubectl label MachineInventory -n fleet-default \
     $MACHINENAME locationID=123
  4. Cread un recurso de clúster K3s de nodo único sencillo y aplicadlo al clúster:

    cat << EOF > $ELEM/cluster.yaml
    apiVersion: provisioning.cattle.io/v1
    kind: Cluster
    metadata:
      name: location-123
      namespace: fleet-default
    spec:
      kubernetesVersion: v1.35.4+k3s1
      rkeConfig:
        machinePools:
          - name: pool1
            quantity: 1
            etcdRole: true
            controlPlaneRole: true
            workerRole: true
            machineConfigRef:
              kind: MachineInventorySelectorTemplate
              name: location-123-selector
              apiVersion: elemental.cattle.io/v1beta1
    EOF
    
    kubectl apply -f $ELEM/cluster.yaml

Después de crear estos objetos, deberíais ver cómo se inicia un nuevo clúster de Kubernetes utilizando el nuevo nodo que acabáis de instalar.

1.10 Restablecimiento de nodo (opcional)

SUSE Rancher Elemental admite la capacidad de realizar un «restablecimiento de nodo» que puede activarse opcionalmente cuando se elimina un clúster completo de Rancher, se elimina un solo nodo de un clúster o se elimina manualmente un nodo del inventario de máquinas. Esto es útil cuando queréis restablecer y limpiar cualquier recurso huérfano y queréis volver a añadir automáticamente el nodo limpio al inventario de máquinas para que pueda reutilizarse. Esto no está habilitado de forma predeterminada, por lo que cualquier sistema que se elimine no se limpiará (es decir, no se eliminarán los datos y cualquier recurso del clúster de Kubernetes seguirá funcionando en los clústeres secundarios) y requerirá intervención manual para borrar los datos y volver a registrar la máquina en Rancher a través de Elemental.

Si deseáis que esta funcionalidad esté habilitada de forma predeterminada, debéis aseguraros de que vuestro MachineRegistration la habilite explícitamente añadiendo config.elemental.reset.enabled: true, por ejemplo:

config:
  elemental:
    registration:
      auth: tpm
    reset:
      enabled: true

Entonces, todos los sistemas registrados con este MachineRegistration recibirán automáticamente la anotación elemental.cattle.io/resettable: 'true' en su configuración. Si deseáis hacerlo manualmente en nodos individuales, por ejemplo, porque tenéis un MachineInventory existente que no tiene esta anotación, o ya habéis desplegado nodos, podéis modificar el MachineInventory y añadir la configuración resettable, por ejemplo:

apiVersion: elemental.cattle.io/v1beta1
kind: MachineInventory
metadata:
  annotations:
    elemental.cattle.io/os.unmanaged: 'true'
    elemental.cattle.io/resettable: 'true'

En SUSE Edge 3.1, el operador de Elemental coloca un marcador en el sistema operativo que activará el proceso de limpieza automáticamente; detendrá todos los servicios de Kubernetes, eliminará todos los datos persistentes, desinstalará todos los servicios de Kubernetes, limpiará los directorios de Kubernetes/Rancher restantes y forzará un nuevo registro en Rancher a través de la configuración original de MachineRegistration de Elemental. Esto ocurre automáticamente, no es necesaria ninguna intervención manual. El script al que se llama se puede encontrar en /opt/edge/elemental_node_cleanup.sh y se activa mediante systemd.path tras la colocación del marcador, por lo que su ejecución es inmediata.

Aviso
Aviso

El uso de la funcionalidad resettable asume que el comportamiento deseado al eliminar un nodo/clúster de Rancher es borrar los datos y forzar un nuevo registro. La pérdida de datos está garantizada en esta situación, así que utilizad esto solo si estáis seguros de que queréis que se realice el restablecimiento automático.

1.11 Pasos siguientes

Aquí tened algunos recursos recomendados para investigar después de usar esta guía:

2 Clústeres independientes con Edge Image Builder

Edge Image Builder (EIB) es una herramienta que agiliza el proceso de generación de imágenes de disco personalizadas y listas para arrancar (CRB) para el arranque de máquinas, incluso en escenarios totalmente en un entorno aislado. EIB se utiliza para crear imágenes de despliegue que se usarán en las tres modalidades de despliegue de SUSE Edge, ya que es lo suficientemente flexible como para ofrecer desde las personalizaciones más pequeñas, por ejemplo, añadir un usuario o configurar la zona horaria, hasta proporcionar una imagen configurada de forma integral que establece, por ejemplo, configuraciones de red complejas, despliega clústeres de Kubernetes de varios nodos, despliega cargas de trabajo de clientes y se registra en la plataforma de gestión centralizada a través de Rancher/Elemental y SUSE Multi-Linux Manager. EIB se ejecuta como una imagen de contenedor, lo que lo hace increíblemente portátil entre plataformas y garantiza que todas las dependencias necesarias sean autónomas, teniendo un impacto muy mínimo en los paquetes instalados del sistema que se utiliza para operar la herramienta.

Nota
Nota

Para escenarios de varios nodos, EIB despliega automáticamente MetalLB y Endpoint Copier Operator para que los hosts aprovisionados utilizando la misma imagen compilada se unan automáticamente a un clúster de Kubernetes.

Para obtener más información, lea la Introducción a Edge Image Builder (Capítulo 8, Edge Image Builder).

Aviso
Aviso

Edge Image Builder 1.3.3.1 admite la personalización de imágenes de SUSE Linux Micro 6.2. Las versiones anteriores, como SUSE Linux Enterprise Micro 5.5 o 6.0, no son compatibles.

2.1 Requisitos previos

Nota
Nota

Para fines que no sean de producción, se puede utilizar openSUSE Leap 15.6 o openSUSE Tumbleweed como máquina host de compilación. Otros sistemas operativos pueden funcionar, siempre que haya disponible un entorno de ejecución de contenedor compatible.

2.1.1 Obtención de la imagen de EIB

La imagen de contenedor de EIB está disponible públicamente y se puede descargar desde el registro SUSE Edge ejecutando el siguiente comando en su host de compilación de imágenes:

podman pull registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1

2.2 Creación del directorio de configuración de la imagen

Como EIB se ejecuta dentro de un contenedor, necesitamos montar un directorio de configuración desde el host, lo que le permite especificar la configuración deseada, y durante el proceso de compilación EIB tiene acceso a cualquier archivo de entrada y artefacto de soporte necesario. Este directorio debe seguir una estructura específica. Vamos a crearlo, asumiendo que este directorio existirá en su directorio personal y se llamará "eib":

export CONFIG_DIR=$HOME/eib
mkdir -p $CONFIG_DIR/base-images

En el paso anterior creamos un directorio "base-images" que albergará la imagen de entrada de SUSE Linux Micro 6.2, asegurémonos de que la imagen se copie al directorio de configuración:

cp /path/to/SL-Micro.x86_64-6.2-Base-SelfInstall-GM.install.iso $CONFIG_DIR/base-images/slemicro.iso
Nota
Nota

Durante la ejecución de EIB, la imagen base original no se modifica; se crea una versión nueva y personalizada con la configuración deseada en la raíz del directorio de configuración de EIB.

El directorio de configuración en este punto debería tener el siguiente aspecto:

└── base-images/
    └── slemicro.iso

2.3 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. Puede encontrar un ejemplo completo de opciones aquí, y le recomendamos que eche un vistazo a la guía de creación de imágenes upstream para obtener ejemplos más completos que el que vamos a analizar a continuación. Comencemos con un archivo de definición muy básico para nuestra imagen de SO:

cat << EOF > $CONFIG_DIR/iso-definition.yaml
apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-image.iso
EOF

Esta definición especifica que estamos generando una imagen de salida para un sistema basado en AMD64/Intel 64. La imagen que se utilizará como base para modificaciones posteriores es una imagen iso llamada slemicro.iso, que se espera que esté ubicada en $CONFIG_DIR/base-images/slemicro.iso. También describe que, una vez que EIB termine de modificar la imagen, la imagen de salida se llamará eib-image.iso y, de forma predeterminada, residirá en $CONFIG_DIR.

Ahora nuestra estructura de directorios debería tener este aspecto:

├── iso-definition.yaml
└── base-images/
    └── slemicro.iso

En las siguientes secciones veremos algunos ejemplos de operaciones comunes:

2.3.1 Configuración del sistema operativo (SO)

La sección operatingSystem de EIB está destinada a configurar dónde se va a instalar el sistema operativo, el tamaño de la imagen, etc. Es una sección opcional y no debe incluirse a menos que se aplique una o más personalizaciones.

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-Base-RT-SelfInstall.iso
operatingSystem:
  isoConfiguration:
    installDevice: /dev/disk/by-id/ata-QEMU_HARDDISK_111-disk1 # first defined disk

Configuración específica del tipo. Dependiendo del tipo de imagen que se esté personalizando, se puede incluir una de las siguientes secciones opcionales.

  • isoConfiguration - Opcional; la configuración en esta sección solo se aplica a imágenes ISO.

  • installDevice - Opcional; especifica el disco que debe utilizarse como dispositivo de instalación. Debe ser un dispositivo de bloques y, por defecto, borrará automáticamente cualquier dato que se encuentre en el disco. Además, especificar este atributo activa una anulación de GRUB para instalar automáticamente el sistema operativo en lugar de solicitar al usuario que inicie la instalación, lo que permite una instalación totalmente desatendida y automatizada. Si se omite, se solicita al usuario que seleccione la opción «Install» en el menú de GRUB, además de tener que seleccionar el disco de instalación y confirmar que el dispositivo se borrará durante el proceso.

    Nota
    Nota

    El dispositivo utilizado en la sección installDevice puede especificarse como /dev/sda o utilizando la nomenclatura /dev/disk/by-id, /dev/disk/by-path para garantizar que se utiliza el dispositivo correcto. Si utiliza máquinas virtuales libvirt, el valor del atributo serial puede especificarse al crear un disco para la máquina virtual (p. ej., serial=111-disk1) para que pueda utilizarse en el valor installDevice con la nomenclatura by-id, como por ejemplo /dev/disk/by-id/ata-QEMU_HARDDISK_111-disk1 si utiliza dispositivos ATA (libvirt añade automáticamente el prefijo ata-QEMU_HARDDISK_ al ID para dispositivos ATA, o virtio- para dispositivos virtio; consulte #17670 problema de virtio para obtener más información).

  • rawConfiguration - Opcional; la configuración de esta sección solo se aplica a imágenes RAW.

  • diskSize - Opcional; establece el tamaño deseado de la imagen de disco sin formato al que EIB redimensionará la imagen resultante. Esto es importante para garantizar que su imagen de disco sea lo suficientemente grande como para albergar cualquier artefacto que se incorpore a la imagen. Se aconseja establecer un tamaño ligeramente inferior al de su tarjeta SD (o dispositivo de bloques si escribe directamente en un disco), ya que el sistema se expandirá automáticamente durante el arranque para ocupar el tamaño del dispositivo de bloques. Esto es opcional, pero muy recomendable. Especifíquelo como un número entero con «M» (megabyte), «G» (gigabyte) o «T» (terabyte) como sufijo (p. ej. "32G").

  • luksKey - Obligatorio para imágenes cifradas; la clave LUKS proporcionada para una imagen sin formato cifrada, necesaria para que EIB pueda completar el proceso de compilación.

  • expandEncryptedPartition - Opcional; desactivado por defecto, cuando se activa, expande automáticamente la partición cifrada a su tamaño máximo. P. ej., si diskSize es 25G y este campo es true, EIB expandirá la partición cifrada a 25G durante el proceso de compilación.

2.3.2 Configuración de usuarios del SO

EIB le permite preconfigurar usuarios con información de inicio de sesión, como contraseñas o claves SSH, incluida la configuración de una contraseña de root fija. Como parte de este ejemplo, vamos a fijar la contraseña de root, y el primer paso es utilizar OpenSSL para crear una contraseña cifrada de una sola vía:

openssl passwd -6 SecurePassword

Esto generará algo similar a:

$6$G392FCbxVgn[...]Y7zTXnC1

A continuación, podemos añadir una sección en el archivo de definición llamada operatingSystem con una matriz users en su interior. El archivo resultante debería tener este aspecto:

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-image.iso
operatingSystem:
  users:
    - username: root
      encryptedPassword: $6$G392FCbxVgn[...]Y7zTXnC1
Nota
Nota

También es posible añadir usuarios adicionales, crear los directorios de inicio, establecer los ID de usuario, añadir autenticación mediante claves SSH y modificar la información de los grupos. Consulte la guía de compilación de imágenes upstream para obtener más ejemplos.

2.3.3 Configuración de la hora del SO

La sección time es opcional, pero se recomienda encarecidamente configurarla para evitar posibles problemas con los certificados y el desfase del reloj. EIB configurará chronyd y /etc/localtime dependiendo de los parámetros aquí indicados.

operatingSystem:
  time:
    timezone: Europe/London
    ntp:
      forceWait: true
      pools:
        - 2.suse.pool.ntp.org
      servers:
        - 10.0.0.1
        - 10.0.0.2
  • El timezone especifica la zona horaria en el formato "Región/Localidad" (p. ej. "Europe/London"). La lista completa se puede encontrar ejecutando timedatectl list-timezones en un sistema Linux.

  • ntp - Define los atributos relacionados con la configuración de NTP (usando chronyd):

  • forceWait - Solicita que chronyd intente sincronizar las fuentes de tiempo antes de iniciar otros servicios, con un tiempo de espera de 180 s.

  • pools - Especifica una lista de grupos que chronyd utilizará como fuentes de datos (usando iburst para mejorar el tiempo necesario para la sincronización inicial).

  • servers - Especifica una lista de servidores que chronyd utilizará como fuentes de datos (usando iburst para mejorar el tiempo necesario para la sincronización inicial).

Nota
Nota

Los valores proporcionados en este ejemplo son solo para fines ilustrativos. Ajústelos para que se adapten a sus requisitos específicos.

2.3.4 Añadir certificados

Los archivos de certificado con la extensión ".pem" o ".crt" almacenados en el directorio certificates se instalarán en el almacén de certificados de todo el sistema del nodo:

.
├── definition.yaml
└── certificates
    ├── my-ca.pem
    └── my-ca.crt

Consultad la guía "Asegurar la comunicación con certificados TLS" para obtener más información.

2.3.5 Añadir archivos de sistema operativo

Los archivos colocados en el directorio os-files dentro del directorio de configuración de la imagen se copian automáticamente en el sistema de archivos de la imagen compilada. El directorio exacto se conservará cuando se copien. Por ejemplo, si un archivo existe en un subdirectorio llamado os-files/etc, se coloca en el directorio /etc de la imagen compilada.

Nota
Nota

Si el directorio os-files existe, no puede estar vacío.

.
├── definition.yaml
└── os-files
    └── etc
        └── ssh
            └── sshd_config

2.3.6 Configuración de paquetes RPM

Una de las principales características de EIB es proporcionar un mecanismo para añadir paquetes de software adicionales a la imagen, de modo que cuando finalice la instalación, el sistema pueda aprovechar los paquetes instalados de inmediato. EIB permite a los usuarios especificar lo siguiente:

  • Paquetes por su nombre dentro de una lista en la definición de la imagen

  • Repositorios de red en los que buscar estos paquetes

  • Credenciales del SUSE Customer Center (SCC) para buscar en los repositorios oficiales de SUSE los paquetes enumerados

  • A través de un directorio $CONFIG_DIR/rpms, cargar paquetes RPM personalizados que no existen en los repositorios de red

  • A través del mismo directorio ($CONFIG_DIR/rpms/gpg-keys), claves GPG para permitir la validación de paquetes de terceros

EIB llevará a cabo entonces un proceso de resolución de paquetes durante el tiempo de compilación de la imagen, tomando la imagen base como entrada, e intentará extraer e instalar todos los paquetes suministrados, ya sea especificados a través de la lista o proporcionados localmente. EIB descarga todos los paquetes, incluidas las dependencias, en un repositorio que existe dentro de la imagen de salida e indica al sistema que los instale durante el primer proceso de arranque. Realizar este proceso durante la compilación de la imagen garantiza que los paquetes se instalarán correctamente durante el primer arranque en la plataforma deseada, por ejemplo, el nodo en el extremo. Esto también es ventajoso en entornos en los que desea integrar los paquetes adicionales en la imagen en lugar de extraerlos a través de la red cuando están en funcionamiento, por ejemplo, para entornos aislados o con red restringida.

Como ejemplo sencillo para demostrar esto, vamos a instalar el paquete RPM nvidia-container-toolkit que se encuentra en el repositorio de NVIDIA compatible con proveedores externos:

  packages:
    packageList:
      - nvidia-container-toolkit
    additionalRepos:
      - url: https://nvidia.github.io/libnvidia-container/stable/rpm/x86_64

El archivo de definición resultante tiene el siguiente aspecto:

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-image.iso
operatingSystem:
  users:
    - username: root
      encryptedPassword: $6$G392FCbxVgn[...]Y7zTXnC1
  packages:
    packageList:
      - nvidia-container-toolkit
    additionalRepos:
      - url: https://nvidia.github.io/libnvidia-container/stable/rpm/x86_64

Lo anterior es un ejemplo sencillo, pero para mayor exhaustividad, descargue la clave de firma del paquete NVIDIA antes de ejecutar la generación de la imagen:

$ mkdir -p $CONFIG_DIR/rpms/gpg-keys
$ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey > $CONFIG_DIR/rpms/gpg-keys/nvidia.gpg
Aviso
Aviso

La adición de RPM adicionales mediante este método está pensada para la incorporación de componentes de terceros compatibles o paquetes suministrados (y mantenidos) por el usuario; este mecanismo no debe utilizarse para añadir paquetes que normalmente no serían compatibles con SUSE Linux Micro. Si se utiliza este mecanismo para añadir componentes de repositorios de openSUSE (que no son compatibles), incluidos los de versiones o paquetes de servicio más recientes, puede acabar con una configuración no compatible, especialmente cuando la resolución de dependencias da lugar a la sustitución de partes fundamentales del sistema operativo, aunque el sistema resultante pueda parecer que funciona como se espera. Si no está seguro, póngase en contacto con su representante de SUSE para obtener ayuda a la hora de determinar la compatibilidad de la configuración que desea.

Nota
Nota

Puede encontrar una guía más completa con ejemplos adicionales en la guía de instalación de paquetes en sentido ascendente.

2.3.7 Configuración del clúster de Kubernetes y de las cargas de trabajo de los usuarios

Otra característica de EIB es la capacidad de utilizarlo para automatizar el despliegue de clústeres de Kubernetes de alta disponibilidad tanto de nodo único como de varios nodos que se "inician en el lugar" (es decir, que no requieren ningún tipo de infraestructura de gestión centralizada para coordinarse). El principal motor de este enfoque son los despliegues en entornos aislados o en entornos con red restringida, pero también sirve para iniciar clústeres independientes de forma rápida, incluso si se dispone de acceso completo y sin restricciones a la red.

Este método permite no solo el despliegue del sistema operativo personalizado, sino también la capacidad de especificar la configuración de Kubernetes, cualquier componente en capas adicional mediante charts de Helm y cualquier carga de trabajo del usuario mediante los manifiestos de Kubernetes suministrados. Sin embargo, el principio de diseño detrás de este método es asumir por defecto que el usuario desea un entorno aislado. Por lo tanto, cualquier elemento especificado en la definición de la imagen se incluirá en la imagen, lo que incluye las cargas de trabajo suministradas por el usuario. EIB garantiza que todas las imágenes detectadas que requieran las definiciones se copien localmente y sean servidas por el registro de imágenes integrado en el sistema desplegado resultante.

En este siguiente ejemplo, vamos a tomar nuestra definición de imagen existente y especificaremos una configuración de Kubernetes (en este ejemplo no se enumeran los sistemas ni sus funciones, por lo que asumimos por defecto que se trata de un solo nodo), lo que indicará a EIB que aprovisione un clúster de Kubernetes RKE2 de un solo nodo. Para mostrar la automatización tanto del despliegue de cargas de trabajo suministradas por el usuario (mediante manifiesto) como de los componentes en capas (mediante Helm), vamos a instalar KubeVirt a través del chart de Helm SUSE Edge, así como NGINX mediante un manifiesto de Kubernetes. La configuración adicional que debemos añadir a la definición de imagen existente es la siguiente:

kubernetes:
  version: v1.35.4+rke2r1
  manifests:
    urls:
      - https://k8s.io/examples/application/nginx-app.yaml
  helm:
    charts:
      - name: kubevirt
        version: 306.0.2+up0.7.0
        repositoryName: suse-edge
    repositories:
      - name: suse-edge
        url: oci://registry.suse.com/edge/charts

El archivo de definición completo resultante debería tener ahora este aspecto:

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-image.iso
operatingSystem:
  users:
    - username: root
      encryptedPassword: $6$G392FCbxVgn[...]Y7zTXnC1
  packages:
    packageList:
      - nvidia-container-toolkit
    additionalRepos:
      - url: https://nvidia.github.io/libnvidia-container/stable/rpm/x86_64
kubernetes:
  version: v1.35.4+k3s1
  manifests:
    urls:
      - https://k8s.io/examples/application/nginx-app.yaml
  helm:
    charts:
      - name: kubevirt
        version: 306.0.2+up0.7.0
        repositoryName: suse-edge
    repositories:
      - name: suse-edge
        url: oci://registry.suse.com/edge/charts
Nota
Nota

Puede encontrar más ejemplos de opciones como despliegues de varios nodos, redes personalizadas y opciones/valores de charts de Helm en la documentación upstream.

2.3.8 Configuración de la red

En el último ejemplo de esta guía de inicio rápido, vamos a configurar la red que se activará cuando se aprovisione un sistema con la imagen generada por EIB. Es importante entender que, a menos que se proporcione una configuración de red, el modelo predeterminado es que se utilizará DHCP en todas las interfaces detectadas en el momento del arranque. Sin embargo, esta no siempre es una configuración deseable, especialmente si DHCP no está disponible y necesita proporcionar configuraciones estáticas, o si necesita configurar construcciones de red más complejas, por ejemplo, enlaces, LACP y VLAN, o necesita anular ciertos parámetros, por ejemplo, nombres de host, servidores DNS y rutas.

EIB ofrece la posibilidad de proporcionar configuraciones por nodo (donde el sistema en cuestión se identifica de forma única por su dirección MAC), o una anulación para suministrar una configuración idéntica a cada máquina, lo cual es más útil cuando no se conocen las direcciones MAC del sistema. EIB utiliza una herramienta adicional llamada Network Manager Configurator, o nmc para abreviar, que es una herramienta creada por el equipo de SUSE Edge para permitir que se apliquen configuraciones de red personalizadas basadas en el esquema de red declarativo nmstate.io, y en el momento del arranque identificará el nodo en el que se está iniciando y aplicará la configuración de red deseada antes de que se activen los servicios.

Ahora vamos a aplicar una configuración de red estática para un sistema con una única interfaz describiendo el estado de red deseado en un archivo específico del nodo (basado en el nombre de host deseado) en el directorio network requerido:

mkdir $CONFIG_DIR/network

cat << EOF > $CONFIG_DIR/network/host1.local.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: 192.168.122.1
    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:E7
  ipv4:
    address:
    - ip: 192.168.122.50
      prefix-length: 24
    dhcp: false
    enabled: true
  ipv6:
    enabled: false
EOF
Aviso
Aviso

El ejemplo anterior está configurado para la subred 192.168.122.0/24 predeterminada asumiendo que la prueba se está ejecutando en una máquina virtual. Por favor, adáptelo a su entorno, sin olvidar la dirección MAC. Como la misma imagen puede utilizarse para aprovisionar múltiples nodos, la red configurada por EIB (a través de nmc) depende de que sea capaz de identificar de forma única el nodo por su dirección MAC, y por tanto, durante el arranque, nmc aplicará la configuración de red correcta a cada máquina. Esto significa que necesitará conocer las direcciones MAC de los sistemas en los que desea realizar la instalación. Alternativamente, el comportamiento predeterminado es depender de DHCP, pero puede utilizar el hook configure-network.sh para aplicar una configuración común a todos los nodos; consulte la guía de red (Capítulo 9, Redes edge) para obtener más detalles.

La estructura de archivos resultante debería ser:

├── iso-definition.yaml
├── base-images/
│   └── slemicro.iso
└── network/
    └── host1.local.yaml

La configuración de red que acabamos de crear será analizada y los archivos de conexión de NetworkManager necesarios se generarán automáticamente e insertarán en la nueva imagen de instalación que creará EIB. Estos archivos se aplicarán durante el aprovisionamiento del host, lo que dará como resultado una configuración de red completa.

Nota
Nota

Por favor, consulte el componente de red edge (Capítulo 9, Redes edge) para obtener una explicación más completa de la configuración anterior y ejemplos de esta funcionalidad.

2.4 Compilación de la imagen

Ahora que tenemos una imagen base y una definición de imagen para que EIB la utilice, procedamos a compilar la imagen. Para ello, simplemente utilizamos podman para llamar al contenedor EIB con el comando \"build\", especificando el archivo de definición:

podman run --rm -it --privileged -v $CONFIG_DIR:/eib \
registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 \
build --definition-file iso-definition.yaml

La salida del comando debería ser similar a:

Setting up Podman API listener...
Downloading file: dl-manifest-1.yaml 100% (498/498 B, 9.5 MB/s)
Pulling selected Helm charts... 100% (1/1, 43 it/min)
Generating image customization components...
Identifier ................... [SUCCESS]
Custom Files ................. [SKIPPED]
Time ......................... [SKIPPED]
Network ...................... [SUCCESS]
Groups ....................... [SKIPPED]
Users ........................ [SUCCESS]
Proxy ........................ [SKIPPED]
Resolving package dependencies...
Rpm .......................... [SUCCESS]
Os Files ..................... [SKIPPED]
Systemd ...................... [SKIPPED]
Fips ......................... [SKIPPED]
Elemental .................... [SKIPPED]
Suma ......................... [SKIPPED]
Populating Embedded Artifact Registry... 100% (3/3, 10 it/min)
Embedded Artifact Registry ... [SUCCESS]
Keymap ....................... [SUCCESS]
Configuring Kubernetes component...
The Kubernetes CNI is not explicitly set, defaulting to 'cilium'.
Downloading file: rke2_installer.sh
Downloading file: rke2-images-core.linux-amd64.tar.zst 100% (657/657 MB, 48 MB/s)
Downloading file: rke2-images-cilium.linux-amd64.tar.zst 100% (368/368 MB, 48 MB/s)
Downloading file: rke2.linux-amd64.tar.gz 100% (35/35 MB, 50 MB/s)
Downloading file: sha256sum-amd64.txt 100% (4.3/4.3 kB, 6.2 MB/s)
Kubernetes ................... [SUCCESS]
Certificates ................. [SKIPPED]
Cleanup ...................... [SKIPPED]
Building ISO image...
Kernel Params ................ [SKIPPED]
Build complete, the image can be found at: eib-image.iso

La imagen ISO compilada se almacena en $CONFIG_DIR/eib-image.iso:

├── iso-definition.yaml
├── eib-image.iso
├── _build
│   └── cache/
│       └── ...
│   └── build-<timestamp>/
│       └── ...
├── base-images/
│   └── slemicro.iso
└── network/
    └── host1.local.yaml

Cada compilación crea una carpeta con marca de tiempo en $CONFIG_DIR/_build/ que incluye los registros de la compilación, los artefactos utilizados durante la misma, y los directorios combustion y artefacts que contienen todos los scripts y artefactos que se añaden a la imagen CRB.

El contenido de este directorio debería ser similar a:

├── build-<timestamp>/
│   │── combustion/
│   │   ├── 05-configure-network.sh
│   │   ├── 10-rpm-install.sh
│   │   ├── 12-keymap-setup.sh
│   │   ├── 13b-add-users.sh
│   │   ├── 20-k8s-install.sh
│   │   ├── 26-embedded-registry.sh
│   │   ├── 48-message.sh
│   │   ├── network/
│   │   │   ├── host1.local/
│   │   │   │   └── eth0.nmconnection
│   │   │   └── host_config.yaml
│   │   ├── nmc
│   │   └── script
│   │── artefacts/
│   │   │── registry/
│   │   │   ├── hauler
│   │   │   ├── nginx:<version>-registry.tar.zst
│   │   │   ├── rancher_kubectl:<version>-registry.tar.zst
│   │   │   └── registry.suse.com_suse_sles_15.6_virt-operator:<version>-registry.tar.zst
│   │   │── rpms/
│   │   │   └── rpm-repo
│   │   │       ├── addrepo0
│   │   │       │   ├── nvidia-container-toolkit-<version>.rpm
│   │   │       │   ├── nvidia-container-toolkit-base-<version>.rpm
│   │   │       │   ├── libnvidia-container1-<version>.rpm
│   │   │       │   └── libnvidia-container-tools-<version>.rpm
│   │   │       ├── repodata
│   │   │       │   ├── ...
│   │   │       └── zypper-success
│   │   └── kubernetes/
│   │       ├── rke2_installer.sh
│   │       ├── registries.yaml
│   │       ├── server.yaml
│   │       ├── images/
│   │       │   ├── rke2-images-cilium.linux-amd64.tar.zst
│   │       │   └── rke2-images-core.linux-amd64.tar.zst
│   │       ├── install/
│   │       │   ├── rke2.linux-amd64.tar.gz
│   │       │   └── sha256sum-amd64.txt
│   │       └── manifests/
│   │           ├── dl-manifest-1.yaml
│   │           └── kubevirt.yaml
│   ├── createrepo.log
│   ├── eib-build.log
│   ├── embedded-registry.log
│   ├── helm
│   │   └── kubevirt
│   │       └── kubevirt-0.4.0.tgz
│   ├── helm-pull.log
│   ├── helm-template.log
│   ├── iso-build.log
│   ├── iso-build.sh
│   ├── iso-extract
│   │   └── ...
│   ├── iso-extract.log
│   ├── iso-extract.sh
│   ├── modify-raw-image.sh
│   ├── network-config.log
│   ├── podman-image-build.log
│   ├── podman-system-service.log
│   ├── prepare-resolver-base-tarball-image.log
│   ├── prepare-resolver-base-tarball-image.sh
│   ├── raw-build.log
│   ├── raw-extract
│   │   └── ...
│   └── resolver-image-build
│       └──...
└── cache
    └── ...

Si la compilación falla, eib-build.log es el primer registro que contiene información. A partir de ahí, le dirigirá al componente que falló para su depuración.

En este punto, debería tener una imagen lista para usar que:

  1. Deploy SUSE Linux Micro 6.2

  2. Configurar la contraseña de root

  3. Instale el paquete nvidia-container-toolkit

  4. Configure un registro de contenedor integrado para servir contenido localmente

  5. Instale RKE2 de nodo único

  6. Configure redes estáticas

  7. Install KubeVirt

  8. Despliegue un manifiesto suministrado por el usuario

2.5 Depuración del proceso de compilación de la imagen

Si el proceso de compilación de la imagen falla, consulte la guía de depuración en sentido ascendente.

2.6 Prueba de su imagen recién creada

Para obtener instrucciones sobre cómo probar la imagen CRB recién creada, consulte la guía de pruebas de imágenes en sentido ascendente.

3 SUSE Multi-Linux Manager

Aviso
Aviso

La versión de SUSE Multi-Linux Manager incluida con SUSE Edge 3.6 (5.0.6) todavía no es compatible con SUSE Linux Micro 6.2. Se actualizará y recibirá soporte en futuras versiones de SUSE Edge 3.6.

SUSE Multi-Linux Manager se incluye en SUSE Edge para proporcionar automatización y control con el fin de mantener SUSE Linux Micro como el sistema operativo subyacente constantemente actualizado en todos los nodos de vuestro edge deployment. También se puede utilizar para gestionar Kubernetes y las aplicaciones desplegadas en Kubernetes en vuestros edge nodes.

Esta guía de inicio rápido tiene como objetivo que os familiaricéis con SUSE Multi-Linux Manager lo más rápido posible, con el objetivo de proporcionar actualizaciones del sistema operativo a vuestros edge nodes. La guía de inicio rápido no trata temas como el dimensionamiento del almacenamiento, la creación y gestión de canales de software adicionales para fines de puesta en escena, o la gestión de usuarios, grupos de sistemas y organizaciones para edge deployments más grandes. Para su uso en producción, recomendamos encarecidamente que os familiaricéis con la completa Documentación de SUSE Multi-Linux Manager.

Se requieren los siguientes pasos para preparar SUSE Edge para utilizar SUSE Multi-Linux Manager de forma eficaz:

  • Desplegad y configurad el servidor de SUSE Multi-Linux Manager.

  • Sincronizad los repositorios de paquetes de SUSE Linux Micro.

  • Cread grupos de sistemas.

  • Cread claves de activación.

  • Utilizad Edge Image Builder para preparar los medios de instalación para el registro de SUSE Multi-Linux Manager.

3.1 Desplegad el servidor de SUSE Multi-Linux Manager

Si ya tenéis una instancia de SUSE Multi-Linux Manager 5.1 en ejecución, podéis omitir este paso.

Podéis ejecutar el servidor de SUSE Multi-Linux Manager en un servidor físico dedicado, como máquina virtual en vuestro propio hardware o en la nube. Se proporcionan imágenes de máquina virtual preconfiguradas para SUSE Multi-Linux Server para las nubes públicas compatibles.

En esta guía de inicio rápido utilizamos la imagen \"qcow2\" SUSE-Manager-Server.x86_64-5.0.4-Qcow-5.0-2025-04.qcow2 para AMD64/Intel 64 que podéis encontrar en https://www.suse.com/download/suse-manager/ o en el SUSE Customer Center. Esta imagen funcionará como máquina virtual en hipervisores como KVM. Comprobad siempre que existe la versión más reciente de la imagen y usadla para las nuevas instalaciones.

También podéis instalar el servidor de SUSE Multi-Linux Manager en cualquiera de las otras arquitecturas de hardware compatibles. En ese caso, elegid la imagen que coincida con vuestra arquitectura de hardware.

Una vez descargada la imagen, cread una máquina virtual que cumpla al menos las siguientes especificaciones mínimas de hardware:

  • 16 GB RAM

  • 4 núcleos físicos o virtuales

  • un dispositivo de bloques adicional que tenga al menos 100 GB

Con la imagen qcow2, no es necesario instalar el sistema operativo. Podéis adjuntar directamente la imagen como vuestra partición root.

¡Debéis configurar la red de modo que vuestros nodos edge puedan acceder más tarde al servidor de SUSE Multi-Linux Manager con un nombre de host que contenga el nombre de dominio completo ("FQDN")!

Cuando iniciéis SUSE Multi-Linux Manager por primera vez, necesitaréis realizar una configuración inicial:

  • Seleccionad la distribución de vuestro teclado.

  • Aceptad el acuerdo de licencia.

  • Seleccionad vuestra zona horaria.

  • Introducid la contraseña de root para el sistema operativo.

Realizad los siguientes pasos como usuario "root":

Para el siguiente paso, necesitáis el código de registro de la extensión de SUSE Multi-Linux Manager que podéis encontrar en el SUSE Customer Center. El mismo código se puede utilizar para registrar tanto SUSE Linux Micro como SUSE Multi-Linux Manager:

Registrad SUSE Linux Micro:

transactional-update register -r <REGCODE> -e <your_email>

Registrad SUSE Multi-Linux Manager:

transactional-update register -p SUSE-Manager-Server/5.0/x86_64 -r <REGCODE>

¡La cadena del producto depende de vuestra arquitectura de hardware! Por ejemplo, si utilizáis SUSE Multi-Linux Manager en un sistema Arm de 64 bits, la cadena es "SUSE-Manager-Server/5.0/aarch64".

Reiniciar

Actualizad el sistema:

transactional-update

A menos que no haya habido cambios, reiniciad para aplicar las actualizaciones.

SUSE Multi-Linux Manager se proporciona a través de un contenedor gestionado por Podman. El comando mgradm se encarga de la instalación y configuración por vosotros.

Aviso
Aviso

¡Es muy importante que vuestro servidor SUSE Multi-Linux Manager tenga el nombre de host configurado con un nombre de dominio completo ("FQDN") que los nodos edge que queréis gestionar puedan resolver correctamente en vuestra red!

Antes de instalar y configurar el contenedor del servidor SUSE Multi-Linux Manager, debéis preparar el dispositivo de bloques adicional que habéis añadido previamente. Para ello, necesitáis conocer el nombre que la máquina virtual ha asignado al dispositivo. Por ejemplo, si el dispositivo de bloque es /dev/vdb, podéis configurarlo para que se utilice para SUSE Multi-Linux Manager mediante el siguiente comando:

mgr-storage-server /dev/vdb

Desplegad SUSE Multi-Linux Manager:

mgradm install podman <FQDN>

Proporcionad la contraseña para el certificado de CA. Esta contraseña debe ser diferente de vuestras contraseñas de inicio de sesión. Normalmente no la necesitaréis introducir más tarde, pero debéis anotarla.

Proporcionad la contraseña para el usuario "admin". Este es el usuario inicial para iniciar sesión en SUSE Multi-Linux Manager. Podéis crear usuarios adicionales con derechos completos o restringidos más tarde.

3.2 Configurad SUSE Multi-Linux Manager

Una vez finalizado el despliegue, podéis iniciar sesión en la interfaz web de SUSE Multi-Linux Manager utilizando el nombre de host que proporcionasteis anteriormente. El usuario inicial es "admin". Utilizad la contraseña que proporcionasteis en el paso anterior.

Para el siguiente paso necesitáis vuestras credenciales de organización que podéis encontrar en la segunda subpestaña de la pestaña «Users» de vuestra organización en SUSE Customer Center. Con esas credenciales, SUSE Multi-Linux Manager puede sincronizar todos los productos para los que tenéis suscripciones.

Seleccione Admin > Setup Wizard.

En la pestaña Organization Credentials cread una nueva credencial con vuestro Username y Password que encontrasteis en el SUSE Customer Center.

Abrid la siguiente pestaña SUSE Products. Debéis esperar hasta que la primera sincronización de datos con SUSE Customer Center haya finalizado.

Una vez que la lista esté rellena, utilizad el filtro para mostrar solo «Micro 6.2». Marcad la casilla de SUSE Linux Micro 6.2 para la arquitectura de hardware en la que se ejecutarán vuestros nodos edge (x86_64 o aarch64).

Haga clic en Add Products. Esto añadirá el repositorio de paquetes principal («canal») para SUSE Linux Micro y añadirá automáticamente el canal para las herramientas de cliente de SUSE Manager como subcanal.

Dependiendo de vuestra conexión a Internet, la primera sincronización tardará un tiempo. Ya podéis empezar con los pasos siguientes:

En Systems > System Groups cread al menos un grupo al que vuestros sistemas se unirán automáticamente cuando se incorporen. Los grupos son una forma importante de categorizar sistemas, por lo que podéis aplicar configuración o acciones a todo un conjunto de sistemas a la vez. Son conceptualmente similares a las etiquetas en Kubernetes.

Haga clic en + Create Group

Proporcionad un nombre corto, p. ej., «Edge Nodes», y una descripción larga.

En Systems > Activation Keys cread al menos una clave de activación. Las claves de activación pueden considerarse como un perfil de configuración que se aplica automáticamente a los sistemas cuando se incorporan a SUSE Multi-Linux Manager. Si queréis que ciertos nodos edge se añadan a grupos diferentes o utilicen una configuración distinta, podéis crear claves de activación independientes para ellos y utilizarlas más adelante en Edge Image Builder para crear medios de instalación personalizados.

Un caso de uso avanzado típico para las claves de activación sería asignar vuestros clústeres de prueba a los canales de software con las actualizaciones más recientes y vuestros clústeres de producción a canales de software que solo reciban esas actualizaciones más recientes una vez que las hayáis probado en el clúster de prueba.

Haga clic en + Create Key

Elegid una descripción corta, p. ej., «Edge Nodes». Proporcionad un nombre único que identifique la clave, p. ej., «edge-x86_64» para vuestros nodos edge con arquitectura de hardware AMD64/Intel 64. Se añade automáticamente un prefijo numérico a la clave. Para la organización predeterminada, el número es siempre «1». Si creáis organizaciones adicionales en SUSE Multi-Linux Manager y creáis claves para ellas, ese número puede diferir.

Si no habéis creado ningún canal de software clonado, podéis mantener el ajuste del Canal base en «SUSE Manager Default». Esto asignará automáticamente el repositorio de actualizaciones de SUSE correcto para vuestros nodos edge.

Como «Canal secundario», seleccionad el control deslizante «incluir recomendado» para la arquitectura de hardware para la que se utiliza vuestra clave de activación. Esto añadirá el canal «SUSE-Manager-Tools-For-SL-Micro-6.2».

En la pestaña «Grupos», añadid el grupo que habéis creado anteriormente. Todos los nodos que se incorporen utilizando esta clave de activación se añadirán automáticamente a ese grupo.

3.3 Cread una imagen de instalación personalizada con Edge Image Builder

Para utilizar Edge Image Builder, solo necesitáis un entorno donde podáis iniciar un contenedor basado en Linux con podman.

Para una configuración de laboratorio mínima, podemos utilizar de hecho la misma máquina virtual en la que se ejecuta el servidor de SUSE Multi-Linux Manager. ¡Aseguraos de que tenéis suficiente espacio en disco en la máquina virtual! Esta no es una configuración recomendada para su uso en producción. Consultad Sección 2.1, “Requisitos previos” para conocer los sistemas operativos anfitriones con los que hemos probado Edge Image Builder.

Iniciad sesión en vuestro anfitrión del servidor de SUSE Multi-Linux Manager como root.

Descargad el contenedor de Edge Image Builder:

podman pull registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1

Cread el directorio /opt/eib y un subdirectorio base-images:

mkdir -p /opt/eib/base-images

En esta guía de inicio rápido utilizamos la variante «self-install» de la imagen de SUSE Linux Micro. Esa imagen puede grabarse posteriormente en una memoria USB física que podéis utilizar para realizar la instalación en servidores físicos. Si vuestro servidor tiene la opción de conexión remota de ISO de instalación a través de un BMC (Baseboard Management Controller), también podéis utilizar ese enfoque. Por último, esa imagen también puede utilizarse con la mayoría de las herramientas de virtualización.

Si queréis precargar la imagen directamente en un nodo físico o iniciarla directamente desde una máquina virtual, también podéis utilizar la variante de imagen «raw».

Podéis encontrar esas imágenes en el SUSE Customer Center o en https://www.suse.com/download/sle-micro/

Descargad o copiad la imagen SL-Micro.x86_64-6.2-Default-SelfInstall-GM.install.iso en el directorio base-images y llamadla «slemicro.iso».

La creación de imágenes AArch64 en un host de compilación basado en la familia de arquitecturas ARM es una vista previa tecnológica en SUSE Edge 3.6. Lo más probable es que funcione, pero aún no es compatible. Si queréis probarlo, debéis ejecutar Podman en una máquina Arm de 64 bits y debéis sustituir «x86_64» en todos los ejemplos y fragmentos de código por «aarch64».

En /opt/eib, cread un archivo llamado iso-definition.yaml. Esta es vuestra definición de compilación para Edge Image Builder.

Aquí tenéis un ejemplo sencillo que instala SL Micro 6.2, establece una contraseña de root, un usuario adicional y el mapa de teclas, inicia la interfaz gráfica de usuario Cockpit y registra vuestro nodo en SUSE Multi-Linux Manager:

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-image.iso
operatingSystem:
  users:
  - username: root
    createHomeDir: true
    encryptedPassword: $6$aaBTHyqDRUMY1HAp$pmBY7.qLtoVlCGj32XR/Ogei4cngc3f4OX7fwBD/gw7HWyuNBOKYbBWnJ4pvrYwH2WUtJLKMbinVtBhMDHQIY0
  - username: admin
    createHomeDir: true
    encryptedPassword: $6$8EGZXU1iFcLiHHxk$Hs3nVtzO.yZhApT.YBHaNvLRZvXG3Iv/km92BtiNiGXhSSUG0ZbNHxlm7c//ROFj3W9M5xIkB.RLQpPKOFxP91
  keymap: de
  systemd:
    enable:
      - cockpit.socket
  packages:
    noGPGCheck: true
  suma:
    host: ${fully qualified hostname of your SUSE Multi-Linux Manager Server}
    activationKey: 1-edge-x86_64

Edge Image Builder también puede configurar la red, instalar automáticamente Kubernetes en el nodo e incluso desplegar aplicaciones mediante charts de Helm. Consultad Capítulo 2, Clústeres independientes con Edge Image Builder para ver ejemplos más completos.

Para baseImage, especificad el nombre real de la ISO en el directorio base-images que queráis utilizar.

En este ejemplo, la contraseña de root sería «root». Consultad Sección 2.3.2, “Configuración de usuarios del SO” para crear hashes de contraseña para la contraseña segura que queráis utilizar.

Como Cockpit prohíbe la conexión como usuario root, es necesario un usuario adicional. En este ejemplo, ese usuario es «admin» con la contraseña «admin».

Estableced el mapa de teclas en la distribución de teclado real que queráis que tenga el sistema después de la instalación.

Nota
Nota

Usamos la opción noGPGCheck: true porque no vamos a proporcionar una clave GPG para comprobar los paquetes RPM. En la guía de instalación de paquetes upstream podéis encontrar una guía completa con una configuración más segura que recomendamos para su uso en producción.

Como se ha mencionado varias veces, vuestro host de SUSE Multi-Linux Manager requiere un nombre de host totalmente cualificado que pueda resolverse en la red en la que arrancarán vuestros nodos edge.

El valor para activationKey debe coincidir con la clave que creasteis en SUSE Multi-Linux Manager.

Para crear una imagen de instalación que registre automáticamente vuestros nodos edge en SUSE Multi-Linux Manager tras la instalación, también debéis preparar dos artefactos:

  • el paquete Salt minion que instala el agente de gestión para SUSE Multi-Linux Manager

  • el certificado de CA de vuestro servidor de SUSE Multi-Linux Manager

3.3.1 Descargad el paquete venv-salt-minion

En /opt/eib, cread un subdirectorio rpms.

Descargad el paquete venv-salt-minion desde vuestro servidor de SUSE Multi-Linux Manager en ese directorio. Podéis obtenerlo a través de la interfaz web buscando el paquete en Software > Channel List y descargándolo desde el canal SUSE-Manager-Tools …​ o descargarlo desde el «repositorio de arranque» de SUSE Multi-Linux Manager con una herramienta como curl:

curl -O http://${HOSTNAME_OF_SUSE_MANAGER}/pub/repositories/slmicro/6/1/bootstrap/x86_64/venv-salt-minion-3006.0-8.1.x86_64.rpm

El nombre real del paquete puede variar si ya se ha publicado una versión más reciente. Si hay varios paquetes para elegir, elegid siempre el más reciente.

Para solucionar un problema documentado en las notas de la versión de SUSE Multi-Linux Manager, también debéis colocar la última versión del paquete de la clave de compilación en el directorio rpms (suse-build-key-12.0-slfo.1.1_3.1.noarch.rpm en el momento en que se creó esta documentación). Podéis encontrarlo en la sección Software de SUSE Multi-Linux Manager a través de la pestaña Packages del canal Pool de SL Micro. Hay un botón Download en la vista Details.

3.4 Descargad el certificado de CA de SUSE Multi-Linux Manager

En /opt/eib, cread un subdirectorio certificates

Descargad el certificado de CA desde SUSE Multi-Linux Manager en ese directorio:

curl -O http://${HOSTNAME_OF_SUSE_MANAGER}/pub/RHN-ORG-TRUSTED-SSL-CERT
Aviso
Aviso

Debéis renombrar el certificado a RHN-ORG-TRUSTED-SSL-CERT.crt. Edge Image Builder se asegurará entonces de que el certificado esté instalado y activado en el nodo edge durante la instalación.

Ahora podéis ejecutar Edge Image Builder:

cd /opt/eib
podman run --rm -it --privileged -v /opt/eib:/eib \
registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 \
build --definition-file iso-definition.yaml

Si habéis utilizado un nombre diferente para vuestro archivo de definición YAML o queréis utilizar una versión diferente de Edge Image Builder, debéis adaptar el comando en consecuencia.

Una vez finalizada la compilación, encontraréis la ISO de instalación en el directorio /opt/eib como eib-image.iso.

Esa imagen puede utilizarse ahora para desplegar nodos que intentarán registrarse en SUSE Multi-Linux Manager.

Una vez que el nodo se haya instalado por completo, veréis su clave en la lista como pending en la sección Salt/Keys de SUSE Multi-Linux Manager. Una vez que haya aceptado la clave, el nodo se incorporará automáticamente a SUSE Multi-Linux Manager y aparecerá en la lista Systems después de que finalice ese proceso. Tendrá asignado el grupo o grupos del sistema que hayáis proporcionado en la clave de activación.

Deberéis programar un reinicio antes de aplicar cualquier configuración adicional.

Tened en cuenta que la aceptación de la clave puede automatizarse por completo mediante listas de permitidos, tal como se describe aquí.

Parte II Componentes

Lista de componentes para Edge

  • 4 Rancher
  • Consulte la documentación de Rancher en https://ranchermanager.docs.rancher.com/v2.14.

  • 5 Extensiones de Rancher Dashboard
  • Las extensiones permiten a los usuarios, desarrolladores, socios y clientes ampliar y mejorar la interfaz de usuario de Rancher. SUSE Edge proporciona extensiones del Dashboard de KubeVirt.

  • 6 Fleet
  • Fleet es un motor de gestión y ampliación de contenedores diseñado para ofrecer a los usuarios un mayor control sobre el clúster local y una supervisión constante a través de GitOps. Fleet no solo se centra en la capacidad de escalado, sino que también ofrece a los usuarios un alto grado de control …

  • 7 SUSE Linux Micro
  • Consultad la documentación oficial de SUSE Linux Micro

  • 8 Edge Image Builder
  • Consulte el Repositorio oficial.

  • 9 Redes edge
  • Esta sección describe el enfoque de la configuración de red en la solución SUSE Edge. Mostraremos cómo configurar NetworkManager en SUSE Linux Micro de forma declarativa y explicaremos cómo se integran las herramientas relacionadas.

  • 10 Elemental
  • Elemental es una pila de software que permite la gestión centralizada y completa del sistema operativo nativo de nube con Kubernetes. La pila Elemental consta de una serie de componentes que residen en el propio Rancher o en los nodos edge. Los componentes principales son:

  • 11 K3s
  • K3s es una distribución de Kubernetes certificada y de alta disponibilidad diseñada para cargas de trabajo de producción en ubicaciones remotas, desatendidas y con recursos limitados, o dentro de dispositivos IoT.

  • 12 RKE2
  • Consulte la documentación oficial de RKE2.

  • 13 SUSE Storage
  • SUSE Storage es un sistema de almacenamiento distribuido en bloques ligero, fiable y fácil de usar diseñado para Kubernetes. Es un producto basado en Longhorn, un proyecto de código abierto desarrollado inicialmente por Rancher Labs y actualmente incubado bajo la CNCF.

  • 14 SUSE Security
  • SUSE Security es una solución de seguridad para Kubernetes que proporciona seguridad de red L7, seguridad en tiempo de ejecución, seguridad del sistema de suministro y comprobaciones de cumplimiento en un paquete cohesivo.

  • 15 MetalLB
  • Véase la documentación oficial de MetalLB.

  • 16 Operador de Endpoint Copier
  • Endpoint Copier Operator es un operador de Kubernetes cuyo propósito es crear una copia de un Servicio y un Endpoint de Kubernetes y mantenerlos sincronizados.

  • 17 Virtualización de borde
  • Esta sección describe cómo puede utilizar la virtualización de borde para ejecutar máquinas virtuales en sus nodos de borde. La virtualización de borde está diseñada para casos de uso de virtualización ligera, donde se espera que se utilice un flujo de trabajo común para el despliegue y la gestión d…

  • 18 Controlador de actualización del sistema
  • Consultad la documentación del controlador de actualización del sistema.

  • 19 Controlador de actualización
  • Un controlador de Kubernetes capaz de realizar actualizaciones en los siguientes SUSE Edge componentes de la plataforma:

  • 20 SUSE Multi-Linux Manager
  • SUSE Multi-Linux Manager se incluye en SUSE Edge para proporcionar automatización y control con el fin de mantener SUSE Linux Micro como el sistema operativo subyacente constantemente actualizado en todos los nodos de vuestra ampliación edge.

4 Rancher

Consulte la documentación de Rancher en https://ranchermanager.docs.rancher.com/v2.14.

Rancher es una potente plataforma de gestión de Kubernetes de código abierto que agiliza la implementación, las operaciones y la supervisión de clústeres de Kubernetes en múltiples entornos. Tanto si gestiona clústeres in situ, en la nube o en el edge, Rancher proporciona una plataforma unificada y centralizada para todas sus necesidades de Kubernetes.

4.1 Características clave de Rancher

  • Gestión de múltiples clústeres: La interfaz intuitiva de Rancher le permite gestionar clústeres de Kubernetes desde cualquier lugar: nubes públicas, centros de datos privados y ubicaciones edge.

  • Seguridad y conformidad con las normas: Rancher aplica políticas de seguridad, control de acceso basado en funciones (RBAC) y estándares de cumplimiento en todo su entorno de Kubernetes.

  • Operaciones de clúster simplificadas: Rancher automatiza el aprovisionamiento, las actualizaciones y la resolución de problemas de los clústeres, simplificando las operaciones de Kubernetes para equipos de todos los tamaños.

  • Catálogo de aplicaciones centralizado: El catálogo de aplicaciones de Rancher ofrece una amplia gama de gráficos de Helm y operadores de Kubernetes, lo que facilita la implementación y gestión de aplicaciones en contenedores.

  • Entrega continua: Rancher admite GitOps y canalizaciones de CI/CD, lo que permite procesos de entrega de aplicaciones automatizados y optimizados.

4.2 Uso de Rancher en SUSE Edge

Rancher proporciona varias funcionalidades principales a la pila SUSE Edge:

4.2.1 Gestión centralizada de Kubernetes

En implementaciones edge típicas con numerosos clústeres distribuidos, Rancher actúa como un plano de control central para gestionar estos clústeres de Kubernetes. Ofrece una interfaz unificada para el aprovisionamiento, la actualización, la supervisión y la resolución de problemas, lo que simplifica las operaciones y garantiza la coherencia.

4.2.2 Despliegue simplificado de clústeres

Rancher agiliza la creación de clústeres de Kubernetes en el sistema operativo ligero SUSE Linux Micro, facilitando el despliegue de infraestructura edge con capacidades robustas de Kubernetes.

4.2.3 Despliegue y gestión de aplicaciones

El catálogo de aplicaciones integrado de Rancher puede simplificar el despliegue y la gestión de aplicaciones en contenedores en clústeres SUSE Edge, lo que permite un despliegue fluido de cargas de trabajo edge.

4.2.4 Seguridad y aplicación de políticas

Rancher proporciona herramientas de gobernanza basadas en políticas, control de acceso basado en funciones (RBAC) e integración con proveedores de autenticación externos. Esto ayuda a que las implementaciones de SUSE Edge mantengan la seguridad y el cumplimiento, algo fundamental en entornos distribuidos.

4.3 Prácticas recomendadas

4.3.1 GitOps

Rancher incluye Fleet como componente integrado para permitir la gestión de configuraciones de clúster y despliegues de aplicaciones con código almacenado en git.

4.3.2 Observabilidad

Rancher incluye herramientas de supervisión y registro integradas como Prometheus y Grafana para obtener información exhaustiva sobre el estado y el rendimiento de su clúster.

4.4 Instalación con Edge Image Builder

SUSE Edge utiliza Capítulo 8, Edge Image Builder para personalizar las imágenes base del sistema operativo SUSE Linux Micro. Siga Sección 25.6, “Instalación de Rancher” para una instalación de Rancher en entorno aislado sobre clústeres de Kubernetes aprovisionados por EIB.

4.5 Recursos adicionales

5 Extensiones de Rancher Dashboard

Las extensiones permiten a los usuarios, desarrolladores, socios y clientes ampliar y mejorar la interfaz de usuario de Rancher. SUSE Edge proporciona extensiones del Dashboard de KubeVirt.

Consulte Rancher documentation para obtener información general sobre las extensiones de Rancher Dashboard.

5.1 Instalación

Todos los componentes de SUSE Edge 3.6 , incluidas las extensiones del Dashboard, se distribuyen como artefactos OCI. Para instalar las extensiones SUSE Edge, puede utilizar la interfaz de usuario de Rancher Dashboard, Helm o Fleet:

5.1.1 Instalación con Rancher Dashboard UI

  1. Haga clic en Extensiones en la sección Configuración de la barra lateral de navegación.

  2. En la página de Extensiones, haga clic en el menú de tres puntos en la parte superior derecha y seleccione Gestionar repositorios.

    Cada extensión se distribuye a través de su propio artefacto OCI. Están disponibles en el repositorio de charts de Helm de SUSE Edge.

  3. En la página de repositorios, haga clic en Create.

  4. En el formulario, especifique el nombre y la URL del repositorio y haga clic en Create.

    SUSE Edge URL del repositorio de Helm charts de: oci://registry.suse.com/edge/charts

    dashboard extensions create oci repository
  5. Puede ver que el repositorio de extensiones se ha añadido a la lista y se encuentra en estado Active.

    dashboard extensions repositories list
  6. Vuelva a Extensiones en la sección Configuración de la barra lateral de navegación.

    En la pestaña Disponibles puede ver las extensiones disponibles para su instalación.

    dashboard extensions available extensions
  7. En la tarjeta de la extensión, haga clic en Install y confirme la instalación.

    Una vez instalada la extensión, la interfaz de usuario de Rancher solicita recargar la página como se describe en https://ranchermanager.docs.rancher.com/v2.14/integrations-in-rancher/rancher-extensions#installing-extensions.

5.1.2 Instalación con Helm

# KubeVirt extension
helm install kubevirt-dashboard-extension oci://registry.suse.com/edge/charts/kubevirt-dashboard-extension --version 306.0.4+up1.3.3 --namespace cattle-ui-plugin-system
Nota
Nota

Las extensiones deben instalarse en el espacio de nombres cattle-ui-plugin-system.

Nota
Nota

Después de instalar una extensión, es necesario recargar la interfaz de usuario de Rancher Dashboard.

5.1.3 Instalación con Fleet

La instalación de extensiones de Dashboard con Fleet requiere definir un recurso gitRepo que apunte a un repositorio Git con archivo(s) de configuración de paquete fleet.yaml personalizado(s).

# KubeVirt extension fleet.yaml
defaultNamespace: cattle-ui-plugin-system
helm:
  releaseName: kubevirt-dashboard-extension
  chart: oci://registry.suse.com/edge/charts/kubevirt-dashboard-extension
  version: "306.0.4+up1.3.3"
Nota
Nota

La propiedad releaseName es obligatoria y debe coincidir con el nombre de la extensión para que esta se instale correctamente.

cat <<- EOF | kubectl apply -f -
apiVersion: fleet.cattle.io/v1alpha1
metadata:
  name: edge-dashboard-extensions
  namespace: fleet-local
spec:
  repo: https://github.com/suse-edge/fleet-examples.git
  branch: main
  paths:
  - fleets/kubevirt-dashboard-extension/
EOF

Para obtener más información, consulte Capítulo 6, Fleet y el repositorio fleet-examples.

Una vez instaladas las extensiones, aparecen en la sección Extensiones bajo la pestaña Instaladas. Dado que no se instalan a través de Aplicaciones/Marketplace, están marcadas con la etiqueta Third-Party.

installed dashboard extensions

5.2 Extensión de Dashboard de KubeVirt

La extensión de KubeVirt proporciona una gestión básica de máquinas virtuales para la interfaz de usuario de Rancher Dashboard. Sus capacidades se describen en Sección 17.7.2, “Uso de la extensión de la UI de KubeVirt Rancher”.

6 Fleet

Fleet es un motor de gestión y ampliación de contenedores diseñado para ofrecer a los usuarios un mayor control sobre el clúster local y una supervisión constante a través de GitOps. Fleet no solo se centra en la capacidad de escalado, sino que también ofrece a los usuarios un alto grado de control y visibilidad para supervisar exactamente lo que está instalado en el clúster.

Fleet puede gestionar ampliaciones desde Git de YAML de Kubernetes sin procesar, gráficos de Helm, Kustomize o cualquier combinación de los tres. Independientemente de la fuente, todos los recursos se convierten dinámicamente en gráficos de Helm, y Helm se utiliza como motor para desplegar todos los recursos en el clúster. Como resultado, los usuarios pueden disfrutar de un alto grado de control, coherencia y auditabilidad de sus clústeres.

Para obtener información sobre cómo funciona Fleet, consulte Arquitectura de Fleet.

6.1 Instalación de Fleet con Helm

Fleet viene integrado en Rancher, pero también puede instalarse como una aplicación independiente en cualquier clúster de Kubernetes mediante Helm.

6.2 Uso de Fleet con Rancher

Rancher utiliza Fleet para desplegar aplicaciones en clústeres gestionados. La entrega continua con Fleet introduce GitOps a escala, diseñado para gestionar aplicaciones que se ejecutan en un gran número de clústeres.

Fleet destaca como parte integrada de Rancher. Los clústeres gestionados con Rancher obtienen automáticamente el agente de Fleet desplegado como parte del proceso de instalación/importación y el clúster está disponible inmediatamente para ser gestionado por Fleet.

6.3 Acceso a Fleet en la interfaz de usuario de Rancher

Fleet viene preinstalado en Rancher y se gestiona mediante la opción Entrega continua en la interfaz de usuario de Rancher.

fleet dashboard

La sección de Entrega continua consta de los siguientes elementos:

6.3.1 Consola

Una página de resumen de todos los repositorios GitOps en todos los espacios de trabajo. Solo se muestran los espacios de trabajo con repositorios.

6.3.2 Repositorios Git

Una lista de repositorios GitOps en el espacio de trabajo seleccionado. Seleccione el espacio de trabajo activo mediante la lista desplegable en la parte superior de la página.

6.3.3 Clústeres

Una lista de clústeres gestionados. De forma predeterminada, todos los clústeres gestionados por Rancher se añaden al espacio de trabajo fleet-default. El espacio de trabajo fleet-local incluye el clúster local. Desde aquí, es posible Pause o Force update los clústeres o mover el clúster a otro espacio de trabajo. La edición del clúster permite actualizar las etiquetas y anotaciones utilizadas para agrupar los clústeres.

6.3.4 Grupos de clústeres

Esta sección permite la agrupación personalizada de los clústeres dentro del espacio de trabajo mediante selectores.

6.3.5 Avanzadas

La sección «Avanzado» permite gestionar espacios de trabajo y otros recursos de Fleet relacionados.

6.4 Ejemplo de instalación de KubeVirt con Rancher y Fleet mediante el panel de control de Rancher

  1. Cree un repositorio Git que contenga el archivo fleet.yaml:

    defaultNamespace: kubevirt
    helm:
      chart: "oci://registry.suse.com/edge/charts/kubevirt"
      version: "306.0.2+up0.7.0"
      # kubevirt namespace is created by kubevirt as well, we need to take ownership of it
      takeOwnership: true
  2. En el panel de control de Rancher, navegue hasta ☰ > Entrega continua > Repositorios Git y haga clic en Add Repository.

  3. El asistente de creación de repositorios le guía a través de la creación del repositorio Git. Proporcione el Nombre, la URL del repositorio (haciendo referencia al repositorio Git creado en el paso anterior) y seleccione la rama o revisión adecuada. En el caso de un repositorio más complejo, especifique las Vías para utilizar varios directorios en un solo repositorio.

    fleet create repo1
  4. Haga clic en Next.

  5. En el siguiente paso, puede definir dónde se desplegarán las cargas de trabajo. La selección de clústeres ofrece varias opciones básicas: puede no seleccionar ningún clúster, seleccionar todos los clústeres o elegir directamente un clúster gestionado o un grupo de clústeres específico (si está definido). La opción «Avanzado» permite editar directamente los selectores mediante YAML.

    fleet create repo2
  6. Haga clic en Create. El repositorio se crea. A partir de ahora, las cargas de trabajo se instalan y se mantienen sincronizadas en los clústeres que coinciden con la definición del repositorio.

6.5 Depuración y solución de problemas

La sección de navegación «Avanzado» proporciona información general sobre los recursos de Fleet de bajo nivel. Un bundle es un recurso interno utilizado para la orquestación de recursos desde Git. Cuando se escanea un repositorio Git, este produce uno o más bundles.

Para encontrar los bundles relevantes para un repositorio específico, vaya a la página de detalles del repositorio Git y haga clic en la pestaña Bundles.

fleet repo bundles

Para cada clúster, el bundle se aplica a un recurso BundleDeployment que se crea. Para ver los detalles de BundleDeployment, haga clic en el botón Graph en la parte superior derecha de la página de detalles del repositorio Git. Se carga un gráfico de Repo > Bundles > BundleDeployments. Haga clic en el BundleDeployment en el gráfico para ver sus detalles y haga clic en Id para ver el YAML de BundleDeployment.

fleet repo graph

Para obtener información adicional sobre consejos de solución de problemas de Fleet, consulte aquí.

6.6 Ejemplos de Fleet

El equipo de Edge mantiene un repositorio con ejemplos de instalación de proyectos Edge con Fleet.

El proyecto Fleet incluye un repositorio fleet-examples que cubre todos los casos de uso para la estructura del repositorio Git.

7 SUSE Linux Micro

Consultad la documentación oficial de SUSE Linux Micro

SUSE Linux Micro es un sistema operativo ligero y seguro para el edge. Fusiona los componentes empresariales reforzados de SUSE Linux Enterprise con las funciones que los desarrolladores desean en un sistema operativo moderno e inmutable. Como resultado, se obtiene una plataforma de infraestructura fiable con la mejor conformidad normativa y fácil de usar.

7.1 ¿Cómo utiliza SUSE Edge SUSE Linux Micro?

Utilizamos SUSE Linux Micro como sistema operativo base para nuestra pila de plataforma. Esto nos proporciona una base segura, estable y mínima sobre la que construir.

SUSE Linux Micro es único en su uso de instantáneas del sistema de archivos (Btrfs) para permitir reversiones sencillas en caso de que algo salga mal con una actualización. Esto permite realizar actualizaciones remotas seguras de toda la plataforma incluso sin acceso físico en caso de problemas.

7.2 Prácticas recomendadas

7.2.1 Medios de instalación

SUSE Edge utiliza el Edge Image Builder (Capítulo 8, Edge Image Builder) para preconfigurar la imagen de instalación auto-instalable de SUSE Linux Micro.

7.2.2 Administración local

SUSE Linux Micro viene con Cockpit para permitir la gestión local del host a través de una aplicación web.

Este servicio está desactivado por defecto, pero puede iniciarse habilitando el servicio systemd cockpit.socket. Como Cockpit prohíbe el inicio de sesión como root por defecto, se recomienda la creación de un usuario con privilegios administrativos; consultad la documentación oficial de SUSE Linux Micro para obtener más información.

7.3 Problemas conocidos

  • Actualmente no hay ningún entorno de escritorio disponible en SUSE Linux Micro, pero se está desarrollando una solución en contenedores.

8 Edge Image Builder

Consulte el Repositorio oficial.

Edge Image Builder (EIB) es una herramienta que agiliza la generación de imágenes de disco personalizadas y listas para arrancar (CRB) para iniciar máquinas. Estas imágenes permiten la implementación integral de toda la pila de software de SUSE con una sola imagen.

Aunque EIB puede crear imágenes CRB para todos los escenarios de aprovisionamiento, EIB demuestra un valor tremendo en implementaciones en entornos aislados con redes limitadas o completamente aisladas.

8.1 ¿Cómo utiliza SUSE Edge Edge Image Builder?

SUSE Edge utiliza EIB para la configuración simplificada y rápida de imágenes personalizadas de SUSE Linux Micro para una variedad de escenarios. Estos escenarios incluyen el inicio de máquinas virtuales y de equipos sin sistema operativo con:

  • Implementaciones totalmente aisladas (air-gapped) de Kubernetes K3s/RKE2 (nodo único y multinodo)

  • Implementaciones totalmente aisladas (air-gapped) de gráficos Helm y manifiestos de Kubernetes

  • Registro en Rancher a través de la API de Elemental

  • Metal3

  • Redes personalizadas (por ejemplo, IP estática, nombre de host, VLAN, bonding, etc.)

  • Configuraciones personalizadas del sistema operativo (por ejemplo, usuarios, grupos, contraseñas, claves SSH, proxies, NTP, certificados SSL personalizados, etc.)

  • Instalación en entorno aislado de paquetes RPM a nivel de host y cargados lateralmente (incluida la resolución de dependencias)

  • Registro en SUSE Multi-Linux Manager para la gestión del SO

  • Imágenes de contenedor integradas

  • Argumentos de la línea de comandos del núcleo de Linux

  • Unidades de systemd que se deben habilitar/deshabilitar en el momento del arranque

  • Guiones y archivos personalizados para cualquier tarea manual

8.2 Introducción

Puede encontrar documentación completa sobre el uso y las pruebas de Edge Image Builder aquí.

Además, consulte Capítulo 2, Clústeres independientes con Edge Image Builder que cubre un escenario de ampliación básico.

Una vez que esté familiarizado con esta herramienta, encontrará información más útil en nuestra página Sección de Consejos y Trucos de EIB (Parte IV, “Consejos y trucos”).

8.3 Problemas conocidos

  • EIB aísla los gráficos de Helm mediante la creación de plantillas de los gráficos de Helm y el análisis de todas las imágenes dentro de la plantilla. Si un gráfico de Helm no mantiene todas sus imágenes dentro de la plantilla y, en su lugar, carga las imágenes de forma lateral, EIB no podrá aislar esas imágenes automáticamente. La solución para esto es añadir manualmente cualquier imagen no detectada a la sección embeddedArtifactRegistry del archivo de definición.

9 Redes edge

Esta sección describe el enfoque de la configuración de red en la solución SUSE Edge. Mostraremos cómo configurar NetworkManager en SUSE Linux Micro de forma declarativa y explicaremos cómo se integran las herramientas relacionadas.

9.1 Visión general de NetworkManager

NetworkManager es una herramienta que gestiona la conexión de red primaria y otras interfaces de conexión.

NetworkManager almacena las configuraciones de red como archivos de conexión que contienen el estado deseado. Estas conexiones se almacenan como archivos en el directorio /etc/NetworkManager/system-connections/.

Puede encontrar detalles sobre NetworkManager en la documentación de SUSE Linux Micro.

9.2 Visión general de nmstate

nmstate es una biblioteca ampliamente adoptada (con una herramienta CLI complementaria) que ofrece una API declarativa para configuraciones de red mediante un esquema predefinido.

Puede encontrar detalles sobre nmstate en la documentación upstream.

9.3 Escriba: Configurador de NetworkManager (nmc)

Las opciones de personalización de red disponibles en SUSE Edge se consiguen mediante una herramienta CLI llamada Configurador de NetworkManager o nmc para abreviar. Aprovecha la funcionalidad proporcionada por la biblioteca nmstate y, como tal, es totalmente capaz de configurar direcciones IP estáticas, servidores DNS, VLAN, vinculación, puentes, etc. Esta herramienta nos permite generar configuraciones de red a partir de estados deseados predefinidos y aplicarlas en muchos nodos diferentes de forma automatizada.

Puede encontrar detalles sobre el Configurador de NetworkManager (nmc) en el repositorio upstream.

9.4 ¿Cómo utiliza SUSE Edge el Configurador de NetworkManager?

SUSE Edge utiliza nmc para las personalizaciones de red en los diversos modelos de aprovisionamiento: * Configuraciones estáticas declarativas en los escenarios de aprovisionamiento basado en imágenes (Capítulo 2, Clústeres independientes con Edge Image Builder)

9.5 Configuración con Edge Image Builder

Edge Image Builder (EIB) es una herramienta que permite configurar varios hosts con una única imagen de SO. En esta sección mostraremos 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.

9.5.1 Requisitos previos

Si sigue esta guía, se asume que ya dispone de lo siguiente:

  • Un AMD64/Intel 64 host físico (o máquina virtual) que ejecute SLES 15 SP6 o openSUSE Leap 15.6

  • Un entorno de ejecución de contenedor disponible (p. ej., Podman)

  • Una copia de la imagen RAW de SUSE Linux Micro 6.2 que se encuentra aquí

9.5.2 Obtención de la imagen de contenedor de Edge Image Builder

La imagen de contenedor de EIB está disponible públicamente y se puede descargar desde el registro SUSE Edge ejecutando:

podman pull registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1

9.5.3 Creación del directorio de configuración de la imagen

Empecemos creando el directorio de configuración:

export CONFIG_DIR=$HOME/eib
mkdir -p $CONFIG_DIR/base-images

Ahora nos aseguraremos de que la copia de la imagen base descargada se mueva al directorio de configuración:

mv /path/to/downloads/SL-Micro.x86_64-6.2-Base-GM.raw $CONFIG_DIR/base-images/
Nota
Nota

EIB nunca modificará la entrada de la imagen base. Creará una nueva imagen con sus modificaciones.

El directorio de configuración en este punto debería tener el siguiente aspecto:

└── base-images/
    └── SL-Micro.x86_64-6.2-Base-GM.raw

9.5.4 Creación del archivo de definición de la imagen

El archivo de definición describe la mayoría de las opciones configurables que admite Edge Image Builder.

Empecemos con un archivo de definición muy básico para nuestra imagen de SO:

cat << EOF > $CONFIG_DIR/definition.yaml
apiVersion: 1.3
image:
  arch: x86_64
  imageType: raw
  baseImage: SL-Micro.x86_64-6.2-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 tipo, así como cómo se llamará 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.

Nota
Nota

Siéntase libre de usar su propia contraseña cifrada ejecutando openssl passwd -6 <password>.

El directorio de configuración en este punto debería tener el siguiente aspecto:

├── definition.yaml
└── base-images/
    └── SL-Micro.x86_64-6.2-Base-GM.raw

9.5.5 Definición de las configuraciones de red

Las configuraciones de red deseadas no forman parte del archivo de definición de imagen que acabamos de crear. Ahora poblaremos esas bajo el directorio especial network/. Creémoslo:

mkdir -p $CONFIG_DIR/network

Como se mencionó anteriormente, la herramienta NetworkManager Configurator (nmc) espera una entrada en forma de esquema predefinido. Puedes encontrar cómo configurar una amplia variedad de opciones de red en la documentación de ejemplos upstream de NMState.

Esta guía explicará cómo configurar la red en tres nodos diferentes:

  • Un nodo que utiliza dos interfaces Ethernet

  • Un nodo que utiliza vinculación de interfaces de red

  • Un nodo que utiliza un puente de red (bridge)

Aviso
Aviso

No se recomienda utilizar configuraciones de red completamente diferentes en compilaciones de producción, especialmente si se configuran clústeres de Kubernetes. Las configuraciones de red generalmente deben ser homogéneas entre los nodos o, al menos, entre los roles dentro de un clúster determinado. Esta guía incluye varias opciones diferentes solo para servir como referencia de ejemplo.

Nota
Nota

Lo siguiente asume una libvirt red predeterminada con un rango de direcciones IP 192.168.122.1/24. Ajuste en consecuencia si esto difiere en su entorno.

Creemos 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: 192.168.122.1
      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 un estado deseado de dos interfaces Ethernet (eth0 y eth3), sus direcciones IP solicitadas, el enrutamiento y la resolución DNS.

Aviso
Aviso

Debe asegurarse de que las direcciones MAC de todas las interfaces Ethernet estén enumeradas. Estas se utilizan durante el proceso de aprovisionamiento como identificadores de los nodos y sirven para determinar qué configuraciones deben aplicarse. Así es como podemos configurar múltiples nodos utilizando una única imagen ISO o RAW.

A continuación, 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: 192.168.122.1
      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 habilitan 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 utilizará 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: 192.168.122.1
      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 punto 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.2-Base-GM.raw
Nota
Nota

Los nombres de los archivos en el directorio network/ son intencionados. Corresponden a los nombres de host que se establecerán durante el proceso de aprovisionamiento.

9.5.6 Creación de la imagen del SO

Ahora que todas las configuraciones necesarias están listas, podemos crear la imagen simplemente ejecutando:

podman run --rm -it -v $CONFIG_DIR:/eib registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 build --definition-file definition.yaml

La salida debería ser similar a la siguiente:

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 podemos proceder con el aprovisionamiento de nuestros nodos periféricos.

Nota
Nota

Se puede 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 tiempo para la ejecución de la imagen.

9.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 hemos especificado las configuraciones de red para tres nodos. Esto es porque también queremos mostrar qué sucederá si aprovisionamos un nodo que no coincide con ninguna de las configuraciones deseadas.

Nota
Nota

Esta guía utilizará virtualización para los ejemplos de aprovisionamiento de nodos. Asegúrese de que las extensiones necesarias estén habilitadas en el BIOS (consulte aquí para obtener más detalles).

Utilizaremos virt-install para crear máquinas virtuales usando los discos raw copiados. Cada máquina virtual utilizará 10 GB de RAM y 6 vCPUs.

9.5.7.1 Aprovisionamiento del primer nodo

Creemos 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
Nota
Nota

Es importante crear las interfaces de red con las mismas direcciones MAC que las del estado deseado descrito anteriormente.

Una vez completada la operación, se observará 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 puede iniciar sesión con el par de credenciales root:eib. También se puede acceder al host por SSH si se prefiere ello a la virsh console que se presenta aquí.

Una vez iniciada la sesión, confirme que todos los ajustes están en su lugar.

Verifique que el nombre de host esté configurado correctamente:

node1:~ # hostnamectl
 Static hostname: node1.suse.com
 ...

Verifique que el enrutamiento esté configurado correctamente:

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 de red es eth1 en lugar de la eth3 predefinida en nuestro estado de red deseado. Esto sucede porque el Configurador de NetworkManager (nmc) es capaz de detectar que el sistema operativo ha asignado un nombre distinto a la NIC con la dirección MAC 34:8a:b1:4b:16:e2 y ajusta su configuración en consecuencia.

Verifique que esto ha ocurrido realmente inspeccionando la fase de combustión 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

Aprovisione ahora el resto de los nodos, pero se mostrarán únicamente las diferencias en la configuración final. Sentíos libres de aplicar cualquiera o todas las comprobaciones anteriores para todos los nodos que vais a aprovisionar.

9.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

Una vez que la máquina virtual esté en funcionamiento, podemos confirmar que este nodo utiliza una interfaz de enlace:

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

Confirma que el enrutamiento está utilizando el enlace:

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úrate 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

9.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

Una vez que la máquina virtual esté en funcionamiento, podemos 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

Confirma que el enrutamiento está utilizando 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úrate 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

9.5.7.4 Aprovisionamiento del cuarto nodo

Por último, aprovisionaremos un nodo que no coincidirá con ninguna de las configuraciones predefinidas por dirección MAC. En estos casos, utilizaremos DHCP por defecto 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

Una vez que la máquina virtual esté en funcionamiento, podemos confirmar que este nodo está utilizando 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

Verifica que nmc no pudo aplicar las 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

Verifica que la interfaz Ethernet se configuró 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

9.5.8 Configuraciones de nodo unificadas

Hay ocasiones en las que depender de direcciones MAC conocidas no es una opción. En estos casos podemos optar por la denominada configuración unificada que nos permite especificar ajustes en un archivo _all.yaml que luego se aplicarán a todos los nodos aprovisionados.

Construiremos y aprovisionaremos un nodo edge utilizando una estructura de configuración diferente. Sigue todos los pasos desde Sección 9.5.3, “Creación del directorio de configuración de la imagen” hasta Sección 9.5.5, “Definición de las configuraciones de red”.

En este ejemplo definimos un estado deseado de dos interfaces Ethernet (eth0 y eth1): una utilizando DHCP y otra con una dirección IP estática asignada.

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 construir la imagen:

podman run --rm -it -v $CONFIG_DIR:/eib registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 build --definition-file definition.yaml

Una vez que la imagen se haya construido correctamente, vamos a crear una máquina virtual utilizándola:

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, iniciad sesión en el sistema con las credenciales proporcionadas.

Verificad que el enrutamiento esté configurado correctamente:

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

Verificad 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

Verificad 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

9.5.9 Configuraciones de red personalizadas

Ya hemos cubierto la configuración de red predeterminada para Edge Image Builder, que depende de 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 utilizarla es mucho menos cómodo al arrancar múltiples nodos con una única imagen.

Nota
Nota

Se recomienda utilizar la configuración de red predeterminada mediante archivos que describan los estados de red deseados en el directorio /network. Optad por el scripting personalizado solo cuando ese comportamiento no sea aplicable a vuestro caso de uso.

Construiremos y aprovisionaremos un nodo edge utilizando una estructura de configuración diferente. Sigue todos los pasos desde Sección 9.5.3, “Creación del directorio de configuración de la imagen” hasta Sección 9.5.5, “Definición de las configuraciones de red”.

En este ejemplo, crearemos un guion personalizado que aplique una configuración estática para la interfaz eth0 en todos los nodos aprovisionados, además de eliminar y deshabilitar las conexiones cableadas creadas automáticamente por NetworkManager. Esto resulta beneficioso en situaciones en las que se desea asegurar que cada nodo del clúster tenga una configuración de red idéntica y, por tanto, no es necesario preocuparse por la dirección MAC de cada nodo antes de la creación de la imagen.

Empecemos almacenando 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 la configuración estática está creada, 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
Nota
Nota

El binario nmc seguirá incluyéndose por defecto, por lo que también puede utilizarse en el guion configure-network.sh si fuera necesario.

Aviso
Aviso

El guion personalizado debe proporcionarse siempre en /network/configure-network.sh dentro del directorio de configuración. Si está presente, se ignorarán todos los demás archivos. NO es posible configurar una red trabajando simultáneamente con configuraciones estáticas en formato YAML y un script personalizado.

El directorio de configuración en este punto debería tener el siguiente aspecto:

├── definition.yaml
├── custom/
│   └── files/
│       └── eth0.nmconnection
├── network/
│   └── configure-network.sh
└── base-images/
    └── SL-Micro.x86_64-6.2-Base-GM.raw

Vamos a construir la imagen:

podman run --rm -it -v $CONFIG_DIR:/eib registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 build --definition-file definition.yaml

Una vez que la imagen se haya construido correctamente, vamos a crear una máquina virtual utilizándola:

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, iniciad sesión en el sistema con las credenciales proporcionadas.

Verificad que el enrutamiento esté configurado correctamente:

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

Verificad 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

Verificad que una interfaz Ethernet esté configurada estáticamente utilizando nuestro archivo de conexión y que 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

10 Elemental

Elemental es una pila de software que permite la gestión centralizada y completa del sistema operativo nativo de nube con Kubernetes. La pila Elemental consta de una serie de componentes que residen en el propio Rancher o en los nodos edge. Los componentes principales son:

  • elemental-operator - El operador principal que reside en Rancher y gestiona las solicitudes de registro de los clientes.

  • elemental-register - El cliente que se ejecuta en los nodos edge permitiendo el registro a través de elemental-operator.

  • elemental-system-agent - Un agente que reside en los nodos edge; su configuración se alimenta desde elemental-register y recibe un plan para configurar el rancher-system-agent

  • rancher-system-agent - Una vez que el nodo edge se ha registrado completamente, este toma el relevo de elemental-system-agent y espera más plans de Rancher Manager (por ejemplo, para la instalación de Kubernetes).

Consulte la documentación en sentido ascendente de Elemental para obtener información completa sobre Elemental y su relación con Rancher.

10.1 ¿Cómo utiliza SUSE Edge Elemental?

Utilizamos partes de Elemental para gestionar dispositivos remotos donde Metal3 no es una opción (por ejemplo, no hay BMC, o el dispositivo está detrás de un gateway NAT). Esta herramienta permite a un operador iniciar sus dispositivos en un laboratorio antes de saber cuándo o dónde se enviarán. Concretamente, aprovechamos los componentes elemental-register y elemental-system-agent para permitir la incorporación de hosts de SUSE Linux Micro a Rancher para casos de uso de aprovisionamiento de red "phone home". Al utilizar Edge Image Builder (EIB) para crear imágenes de despliegue, el registro automático a través de Rancher mediante Elemental puede lograrse especificando la configuración de registro en el directorio de configuración de EIB.

Nota
Nota

En SUSE Edge 3.6 no aprovechamos los aspectos de gestión del sistema operativo de Elemental y, por tanto, no es posible gestionar la aplicación de parches de su sistema operativo a través de Rancher. En lugar de utilizar las herramientas de Elemental para crear imágenes de despliegue, SUSE Edge utiliza las herramientas de Edge Image Builder, que consumen la configuración de registro.

10.2 Prácticas recomendadas

10.2.1 Medios de instalación

La forma recomendada SUSE Edge de crear imágenes de despliegue que puedan aprovechar Elemental para el registro en Rancher en el modelo de despliegue de «aprovisionamiento de red phone home» es seguir las instrucciones detalladas en la guía de inicio rápido de incorporación de hosts remotos con Elemental (Capítulo 1, Incorporación de hosts remotos con Elemental).

10.2.2 Etiquetas

Elemental realiza un seguimiento de su inventario con el CRD MachineInventory y proporciona una forma de seleccionar el inventario, por ejemplo, para seleccionar máquinas en las que desplegar clústeres de Kubernetes, basándose en etiquetas. Esto proporciona una forma para que los usuarios predefinan la mayoría (si no todas) de sus necesidades de infraestructura antes incluso de comprar el hardware. Además, dado que los nodos pueden añadir/eliminar etiquetas en sus respectivos objetos de inventario (volviendo a ejecutar elemental-register con el indicador adicional --label "FOO=BAR"), podemos escribir guiones que descubran y comuniquen a Rancher dónde se ha arrancado un nodo.

10.3 Problemas conocidos

  • La interfaz de usuario de Elemental no sabe actualmente cómo crear medios de instalación ni actualizar sistemas operativos que no sean «Elemental Teal». Esto debería solucionarse en futuras versiones.

11 K3s

K3s es una distribución de Kubernetes certificada y de alta disponibilidad diseñada para cargas de trabajo de producción en ubicaciones remotas, desatendidas y con recursos limitados, o dentro de dispositivos IoT.

Se empaqueta como un binario único y pequeño, por lo que las instalaciones y actualizaciones son rápidas y sencillas.

11.1 ¿Cómo utiliza SUSE Edge K3s?

K3s se puede utilizar como la distribución de Kubernetes que respalda la pila SUSE Edge. Está pensado para instalarse en un sistema operativo SUSE Linux Micro.

El uso de K3s como distribución de Kubernetes de la pila SUSE Edge solo se recomienda cuando etcd como backend no se ajusta a sus limitaciones. Si etcd como backend es posible, es mejor utilizar RKE2 (Capítulo 12, RKE2).

11.2 Prácticas recomendadas

11.2.1 Instalación

La forma recomendada de instalar K3s como parte de la pila SUSE Edge es mediante Edge Image Builder (EIB). Consulte su documentación (Capítulo 8, Edge Image Builder) para obtener más detalles sobre cómo configurarlo para desplegar K3s.

Admite automáticamente la configuración de alta disponibilidad (HA), así como la configuración de Elemental.

11.2.2 Fleet para el flujo de trabajo de GitOps

La pila SUSE Edge utiliza Fleet como su herramienta de GitOps preferida. Para obtener más información sobre su instalación y uso, consulte la sección de Fleet (Capítulo 6, Fleet) en esta documentación.

11.2.3 Gestión del almacenamiento

K3s viene con almacenamiento de ruta local preconfigurado, que es adecuado para clústeres de un solo nodo. Para clústeres que abarcan varios nodos, recomendamos utilizar SUSE Storage (Capítulo 13, SUSE Storage).

11.2.4 Balance de la carga y alta disponibilidad

Si ha instalado K3s utilizando EIB, esta parte ya está cubierta por la documentación de EIB en la sección de alta disponibilidad.

De lo contrario, debe instalar y configurar MetalLB según nuestra documentación de MetalLB (Capítulo 21, MetalLB en K3s (usando el modo de capa 2)).

12 RKE2

Consulte la documentación oficial de RKE2.

RKE2 es una distribución de Kubernetes totalmente conforme que se centra en la seguridad y el cumplimiento mediante:

  • Proporcionando opciones predeterminadas y de configuración que permiten a los clústeres pasar el benchmark CIS de Kubernetes v1.6 o v1.23 con una mínima intervención del operador

  • Habilitando el cumplimiento de FIPS 140-2

  • Analizando periódicamente los componentes en busca de CVEs mediante trivy en la canalización de compilación de RKE2

RKE2 lanza los componentes del plano de control como pods estáticos, gestionados por kubelet. El entorno de ejecución de contenedor integrado es containerd.

Nota: RKE2 también se conoce como RKE Government para transmitir otro caso de uso y sector al que se dirige actualmente.

12.1 RKE2 vs K3s

K3s es una distribución de Kubernetes totalmente conforme y ligera, centrada en Edge, IoT y en la familia de arquitecturas ARM, optimizada para facilitar su uso y para entornos con recursos limitados

RKE2 combina lo mejor de ambos mundos de la versión 1.x de RKE (en adelante denominada RKE1) y K3s.

De K3s, hereda la facilidad de uso, la sencillez de funcionamiento y el modelo de despliegue.

De RKE1, hereda una estrecha alineación con Kubernetes upstream. En algunos aspectos, K3s se ha desviado de Kubernetes upstream para optimizar despliegues en edge, pero RKE1 y RKE2 pueden mantenerse estrechamente alineados con upstream

12.2 ¿Cómo utiliza SUSE Edge RKE2?

RKE2 es una pieza fundamental de la pila SUSE Edge. Se asienta sobre SUSE Linux Micro (Capítulo 7, SUSE Linux Micro), proporcionando una interfaz de Kubernetes estándar necesaria para desplegar cargas de trabajo de Edge.

12.3 Prácticas recomendadas

12.3.1 Instalación

La forma recomendada de instalar RKE2 como parte de la pila SUSE Edge es mediante el uso de Edge Image Builder (EIB). Consulte la documentación de EIB (Capítulo 8, Edge Image Builder) para obtener más detalles sobre cómo configurarlo para desplegar RKE2.

EIB es lo suficientemente flexible como para admitir cualquier parámetro requerido por RKE2, como especificar la versión de RKE2, la configuración de los servidores o de los agentes, cubriendo todos los casos de uso de Edge.

12.3.2 Gran disponibilidad

Para despliegues de alta disponibilidad, EIB despliega y configura automáticamente MetalLB (Capítulo 15, MetalLB) y el Endpoint Copier Operator (Capítulo 16, Operador de Endpoint Copier) para exponer el punto de conexión de la API de RKE2 externamente.

12.3.3 Conectividad

La pila SUSE Edge admite Cilium, Calico, siendo Cilium su CNI predeterminado. También se puede utilizar el metaplugin Multus cuando los pods requieran múltiples interfaces de red. RKE2 independiente admite una gama más amplia de opciones de CNI.

12.3.4 Almacenamiento

RKE2 no proporciona ningún tipo de clase de almacenamiento persistente ni operadores. Para clústeres que abarcan varios nodos, se recomienda utilizar SUSE Storage (Capítulo 13, SUSE Storage).

SUSE Storage es un sistema de almacenamiento distribuido en bloques ligero, fiable y fácil de usar diseñado para Kubernetes. Es un producto basado en Longhorn, un proyecto de código abierto desarrollado inicialmente por Rancher Labs y actualmente incubado bajo la CNCF.

13.1 Requisitos previos

Si estáis siguiendo esta guía, se asume que ya disponéis de lo siguiente:

  • Al menos un host con SUSE Linux Micro 6.2 instalado; puede ser físico o virtual

  • Un clúster de Kubernetes instalado; ya sea K3s o RKE2

  • Helm

13.2 Instalación manual de SUSE Storage

13.2.1 Instalación de Open-iSCSI

Un requisito fundamental para desplegar y utilizar SUSE Storage es la instalación del paquete open-iscsi y que el daemon iscsid se ejecute en todos los nodos de Kubernetes. Esto es necesario, ya que Longhorn depende de iscsiadm en el host para proporcionar volúmenes persistentes a Kubernetes.

Vamos a instalarlo:

transactional-update pkg install open-iscsi

Es importante señalar que, una vez completada la operación, el paquete solo se instala en una nueva instantánea, ya que SUSE Linux Micro es un sistema operativo inmutable. Para cargarlo y que el daemon iscsid comience a ejecutarse, debemos reiniciar en esa nueva instantánea que acabamos de crear. Ejecutad el comando de reinicio cuando estéis listos:

reboot
Sugerencia
Sugerencia

Para obtener ayuda adicional sobre la instalación de open-iscsi, consultad la documentación oficial de Longhorn.

13.2.2 Instalación de SUSE Storage

Existen varias formas de instalar SUSE Storage en vuestros clústeres de Kubernetes. Esta guía seguirá la instalación mediante Helm; no obstante, sentíos libres de seguir la documentación oficial si deseáis utilizar otro enfoque.

  1. Iniciad sesión en la colección de aplicaciones de Rancher:

    helm registry login dp.apps.rancher.io --username $APPS.RANCHER.IO_USERNAME --password $APPS.RANCHER.IO_ACCESS_TOKEN
  2. Instalad SUSE Storage en el espacio de nombres longhorn-system y añadid vuestras credenciales del registro de contenedores:

    helm install longhorn oci://dp.apps.rancher.io/charts/suse-storage \
      --version 1.11.2 \
      --namespace longhorn-system \
      --create-namespace \
      --set privateRegistry.createSecret=true \
      --set privateRegistry.registryUrl=dp.apps.rancher.io \
      --set privateRegistry.registryUser=$APPS.RANCHER.IO_USERNAME \
      --set privateRegistry.registryPasswd=$APPS.RANCHER.IO_ACCESS_TOKEN \
      --set privateRegistry.registrySecret=application-collection
  3. Confirmad que el despliegue se ha realizado correctamente:

    kubectl -n longhorn-system get pods
    localhost:~ # kubectl -n longhorn-system get pods
    NAME                                                READY   STATUS    RESTARTS        AGE
    csi-attacher-7656559cf4-pkhh6                       1/1     Running   0               103s
    csi-attacher-7656559cf4-pnzw5                       1/1     Running   0               103s
    csi-attacher-7656559cf4-z94mm                       1/1     Running   0               103s
    csi-provisioner-6d9cf6456d-kcwtq                    1/1     Running   0               103s
    csi-provisioner-6d9cf6456d-mvvml                    1/1     Running   0               103s
    csi-provisioner-6d9cf6456d-q4f88                    1/1     Running   0               103s
    csi-resizer-f587cd467-clr2n                         1/1     Running   0               103s
    csi-resizer-f587cd467-z28v4                         1/1     Running   0               103s
    csi-resizer-f587cd467-zxmtx                         1/1     Running   0               103s
    csi-snapshotter-6dcdf78684-757mg                    1/1     Running   0               103s
    csi-snapshotter-6dcdf78684-8ktgc                    1/1     Running   0               103s
    csi-snapshotter-6dcdf78684-ffsqr                    1/1     Running   0               103s
    engine-image-ei-099f845a-lvdtr                      1/1     Running   0               2m21s
    instance-manager-4adffddaffe02374cd5635b8a6113de7   1/1     Running   0               111s
    longhorn-csi-plugin-w7pwr                           3/3     Running   0               103s
    longhorn-driver-deployer-6886fb84bc-wm9h6           1/1     Running   2 (2m32s ago)   2m45s
    longhorn-manager-zblbl                              2/2     Running   0               2m45s
    longhorn-ui-6bcc65d4bd-mcn6r                        1/1     Running   0               2m45s
    longhorn-ui-6bcc65d4bd-rwf97                        1/1     Running   0               2m45s

13.3 Creación de volúmenes de SUSE Storage

SUSE Storage utiliza recursos de Kubernetes llamados StorageClass para aprovisionar automáticamente objetos PersistentVolume para los pods. Pensad en StorageClass como una forma en que los administradores describen las clases o perfiles de almacenamiento que ofrecen.

Vamos a crear un StorageClass con algunas opciones predeterminadas:

kubectl apply -f - <<EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: longhorn-example
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
  numberOfReplicas: "3"
  staleReplicaTimeout: "2880" # 48 hours in minutes
  fromBackup: ""
  fsType: "ext4"
EOF

Ahora que tenemos nuestro StorageClass en su lugar, necesitamos un PersistentVolumeClaim que haga referencia a él. Una PersistentVolumeClaim (PVC) es una solicitud de almacenamiento por parte de un usuario. Los PVC consumen recursos PersistentVolume. Las reclamaciones pueden solicitar tamaños y modos de acceso específicos (por ejemplo, pueden montarse una vez en lectura-escritura o muchas veces en solo lectura).

Vamos a crear una PersistentVolumeClaim:

kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-volv-pvc
  namespace: longhorn-system
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn-example
  resources:
    requests:
      storage: 2Gi
EOF

Es así de sencillo. Una vez que hayamos creado la PersistentVolumeClaim, podemos proceder a adjuntarla a un Pod. Cuando se despliega el Pod, Kubernetes crea el volumen de Longhorn y lo vincula a la Pod si hay almacenamiento disponible.

kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
  namespace: longhorn-system
spec:
  containers:
  - name: volume-test
    image: nginx:stable-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: volv
      mountPath: /data
    ports:
    - containerPort: 80
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: longhorn-volv-pvc
EOF
Sugerencia
Sugerencia

El concepto de almacenamiento en Kubernetes es un tema complejo, pero importante. Hemos mencionado brevemente algunos de los recursos de Kubernetes más comunes; no obstante, os sugerimos que os familiaricéis con la documentación de terminología que ofrece Longhorn.

En este ejemplo, el resultado debería ser parecido a esto:

localhost:~ # kubectl get storageclass
NAME                 PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
longhorn (default)   driver.longhorn.io   Delete          Immediate           true                   12m
longhorn-example     driver.longhorn.io   Delete          Immediate           true                   24s

localhost:~ # kubectl get pvc -n longhorn-system
NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
longhorn-volv-pvc   Bound    pvc-f663a92e-ac32-49ae-b8e5-8a6cc29a7d1e   2Gi        RWO            longhorn-example   54s

localhost:~ # kubectl get pods -n longhorn-system
NAME                                                READY   STATUS    RESTARTS      AGE
csi-attacher-5c4bfdcf59-qmjtz                       1/1     Running   0             14m
csi-attacher-5c4bfdcf59-s7n65                       1/1     Running   0             14m
csi-attacher-5c4bfdcf59-w9xgs                       1/1     Running   0             14m
csi-provisioner-667796df57-fmz2d                    1/1     Running   0             14m
csi-provisioner-667796df57-p7rjr                    1/1     Running   0             14m
csi-provisioner-667796df57-w9fdq                    1/1     Running   0             14m
csi-resizer-694f8f5f64-2rb8v                        1/1     Running   0             14m
csi-resizer-694f8f5f64-z9v9x                        1/1     Running   0             14m
csi-resizer-694f8f5f64-zlncz                        1/1     Running   0             14m
csi-snapshotter-959b69d4b-5dpvj                     1/1     Running   0             14m
csi-snapshotter-959b69d4b-lwwkv                     1/1     Running   0             14m
csi-snapshotter-959b69d4b-tzhwc                     1/1     Running   0             14m
engine-image-ei-5cefaf2b-hvdv5                      1/1     Running   0             14m
instance-manager-0ee452a2e9583753e35ad00602250c5b   1/1     Running   0             14m
longhorn-csi-plugin-gd2jx                           3/3     Running   0             14m
longhorn-driver-deployer-9f4fc86-j6h2b              1/1     Running   0             15m
longhorn-manager-z4lnl                              1/1     Running   0             15m
longhorn-ui-5f4b7bbf69-bln7h                        1/1     Running   3 (14m ago)   15m
longhorn-ui-5f4b7bbf69-lh97n                        1/1     Running   3 (14m ago)   15m
volume-test                                         1/1     Running   0             26s

13.4 Acceso a la interfaz de usuario

Si habéis instalado SUSE Storage con kubectl o Helm, debéis configurar un controlador de Ingress para permitir el tráfico externo al clúster. La autenticación no está habilitada de forma predeterminada. Si se utilizó la aplicación de catálogo de Rancher, Rancher creó automáticamente un controlador de Ingress con control de acceso (el rancher-proxy).

  1. Obtened la dirección IP del servicio externo de Longhorn:

    kubectl -n longhorn-system get svc
  2. Una vez que hayáis recuperado la dirección IP longhorn-frontend, podéis empezar a utilizar la interfaz de usuario navegando hasta ella en vuestro navegador.

13.5 Instalación con Edge Image Builder

SUSE Edge utiliza Capítulo 8, Edge Image Builder para personalizar las imágenes base del SO SUSE Linux Micro. Vamos a demostrar cómo hacerlo para aprovisionar un clúster RKE2 con SUSE Storage sobre él.

Vamos a crear el archivo de definición:

export CONFIG_DIR=$HOME/eib
mkdir -p $CONFIG_DIR

cat << EOF > $CONFIG_DIR/iso-definition.yaml
apiVersion: 1.3
image:
  imageType: iso
  baseImage: SL-Micro.x86_64-6.2-Base-SelfInstall-GM.install.iso
  arch: x86_64
  outputImageName: eib-image.iso
kubernetes:
  version: v1.35.4+rke2r1
  helm:
    charts:
      - name: suse-storage
        releaseName: longhorn
        version: 1.11.2
        repositoryName: rancher-application-collection
        targetNamespace: longhorn-system
        createNamespace: true
        installationNamespace: kube-system
    repositories:
      - name: rancher-application-collection
        url: oci://dp.apps.rancher.io/charts
        authentication:
          username: $APPS.RANCHER.IO_USERNAME
          password: $APPS.RANCHER.IO_ACCESS_TOKEN
embeddedArtifactRegistry:
  registries:
    - uri: dp.apps.rancher.io
      authentication:
        username: $APPS.RANCHER.IO_USERNAME
        password: $APPS.RANCHER.IO_ACCESS_TOKEN
  images:
    - name: dp.apps.rancher.io/containers/kubernetes-csi-external-attacher:4.11.0-13.2
    - name: dp.apps.rancher.io/containers/kubernetes-csi-external-provisioner:5.3.0-14.1
    - name: dp.apps.rancher.io/containers/kubernetes-csi-external-resizer:2.1.0-6.2
    - name: dp.apps.rancher.io/containers/kubernetes-csi-external-snapshotter:8.5.0-13.2
    - name: dp.apps.rancher.io/containers/kubernetes-csi-livenessprobe:2.18.0-13.2
    - name: dp.apps.rancher.io/containers/kubernetes-csi-node-driver-registrar:2.16.0-13.2
    - name: dp.apps.rancher.io/containers/longhorn-backing-image-manager:1.11.2-4.1
    - name: dp.apps.rancher.io/containers/longhorn-engine:1.11.2-4.2
    - name: dp.apps.rancher.io/containers/longhorn-instance-manager:1.11.2-4.3
    - name: dp.apps.rancher.io/containers/longhorn-manager:1.11.2-4.2
    - name: dp.apps.rancher.io/containers/longhorn-share-manager:1.11.2-4.1
    - name: dp.apps.rancher.io/containers/longhorn-ui:1.11.2-4.1
    - name: dp.apps.rancher.io/containers/rancher-support-bundle-kit:0.0.84-9.4
operatingSystem:
  packages:
    sccRegistrationCode: <reg-code>
    packageList:
      - open-iscsi
  users:
  - username: root
    encryptedPassword: \$6\$jHugJNNd3HElGsUZ\$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
EOF
Nota
Nota

Es posible personalizar cualquiera de los valores del gráfico de Helm mediante un archivo independiente proporcionado en helm.charts[].valuesFile. Consulte la documentación en sentido ascendente para obtener información detallada.

Vamos a compilar la imagen:

podman run --rm --privileged -it -v $CONFIG_DIR:/eib registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 build --definition-file $CONFIG_DIR/iso-definition.yaml

Una vez compilada la imagen, podéis utilizarla para instalar vuestro SO en un host físico o virtual. Una vez completado el aprovisionamiento, podéis iniciar sesión en el sistema utilizando el par de credenciales root:eib.

Aseguraos de que SUSE Storage se haya desplegado correctamente:

localhost:~ # /var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml -n longhorn-system get pods
NAME                                                READY   STATUS    RESTARTS        AGE
csi-attacher-5c4bfdcf59-qmjtz                       1/1     Running   0               103s
csi-attacher-5c4bfdcf59-s7n65                       1/1     Running   0               103s
csi-attacher-5c4bfdcf59-w9xgs                       1/1     Running   0               103s
csi-provisioner-667796df57-fmz2d                    1/1     Running   0               103s
csi-provisioner-667796df57-p7rjr                    1/1     Running   0               103s
csi-provisioner-667796df57-w9fdq                    1/1     Running   0               103s
csi-resizer-694f8f5f64-2rb8v                        1/1     Running   0               103s
csi-resizer-694f8f5f64-z9v9x                        1/1     Running   0               103s
csi-resizer-694f8f5f64-zlncz                        1/1     Running   0               103s
csi-snapshotter-959b69d4b-5dpvj                     1/1     Running   0               103s
csi-snapshotter-959b69d4b-lwwkv                     1/1     Running   0               103s
csi-snapshotter-959b69d4b-tzhwc                     1/1     Running   0               103s
engine-image-ei-5cefaf2b-hvdv5                      1/1     Running   0               109s
instance-manager-0ee452a2e9583753e35ad00602250c5b   1/1     Running   0               109s
longhorn-csi-plugin-gd2jx                           3/3     Running   0               103s
longhorn-driver-deployer-9f4fc86-j6h2b              1/1     Running   0               2m28s
longhorn-manager-z4lnl                              1/1     Running   0               2m28s
longhorn-ui-5f4b7bbf69-bln7h                        1/1     Running   3 (2m7s ago)    2m28s
longhorn-ui-5f4b7bbf69-lh97n                        1/1     Running   3 (2m10s ago)   2m28s
Nota
Nota

Esta instalación no funcionará en entornos completamente aislados. En esos casos, consultad Sección 25.8, “Instalación de SUSE Storage”.

SUSE Security es una solución de seguridad para Kubernetes que proporciona seguridad de red L7, seguridad en tiempo de ejecución, seguridad del sistema de suministro y comprobaciones de cumplimiento en un paquete cohesivo.

SUSE Security es un producto que se despliega como una plataforma de múltiples contenedores, cada uno de los cuales se comunica a través de varios puertos e interfaces. Internamente, utiliza NeuVector como su componente de seguridad de contenedores subyacente. Los siguientes contenedores conforman la plataforma SUSE Security:

  • . Un contenedor sin estado que presenta la consola basada en web. Normalmente, solo se necesita uno y puede ejecutarse en cualquier lugar. El fallo del gestor no afecta a ninguna de las operaciones del controlador o del Enforcer. Sin embargo, ciertas notificaciones (eventos) y datos de conexión recientes son almacenados en caché en la memoria por el gestor, por lo que su visualización se vería afectada.

  • Controlador. El «plano de control» para SUSE Security debe desplegarse en una configuración de alta disponibilidad (HA), para que la configuración no se pierda en caso de fallo de un nodo. Estos pueden ejecutarse en cualquier lugar, aunque los clientes suelen optar por colocarlos en nodos de «gestión», maestros o de infraestructura debido a su criticidad.

  • Enforcer. Este contenedor se despliega como un DaemonSet, por lo que hay un Enforcer en cada nodo que se debe proteger. Normalmente se despliega en todos los nodos de trabajo, pero se puede habilitar la programación para que también se despliegue en los nodos maestros e infra. Nota: Si el Enforcer no está en un nodo del clúster y las conexiones provienen de un pod en ese nodo, SUSE Security las etiqueta como cargas de trabajo «no gestionadas».

  • Escáner. Realiza el escaneo de vulnerabilidades utilizando la base de datos de CVE integrada, según las instrucciones del controlador. Se pueden desplegar múltiples escáneres para aumentar la capacidad de escaneo. Los escáneres pueden ejecutarse en cualquier lugar, pero a menudo se ejecutan en los nodos donde se ejecutan los controladores. Véase a continuación las consideraciones de dimensionamiento de los nodos del escáner. Un escáner también puede invocarse de forma independiente cuando se utiliza para el escaneo en la fase de compilación, por ejemplo, dentro de una canalización que activa un escaneo, recupera los resultados y termina el escáner. El escáner contiene la base de datos de CVE más reciente, por lo que debe actualizarse diariamente.

  • Actualizador. El actualizador activa una actualización del escáner mediante un trabajo cron de Kubernetes cuando se desea una actualización de la base de datos de CVE. Asegúrense de configurar esto para su entorno.

Se puede encontrar una documentación más detallada sobre la incorporación y las mejores prácticas de SUSE Security aquí.

14.1 ¿Cómo utiliza SUSE Edge SUSE Security?

SUSE Edge proporciona una configuración más ligera de SUSE Security como punto de partida para despliegues edge.

14.2 Notas importantes

  • El contenedor Scanner debe tener suficiente memoria para extraer la imagen que se va a escanear a la memoria y expandirla. Para escanear imágenes que superen 1 GB, aumenten la memoria del escáner ligeramente por encima del tamaño de imagen esperado más grande.

  • Se esperan muchas conexiones de red en el modo Protect. El Enforcer requiere CPU y memoria cuando está en modo Protect (bloqueo de firewall en línea) para mantener e inspeccionar las conexiones y la posible carga útil (DLP). Aumentar la memoria y dedicar un núcleo de CPU al Enforcer puede garantizar una capacidad de filtrado de paquetes adecuada.

14.3 Instalación con Edge Image Builder

SUSE Edge utiliza Capítulo 8, Edge Image Builder para personalizar las imágenes base de SUSE Linux Micro OS. Sigan Sección 25.7, “Instalación de SUSE Security” para una instalación en entorno aislado de SUSE Security sobre clústeres de Kubernetes aprovisionados por EIB.

15 MetalLB

Véase la documentación oficial de MetalLB.

MetalLB es una implementación de balance de la carga para clústeres de Kubernetes en equipo sin sistema operativo, que utiliza protocolos de enrutamiento estándar.

En entornos de equipo sin sistema operativo, configurar balanceadores de carga de red es notablemente más complejo que en entornos en la nube. A diferencia de las sencillas llamadas a la API en configuraciones en la nube, el entorno de equipo sin sistema operativo requiere dispositivos de red dedicados o una combinación de balanceadores de carga y configuraciones de IP virtual (VIP) para gestionar la alta disponibilidad (HA) o resolver el posible punto único de fallo (SPOF) inherente a un balanceador de carga de un solo nodo. Estas configuraciones no se automatizan fácilmente, lo que plantea desafíos en los despliegues de Kubernetes donde los componentes se escalan dinámicamente.

MetalLB aborda estos desafíos aprovechando el modelo de Kubernetes para crear servicios del tipo LoadBalancer como si estuvieran operando en un entorno en la nube, incluso en configuraciones de equipo sin sistema operativo.

Existen dos enfoques diferentes, mediante modo L2 (usando trucos ARP) o mediante BGP. Principalmente, L2 no necesita ningún equipo de red especial, pero BGP es, en general, mejor. Depende de los casos de uso.

15.1 ¿Cómo utiliza SUSE Edge MetalLB?

SUSE Edge utiliza MetalLB de tres formas clave:

  • Como solución de balance de la carga: MetalLB sirve como solución de balance de la carga para máquinas de equipo sin sistema operativo.

  • Para una configuración de HA K3s/RKE2: MetalLB permite equilibrar la carga de la API de Kubernetes mediante una dirección IP virtual.

  • Como solución BGP de capa 3, MetalLB anuncia rutas a las IP de servicio a los routers cercanos.

Nota
Nota

Para poder exponer la API, se utiliza el Endpoint Copier Operator (Capítulo 16, Operador de Endpoint Copier) para mantener sincronizados los endpoints de la API de K8s desde el servicio kubernetes a un servicio del tipo LoadBalancer kubernetes-vip.

15.2 Prácticas recomendadas

La instalación de MetalLB en modo L2 se describe en Capítulo 21, MetalLB en K3s (usando el modo de capa 2) y para el modo L3 en Capítulo 22, MetalLB en K3s (usando el modo de capa 3).

Puede encontrar una guía sobre la instalación de MetalLB delante de kube-api-server para lograr una topología de alta disponibilidad en Capítulo 24, MetalLB delante del servidor de API de Kubernetes.

15.3 Problemas conocidos

  • K3s incluye su propia solución de balance de la carga llamada Klipper. Para utilizar Klipper`MetalLB, debe desactivarse. Esto puede hacerse iniciando el servidor K3s con la opción `--disable servicelb, tal como se describe en la documentación de K3s.

16 Operador de Endpoint Copier

Endpoint Copier Operator es un operador de Kubernetes cuyo propósito es crear una copia de un Servicio y un Endpoint de Kubernetes y mantenerlos sincronizados.

16.1 ¿Cómo utiliza SUSE Edge el Operador de Endpoint Copier?

En SUSE Edge, el Operador de Endpoint Copier desempeña un papel crucial para lograr una configuración de alta disponibilidad (HA) para clústeres K3s/RKE2. Esto se logra creando un servicio kubernetes-vip de tipo LoadBalancer, asegurando que su Endpoint permanezca en sincronización constante con el Endpoint de Kubernetes. Se aprovecha MetalLB (Capítulo 15, MetalLB) para gestionar el servicio kubernetes-vip, ya que la dirección IP expuesta se utiliza desde otros nodos para unirse al clúster.

16.2 Mejores prácticas

La documentación completa para utilizar el Operador de Endpoint Copier se puede encontrar aquí.

Además, consulte nuestra guía (Capítulo 21, MetalLB en K3s (usando el modo de capa 2)) sobre cómo lograr una configuración de alta disponibilidad (HA) de K3s/RKE2 utilizando el Operador de Endpoint Copier y MetalLB.

16.3 Problemas conocidos

Actualmente, el Operador de Endpoint Copier está limitado a trabajar con un solo Servicio/Endpoint. Se planean mejoras para admitir múltiples Servicios/Endpoints en el futuro.

17 Virtualización de borde

Esta sección describe cómo puede utilizar la virtualización de borde para ejecutar máquinas virtuales en sus nodos de borde. La virtualización de borde está diseñada para casos de uso de virtualización ligera, donde se espera que se utilice un flujo de trabajo común para el despliegue y la gestión de aplicaciones tanto virtualizadas como en contenedores.

SUSE Edge La virtualización admite dos métodos para ejecutar máquinas virtuales:

  1. Despliegue manual de las máquinas virtuales mediante libvirt+qemu-kvm a nivel de host (donde Kubernetes no interviene)

  2. Despliegue del operador KubeVirt para la gestión de máquinas virtuales basada en Kubernetes

Ambas opciones son válidas, pero a continuación solo se trata la segunda. Si desea utilizar los mecanismos de virtualización estándar listos para usar que proporciona SUSE Linux Micro, puede encontrar una guía completa aquí, y aunque se redactó principalmente para SUSE Linux Enterprise Server, los conceptos son casi idénticos.

Esta guía explica inicialmente cómo desplegar los componentes de virtualización adicionales en un sistema que ya ha sido predesplegado, pero continúa con una sección que describe cómo integrar esta configuración en el despliegue inicial mediante Edge Image Builder. Si no desea repasar los conceptos básicos y configurar las cosas manualmente, pase directamente a esa sección.

17.1 Visión general de KubeVirt

KubeVirt permite gestionar máquinas virtuales con Kubernetes junto con el resto de sus cargas de trabajo en contenedores. Lo hace ejecutando la parte del espacio de usuario de la pila de virtualización de Linux en un contenedor. Esto minimiza los requisitos del sistema host, lo que permite una configuración y gestión más sencillas.

Los detalles sobre la arquitectura de KubeVirt se pueden encontrar en la documentación de sentido ascendente.

17.2 Requisitos previos

Si está siguiendo esta guía, asumimos que ya tiene disponible lo siguiente:

  • Al menos un host físico con SUSE Linux Micro 6.2 instalado y con las extensiones de virtualización habilitadas en la BIOS (consulte aquí para obtener más detalles).

  • En sus nodos, un clúster de Kubernetes K3s/RKE2 ya desplegado y con un kubeconfig adecuado que permita el acceso de superusuario al clúster.

  • Acceso al usuario raíz: estas instrucciones asumen que usted es el usuario raíz y no que está escalando sus privilegios mediante sudo.

  • Tiene Helm disponible localmente con una conexión de red adecuada para poder enviar configuraciones a su clúster de Kubernetes y descargar las imágenes necesarias.

17.3 Instalación manual de la virtualización de borde

Esta guía no le explicará el despliegue de Kubernetes, pero asume que ha instalado la versión adecuada de SUSE Edge de K3s o RKE2 y que tiene su kubeconfig configurado en consecuencia para que los comandos estándar de kubectl se puedan ejecutar como superusuario. Asumimos que su nodo forma un clúster de un solo nodo, aunque no se esperan diferencias significativas para los despliegues de varios nodos.

SUSE Edge Virtualization se despliega mediante tres gráficos de Helm independientes, concretamente:

  • KubeVirt: Los componentes fundamentales de la virtualización, es decir, los CRD de Kubernetes, operadores y otros componentes necesarios para permitir que Kubernetes despliegue y gestione máquinas virtuales.

  • Extensión del panel de control de KubeVirt: Una extensión opcional de la interfaz de usuario de Rancher que permite la gestión básica de máquinas virtuales, por ejemplo, iniciar/detener máquinas virtuales, así como acceder a la consola.

  • Importador de datos en contenedores (CDI): Un componente adicional que permite la integración de almacenamiento persistente para KubeVirt, proporcionando capacidades para que las máquinas virtuales utilicen sistemas secundarios de almacenamiento de Kubernetes existentes para los datos, pero que también permite a los usuarios importar o clonar volúmenes de datos para las máquinas virtuales.

Cada uno de estos charts de Helm tiene una versión correspondiente a la versión de SUSE Edge que esté utilizando actualmente. Para un uso en producción o con soporte, emplee los artefactos que se pueden encontrar en el registro de SUSE.

Primero, asegúrese de que su acceso a kubectl funciona:

$ kubectl get nodes

Esto debería mostrar algo similar a lo siguiente:

NAME                   STATUS   ROLES                       AGE     VERSION
node1.edge.rdo.wales   Ready    control-plane,etcd,master   4h20m   v1.30.5+rke2r1
node2.edge.rdo.wales   Ready    control-plane,etcd,master   4h15m   v1.30.5+rke2r1
node3.edge.rdo.wales   Ready    control-plane,etcd,master   4h15m   v1.30.5+rke2r1

Ahora puede proceder a instalar los charts de Helm de KubeVirt y Containerized Data Importer (CDI):

$ helm install kubevirt oci://registry.suse.com/edge/charts/kubevirt --namespace kubevirt-system --create-namespace
$ helm install cdi oci://registry.suse.com/edge/charts/cdi --namespace cdi-system --create-namespace

En unos minutos, debería tener todos los componentes de KubeVirt y CDI desplegados. Puede validarlo comprobando todos los recursos desplegados en el espacio de nombres kubevirt-system y cdi-system.

Verificar los recursos de KubeVirt:

$ kubectl get all -n kubevirt-system

Esto debería mostrar algo similar a lo siguiente:

NAME                                   READY   STATUS    RESTARTS      AGE
pod/virt-operator-5fbcf48d58-p7xpm     1/1     Running   0             2m24s
pod/virt-operator-5fbcf48d58-wnf6s     1/1     Running   0             2m24s
pod/virt-handler-t594x                 1/1     Running   0             93s
pod/virt-controller-5f84c69884-cwjvd   1/1     Running   1 (64s ago)   93s
pod/virt-controller-5f84c69884-xxw6q   1/1     Running   1 (64s ago)   93s
pod/virt-api-7dfc54cf95-v8kcl          1/1     Running   1 (59s ago)   118s

NAME                                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubevirt-prometheus-metrics   ClusterIP   None            <none>        443/TCP   2m1s
service/virt-api                      ClusterIP   10.43.56.140    <none>        443/TCP   2m1s
service/kubevirt-operator-webhook     ClusterIP   10.43.201.121   <none>        443/TCP   2m1s
service/virt-exportproxy              ClusterIP   10.43.83.23     <none>        443/TCP   2m1s

NAME                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/virt-handler   1         1         1       1            1           kubernetes.io/os=linux   93s

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/virt-operator     2/2     2            2           2m24s
deployment.apps/virt-controller   2/2     2            2           93s
deployment.apps/virt-api          1/1     1            1           118s

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/virt-operator-5fbcf48d58     2         2         2       2m24s
replicaset.apps/virt-controller-5f84c69884   2         2         2       93s
replicaset.apps/virt-api-7dfc54cf95          1         1         1       118s

NAME                            AGE     PHASE
kubevirt.kubevirt.io/kubevirt   2m24s   Deployed

Verificar los recursos de CDI:

$ kubectl get all -n cdi-system

Esto debería mostrar algo similar a lo siguiente:

NAME                                   READY   STATUS    RESTARTS   AGE
pod/cdi-operator-55c74f4b86-692xb      1/1     Running   0          2m24s
pod/cdi-apiserver-db465b888-62lvr      1/1     Running   0          2m21s
pod/cdi-deployment-56c7d74995-mgkfn    1/1     Running   0          2m21s
pod/cdi-uploadproxy-7d7b94b968-6kxc2   1/1     Running   0          2m22s

NAME                             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/cdi-uploadproxy          ClusterIP   10.43.117.7    <none>        443/TCP    2m22s
service/cdi-api                  ClusterIP   10.43.20.101   <none>        443/TCP    2m22s
service/cdi-prometheus-metrics   ClusterIP   10.43.39.153   <none>        8080/TCP   2m21s

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/cdi-operator      1/1     1            1           2m24s
deployment.apps/cdi-apiserver     1/1     1            1           2m22s
deployment.apps/cdi-deployment    1/1     1            1           2m21s
deployment.apps/cdi-uploadproxy   1/1     1            1           2m22s

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/cdi-operator-55c74f4b86      1         1         1       2m24s
replicaset.apps/cdi-apiserver-db465b888      1         1         1       2m21s
replicaset.apps/cdi-deployment-56c7d74995    1         1         1       2m21s
replicaset.apps/cdi-uploadproxy-7d7b94b968   1         1         1       2m22s

Para verificar que las definiciones de recursos personalizadas (CRD) de VirtualMachine están desplegadas, puede validar con:

$ kubectl explain virtualmachine

Esto debería imprimir la definición del objeto VirtualMachine, que debería mostrarse de la siguiente manera:

GROUP:      kubevirt.io
KIND:       VirtualMachine
VERSION:    v1

DESCRIPTION:
    VirtualMachine handles the VirtualMachines that are not running or are in a
    stopped state The VirtualMachine contains the template to create the
    VirtualMachineInstance. It also mirrors the running state of the created
    VirtualMachineInstance in its status.
(snip)

17.4 Despliegue de máquinas virtuales

Ahora que KubeVirt y CDI están desplegados, defina una máquina virtual sencilla basada en openSUSE Tumbleweed. Esta máquina virtual tiene la configuración más sencilla, utilizando la «red de pod» estándar para una configuración de red idéntica a la de cualquier otro pod. También emplea almacenamiento no persistente, lo que garantiza que el almacenamiento sea efímero, igual que en cualquier contenedor que no tenga un PVC.

$ cat <<EOF > user-data.yaml
#cloud-config
disable_root: false
ssh_pwauth: True
users:
  - default
  - name: suse
    groups: sudo
    shell: /bin/bash
    sudo:  ALL=(ALL) NOPASSWD:ALL
    lock_passwd: False
    plain_text_passwd: 'suse'
EOF
$ kubectl apply -f - <<EOF
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: tumbleweed
  namespace: default
spec:
  runStrategy: Always
  template:
    spec:
      domain:
        devices: {}
        machine:
          type: q35
        memory:
          guest: 2Gi
        resources: {}
      volumes:
      - containerDisk:
          image: quay.io/containerdisks/opensuse-tumbleweed:1.0.0
        name: tumbleweed-containerdisk-0
      - cloudInitNoCloud:
          userDataBase64: $(cat user-data.yaml | base64 -w 0)
        name: cloudinitdisk
EOF

Esto debería mostrar que se ha creado un VirtualMachine:

virtualmachine.kubevirt.io/tumbleweed created

Esta definición de VirtualMachine es mínima y especifica poco sobre la configuración. Simplemente describe que es un tipo de máquina « q35» con 2 GB de memoria que utiliza una imagen de disco basada en un containerDisk efímero (es decir, una imagen de disco que se almacena en una imagen de contenedor desde un repositorio de imágenes remoto), y especifica un disco cloudInit codificado en base64, que solo utilizamos para la creación de usuarios y la aplicación de contraseñas en el momento del arranque (utilice base64 -d para decodificarlo).

Nota
Nota

Esta imagen de máquina virtual es solo para pruebas. La imagen no cuenta con soporte oficial y solo pretende ser un ejemplo de documentación.

Esta máquina tarda unos minutos en arrancar, ya que necesita descargar la imagen de disco de openSUSE Tumbleweed, pero una vez hecho esto, puede ver más detalles sobre la máquina virtual comprobando la información de la máquina virtual:

$ kubectl get vmi

Esto debería mostrar el nodo en el que se inició la máquina virtual y la dirección IP de la máquina virtual. Recuerde que, dado que utiliza la red de pod, la dirección IP notificada será igual que la de cualquier otro pod, y enrutable como tal:

NAME         AGE     PHASE     IP           NODENAME               READY
tumbleweed   4m24s   Running   10.42.2.98   node3.edge.rdo.wales   True

Al ejecutar estos comandos en los propios nodos del clúster de Kubernetes, con una CNI que enruta el tráfico directamente a los pods (por ejemplo, Cilium), debería poder ssh directamente a la propia máquina. Sustituya la siguiente dirección IP por la que se ha asignado a su máquina virtual:

$ ssh suse@10.42.2.98
(password is "suse")

Una vez que esté en esta máquina virtual, podrá experimentar, pero recuerde que está limitada en cuanto a recursos y solo tiene 1 GB de espacio en disco. Cuando haya terminado, Ctrl-D o exit para desconectarse de la sesión SSH.

El proceso de la máquina virtual sigue estando envuelto en un pod estándar de Kubernetes. El CRD VirtualMachine es una representación de la máquina virtual deseada, pero el proceso en el que la máquina virtual se inicia realmente es a través del pod virt-launcher, un pod estándar de Kubernetes, igual que cualquier otra aplicación. Para cada máquina virtual iniciada, puede ver que hay un pod virt-launcher:

$ kubectl get pods

Esto debería mostrar entonces el pod virt-launcher para la máquina Tumbleweed que ha definido:

NAME                             READY   STATUS    RESTARTS   AGE
virt-launcher-tumbleweed-8gcn4   3/3     Running   0          10m

Si echa un vistazo a este pod virt-launcher, verá que está ejecutando los procesos libvirt y qemu-kvm. Puede entrar en el propio pod y echar un vistazo a lo que hay debajo, teniendo en cuenta que debe adaptar el siguiente comando para el nombre de su pod:

$ kubectl exec -it virt-launcher-tumbleweed-8gcn4 -- bash

Una vez que esté en el pod, intente ejecutar los comandos virsh además de observar los procesos. Verá el binario qemu-system-x86_64 en ejecución, junto con ciertos procesos para supervisar la máquina virtual. También verá la ubicación de la imagen de disco y cómo está conectada la red (como un dispositivo tap):

qemu@tumbleweed:/> ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ssl    0:00 /usr/bin/virt-launcher-monitor --qemu-timeout 269s --name tumbleweed --uid b9655c11-38f7-4fa8-8f5d-bfe987dab42c --namespace default --kubevirt-share-dir /var/run/kubevirt --ephemeral-disk-dir /var/run/kubevirt-ephemeral-disks --container-disk-dir /var/run/kube
   12 ?        Sl     0:01 /usr/bin/virt-launcher --qemu-timeout 269s --name tumbleweed --uid b9655c11-38f7-4fa8-8f5d-bfe987dab42c --namespace default --kubevirt-share-dir /var/run/kubevirt --ephemeral-disk-dir /var/run/kubevirt-ephemeral-disks --container-disk-dir /var/run/kubevirt/con
   24 ?        Sl     0:00 /usr/sbin/virtlogd -f /etc/libvirt/virtlogd.conf
   25 ?        Sl     0:01 /usr/sbin/virtqemud -f /var/run/libvirt/virtqemud.conf
   83 ?        Sl     0:31 /usr/bin/qemu-system-x86_64 -name guest=default_tumbleweed,debug-threads=on -S -object {"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/run/kubevirt-private/libvirt/qemu/lib/domain-1-default_tumbleweed/master-key.aes"} -machine pc-q35-7.1,usb
  286 pts/0    Ss     0:00 bash
  320 pts/0    R+     0:00 ps ax

qemu@tumbleweed:/> virsh list --all
 Id   Name                 State
------------------------------------
 1    default_tumbleweed   running

qemu@tumbleweed:/> virsh domblklist 1
 Target   Source
---------------------------------------------------------------------------------------------
 sda      /var/run/kubevirt-ephemeral-disks/disk-data/tumbleweed-containerdisk-0/disk.qcow2
 sdb      /var/run/kubevirt-ephemeral-disks/cloud-init-data/default/tumbleweed/noCloud.iso

qemu@tumbleweed:/> virsh domiflist 1
 Interface   Type       Source   Model                     MAC
------------------------------------------------------------------------------
 tap0        ethernet   -        virtio-non-transitional   e6:e9:1a:05:c0:92

qemu@tumbleweed:/> exit
exit

Por último, elimine esta máquina virtual para realizar una limpieza:

$ kubectl delete vm/tumbleweed
virtualmachine.kubevirt.io "tumbleweed" deleted

17.5 Uso de virtctl

Junto con las herramientas CLI estándar de Kubernetes, es decir, kubectl, KubeVirt incluye una utilidad CLI complementaria que le permite interactuar con su clúster de una forma que salva algunas diferencias entre el mundo de la virtualización y el mundo para el que se diseñó Kubernetes. Por ejemplo, la herramienta virtctl ofrece la capacidad de gestionar el ciclo de vida de las máquinas virtuales (iniciar, detener, reiniciar, etc.), proporcionando acceso a las consolas virtuales, cargando imágenes de máquinas virtuales, así como interactuando con construcciones de Kubernetes como servicios, sin utilizar directamente la API o los CRD.

Descarguemos la última versión estable de la herramienta virtctl:

$ export VERSION=v0.7.0
$ wget https://github.com/kubevirt/kubevirt/releases/download/$VERSION/virtctl-$VERSION-linux-amd64

Si utilizáis una arquitectura diferente o una máquina que no sea Linux, podéis encontrar otras versiones aquí. Debes hacerlo ejecutable antes de continuar, y puede ser útil moverlo a una ubicación dentro de tu $PATH:

$ mv virtctl-$VERSION-linux-amd64 /usr/local/bin/virtctl
$ chmod a+x /usr/local/bin/virtctl

Entonces podrás utilizar la herramienta de línea de comandos virtctl para crear máquinas virtuales. Repliquemos nuestra máquina virtual anterior, teniendo en cuenta que estamos redirigiendo la salida directamente a kubectl apply:

$ cat <<EOF >  user-data.yaml
#cloud-config
disable_root: false
ssh_pwauth: True
users:
  - default
  - name: suse
    groups: sudo
    shell: /bin/bash
    sudo:  ALL=(ALL) NOPASSWD:ALL
    lock_passwd: False
    plain_text_passwd: 'suse'
EOF
$ alias virtctl=echo
$ virtctl create vm --name virtctl-example --memory=1Gi \
    --volume-containerdisk=src:quay.io/containerdisks/opensuse-tumbleweed:1.0.0 \
    --cloud-init-user-data "$(cat user-data.yaml | base64 -w 0)"

Esto debería mostrar entonces la máquina virtual ejecutándose (debería iniciarse mucho más rápido esta vez dado que la imagen del contenedor estará en caché):

$ kubectl get vmi
NAME              AGE   PHASE     IP           NODENAME               READY
virtctl-example   52s   Running   10.42.2.29   node3.edge.rdo.wales   True

Ahora podemos usar virtctl para conectar directamente a la máquina virtual:

$ virtctl ssh suse@virtctl-example
(password is "suse" - Ctrl-D to exit)

Hay muchos otros comandos que pueden ser utilizados por virtctl. Por ejemplo, virtctl console puede darte acceso a la consola serie si la red no funciona, y puedes usar virtctl guestosinfo para obtener información completa del sistema operativo, siempre que el invitado tenga instalado y en ejecución qemu-guest-agent.

Finalmente, pausemos y reanudemos la máquina virtual:

$ virtctl pause vm virtctl-example
VMI virtctl-example was scheduled to pause

Encuentras que el objeto VirtualMachine se muestra como Paused y el objeto VirtualMachineInstance se muestra como Running pero READY=False:

$ kubectl get vm
NAME              AGE     STATUS   READY
virtctl-example   8m14s   Paused   False

$ kubectl get vmi
NAME              AGE     PHASE     IP           NODENAME               READY
virtctl-example   8m15s   Running   10.42.2.29   node3.edge.rdo.wales   False

También encuentras que ya no puedes conectar a la máquina virtual:

$ virtctl ssh suse@virtctl-example
can't access VMI virtctl-example: Operation cannot be fulfilled on virtualmachineinstance.kubevirt.io "virtctl-example": VMI is paused

Reanudemos la máquina virtual e intentémoslo de nuevo:

$ virtctl unpause vm virtctl-example
VMI virtctl-example was scheduled to unpause

Ahora deberíamos poder restablecer una conexión:

$ virtctl ssh suse@virtctl-example
suse@vmi/virtctl-example.default's password:
suse@virtctl-example:~> exit
logout

Finalmente, eliminemos la máquina virtual:

$ kubectl delete vm/virtctl-example
virtualmachine.kubevirt.io "virtctl-example" deleted

17.6 Redes de ingress simples

En esta sección, mostramos cómo puedes exponer máquinas virtuales como servicios estándar de Kubernetes y hacerlas disponibles a través del servicio Ingress de Kubernetes, por ejemplo, Traefik con RKE2 o Traefik con K3s. Este documento asume que estos componentes ya están configurados adecuadamente y que tienes un puntero DNS apropiado, por ejemplo, mediante un carácter comodín, para apuntar a tus nodos de servidor de Kubernetes o a tu IP virtual de ingress para una adecuada resolución de ingress.

Nota
Nota

En SUSE Edge 3.1+, si estás usando K3s en una configuración de nodo multiservidor, es posible que hayas necesitado configurar una VIP basada en MetalLB para Ingress; esto no es necesario para RKE2.

En el entorno de ejemplo, se despliega otra máquina virtual openSUSE Tumbleweed, se utiliza cloud-init para instalar NGINX como un servidor web simple en el momento del arranque, y se configura un mensaje simple para que se devuelva y verificar que funciona como se espera cuando se realiza una llamada. Para ver cómo se hace esto, simplemente base64 -d la sección cloud-init en la salida siguiente.

Creemos esta máquina virtual ahora:

$ cat <<EOF > user-data.yaml
#cloud-config
disable_root: false
ssh_pwauth: True
users:
  - default
  - name: suse
    groups: sudo
    shell: /bin/bash
    sudo:  ALL=(ALL) NOPASSWD:ALL
    lock_passwd: False
    plain_text_passwd: 'suse'
EOF
$ kubectl apply -f - <<EOF
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: ingress-example
  namespace: default
spec:
  runStrategy: Always
  template:
    metadata:
      labels:
        app: nginx
    spec:
      domain:
        devices: {}
        machine:
          type: q35
        memory:
          guest: 2Gi
        resources: {}
      volumes:
      - containerDisk:
          image: quay.io/containerdisks/opensuse-tumbleweed:1.0.0
        name: tumbleweed-containerdisk-0
      - cloudInitNoCloud:
          userDataBase64: $(cat user-data.yaml | base64 -w 0)
        name: cloudinitdisk
EOF

Cuando esta máquina virtual se haya iniciado correctamente, podemos usar el comando virtctl para exponer la VirtualMachineInstance con un puerto externo de 8080 y un puerto de destino de 80 (donde NGINX escucha por defecto). Usamos el comando virtctl aquí ya que entiende la asignación entre el objeto de la máquina virtual y el pod. Esto crea un nuevo servicio para nosotros:

$ virtctl expose vmi ingress-example --port=8080 --target-port=80 --name=ingress-example
Service ingress-example successfully exposed for vmi ingress-example

Entonces tendremos un servicio apropiado creado automáticamente:

$ kubectl get svc/ingress-example
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                         AGE
ingress-example   ClusterIP      10.43.217.19    <none>            8080/TCP                        9s

A continuación, si utilizas kubectl create ingress, podemos crear un objeto Ingress que apunte a este servicio. Adaptad la URL (conocida como "host" en el objeto ingress) aquí para que coincida con vuestra configuración DNS y aseguraos de apuntarla al puerto 8080:

$ kubectl create ingress ingress-example --rule=ingress-example.suse.local/=ingress-example:8080

Con el DNS configurado correctamente, deberíais poder hacer curl a la URL inmediatamente:

$ curl ingress-example.suse.local
It works!

Vamos a realizar una limpieza eliminando esta máquina virtual y sus recursos de servicio e ingress:

$ kubectl delete vm/ingress-example svc/ingress-example ingress/ingress-example
virtualmachine.kubevirt.io "ingress-example" deleted
service "ingress-example" deleted
ingress.networking.k8s.io "ingress-example" deleted

17.7 Uso de la extensión de la UI de Rancher

SUSE Edge Virtualization proporciona una extensión de la UI para Rancher Manager, que permite la gestión básica de máquinas virtuales mediante la interfaz del panel de control de Rancher.

17.7.1 Instalación

Consultad Extensiones del panel de control de Rancher (Capítulo 5, Extensiones de Rancher Dashboard) para obtener orientación sobre la instalación.

17.7.2 Uso de la extensión de la UI de KubeVirt Rancher

La extensión introduce una nueva sección KubeVirt en el Explorador de clústeres. Esta sección se añade a cualquier clúster downstream que tenga KubeVirt instalado.

La extensión os permite interactuar directamente con los recursos de máquinas virtuales de KubeVirt para gestionar el ciclo de vida de las máquinas virtuales.

17.7.2.1 Creación de una máquina virtual

  1. Navegad al Explorador de clústeres haciendo clic en el clúster downstream habilitado para KubeVirt en la navegación de la izquierda.

  2. Navegad a la página KubeVirt > Máquinas virtuales y haced clic en Create from YAML en la parte superior derecha de la pantalla.

  3. Rellenad o pegad una definición de máquina virtual y pulsad Create. Utilizad la definición de máquina virtual de la sección Desplegar máquinas virtuales como inspiración.

virtual machines page

17.7.2.2 Acciones de la máquina virtual

Podéis utilizar el menú de acciones al que se accede desde la lista desplegable ⋮ a la derecha de cada máquina virtual para realizar acciones de inicio, terminar, pausa o reinicio suave. Alternativamente, también podéis utilizar las acciones de grupo en la parte superior de la lista seleccionando las máquinas virtuales sobre las que realizar la acción.

Realizar las acciones puede tener un efecto en la Estrategia de ejecución de la máquina virtual. Consultad la tabla en la documentación de KubeVirt para obtener más detalles.

17.7.2.3 Acceso a la consola de la máquina virtual

La lista de «Máquinas virtuales» proporciona una lista desplegable Console que permite conectar a la máquina utilizando VNC o consola serie. Esta acción solo está disponible para máquinas en ejecución.

En algunos casos, pasa un breve periodo de tiempo antes de que la consola esté accesible en una máquina virtual recién iniciada.

vnc console ui

17.8 Instalación con Edge Image Builder

SUSE Edge utiliza Capítulo 8, Edge Image Builder para personalizar las imágenes base del SO SUSE Linux Micro. Seguid Sección 25.9, “Instalación de KubeVirt y CDI” para una instalación en un entorno aislado tanto de KubeVirt como de CDI sobre clústeres de Kubernetes aprovisionados por EIB.

18 Controlador de actualización del sistema

Consultad la documentación del controlador de actualización del sistema.

El controlador de actualización del sistema (SUC) tiene como objetivo proporcionar un controlador de actualización de propósito general y nativo de Kubernetes (para nodos). Introduce una nueva CRD, el Plan, para definir todas y cada una de vuestras políticas/requisitos de actualización. Un Plan es una intención pendiente de mutar los nodos en vuestro clúster.

18.1 ¿Cómo utiliza SUSE Edge el controlador de actualización del sistema?

SUSE Edge utiliza SUC para facilitar diversas operaciones de "Día 2" relacionadas con las actualizaciones de la versión del SO y de Kubernetes en los clústeres de gestión y de sentido descendente.

Las operaciones de "Día 2" se definen a través de SUC Plans. Basándose en estos planes, SUC despliega cargas de trabajo en cada nodo para ejecutar la operación de "Día 2" correspondiente.

SUC también se utiliza dentro de Capítulo 19, Controlador de actualización. Para obtener más información sobre las diferencias clave entre SUC y el controlador de actualización del sistema, véase Sección 19.2, “Controlador de actualización frente a System Upgrade Controller”.

18.2 Instalación del controlador de actualización del sistema

Importante
Importante

A partir de Rancher v2.10.0, el System Upgrade Controller se instala automáticamente.

Seguid los pasos a continuación solo si vuestro entorno no está gestionado por Rancher, o si vuestra versión de Rancher es inferior a v2.10.0.

Recomendamos que instaléis SUC a través de Fleet (Capítulo 6, Fleet) ubicado en el repositorio suse-edge/fleet-examples.

Nota
Nota

Los recursos ofrecidos por el repositorio suse-edge/fleet-examples deben utilizarse siempre desde una versión de fleet-examples válida. Para determinar qué versión necesitáis utilizar, consultad las Notas de la versión (Capítulo 41, Notas de la versión).

Si no podéis utilizar Fleet para la instalación de SUC, podéis instalarlo a través del repositorio de charts de Helm de Rancher, o incorporar el chart de Helm de Rancher en vuestro propio flujo de trabajo GitOps de terceros.

Esta sección cubre:

18.2.1 Instalación de Fleet del controlador de actualización del sistema

Utilizando Fleet, hay dos recursos posibles que se pueden usar para desplegar SUC:

18.2.1.1 Instalación del controlador de actualización del sistema - GitRepo

Nota
Nota

Este proceso también puede realizarse a través de la interfaz de usuario de Rancher, si está disponible. Para obtener más información, consultad Acceso a Fleet en la interfaz de usuario de Rancher.

En vuestro clúster de gestión:

  1. Determinad en qué clústeres queréis desplegar SUC. Esto se hace desplegando un recurso GitRepo de SUC en el espacio de trabajo de Fleet correcto en vuestro clúster de gestión. Por defecto, Fleet tiene dos espacios de trabajo:

    • fleet-local - para recursos que deban desplegarse en el clúster de gestión.

    • fleet-default - para recursos que deban desplegarse en clústeres sentido descendente.

      Para obtener más información sobre los espacios de trabajo de Fleet, consultad la documentación sentido ascendente.

  2. Despliega el recurso GitRepo:

    • Para desplegar SUC en vuestro clúster de gestión:

      kubectl apply -n fleet-local -f - <<EOF
      apiVersion: fleet.cattle.io/v1alpha1
      kind: GitRepo
      metadata:
        name: system-upgrade-controller
      spec:
        revision: release-3.6.1
        paths:
        - fleets/day2/system-upgrade-controller
        repo: https://github.com/suse-edge/fleet-examples.git
      EOF
    • Para desplegar SUC en vuestros clústeres de sentido descendente:

      Nota
      Nota

      Antes de desplegar el recurso siguiente, debéis proporcionar una configuración targets válida, para que Fleet sepa en qué clústeres de sentido descendente desplegar vuestro recurso. Para obtener información sobre cómo realizar el mapeo a clústeres de sentido descendente, consultad Mapping to Downstream Clusters.

      kubectl apply -n fleet-default -f - <<EOF
      apiVersion: fleet.cattle.io/v1alpha1
      kind: GitRepo
      metadata:
        name: system-upgrade-controller
      spec:
        revision: release-3.6.1
        paths:
        - fleets/day2/system-upgrade-controller
        repo: https://github.com/suse-edge/fleet-examples.git
        targets:
        - clusterSelector: CHANGEME
        # Example matching all clusters:
        # targets:
        # - clusterSelector: {}
      EOF
  3. Validad que el recurso GitRepo esté desplegado:

    # Namespace will vary based on where you want to deploy SUC
    kubectl get gitrepo system-upgrade-controller -n <fleet-local/fleet-default>
    
    NAME                        REPO                                              COMMIT          BUNDLEDEPLOYMENTS-READY   STATUS
    system-upgrade-controller   https://github.com/suse-edge/fleet-examples.git   release-3.6.1   1/1
  4. Validad el despliegue del controlador de actualización del sistema:

    kubectl get deployment system-upgrade-controller -n cattle-system
    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    system-upgrade-controller   1/1     1            1           2m20s

18.2.1.2 Instalación del controlador de actualización del sistema - Bundle

Esta sección ilustra cómo crear y desplegar un recurso Bundle a partir de una configuración estándar de Fleet utilizando la fleet-cli.

  1. En una máquina con acceso a la red, descarga el fleet-cli:

    Nota
    Nota

    Aseguraos de que la versión de fleet-cli que descarguéis coincida con la versión de Fleet que se ha desplegado en vuestro clúster.

    • Para usuarios de Mac, existe una fleet-cli Homebrew Formulae.

    • Para usuarios de Linux y Windows, los binarios están presentes como assets en cada release de Fleet.

      • Linux AMD:

        curl -L -o fleet-cli https://github.com/rancher/fleet/releases/download/vv0.15.2/fleet-linux-amd64
      • Linux ARM:

        curl -L -o fleet-cli https://github.com/rancher/fleet/releases/download/vv0.15.2/fleet-linux-arm64
  2. Haced que fleet-cli sea ejecutable:

    chmod +x fleet-cli
  3. Clonad la suse-edge/fleet-examples release que deseéis utilizar:

    git clone -b release-3.6.1 https://github.com/suse-edge/fleet-examples.git
  4. Navegad al repositorio SUC fleet, ubicado en el fleet-examples:

    cd fleet-examples/fleets/day2/system-upgrade-controller
  5. Determinad en qué clústeres queréis desplegar SUC. Esto se hace desplegando el Bundle de SUC en el espacio de trabajo de Fleet correcto dentro de vuestro clúster de gestión. Por defecto, Fleet tiene dos espacios de trabajo:

    • fleet-local - para recursos que deban desplegarse en el clúster de gestión.

    • fleet-default - para recursos que deban desplegarse en clústeres downstream.

      Para obtener más información sobre los espacios de trabajo de Fleet, consulta la documentación sentido ascendente.

  6. Si tenéis la intención de desplegar SUC solo en clústeres de sentido descendente, cread un archivo targets.yaml que coincida con los clústeres específicos:

    cat > targets.yaml <<EOF
    targets:
    - clusterSelector: CHANGEME
    EOF

    Para obtener información sobre cómo realizar el mapeo a clústeres de sentido descendente, consultad Mapping to Downstream Clusters

  7. Proceded a compilar el Bundle:

    Nota
    Nota

    Aseguraos de no descargar fleet-cli en el directorio fleet-examples/fleets/day2/system-upgrade-controller, de lo contrario se empaquetará con el Bundle, lo cual no es recomendable.

    • Para desplegar SUC en vuestro clúster de gestión, ejecutad:

      fleet-cli apply --compress -n fleet-local -o - system-upgrade-controller . > system-upgrade-controller-bundle.yaml
    • Para desplegar SUC en vuestros clústeres de sentido descendente, ejecutad:

      fleet-cli apply --compress --targets-file=targets.yaml -n fleet-default -o - system-upgrade-controller . > system-upgrade-controller-bundle.yaml

      Para obtener más información sobre este proceso, consultad Convert a Helm Chart into a Bundle.

      Para obtener más información sobre el comando fleet-cli apply, consultad fleet apply.

  8. Transferid el Bundle system-upgrade-controller-bundle.yaml a la máquina de vuestro clúster de gestión:

    scp system-upgrade-controller-bundle.yaml <machine-address>:<filesystem-path>
  9. En vuestro clúster de gestión, desplegad el Bundle system-upgrade-controller-bundle.yaml:

    kubectl apply -f system-upgrade-controller-bundle.yaml
  10. En vuestro clúster de gestión, validad que el Bundle esté desplegado:

    # Namespace will vary based on where you want to deploy SUC
    kubectl get bundle system-upgrade-controller -n <fleet-local/fleet-default>
    
    NAME                        BUNDLEDEPLOYMENTS-READY   STATUS
    system-upgrade-controller   1/1
  11. Según el espacio de trabajo de Fleet en el que hayáis desplegado vuestro Bundle, navegad al clúster y validad el despliegue de SUC:

    Nota
    Nota

    SUC siempre se despliega en el espacio de nombres cattle-system.

    kubectl get deployment system-upgrade-controller -n cattle-system
    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    system-upgrade-controller   1/1     1            1           111s

18.2.2 Instalación de Helm del controlador de actualización del sistema

  1. Añadid el repositorio de charts de Rancher:

    helm repo add rancher-charts https://charts.rancher.io/
  2. Desplegad el chart de SUC:

    helm install system-upgrade-controller rancher-charts/system-upgrade-controller --version 109.0.1 --set global.cattle.psp.enabled=false -n cattle-system --create-namespace

    Esto instalará la versión v0.19.1 de SUC, necesaria para la plataforma Edge 3.6.

  3. Validad el despliegue de SUC:

    kubectl get deployment system-upgrade-controller -n cattle-system
    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    system-upgrade-controller   1/1     1            1           37s

18.3 Monitorización de los planes del controlador de actualización del sistema

Los planes SUC pueden visualizarse de las siguientes formas:

Importante
Importante

Los Pods desplegados para los planes SUC se mantienen activos 15 minutos después de una ejecución correcta. Después de eso, son eliminados por el Job correspondiente que los creó. Para tener acceso a los registros del Pod después de este periodo de tiempo, debéis habilitar el registro para vuestro clúster. Para obtener información sobre cómo hacerlo en Rancher, consultad Rancher Integration with Logging Services.

18.3.1 Monitorización de los planes del controlador de actualización del sistema - Interfaz de usuario de Rancher

Para consultar los registros de Pod de un plan SUC específico:

  1. En la esquina superior izquierda, ☰ → <your-cluster-name>

  2. Seleccionad Workloads → Pods

  3. Seleccionad el menú desplegable Only User Namespaces y añadid el espacio de nombres cattle-system

  4. En la barra de filtro de Pods, escribid el nombre de vuestro Pod del plan SUC. El nombre seguirá el siguiente formato de plantilla: apply-<plan_name>-on-<node_name>

    Nota
    Nota

    Puede haber Pods Completed y Unknown para un plan SUC específico. Esto es normal y ocurre debido a la naturaleza de algunas de las actualizaciones.

  5. Seleccionad el pod cuyos registros queréis revisar y navegad a ⋮ → View Logs

18.3.2 Planes del Upgrade Controller del sistema de monitorización - Manual

Nota
Nota

Los siguientes pasos asumen que kubectl se ha configurado para conectarse al clúster donde se han desplegado los SUC Plans.

  1. Listar los planes SUC desplegados:

    kubectl get plans -n cattle-system
  2. Obtener el pod para el plan SUC:

    kubectl get pods -l upgrade.cattle.io/plan=<plan_name> -n cattle-system
    Nota
    Nota

    Puede haber ambos pods Completed y Unknown para un plan SUC específico. Esto es normal y ocurre debido a la naturaleza de algunas de las actualizaciones.

  3. Obtener los registros del pod:

    kubectl logs <pod_name> -n cattle-system

19 Controlador de actualización

Un controlador de Kubernetes capaz de realizar actualizaciones en los siguientes SUSE Edge componentes de la plataforma:

  • Sistema operativo (SUSE Linux Micro)

  • Kubernetes (K3s y RKE2)

  • Componentes adicionales (Rancher, Elemental, SUSE Security, etc.)

El Controlador de actualización agiliza el proceso de actualización de los componentes mencionados anteriormente al encapsular sus complejidades dentro de un único user-facing recurso que sirve como desencadenante para la actualización. Los usuarios solo necesitan configurar este recurso y el Upgrade Controller se encarga del resto.

Nota
Nota

El Upgrade Controller actualmente admite actualizaciones de plataforma SUSE Edge solo para clústeres de gestión sin entorno aislado. Consulte la sección Sección 19.8, “Limitaciones conocidas” para obtener más información.

19.1 ¿Cómo utiliza SUSE Edge el Controlador de actualización?

El Controlador de actualización es esencial para automatizar las operaciones de «Día 2» (anteriormente manuales) necesarias para actualizar los clústeres de gestión de una versión de lanzamiento SUSE Edge a la siguiente.

Para lograr esta automatización, el Controlador de actualización utiliza herramientas como el System Upgrade Controller (Capítulo 18, Controlador de actualización del sistema) y el Helm Controller.

Para obtener más detalles sobre cómo funciona el Controlador de actualización, consulte Sección 19.5, “¿Cómo funciona el Controlador de actualización?”.

Para conocer las limitaciones que tiene el Controlador de actualización, consulte Sección 19.8, “Limitaciones conocidas”.

Para obtener información sobre la diferencia entre el Controlador de actualización y el System Upgrade Controller, consulte Sección 19.2, “Controlador de actualización frente a System Upgrade Controller”.

19.2 Controlador de actualización frente a System Upgrade Controller

El System Upgrade Controller (SUC) (Capítulo 18, Controlador de actualización del sistema) es una herramienta de propósito general que propaga instrucciones de actualización a nodos específicos de Kubernetes.

Aunque admite algunas operaciones de «Día 2» para la plataforma SUSE Edge, no las cubre todas. Además, incluso para las operaciones admitidas, los usuarios deben configurar, mantener y desplegar manualmente múltiples SUC Plans: un proceso propenso a errores que puede dar lugar a problemas inesperados.

Esto llevó a la necesidad de una herramienta que automatice y abstraiga la complejidad de gestionar diversas operaciones de «Día 2» para la plataforma SUSE Edge. Por tanto, se desarrolló el Upgrade Controller. Simplifica el proceso de actualización al introducir un único user-facing resource que dirige la actualización. Los usuarios solo necesitan gestionar este recurso, mientras que el Upgrade Controller se encarga del resto.

19.3 Instalación del Controlador de actualización

19.3.1 Requisitos previos

19.3.2 Pasos

  1. Instale el gráfico de Helm del Controlador de actualización en su clúster de gestión:

    helm install upgrade-controller oci://registry.suse.com/edge/charts/upgrade-controller --version 306.0.4+up0.1.3 --create-namespace --namespace upgrade-controller-system
  2. Valide el despliegue del Upgrade Controller:

    kubectl get deployment -n upgrade-controller-system
  3. Valide el pod del Upgrade Controller:

    kubectl get pods -n upgrade-controller-system
  4. Valide los registros del pod del Upgrade Controller:

    kubectl logs <pod_name> -n upgrade-controller-system

19.4 Instalación del Controlador de actualización mediante Edge Image Builder

Como alternativa a la instalación manual descrita anteriormente, es posible instalar el Controlador de actualización como parte del despliegue inicial orquestado por Edge Image Builder (Capítulo 8, Edge Image Builder).

En este caso, es necesario añadir la siguiente configuración de helm chart al archivo de configuración de EIB:

kubernetes:
  helm:
    charts:
      - name: cert-manager
        repositoryName: jetstack
        version: {version-cert-manager}
        targetNamespace: cert-manager
        valuesFile: certmanager-values.yaml
        createNamespace: true
        installationNamespace: kube-system
      - name: upgrade-controller
        version: {version-upgrade-controller-chart}
        repositoryName: suse-edge-charts
        targetNamespace: upgrade-controller-system
        createNamespace: true
        installationNamespace: kube-system

19.5 ¿Cómo funciona el Controlador de actualización?

Para realizar una actualización de la versión de Edge, el Upgrade Controller introduce dos nuevos recursos personalizados de Kubernetes:

  • UpgradePlan (Sección 19.6.1, “UpgradePlan”) - creado por el usuario; contiene configuraciones relativas a una actualización de la versión de Edge.

  • ReleaseManifest (Sección 19.6.2, “ReleaseManifest”) - creado por el Controlador de actualización; contiene versiones de componentes específicas para una versión de Edge concreta. Este archivo no debe ser editado por los usuarios.

El Upgrade Controller procede a crear un recurso ReleaseManifest que contiene los datos de los componentes para la versión de Edge especificada por el usuario en la propiedad releaseVersion del recurso UpgradePlan.

Utilizando los datos de los componentes del ReleaseManifest, el Upgrade Controller procede a actualizar los componentes de la versión de Edge en el siguiente orden:

Nota
Nota

Durante el proceso de actualización, el Upgrade Controller envía continuamente información de actualización al UpgradePlan creado. Para obtener más información sobre cómo realizar el seguimiento del proceso de actualización, véase Seguimiento del proceso de actualización (Sección 19.7, “Seguimiento del proceso de actualización”).

19.5.1 Actualización del sistema operativo

Para actualizar el sistema operativo, el Controlador de actualización crea planes SUC (Capítulo 18, Controlador de actualización del sistema) que tienen la siguiente plantilla de nomenclatura:

  • Para planes SUC relacionados con actualizaciones del SO de los nodos del plano de control: control-plane-<os-name>-<os-version>-<suffix>.

  • Para planes SUC relacionados con actualizaciones del SO de los nodos trabajadores: workers-<os-name>-<os-version>-<suffix>.

Basándose en estos planes, SUC procede a crear cargas de trabajo en cada nodo del clúster que realizan la actualización real del SO.

Dependiendo del ReleaseManifest, la actualización del SO puede incluir:

  • Actualizaciones solo de paquetes: para casos de uso en los que la versión del SO no cambia entre versiones de Edge.

  • Migración completa del SO: para casos de uso en los que la versión del SO cambia entre versiones de Edge.

La actualización se ejecuta uno a uno, empezando primero por los nodos del plano de control. Solo si finaliza la actualización del nodo del plano de control, comenzarán a actualizarse los nodos trabajadores.

Nota
Nota

El controlador de actualización configura los planes SUC del SO para realizar un vaciado de los nodos del clúster si este tiene más de un nodo del tipo especificado.

Para clústeres en los que los nodos del plano de control son más de uno y solo hay un nodo trabajador, se realizará un vaciado solo para los nodos del plano de control y viceversa.

Para obtener información sobre cómo desactivar por completo los vaciados de nodos, consulte la sección UpgradePlan (Sección 19.6.1, “UpgradePlan”).

19.5.2 Actualización de versión de Kubernetes

Para actualizar la distribución de Kubernetes de un clúster, el controlador de actualización crea planes SUC (Capítulo 18, Controlador de actualización del sistema) que tienen la siguiente plantilla de nomenclatura:

  • Para planes SUC relacionados con actualizaciones de versión de Kubernetes de nodos del plano de control: control-plane-<k8s-version>-<suffix>.

  • Para planes SUC relacionados con actualizaciones de versión de Kubernetes de nodos trabajadores: workers-<k8s-version>-<suffix>.

Basándose en estos planes, SUC procede a crear cargas de trabajo en cada nodo del clúster que realizan la actualización de versión de Kubernetes propiamente dicha.

La actualización de versión de Kubernetes se realizará uno a uno, empezando primero por los nodos del plano de control. Solo si finaliza la actualización de versión del nodo del plano de control, comenzarán a actualizarse los nodos trabajadores.

Nota
Nota

El controlador de actualización configura los planes SUC de Kubernetes para realizar un vaciado de los nodos del clúster si este tiene más de un nodo del tipo especificado.

Para clústeres en los que los nodos del plano de control son más de uno y solo hay un nodo trabajador, se realizará un vaciado solo para los nodos del plano de control y viceversa.

Para obtener información sobre cómo desactivar por completo los vaciados de nodos, consulte Sección 19.6.1, “UpgradePlan”.

19.5.3 Actualizaciones de componentes adicionales

Actualmente, todos los componentes adicionales se instalan mediante gráficos de Helm. Para obtener una lista completa de los componentes de una versión específica, consulte las Notas de la versión (Capítulo 41, Notas de la versión).

Para los gráficos de Helm desplegados a través de EIB (Capítulo 8, Edge Image Builder), el controlador de actualización actualiza el HelmChart CR existente de cada componente.

Para los gráficos de Helm desplegados fuera de EIB, el controlador de actualización crea un recurso HelmChart para cada componente.

Tras la creación/actualización del recurso HelmChart, el controlador de actualización depende del helm-controller para detectar este cambio y proceder con la actualización real del componente.

Los gráficos se actualizarán secuencialmente según su orden en el ReleaseManifest. También se pueden pasar valores adicionales a través del UpgradePlan. Si la versión de un gráfico permanece sin cambios en la nueva versión de SUSE Edge, no se actualizará. Para obtener más información acerca de esto, consulte Sección 19.6.1, “UpgradePlan”.

19.6 Extensiones de la API de Kubernetes

Extensiones de la API de Kubernetes introducidas por el controlador de actualización.

19.6.1 UpgradePlan

El Controlador de actualización introduce un nuevo recurso personalizado de Kubernetes llamado UpgradePlan.

El UpgradePlan sirve como mecanismo de instrucciones para el Controlador de actualización y admite las siguientes configuraciones:

  • releaseVersion - Versión de lanzamiento de Edge a la que se debe actualizar el clúster. La versión de lanzamiento debe seguir el versionado semántico y debe obtenerse de las Notas de la versión (Capítulo 41, Notas de la versión).

  • disableDrain - Opcional; indica al controlador de actualización si debe desactivar los drenajes de nodos. Útil cuando se tienen cargas de trabajo con presupuestos de interrupción.

    • Ejemplo para la desactivación del drenaje de nodos del plano de control:

      spec:
        disableDrain:
          controlPlane: true
    • Ejemplo para la desactivación del drenaje de nodos del plano de control y de nodos trabajadores:

      spec:
        disableDrain:
          controlPlane: true
          worker: true
  • helm - Opcional; especifica valores adicionales para los componentes instalados mediante Helm.

    Aviso
    Aviso

    Solo se recomienda utilizar este campo para valores que sean críticos para las actualizaciones. Las actualizaciones estándar de valores de gráficos deben realizarse después de que los gráficos respectivos se hayan actualizado a la siguiente versión.

    • Ejemplo:

      spec:
        helm:
        - chart: foo
          values:
            bar: baz

19.6.2 ReleaseManifest

El Upgrade Controller introduce un nuevo recurso personalizado de Kubernetes llamado ReleaseManifest.

El recurso ReleaseManifest es creado por el Upgrade Controller y contiene datos de componentes para una versión de lanzamiento de Edge específica. Esto significa que cada actualización de la versión de lanzamiento de Edge estará representada por un recurso ReleaseManifest diferente.

Aviso
Aviso

El Release Manifest siempre debe ser creado por el Upgrade Controller.

No es aconsejable crear o editar manualmente los recursos ReleaseManifest. Los usuarios que decidan hacerlo deben hacerlo bajo su propio riesgo.

Los datos de los componentes que incluye el Release Manifest incluyen, entre otros:

  • Datos del sistema operativo: versión, arquitecturas compatibles, datos de actualización adicionales, etc.

  • Datos de distribución de Kubernetes: versiones compatibles de RKE2/K3s

  • Datos de componentes adicionales: datos de los gráficos de Helm de SUSE (ubicación, versión, nombre, etc.)

Para ver un ejemplo de cómo puede ser un Release Manifest, consulte la documentación sentido ascendente. Tenga en cuenta que esto es solo un ejemplo y no pretende ser creado como un recurso ReleaseManifest válido.

19.7 Seguimiento del proceso de actualización

Esta sección sirve como medio para realizar el seguimiento y depurar el proceso de actualización que el Upgrade Controller inicia una vez que el usuario crea un UpgradePlan recurso.

19.7.1 General

La información general sobre el estado del proceso de actualización puede verse en las condiciones de estado del Upgrade Plan.

El estado del recurso Upgrade Plan puede verse de la siguiente manera:

kubectl get upgradeplan <upgradeplan_name> -n upgrade-controller-system -o yaml
Ejemplo 19.1: Ejemplo de Upgrade Plan en ejecución:
apiVersion: lifecycle.suse.com/v1alpha1
kind: UpgradePlan
metadata:
  name: upgrade-plan-mgmt
  namespace: upgrade-controller-system
spec:
  releaseVersion: 3.6
status:
  conditions:
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Control plane nodes are being upgraded
    reason: InProgress
    status: "False"
    type: OSUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Kubernetes upgrade is not yet started
    reason: Pending
    status: Unknown
    type: KubernetesUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Rancher upgrade is not yet started
    reason: Pending
    status: Unknown
    type: RancherUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Longhorn upgrade is not yet started
    reason: Pending
    status: Unknown
    type: LonghornUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: MetalLB upgrade is not yet started
    reason: Pending
    status: Unknown
    type: MetalLBUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: CDI upgrade is not yet started
    reason: Pending
    status: Unknown
    type: CDIUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: KubeVirt upgrade is not yet started
    reason: Pending
    status: Unknown
    type: KubeVirtUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: NeuVector upgrade is not yet started
    reason: Pending
    status: Unknown
    type: NeuVectorUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: EndpointCopierOperator upgrade is not yet started
    reason: Pending
    status: Unknown
    type: EndpointCopierOperatorUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Elemental upgrade is not yet started
    reason: Pending
    status: Unknown
    type: ElementalUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: SRIOV upgrade is not yet started
    reason: Pending
    status: Unknown
    type: SRIOVUpgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: Metal3 upgrade is not yet started
    reason: Pending
    status: Unknown
    type: Metal3Upgraded
  - lastTransitionTime: "2024-10-01T06:26:27Z"
    message: RancherTurtles upgrade is not yet started
    reason: Pending
    status: Unknown
    type: RancherTurtlesUpgraded
  observedGeneration: 1
  sucNameSuffix: 90315a2b6d

Aquí se puede ver cada componente para el que el Upgrade Controller intentará programar una actualización. Cada condición sigue la siguiente plantilla:

  • lastTransitionTime - la última vez que esta condición de componente ha cambiado de un estado a otro.

  • message - mensaje que indica el estado de actualización actual de la condición del componente específico.

  • reason - el estado de actualización actual de la condición del componente específico. Posibles reasons incluyen:

    • Succeeded - la actualización del componente específico se ha realizado correctamente.

    • Failed - la actualización del componente específico ha fallado.

    • InProgress - la actualización del componente específico está en curso.

    • Pending - la actualización del componente específico aún no está programada.

    • Skipped - el componente específico no se encuentra en el clúster, por lo que se omitirá su actualización.

    • Error - el componente específico ha encontrado un error transitorio.

  • status - estado de la condición actual type, uno de True, False, Unknown.

  • type - indicador del componente actualizado actualmente.

El controlador de actualización crea planes SUC para condiciones de componente de tipo OSUpgraded y KubernetesUpgraded. Para realizar un seguimiento adicional de los planes SUC creados para estos componentes, consulte Sección 18.3, “Monitorización de los planes del controlador de actualización del sistema”.

Todos los demás tipos de condiciones de componente pueden seguirse consultando los recursos creados para ellos por el helm-controller. Para obtener más información, consulte Sección 19.7.2, “Controlador de Helm”.

Un plan de actualización programado por el controlador de actualización puede marcarse como successful una vez que:

  1. No hay condiciones de componente Pending o InProgress.

  2. La propiedad lastSuccessfulReleaseVersion apunta al releaseVersion que se especifica en la configuración del plan de actualización. Esta propiedad se añade al estado del plan de actualización por parte del controlador de actualización una vez que el proceso de actualización se realiza correctamente.

Ejemplo 19.2: Ejemplo de UpgradePlan correcto:
apiVersion: lifecycle.suse.com/v1alpha1
kind: UpgradePlan
metadata:
  name: upgrade-plan-mgmt
  namespace: upgrade-controller-system
spec:
  releaseVersion: 3.6
status:
  conditions:
  - lastTransitionTime: "2024-10-01T06:26:48Z"
    message: All cluster nodes are upgraded
    reason: Succeeded
    status: "True"
    type: OSUpgraded
  - lastTransitionTime: "2024-10-01T06:26:59Z"
    message: All cluster nodes are upgraded
    reason: Succeeded
    status: "True"
    type: KubernetesUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Chart rancher upgrade succeeded
    reason: Succeeded
    status: "True"
    type: RancherUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Chart longhorn is not installed
    reason: Skipped
    status: "False"
    type: LonghornUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Specified version of chart metallb is already installed
    reason: Skipped
    status: "False"
    type: MetalLBUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Chart cdi is not installed
    reason: Skipped
    status: "False"
    type: CDIUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Chart kubevirt is not installed
    reason: Skipped
    status: "False"
    type: KubeVirtUpgraded
  - lastTransitionTime: "2024-10-01T06:27:13Z"
    message: Chart neuvector-crd is not installed
    reason: Skipped
    status: "False"
    type: NeuVectorUpgraded
  - lastTransitionTime: "2024-10-01T06:27:14Z"
    message: Specified version of chart endpoint-copier-operator is already installed
    reason: Skipped
    status: "False"
    type: EndpointCopierOperatorUpgraded
  - lastTransitionTime: "2024-10-01T06:27:14Z"
    message: Chart elemental-operator upgrade succeeded
    reason: Succeeded
    status: "True"
    type: ElementalUpgraded
  - lastTransitionTime: "2024-10-01T06:27:15Z"
    message: Chart sriov-crd is not installed
    reason: Skipped
    status: "False"
    type: SRIOVUpgraded
  - lastTransitionTime: "2024-10-01T06:27:19Z"
    message: Chart metal3 is not installed
    reason: Skipped
    status: "False"
    type: Metal3Upgraded
  - lastTransitionTime: "2024-10-01T06:27:27Z"
    message: Chart rancher-turtles is not installed
    reason: Skipped
    status: "False"
    type: RancherTurtlesUpgraded
  lastSuccessfulReleaseVersion: 3.6
  observedGeneration: 1
  sucNameSuffix: 90315a2b6d

19.7.2 Controlador de Helm

Esta sección trata sobre cómo realizar el seguimiento de los recursos creados por el helm-controller.

Nota
Nota

Los pasos siguientes asumen que kubectl se ha configurado para conectarse al clúster donde se ha desplegado el Upgrade Controller.

  1. Localice el recurso HelmChart para el componente específico:

    kubectl get helmcharts -n kube-system
  2. Utilizando el nombre del recurso HelmChart, localice el Pod de actualización que fue creado por el helm-controller:

    kubectl get pods -l helmcharts.helm.cattle.io/chart=<helmchart_name> -n kube-system
    
    # Example for Rancher
    kubectl get pods -l helmcharts.helm.cattle.io/chart=rancher -n kube-system
    NAME                         READY   STATUS      RESTARTS   AGE
    helm-install-rancher-tv9wn   0/1     Completed   0          16m
  3. Vea los registros del pod específico del componente:

    kubectl logs <pod_name> -n kube-system

19.8 Limitaciones conocidas

  • Las actualizaciones de clústeres en sentido descendente aún no están gestionadas por el Upgrade Controller. Para obtener información sobre cómo actualizar clústeres en sentido descendente, consulte Capítulo 33, Clústeres en sentido descendente.

  • El Upgrade Controller espera que cualquier gráfico de Helm SUSE Edge adicional que se implemente a través de EIB (Capítulo 8, Edge Image Builder) tenga su HelmChart CR implementado en el espacio de nombres kube-system. Para hacer esto, configure la propiedad installationNamespace en su archivo de definición de EIB. Para obtener más información, consulte la documentación en sentido ascendente.

  • Actualmente, el Upgrade Controller no tiene forma de determinar la versión de lanzamiento de Edge que se está ejecutando en el clúster de gestión. Asegúrese de proporcionar una versión de lanzamiento de Edge que sea superior a la versión de lanzamiento de Edge que se está ejecutando actualmente en el clúster.

  • Actualmente, el Upgrade Controller solo admite actualizaciones en entornos no aislados. Las actualizaciones en entornos aislados aún no son posibles.

20 SUSE Multi-Linux Manager

SUSE Multi-Linux Manager se incluye en SUSE Edge para proporcionar automatización y control con el fin de mantener SUSE Linux Micro como el sistema operativo subyacente constantemente actualizado en todos los nodos de vuestra ampliación edge.

Para obtener más información, consultad Capítulo 3, SUSE Multi-Linux Manager y la SUSE Multi-Linux Manager Documentation.

Parte III Guías de instrucciones

Instrucciones y mejores prácticas

  • 21 MetalLB en K3s (usando el modo de capa 2)
  • MetalLB es una implementación de equilibrador de carga para clústeres de Kubernetes bare-metal que utiliza protocolos de enrutamiento estándar.

  • 22 MetalLB en K3s (usando el modo de capa 3)
  • MetalLB es una implementación de balanceador de la carga para clústeres de Kubernetes en equipo sin sistema operativo, que utiliza protocolos de enrutamiento estándar.

  • 23 MetalLB en K3s (usando el modo FRR-K8s)
  • MetalLB es una implementación de equilibrador de carga para clústeres de Kubernetes en equipo sin sistema operativo, que utiliza protocolos de enrutamiento estándar.

  • 24 MetalLB delante del servidor de API de Kubernetes
  • Esta guía demuestra el uso de un servicio MetalLB para exponer la API de RKE2/K3s externamente en un clúster de alta disponibilidad con tres nodos de plano de control. Para lograr esto, se creará manualmente un Servicio de Kubernetes de tipo LoadBalancer. A continuación, se creará automáticamente un…

  • 25 Despliegues en entorno aislado con Edge Image Builder
  • Esta guía mostrará cómo desplegar varios de los componentes de SUSE Edge completamente aislados en SUSE Linux Micro 6.2 utilizando Edge Image Builder(EIB) (Capítulo 8, Edge Image Builder). Con esto, podréis arrancar en una imagen personalizada y lista para arrancar (CRB) creada por EIB y tener los c…

  • 26 Creación de imágenes actualizadas de SUSE Linux Micro con Kiwi
  • Esta sección explica cómo generar imágenes actualizadas de SUSE Linux Micro para ser utilizadas con Edge Image Builder, con Cluster API (CAPI) + Metal3, o para escribir la imagen de disco directamente en un dispositivo de bloque. Este proceso es útil en situaciones en las que se requiere incluir los…

21 MetalLB en K3s (usando el modo de capa 2)

MetalLB es una implementación de equilibrador de carga para clústeres de Kubernetes bare-metal que utiliza protocolos de enrutamiento estándar.

En esta guía, demostramos cómo desplegar MetalLB en modo de capa 2 (L2).

21.1 Por qué usar MetalLB

MetalLB es una opción atractiva para el balance de la carga en clústeres de Kubernetes bare-metal por varias razones:

  1. Integración nativa con Kubernetes: MetalLB se integra perfectamente con Kubernetes, lo que facilita su despliegue y gestión mediante herramientas y prácticas habituales de Kubernetes.

  2. Compatibilidad con bare-metal: A diferencia de los equilibradores de carga basados en la nube, MetalLB está diseñado específicamente para despliegues in situ donde los equilibradores de carga tradicionales podrían no estar disponibles o no ser viables.

  3. Admite distintos protocolos: MetalLB admite tanto el modo de capa 2 como el modo BGP (Border Gateway Protocol), lo que proporciona flexibilidad para diferentes arquitecturas y requisitos de red.

  4. Alta disponibilidad: Al distribuir las responsabilidades de balance de la carga entre varios nodos, MetalLB garantiza alta disponibilidad y fiabilidad para sus servicios.

  5. Escalabilidad: MetalLB puede gestionar despliegues a gran escala, aumentando su escalabilidad junto con su clúster de Kubernetes para satisfacer la creciente demanda.

En el modo de capa 2, un nodo asume la responsabilidad de anunciar un servicio a la red local. Desde la perspectiva de la red, simplemente parece que esa máquina tiene varias direcciones IP asignadas a su interfaz de red.

La principal ventaja del modo de capa 2 es su universalidad: funciona en cualquier red Ethernet, sin necesidad de hardware especial, ni siquiera routers sofisticados.

21.2 MetalLB en K3s (usando L2)

En esta guía de inicio rápido, se utilizará el modo L2. Esto significa que no necesitamos ningún equipo de red especial, sino tres IP libres dentro del rango de la red.

21.3 Requisitos previos

  • Un clúster de K3s donde se va a desplegar MetalLB.

Aviso
Aviso

K3S viene con su propio equilibrador de carga para servicios llamado Klipper. Debes desactivarlo para ejecutar MetalLB. Para desactivar Klipper, K3s debe instalarse utilizando el indicador --disable=servicelb.

  • Helm

  • Tres direcciones IP libres dentro del rango de la red. En este ejemplo 192.168.122.10-192.168.122.12

Importante
Importante

Debes asegurarte de que estas direcciones IP no estén asignadas. En un entorno DHCP, estas direcciones no deben formar parte del grupo DHCP para evitar asignaciones dobles.

21.4 Distribución

Utilizaremos el chart de Helm de MetalLB publicado como parte de la solución SUSE Edge:

helm install \
  metallb oci://registry.suse.com/edge/charts/metallb \
  --namespace metallb-system \
  --create-namespace

while ! kubectl wait --for condition=ready -n metallb-system $(kubectl get\
 pods -n metallb-system -l app.kubernetes.io/component=controller -o name)\
 --timeout=10s; do
 sleep 2
done

21.5 Configuración

En este punto, la instalación se ha completado. Ahora es el momento de configurar utilizando nuestros valores de ejemplo:

cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: ip-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.122.10/32
  - 192.168.122.11/32
  - 192.168.122.12/32
EOF
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: ip-pool-l2-adv
  namespace: metallb-system
spec:
  ipAddressPools:
  - ip-pool
EOF

Ahora, está listo para ser utilizado. Puedes personalizar muchas cosas para el modo L2, tales como:

Y mucho más para BGP.

21.5.1 Traefik y MetalLB

Traefik se despliega por defecto con K3s (se puede desactivar con --disable=traefik) y, por defecto, se expone como LoadBalancer (para utilizarse con Klipper). Sin embargo, como Klipper debe desactivarse, el servicio de Traefik para ingress sigue siendo de tipo LoadBalancer. Por tanto, en el momento de desplegar MetalLB, la primera IP se asignará automáticamente a Traefik Ingress.

# Before deploying MetalLB
kubectl get svc -n kube-system traefik
NAME      TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
traefik   LoadBalancer   10.43.44.113   <pending>     80:31093/TCP,443:32095/TCP   28s
# After deploying MetalLB
kubectl get svc -n kube-system traefik
NAME      TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      AGE
traefik   LoadBalancer   10.43.44.113   192.168.122.10   80:31093/TCP,443:32095/TCP   3m10s

Esto se aplicará más adelante (Sección 21.6.1, “Ingress con MetalLB”) en el proceso.

21.6 Uso

Vamos a crear un despliegue de ejemplo:

cat <<- EOF | kubectl apply -f -
---
apiVersion: v1
kind: Namespace
metadata:
  name: hello-kubernetes
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: hello-kubernetes
  namespace: hello-kubernetes
  labels:
    app.kubernetes.io/name: hello-kubernetes
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-kubernetes
  namespace: hello-kubernetes
  labels:
    app.kubernetes.io/name: hello-kubernetes
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: hello-kubernetes
  template:
    metadata:
      labels:
        app.kubernetes.io/name: hello-kubernetes
    spec:
      serviceAccountName: hello-kubernetes
      containers:
        - name: hello-kubernetes
          image: "paulbouwer/hello-kubernetes:1.10"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          env:
          - name: HANDLER_PATH_PREFIX
            value: ""
          - name: RENDER_PATH_PREFIX
            value: ""
          - name: KUBERNETES_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: KUBERNETES_POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: KUBERNETES_NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: CONTAINER_IMAGE
            value: "paulbouwer/hello-kubernetes:1.10"
EOF

Y, finalmente, el servicio:

cat <<- EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes
  namespace: hello-kubernetes
  labels:
    app.kubernetes.io/name: hello-kubernetes
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: hello-kubernetes
EOF

Veámoslo en acción:

kubectl get svc -n hello-kubernetes
NAME               TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
hello-kubernetes   LoadBalancer   10.43.127.75   192.168.122.11   80:31461/TCP   8s

curl http://192.168.122.11
<!DOCTYPE html>
<html>
<head>
    <title>Hello Kubernetes!</title>
    <link rel="stylesheet" type="text/css" href="/css/main.css">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Ubuntu:300" >
</head>
<body>

  <div class="main">
    <img src="/images/kubernetes.png"/>
    <div class="content">
      <div id="message">
  Hello world!
</div>
<div id="info">
  <table>
    <tr>
      <th>namespace:</th>
      <td>hello-kubernetes</td>
    </tr>
    <tr>
      <th>pod:</th>
      <td>hello-kubernetes-7c8575c848-2c6ps</td>
    </tr>
    <tr>
      <th>node:</th>
      <td>allinone (Linux 5.14.21-150400.24.46-default)</td>
    </tr>
  </table>
</div>
<div id="footer">
  paulbouwer/hello-kubernetes:1.10 (linux/amd64)
</div>
    </div>
  </div>

</body>
</html>

21.6.1 Ingress con MetalLB

Como Traefik ya actúa como controlador de ingress, podemos exponer cualquier tráfico HTTP/HTTPS mediante un objeto Ingress como:

IP=$(kubectl get svc -n kube-system traefik -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
cat <<- EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-kubernetes-ingress
  namespace: hello-kubernetes
spec:
  rules:
  - host: hellok3s.${IP}.sslip.io
    http:
      paths:
        - path: "/"
          pathType: Prefix
          backend:
            service:
              name: hello-kubernetes
              port:
                name: http
EOF

Y después:

curl http://hellok3s.${IP}.sslip.io
<!DOCTYPE html>
<html>
<head>
    <title>Hello Kubernetes!</title>
    <link rel="stylesheet" type="text/css" href="/css/main.css">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Ubuntu:300" >
</head>
<body>

  <div class="main">
    <img src="/images/kubernetes.png"/>
    <div class="content">
      <div id="message">
  Hello world!
</div>
<div id="info">
  <table>
    <tr>
      <th>namespace:</th>
      <td>hello-kubernetes</td>
    </tr>
    <tr>
      <th>pod:</th>
      <td>hello-kubernetes-7c8575c848-fvqm2</td>
    </tr>
    <tr>
      <th>node:</th>
      <td>allinone (Linux 5.14.21-150400.24.46-default)</td>
    </tr>
  </table>
</div>
<div id="footer">
  paulbouwer/hello-kubernetes:1.10 (linux/amd64)
</div>
    </div>
  </div>

</body>
</html>

Verifica que MetalLB funciona correctamente:

% arping hellok3s.${IP}.sslip.io

ARPING 192.168.64.210
60 bytes from 92:12:36:00:d3:58 (192.168.64.210): index=0 time=1.169 msec
60 bytes from 92:12:36:00:d3:58 (192.168.64.210): index=1 time=2.992 msec
60 bytes from 92:12:36:00:d3:58 (192.168.64.210): index=2 time=2.884 msec

En el ejemplo anterior, el tráfico fluye de la siguiente manera:

  1. hellok3s.${IP}.sslip.io se resuelve en la IP real.

  2. A continuación, el tráfico es gestionado por el pod metallb-speaker.

  3. metallb-speaker redirige el tráfico al controlador traefik.

  4. Finalmente, Traefik reenvía la solicitud al servicio hello-kubernetes.

22 MetalLB en K3s (usando el modo de capa 3)

MetalLB es una implementación de balanceador de la carga para clústeres de Kubernetes en equipo sin sistema operativo, que utiliza protocolos de enrutamiento estándar.

En esta guía, demostramos cómo desplegar MetalLB en modo BGP de capa 3 (L3).

22.1 Por qué usar MetalLB

MetalLB es una opción atractiva para el balance de la carga en clústeres de Kubernetes en equipo sin sistema operativo por varias razones:

  1. Integración nativa con Kubernetes: MetalLB se integra perfectamente con Kubernetes, lo que facilita su implementación y gestión mediante herramientas y prácticas habituales de Kubernetes.

  2. Compatibilidad con equipo sin sistema operativo: A diferencia de los balanceadores de la carga basados en la nube, MetalLB está diseñado específicamente para ampliaciones in situ donde los balanceadores de la carga tradicionales podrían no estar disponibles o no ser viables.

  3. Admite distintos protocolos: MetalLB admite modos de capa 2 y de capa 3 BGP (Border Gateway Protocol), lo que proporciona flexibilidad para diferentes arquitecturas y requisitos de red.

  4. Alta disponibilidad: Al distribuir las responsabilidades de balance de la carga entre varios nodos, MetalLB garantiza alta disponibilidad y fiabilidad para tus servicios.

  5. Escalabilidad: MetalLB puede gestionar implementaciones a gran escala, escalándose junto con tu clúster de Kubernetes para satisfacer la creciente demanda.

En el modo de capa 2, un nodo asume la responsabilidad de anunciar un servicio a la red local. Desde la perspectiva de la red, simplemente parece que esa máquina tiene varias direcciones IP asignadas a su interfaz de red.

La principal ventaja del modo de capa 2 es su universalidad: funciona en cualquier red Ethernet, sin necesidad de hardware especial, ni siquiera routers sofisticados.

22.2 MetalLB en K3s (usando L3)

En este inicio rápido, se utiliza el modo L3. Esto significa que necesitamos tener router(s) vecino(s) con capacidades BGP dentro del rango de la red.

22.3 Requisitos previos

  • Un clúster de K3s donde se va a desplegar MetalLB.

  • Router(es) en la red que admitan el protocolo BGP.

  • Una dirección IP libre dentro del rango de la red para el servicio. En este ejemplo 192.168.10.100

Importante
Importante

Debéis aseguraros de que esta dirección IP no esté asignada. En un entorno DHCP, esta dirección no debe formar parte del grupo DHCP para evitar asignaciones dobles.

22.4 Configuración para anunciar direcciones IP de servicio

Por defecto, BGP anuncia una dirección IP de servicio a todos los pares que están configurados. Estos pares, que normalmente son routers, recibirán una ruta para cada dirección IP de servicio con una máscara de red de 32 bits. En este ejemplo utilizaremos un router basado en FRR que se encuentra en la misma red que nuestro clúster. A continuación, utilizaremos la capacidad BGP de MetalLB para anunciar un servicio a ese router basado en FRR.

22.5 Distribución

Utilizaremos el gráfico de Helm de MetalLB publicado como parte de la solución SUSE Edge:

helm install \
  metallb oci://registry.suse.com/edge/charts/metallb \
  --namespace metallb-system \
  --create-namespace

while ! kubectl wait --for condition=ready -n metallb-system $(kubectl get\
 pods -n metallb-system -l app.kubernetes.io/component=controller -o name)\
 --timeout=10s; do
 sleep 2
done

22.6 Configuración

  1. En este punto, la instalación está completa. Crear un IPAddressPool:

cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: bgp-pool
  namespace: metallb-system
  labels:
    app: httpd
spec:
  addresses:
  - 192.168.10.100/32
  autoAssign: true
  avoidBuggyIPs: false
  serviceAllocation:
    namespaces:
    - metallb-system
    priority: 100
    serviceSelectors:
    - matchExpressions:
      - key: serviceType
        operator: In
        values:
        - httpd
EOF
  1. Configurar un BGPPeer.

Nota
Nota

El router FRR tiene el ASN 1000, mientras que nuestro BGPPeer tendrá el 1001. También podemos ver que el router FRR tiene una dirección IP que es 192.168.3.140.

cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  namespace: metallb-system
  name: mypeertest
spec:
  peerAddress: 192.168.3.140
  peerASN: 1000
  myASN: 1001
  routerID: 4.4.4.4
EOF
  1. Crea BGPAdvertisement (L3):

cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
  name: bgpadvertisement-test
  namespace: metallb-system
spec:
  ipAddressPools:
  - bgp-pool
EOF

22.7 Uso

  1. Crea una aplicación de ejemplo con un servicio. En este caso, la dirección IP del IPAddressPool es 192.168.10.100 para ese servicio.

cat <<- EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deployment
  namespace: metallb-system
  labels:
    app: httpd
spec:
  replicas: 3
  selector:
    matchLabels:
      pod-label: httpd
  template:
    metadata:
      labels:
        pod-label: httpd
    spec:
      containers:
      - name: httpdcontainer
        image: image: docker.io/library/httpd:2.4
        ports:
          - containerPort: 80
            protocol: TCP
      restartPolicy: Always

---
apiVersion: v1
kind: Service
metadata:
  name: http-service
  namespace: metallb-system
  labels:
    serviceType: httpd
spec:
  selector:
    pod-label: httpd
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 8080
    name: 8080-tcp
    targetPort: 80
EOF
  1. Para verificarlo, iniciad sesión en el router FRR para poder ver las rutas creadas a partir del anuncio BGP.

42178089cba5# show ip bgp all

For address family: IPv4 Unicast
BGP table version is 3, local router ID is 2.2.2.2, vrf id 0
Default local pref 100, local AS 1000
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

   Network          Next Hop            Metric LocPrf Weight Path
* i172.16.0.0/24    1.1.1.1                  0    100      0 i
*>                  0.0.0.0                  0         32768 i
* i172.17.0.0/24    3.3.3.3                  0    100      0 i
*>                  0.0.0.0                  0         32768 i
*= 192.168.10.100/32
                    192.168.3.162                          0 1001 i
*=                  192.168.3.163                          0 1001 i
*>                  192.168.3.161                          0 1001 i

Displayed  3 routes and 7 total paths
kubectl get svc -n hello-kubernetes
NAME               TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
hello-kubernetes   LoadBalancer   10.43.127.75   192.168.122.11   80:31461/TCP   8s
  1. Si este router es el gateway predeterminado de vuestra red, podéis ejecutar el comando curl desde un equipo en esa red para verificar que pueden acceder a la aplicación de ejemplo httpd.

# curl http://192.168.10.100:8080
<html><body><h1>It works!</h1></body></html>
#

23 MetalLB en K3s (usando el modo FRR-K8s)

MetalLB es una implementación de equilibrador de carga para clústeres de Kubernetes en equipo sin sistema operativo, que utiliza protocolos de enrutamiento estándar.

En esta guía, demostramos cómo desplegar MetalLB en modo BGP FRR-K8s de capa 3.

23.1 MetalLB en K3s (usando FRR-K8s)

Nota
Nota

FRR-K8s es actualmente una función de vista previa tecnológica. La documentación de la comunidad sobre FRR-K8s está aquí.

En esta guía de inicio rápido, se utiliza el modo FRR-K8s.

23.2 Requisitos previos

  • Todos los requisitos previos para FRR-K8s son los mismos que para Capítulo 22, MetalLB en K3s (usando el modo de capa 3), aparte de la necesidad de una dirección IP libre.

    Nota
    Nota

    El ejemplo aquí no incluye la configuración de un servicio, por lo que no es necesaria una dirección IP.

  • Un clúster de K3s donde se va a desplegar MetalLB.

  • Router(es) en la red que admitan el protocolo BGP.

23.3 Configuración para aceptar rutas entrantes

De forma predeterminada, MetalLB BGP anuncia una dirección IP de servicio a todos los pares BGP configurados. Estos pares, que normalmente son routers, recibirán una ruta para cada dirección IP de servicio con una máscara de red de 32 bits. Al utilizar FRR-K8s con el CR FRRConfiguration, también es posible recibir rutas de routers externos. Estas rutas externas aparecerán en la tabla de enrutamiento de cada nodo. Esto tiene múltiples beneficios, pero el principal es que elimina la necesidad de actualizar manualmente las tablas de enrutamiento de Linux en los nodos cuando cambia la red externa, específicamente en los casos en los que es deseable evitar enviar tráfico a través de la puerta de enlace predeterminada.

23.4 Distribución

Utilizaremos el gráfico de Helm de MetalLB publicado como parte de la solución SUSE Edge. Tened en cuenta que FRR-K8s es un subchart de MetalLB y, para habilitarlo, estableced frrk8s.enabled en true. FRR-K8s también requiere algunos privilegios elevados en el espacio de nombres.

kubectl create namespace metallb-system
kubectl label namespace metallb-system pod-security.kubernetes.io/enforce=privileged
kubectl label namespace metallb-system pod-security.kubernetes.io/audit=privileged
kubectl label namespace metallb-system pod-security.kubernetes.io/warn=privileged
helm install metallb \
  oci://registry.suse.com/edge/charts/metallb \
  --namespace metallb-system \
  --set frrk8s.enabled=true --set frrk8s.external=false


while ! kubectl wait --for condition=ready -n metallb-system $(kubectl get\
 pods -n metallb-system -l app.kubernetes.io/component=controller -o name)\
 --timeout=10s; do
 sleep 2
done

Verificad que tenéis 4 pods en el espacio de nombres metallb-system y que todos ellos se están ejecutando sin problemas:

k get pods -n metallb-system
NAME                                                      READY   STATUS    RESTARTS     AGE
metallb-controller-7fbfd8977d-m2q9t                       1/1     Running   0            46s
metallb-metallb-frr-k8s-9w7wl                             6/6     Running   0            46s
metallb-metallb-frr-k8s-webhook-server-5d9d67ffd6-8jqnc   1/1     Running   1 (6s ago)   46s
metallb-speaker-qx8bl                                     1/1     Running   0            46s

En este punto, la instalación de MetalLB y FRR-K8s está completa.

23.5 Configuración

  1. Cread un FRRConfiguration para FRR-K8s:

    cat <<-EOF | kubectl apply -f -
    apiVersion: frrk8s.metallb.io/v1beta1
    kind: FRRConfiguration
    metadata:
      name: frrdemo
      namespace: metallb-system
    spec:
      bgp:
        routers:
        - asn: 64513
          neighbors:
            - address: 192.168.20.154
              asn: 64512
              port: 179
              toAdvertise:
                allowed:
                  mode: all
              toReceive:
                allowed:
                  mode: all
    EOF

    El router BGP externo tiene el ASN 64512, mientras que nuestro BGPPeer tendrá el 64513. También podemos ver que el router BGP externo tiene una dirección IP que es 192.168.20.154.

  2. Verificad que la FRRConfiguration se haya desplegado:

    k get FRRConfiguration -A
    NAMESPACE        NAME      AGE
    metallb-system   frrdemo   4s
    Nota
    Nota

    Los ajustes de toReceive anteriores harán que vuestro clúster acepte todas las rutas entrantes. Esto podría no ser aconsejable en un entorno de producción ya que, dependiendo de vuestros routers externos, puede hacer que las tablas de enrutamiento de vuestros nodos se llenen. Consultad la documentación en instrucciones para filtrar para recibir más información.

Con FRR-K8s, estas son todas las configuraciones necesarias. Cualquier ruta que vuestro router BGP externo esté recibiendo se compartirá con vuestro clúster y todos los nodos tendrán sus tablas de enrutamiento actualizadas.

La configuración se puede probar con lo que se describe en Capítulo 22, MetalLB en K3s (usando el modo de capa 3). Para combinar estas configuraciones, existen algunos requisitos:

  • La configuración de FRR-K8s se realiza en un clúster independiente. Esto es necesario para evitar el enrutamiento interno del clúster.

  • Se requieren cambios en los ID de ASN y en la dirección IP del router para que coincidan ambas configuraciones.

Con ambas configuraciones implementadas, se puede observar lo siguiente:

Nota
Nota

En las configuraciones estándar de FRR Routing, las rutas se comparten con el siguiente salto (next-hop) establecido en la dirección IP del FRR Router. Para conseguir un siguiente salto sin la dirección IP del FRR Router, se puede añadir una línea \"neighbor BGPPG next-hop-unchanged\" y una línea \"neighbor BGPPG as-override\" al archivo /etc/frr/frr.conf en el FRR Router. Con esto implementado, los nodos del clúster FRR-K8s obtendrán una ruta directa al servicio.

24 MetalLB delante del servidor de API de Kubernetes

Esta guía demuestra el uso de un servicio MetalLB para exponer la API de RKE2/K3s externamente en un clúster de alta disponibilidad con tres nodos de plano de control. Para lograr esto, se creará manualmente un Servicio de Kubernetes de tipo LoadBalancer. A continuación, se creará automáticamente un objeto EndpointSlices que mantiene las IP de todos los nodos del plano de control disponibles en el clúster. Para que los EndpointSlices se sincronicen continuamente con los eventos que ocurren en el clúster (añadir/eliminar un nodo o un nodo que se desconecta), se desplegará el Endpoint Copier Operator (Capítulo 16, Operador de Endpoint Copier). El operador supervisa los eventos que ocurren en los EndpointSlices kubernetes predeterminados y actualiza automáticamente el gestionado para mantenerlos sincronizados. Dado que el Servicio gestionado es de tipo LoadBalancer, MetalLB le asigna una ExternalIP estática. Esta ExternalIP se utilizará para comunicarse con el servidor de API.

24.1 Requisitos previos

  • Tres hosts sobre los que desplegar RKE2/K3s.

    • Aseguraos de que los hosts tengan nombres de host diferentes.

    • Para realizar pruebas, podrían ser máquinas virtuales

  • Al menos 2 IP disponibles en la red (una para el servicio expuesto del controlador de entrada Traefik y otra para el servicio gestionado).

  • Helm

24.2 Instalación de RKE2/K3s

Nota
Nota

Si no queréis utilizar un clúster nuevo, sino uno ya existente, saltad este paso y continuad con el siguiente.

Primero, debéis reservar una IP libre en la red que se utilizará más adelante para ExternalIP del Servicio gestionado.

Acceded por SSH al primer host e instalad la distribución deseada en modo clúster.

Para RKE2:

# As a root user, create the /etc/rancher/rke2/config.yaml config file with the following content:

mkdir -p /etc/rancher/rke2/
cat <<EOF > /etc/rancher/rke2/config.yaml
# An example of the config.yaml file for a server node:
write-kubeconfig-mode: "0644"
ingress-controller: traefik
tls-san:
  - "${VIP_SERVICE_IP}"
  - "https://${VIP_SERVICE_IP}.sslip.io"
EOF

# Install RKE2
curl -sfL https://get.rke2.io | INSTALL_RKE2_EXEC="server" sh -

# Enable and start the RKE2 service with the configuration specified in the config.yaml file
systemctl enable rke2-server.service
systemctl start rke2-server.service

# Fetch the cluster token to be used later:
RKE2_TOKEN=$(tr -d '\n' < /var/lib/rancher/rke2/server/node-token)

Para K3s:

# Export the free IP mentioned above
export VIP_SERVICE_IP=<ip>
export INSTALL_K3S_SKIP_START=false

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --cluster-init \
 --disable=servicelb --write-kubeconfig-mode=644 --tls-san=${VIP_SERVICE_IP} \
 --tls-san=https://${VIP_SERVICE_IP}.sslip.io" K3S_TOKEN=foobar sh -
Nota
Nota

Aseguraos de que el flag --disable=servicelb se incluya en el comando k3s server.

Importante
Importante

A partir de ahora, debéis ejecutar los comandos en la máquina local.

Para acceder al servidor de la API desde el exterior, se utilizará la IP de la máquina virtual de RKE2/K3s.

# Replace <node-ip> with the actual IP of the machine
export NODE_IP=<node-ip>
export KUBE_DISTRIBUTION=<k3s/rke2>

scp ${NODE_IP}:/etc/rancher/${KUBE_DISTRIBUTION}/${KUBE_DISTRIBUTION}.yaml ~/.kube/config && sed \
 -i '' "s/127.0.0.1/${NODE_IP}/g" ~/.kube/config && chmod 600 ~/.kube/config

24.3 Configuración de un clúster existente

Nota
Nota

Este paso solo es válido si tenéis intención de utilizar un clúster de RKE2/K3s existente.

Para utilizar un clúster existente, debéis modificar los flags tls-san. Además, debéis desactivar el LB servicelb para K3s.

Para cambiar los flags de los servidores de RKE2 o K3s, debéis modificar el archivo /etc/systemd/system/rke2.service o /etc/systemd/system/k3s.service en todas las máquinas virtuales del clúster, dependiendo de la distribución.

Los flags deben insertarse en ExecStart. Por ejemplo:

Para RKE2:

# Replace the <vip-service-ip> with the actual ip
ExecStart=/usr/local/bin/rke2 \
    server \
        '--write-kubeconfig-mode=644' \
        '--tls-san=<vip-service-ip>' \
        '--tls-san=https://<vip-service-ip>.sslip.io' \

Para K3s:

# Replace the <vip-service-ip> with the actual ip
ExecStart=/usr/local/bin/k3s \
    server \
        '--cluster-init' \
        '--write-kubeconfig-mode=644' \
        '--disable=servicelb' \
        '--tls-san=<vip-service-ip>' \
        '--tls-san=https://<vip-service-ip>.sslip.io' \

A continuación, debéis ejecutar los siguientes comandos para cargar las nuevas configuraciones:

systemctl daemon-reload
systemctl restart ${KUBE_DISTRIBUTION}

24.4 Instalación de MetalLB

Para desplegar MetalLB, podéis utilizar la guía MetalLB on K3s (Capítulo 21, MetalLB en K3s (usando el modo de capa 2)).

NOTA: Aseguraos de que la dirección IP VIP_SERVICE_IP no se solape con la IPAddressPools existente en el clúster.

Cread un IpAddressPool y un L2Advertisement independientes que se utilizarán únicamente para el Servicio gestionado.

NOTA: El IPAddressPool que aparece a continuación se asignará a un Servicio de tipo LoadBalancer en el espacio de nombres default. Si existen múltiples LoadBalancer servicios allí, se pueden configurar ServiceSelectors adicionales para que coincidan explícitamente con este servicio VIP.

# Export the VIP_SERVICE_IP on the local machine
# Replace with the actual IP
export VIP_SERVICE_IP=<ip>

cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: kubernetes-vip-ip-pool
  namespace: metallb-system
spec:
  addresses:
  - ${VIP_SERVICE_IP}/32
  serviceAllocation:
    priority: 100
    namespaces:
      - default
EOF
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: kubernetes-vip-l2-adv
  namespace: metallb-system
spec:
  ipAddressPools:
  - kubernetes-vip-ip-pool
EOF

24.5 Instalación del operador Endpoint Copier

helm install \
endpoint-copier-operator oci://registry.suse.com/edge/charts/endpoint-copier-operator \
--namespace endpoint-copier-operator \
--create-namespace

El comando anterior desplegará el Deployment del operador endpoint-copier-operator con dos réplicas. Uno será el líder y el otro asumirá el papel de líder si es necesario.

Ahora, el servicio kubernetes-vip debería estar desplegado, el cual será reconciliado por el operador y se crearán unos EndpointSlices con los puertos y la IP configurados.

Para RKE2:

cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-vip
  namespace: default
spec:
  ports:
  - name: rke2-api
    port: 9345
    protocol: TCP
    targetPort: 9345
  - name: k8s-api
    port: 6443
    protocol: TCP
    targetPort: 6443
  type: LoadBalancer
EOF

Para K3s:

cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-vip
  namespace: default
spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: https
    port: 6443
    protocol: TCP
    targetPort: 6443
  sessionAffinity: None
  type: LoadBalancer
EOF

Verificad que el servicio kubernetes-vip tenga la dirección IP correcta:

kubectl get service kubernetes-vip -n default \
 -o=jsonpath='{.status.loadBalancer.ingress[0].ip}'

Aseguraos de que los recursos EndpointSlices kubernetes-vip-* y kubernetes en el espacio de nombres default apunten a las mismas IP.

kubectl get endpointslices | grep kubernetes

Si todo es correcto, lo último que queda es utilizar el VIP_SERVICE_IP en nuestro Kubeconfig.

sed -i '' "s/${NODE_IP}/${VIP_SERVICE_IP}/g" ~/.kube/config

A partir de ahora, todo el kubectl pasará a través del servicio kubernetes-vip.

24.6 Añadir nodos del plano de control

Para supervisar todo el proceso, se pueden abrir dos pestañas de terminal más.

Primera terminal:

watch kubectl get nodes

Segunda terminal:

watch kubectl get endpointslices

Ahora, ejecutad los comandos siguientes en el segundo y el tercer nodo.

Para RKE2:

# As a root user, create the /etc/rancher/rke2/config.yaml config file with the following content:

mkdir -p /etc/rancher/rke2/
cat <<EOF > /etc/rancher/rke2/config.yaml
# An example of the config.yaml file for an additional server node:
server: https://${VIP_SERVICE_IP}:9345
write-kubeconfig-mode: "0644"
ingress-controller: traefik
tls-san:
  - "${VIP_SERVICE_IP}"
  - "https://${VIP_SERVICE_IP}.sslip.io"
# The one from above
token: ${RKE2_TOKEN}
EOF

# Install RKE2
curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="server" sh -

# Enable the RKE2 service with the configuration specified in the config.yaml file

systemctl enable --now rke2-server.service

# Fetch the cluster token to be used later:
RKE2_TOKEN=$(tr -d '\n' < /var/lib/rancher/rke2/server/node-token)

Para K3s:

# Export the VIP_SERVICE_IP in the VM
# Replace with the actual IP
export VIP_SERVICE_IP=<ip>
export INSTALL_K3S_SKIP_START=false

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server \
 --server https://${VIP_SERVICE_IP}:6443 --disable=servicelb \
 --write-kubeconfig-mode=644" K3S_TOKEN=foobar sh -

25 Despliegues en entorno aislado con Edge Image Builder

25.1 Introducción

Esta guía mostrará cómo desplegar varios de los componentes de SUSE Edge completamente aislados en SUSE Linux Micro 6.2 utilizando Edge Image Builder(EIB) (Capítulo 8, Edge Image Builder). Con esto, podréis arrancar en una imagen personalizada y lista para arrancar (CRB) creada por EIB y tener los componentes especificados desplegados en un clúster RKE2 o K3s sin conexión a Internet ni pasos manuales. Esta configuración es muy deseable para los clientes que desean preinstalar todos los artefactos necesarios para el despliegue en su imagen de SO, de modo que estén disponibles inmediatamente al arrancar.

Cubriremos una instalación en entorno aislado de:

Aviso
Aviso

EIB analizará y descargará previamente todas las imágenes referenciadas en los charts de Helm y los manifiestos de Kubernetes proporcionados. Sin embargo, algunos de ellos podrían intentar descargar imágenes de contenedor y crear recursos de Kubernetes basados en ellas durante el tiempo de ejecución. En estos casos tenemos que especificar manualmente las imágenes necesarias en el archivo de definición si queremos configurar un entorno completamente aislado.

25.2 Requisitos previos

Si estáis siguiendo esta guía, se asume que ya estáis familiarizados con EIB (Capítulo 8, Edge Image Builder). Si no es así, por favor, seguid la guía de inicio rápido (Capítulo 2, Clústeres independientes con Edge Image Builder) para comprender mejor los conceptos que se muestran en la práctica a continuación.

25.3 Configuración de red de Libvirt

Nota
Nota

Para realizar una demostración del despliegue en entorno aislado, esta guía se llevará a cabo utilizando una red libvirt simulada y aislada, y la siguiente configuración se adaptará a ello. Para vuestros propios despliegues, es posible que tengáis que modificar la configuración host1.local.yaml que se presentará en el siguiente paso.

Si queréis utilizar la misma configuración de red libvirt, seguid los pasos. De lo contrario, vaya a la Sección 25.4, “Configuración del directorio base”.

Vamos a crear una configuración de red aislada con un rango de direcciones IP 192.168.100.2/24 para DHCP:

cat << EOF > isolatednetwork.xml
<network>
  <name>isolatednetwork</name>
  <bridge name='virbr1' stp='on' delay='0'/>
  <ip address='192.168.100.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.100.2' end='192.168.100.254'/>
    </dhcp>
  </ip>
</network>
EOF

Ahora, lo único que queda es crear la red e iniciarla:

virsh net-define isolatednetwork.xml
virsh net-start isolatednetwork

25.4 Configuración del directorio base

La configuración del directorio base es la misma en todos los componentes, por lo que la estableceremos aquí.

Primero crearemos los subdirectorios necesarios:

export CONFIG_DIR=$HOME/config
mkdir -p $CONFIG_DIR/base-images
mkdir -p $CONFIG_DIR/network
mkdir -p $CONFIG_DIR/kubernetes/helm/values

Aseguraos de añadir la imagen base que planeéis utilizar en el directorio base-images. Esta guía se centrará en la ISO de autoinstalación que encontraréis aquí.

Vamos a copiar la imagen descargada:

cp SL-Micro.x86_64-6.2-Base-SelfInstall-GM.install.iso $CONFIG_DIR/base-images/slemicro.iso
Nota
Nota

EIB nunca modificará la entrada de la imagen base.

Vamos a crear un archivo que contenga la configuración de red deseada:

cat << EOF > $CONFIG_DIR/network/host1.local.yaml
routes:
  config:
  - destination: 0.0.0.0/0
    metric: 100
    next-hop-address: 192.168.100.1
    next-hop-interface: eth0
    table-id: 254
  - destination: 192.168.100.0/24
    metric: 100
    next-hop-address: 192.168.122.1
    next-hop-interface: eth0
    table-id: 254
dns-resolver:
  config:
    server:
    - 192.168.100.1
    - 8.8.8.8
interfaces:
- name: eth0
  type: ethernet
  state: up
  mac-address: 34:8A:B1:4B:16:E7
  ipv4:
    address:
    - ip: 192.168.100.50
      prefix-length: 24
    dhcp: false
    enabled: true
  ipv6:
    enabled: false
EOF

Esta configuración garantiza que lo siguiente esté presente en los sistemas aprovisionados (utilizando la dirección MAC especificada):

  • una interfaz Ethernet con una dirección IP estática

  • encaminamiento

  • DNS

  • Nombre de host (host1.local)

La estructura de archivos resultante debería tener ahora este aspecto:

├── kubernetes/
│   └── helm/
│       └── values/
├── base-images/
│   └── slemicro.iso
└── network/
    └── host1.local.yaml

25.5 Archivo de definición base

Edge Image Builder utiliza archivos de definición para modificar las imágenes de SUSE Linux Micro. Estos archivos contienen la mayoría de las opciones configurables. Muchas de estas opciones se repetirán en las distintas secciones de los componentes, por lo que las enumeraremos y explicaremos aquí.

Sugerencia
Sugerencia

La lista completa de opciones de personalización en el archivo de definición se puede encontrar en la documentación en sentido ascendente

Echaremos un vistazo a los siguientes campos que estarán presentes en todos los archivos de definición:

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-image.iso
operatingSystem:
  users:
    - username: root
      encryptedPassword: $6$jHugJNNd3HElGsUZ$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
kubernetes:
  version: v1.35.4+rke2r1
embeddedArtifactRegistry:
  images:
    - ...

La sección image es obligatoria y especifica la imagen de entrada, su arquitectura y tipo, así como el nombre que recibirá 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.

La sección kubernetes es opcional y define el tipo y la versión de Kubernetes. Vamos a utilizar la distribución RKE2. Utilizad kubernetes.version: v1.35.4+k3s1 si preferís K3s. A menos que se configure explícitamente mediante el campo kubernetes.nodes, todos los clústeres que iniciemos en esta guía serán de un solo nodo.

La sección embeddedArtifactRegistry incluirá todas las imágenes que solo se referencian y se descargan en tiempo de ejecución para el componente específico.

25.6 Instalación de Rancher

Nota
Nota

El despliegue de Rancher (Capítulo 4, Rancher) que se mostrará estará muy simplificado con fines de demostración. Para vuestros despliegues reales, pueden ser necesarios artefactos adicionales dependiendo de vuestra configuración.

Los activos de la versión Rancher 2.14.2 contienen un archivo rancher-images.txt que enumera todas las imágenes necesarias para una instalación en entorno aislado.

Hay más de 600 imágenes de contenedor en total, lo que significa que la imagen CRB resultante sería de aproximadamente 30 GB. Para nuestra instalación de Rancher, reduciremos esa lista a la configuración funcional más pequeña. A partir de ahí, podéis volver a añadir las imágenes que necesitéis para vuestros despliegues.

Crearemos el archivo de definición e incluiremos la lista de imágenes reducida:

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-image.iso
operatingSystem:
  users:
    - username: root
      encryptedPassword: $6$jHugJNNd3HElGsUZ$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
kubernetes:
  version: v1.35.4+rke2r1
  manifests:
    urls:
    - https://github.com/cert-manager/cert-manager/releases/download/v1.15.3/cert-manager.crds.yaml
  helm:
    charts:
      - name: rancher
        version: 2.14.2
        repositoryName: rancher-prime
        valuesFile: rancher-values.yaml
        targetNamespace: cattle-system
        createNamespace: true
        installationNamespace: kube-system
      - name: cert-manager
        installationNamespace: kube-system
        createNamespace: true
        repositoryName: jetstack
        targetNamespace: cert-manager
        version: 1.20.1
    repositories:
      - name: jetstack
        url: https://charts.jetstack.io
      - name: rancher-prime
        url: https://charts.rancher.com/server-charts/prime
embeddedArtifactRegistry:
  images:
    - name: registry.rancher.com/rancher/backup-restore-operator:v10.0.2
    - name: registry.rancher.com/rancher/compliance-operator:v1.4.1
    - name: registry.rancher.com/rancher/fleet-agent:v0.15.2
    - name: registry.rancher.com/rancher/fleet:v0.15.2
    - name: registry.rancher.com/rancher/hardened-addon-resizer:1.8.23-build20260413
    - name: registry.rancher.com/rancher/hardened-calico:v3.31.5-build20260415
    - name: registry.rancher.com/rancher/hardened-cluster-autoscaler:v1.10.3-build20260414
    - name: registry.rancher.com/rancher/hardened-cni-plugins:v1.9.1-build20260415
    - name: registry.rancher.com/rancher/hardened-coredns:v1.14.2-build20260416
    - name: registry.rancher.com/rancher/hardened-dns-node-cache:1.26.8-build20260416
    - name: registry.rancher.com/rancher/hardened-etcd:v3.6.7-k3s1-build20260415
    - name: registry.rancher.com/rancher/hardened-flannel:v0.28.4-build20260415
    - name: registry.rancher.com/rancher/hardened-k8s-metrics-server:v0.8.1-build20260413
    - name: registry.rancher.com/rancher/hardened-kubernetes:v1.35.4-rke2r1-build20260416
    - name: registry.rancher.com/rancher/hardened-multus-cni:v4.2.4-build20260310
    - name: registry.rancher.com/rancher/hardened-multus-dynamic-networks-controller:v0.3.7-build20260310
    - name: registry.rancher.com/rancher/hardened-multus-thick:v4.2.4-build20260310
    - name: registry.rancher.com/rancher/hardened-traefik:v3.6.13-build20260416
    - name: registry.rancher.com/rancher/hardened-whereabouts:v0.9.3-build20260408
    - name: registry.rancher.com/rancher/k3s-upgrade:v1.35.4-k3s1
    - name: registry.rancher.com/rancher/klipper-helm:v0.9.17-build20260422
    - name: registry.rancher.com/rancher/klipper-lb:v0.4.16
    - name: registry.rancher.com/rancher/kubectl:v1.35.2
    - name: registry.rancher.com/rancher/kuberlr-kubectl:v7.0.3
    - name: registry.rancher.com/rancher/local-path-provisioner:v0.0.35
    - name: registry.rancher.com/rancher/machine:v0.15.0-rancher142
    - name: registry.rancher.com/rancher/nginx-ingress-controller:v1.14.5-hardened2
    - name: registry.rancher.com/rancher/prom-prometheus:v3.8.1
    - name: registry.rancher.com/rancher/prometheus-federator:v6.0.0
    - name: registry.rancher.com/rancher/pushprox:v0.1.10
    - name: registry.rancher.com/rancher/rancher-agent:v2.14.2
    - name: registry.rancher.com/rancher/rancher-csp-adapter:v9.0.0
    - name: registry.rancher.com/rancher/rancher-webhook:v0.10.6
    - name: registry.rancher.com/rancher/rancher:v2.14.2
    - name: registry.rancher.com/rancher/remotedialer-proxy:v0.7.2
    - name: registry.rancher.com/rancher/rke2-cloud-provider:v1.35.4-0.20260415195656-e51c0636351d-build20260415
    - name: registry.rancher.com/rancher/rke2-runtime:v1.35.4-rke2r1
    - name: registry.rancher.com/rancher/rke2-upgrade:v1.35.4-rke2r1
    - name: registry.rancher.com/rancher/scc-operator:v0.4.1
    - name: registry.rancher.com/rancher/security-scan:v0.9.1
    - name: registry.rancher.com/rancher/shell:v0.1.24
    - name: registry.rancher.com/rancher/supportability-review-app-frontend:v0.19.0
    - name: registry.rancher.com/rancher/supportability-review-internal:latest
    - name: registry.rancher.com/rancher/supportability-review-operator:v0.19.0
    - name: registry.rancher.com/rancher/supportability-review:latest
    - name: registry.rancher.com/rancher/system-agent-installer-k3s:v1.35.4-k3s1
    - name: registry.rancher.com/rancher/system-agent-installer-rke2:v1.35.4-rke2r1
    - name: registry.rancher.com/rancher/system-agent:v0.3.16-suc
    - name: registry.rancher.com/rancher/system-upgrade-controller:v0.19.1
    - name: registry.rancher.com/rancher/turtles:v0.26.2
    - name: registry.rancher.com/rancher/ui-plugin-catalog:4.15.0
    - name: registry.rancher.com/rancher/kubectl:v1.20.2
    - name: registry.rancher.com/rancher/mirrored-ingress-nginx-kube-webhook-certgen:v1.6.7

En comparación con la lista completa de más de 600 imágenes de contenedor, esta versión reducida solo contiene unas 60, lo que hace que la nueva imagen CRB sea de solo unos 7 GB.

También necesitamos crear un archivo de valores de Helm para Rancher:

cat << EOF > $CONFIG_DIR/kubernetes/helm/values/rancher-values.yaml
hostname: 192.168.100.50.sslip.io
replicas: 1
bootstrapPassword: "adminadminadmin"
systemDefaultRegistry: registry.rancher.com
useBundledSystemChart: true
EOF
Aviso
Aviso

Establecer systemDefaultRegistry en registry.rancher.com permite a Rancher buscar automáticamente imágenes en el registro de artefactos integrado que se inicia dentro de la imagen CRB al arrancar. Omitir este campo puede provocar que no se encuentren las imágenes de contenedor en el nodo.

Vamos a compilar la imagen:

podman run --rm -it --privileged -v $CONFIG_DIR:/eib \
registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 \
build --definition-file eib-iso-definition.yaml

La salida debería ser similar a la siguiente:

Downloading file: dl-manifest-1.yaml 100% |██████████████████████████████████████████████████████████████████████████████| (583/583 kB, 12 MB/s)
Pulling selected Helm charts... 100% |███████████████████████████████████████████████████████████████████████████████████████████| (2/2, 3 it/s)
Generating image customization components...
Identifier ................... [SUCCESS]
Custom Files ................. [SKIPPED]
Time ......................... [SKIPPED]
Network ...................... [SUCCESS]
Groups ....................... [SKIPPED]
Users ........................ [SUCCESS]
Proxy ........................ [SKIPPED]
Rpm .......................... [SKIPPED]
Os Files ..................... [SKIPPED]
Systemd ...................... [SKIPPED]
Fips ......................... [SKIPPED]
Elemental .................... [SKIPPED]
Suma ......................... [SKIPPED]
Populating Embedded Artifact Registry... 100% |███████████████████████████████████████████████████████████████████████████| (56/56, 8 it/min)
Embedded Artifact Registry ... [SUCCESS]
Keymap ....................... [SUCCESS]
Configuring Kubernetes component...
The Kubernetes CNI is not explicitly set, defaulting to 'cilium'.
Downloading file: rke2_installer.sh
Downloading file: rke2-images-core.linux-amd64.tar.zst 100% |███████████████████████████████████████████████████████████| (644/644 MB, 29 MB/s)
Downloading file: rke2-images-cilium.linux-amd64.tar.zst 100% |█████████████████████████████████████████████████████████| (400/400 MB, 29 MB/s)
Downloading file: rke2.linux-amd64.tar.gz 100% |███████████████████████████████████████████████████████████████████████████| (36/36 MB, 30 MB/s)
Downloading file: sha256sum-amd64.txt 100% |█████████████████████████████████████████████████████████████████████████████| (4.3/4.3 kB, 29 MB/s)
Kubernetes ................... [SUCCESS]
Certificates ................. [SKIPPED]
Cleanup ...................... [SKIPPED]
Building ISO image...
Kernel Params ................ [SKIPPED]
Build complete, the image can be found at: eib-image.iso

Una vez que se aprovisione un nodo que utilice la imagen compilada, podemos verificar la instalación de Rancher:

/var/lib/rancher/rke2/bin/kubectl get all -n cattle-system --kubeconfig /etc/rancher/rke2/rke2.yaml

El resultado debería ser similar al siguiente, mostrando que todo se ha desplegado correctamente:

NAME                                            READY   STATUS      RESTARTS   AGE
pod/helm-operation-6l6ld                        0/2     Completed   0          107s
pod/helm-operation-8tk2v                        0/2     Completed   0          2m2s
pod/helm-operation-blnrr                        0/2     Completed   0          2m49s
pod/helm-operation-hdcmt                        0/2     Completed   0          3m19s
pod/helm-operation-m74c7                        0/2     Completed   0          97s
pod/helm-operation-qzzr4                        0/2     Completed   0          2m30s
pod/helm-operation-s9jh5                        0/2     Completed   0          3m
pod/helm-operation-tq7ts                        0/2     Completed   0          2m41s
pod/rancher-99d599967-ftjkk                     1/1     Running     0          4m15s
pod/rancher-webhook-79798674c5-6w28t            1/1     Running     0          2m27s
pod/system-upgrade-controller-56696956b-trq5c   1/1     Running     0          104s

NAME                      TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/rancher           ClusterIP   10.43.255.80   <none>        80/TCP,443/TCP   4m15s
service/rancher-webhook   ClusterIP   10.43.7.238    <none>        443/TCP          2m27s

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/rancher                     1/1     1            1           4m15s
deployment.apps/rancher-webhook             1/1     1            1           2m27s
deployment.apps/system-upgrade-controller   1/1     1            1           104s

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/rancher-99d599967                     1         1         1       4m15s
replicaset.apps/rancher-webhook-79798674c5            1         1         1       2m27s
replicaset.apps/system-upgrade-controller-56696956b   1         1         1       104s

Y cuando vamos a https://192.168.100.50.sslip.io e iniciamos sesión con la contraseña adminadminadmin que establecimos anteriormente, nos recibe el panel de control de Rancher:

air gapped rancher

25.7 Instalación de SUSE Security

A diferencia de la instalación de Rancher, la instalación de SUSE Security no requiere ningún manejo especial en EIB. EIB aislará automáticamente cada imagen requerida por su componente subyacente NeuVector.

Crearemos el archivo de definición:

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-image.iso
operatingSystem:
  users:
    - username: root
      encryptedPassword: $6$jHugJNNd3HElGsUZ$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
kubernetes:
  version: v1.35.4+rke2r1
  helm:
    charts:
      - name: neuvector-crd
        version: 109.0.2+up2.10.2
        repositoryName: rancher-charts
        targetNamespace: neuvector
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: neuvector-values.yaml
      - name: neuvector
        version: 109.0.2+up2.10.2
        repositoryName: rancher-charts
        targetNamespace: neuvector
        createNamespace: true
        installationNamespace: kube-system
        valuesFile: neuvector-values.yaml
    repositories:
      - name: rancher-charts
        url: https://charts.rancher.io/

También crearemos un archivo de valores de Helm para NeuVector:

cat << EOF > $CONFIG_DIR/kubernetes/helm/values/neuvector-values.yaml
controller:
  replicas: 1
manager:
  enabled: false
cve:
  scanner:
    enabled: false
    replicas: 1
k3s:
  enabled: true
crdwebhook:
  enabled: false
EOF

Vamos a compilar la imagen:

podman run --rm -it --privileged -v $CONFIG_DIR:/eib \
registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 \
build --definition-file eib-iso-definition.yaml

La salida debería ser similar a la siguiente:

Pulling selected Helm charts... 100% |███████████████████████████████████████████████████████████████████████████████████████████| (2/2, 4 it/s)
Generating image customization components...
Identifier ................... [SUCCESS]
Custom Files ................. [SKIPPED]
Time ......................... [SKIPPED]
Network ...................... [SUCCESS]
Groups ....................... [SKIPPED]
Users ........................ [SUCCESS]
Proxy ........................ [SKIPPED]
Rpm .......................... [SKIPPED]
Os Files ..................... [SKIPPED]
Systemd ...................... [SKIPPED]
Fips ......................... [SKIPPED]
Elemental .................... [SKIPPED]
Suma ......................... [SKIPPED]
Populating Embedded Artifact Registry... 100% |██████████████████████████████████████████████████████████████████████████████| (5/5, 13 it/min)
Embedded Artifact Registry ... [SUCCESS]
Keymap ....................... [SUCCESS]
Configuring Kubernetes component...
The Kubernetes CNI is not explicitly set, defaulting to 'cilium'.
Downloading file: rke2_installer.sh
Kubernetes ................... [SUCCESS]
Certificates ................. [SKIPPED]
Cleanup ...................... [SKIPPED]
Building ISO image...
Kernel Params ................ [SKIPPED]
Build complete, the image can be found at: eib-image.iso

Una vez que se aprovisione un nodo que utilice la imagen compilada, podemos verificar la instalación de SUSE Security:

/var/lib/rancher/rke2/bin/kubectl get all -n neuvector --kubeconfig /etc/rancher/rke2/rke2.yaml

El resultado debería ser similar al siguiente, mostrando que todo se ha desplegado correctamente:

NAME                                            READY   STATUS      RESTARTS   AGE
pod/neuvector-cert-upgrader-job-bxbnz           0/1     Completed   0          3m39s
pod/neuvector-controller-pod-7d854bfdc7-nhxjf   1/1     Running     0          3m44s
pod/neuvector-enforcer-pod-ct8jm                1/1     Running     0          3m44s

NAME                                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
service/neuvector-svc-admission-webhook   ClusterIP   10.43.234.241   <none>        443/TCP                         3m44s
service/neuvector-svc-controller          ClusterIP   None            <none>        18300/TCP,18301/TCP,18301/UDP   3m44s
service/neuvector-svc-crd-webhook         ClusterIP   10.43.50.190    <none>        443/TCP                         3m44s

NAME                                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/neuvector-enforcer-pod   1         1         1       1            1           <none>          3m44s

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/neuvector-controller-pod   1/1     1            1           3m44s

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/neuvector-controller-pod-7d854bfdc7   1         1         1       3m44s

NAME                                        SCHEDULE    TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob.batch/neuvector-cert-upgrader-pod   0 0 1 1 *   <none>     True      0        <none>          3m44s
cronjob.batch/neuvector-updater-pod         0 0 * * *   <none>     False     0        <none>          3m44s

NAME                                    STATUS     COMPLETIONS   DURATION   AGE
job.batch/neuvector-cert-upgrader-job   Complete   1/1           7s         3m39s

25.8 Instalación de SUSE Storage

La documentación oficial de Longhorn contiene un longhorn-images.txt archivo que enumera todas las imágenes necesarias para una instalación en entorno aislado. Incluiremos sus equivalentes reflejados desde el registro de contenedores de Rancher en nuestro archivo de definición. Vamos a crearlo:

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-image.iso
operatingSystem:
  users:
    - username: root
      encryptedPassword: $6$jHugJNNd3HElGsUZ$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
  packages:
    sccRegistrationCode: [reg-code]
    packageList:
      - open-iscsi
kubernetes:
  version: v1.35.4+rke2r1
  helm:
    charts:
      - name: suse-storage
        releaseName: longhorn
        repositoryName: rancher-application-collection
        targetNamespace: longhorn-system
        createNamespace: true
        version: 1.11.2
    repositories:
      - name: rancher-application-collection
        url: oci://dp.apps.rancher.io/charts
        authentication:
          username: $APPS.RANCHER.IO_USERNAME
          password: $APPS.RANCHER.IO_ACCESS_TOKEN
embeddedArtifactRegistry:
    registries:
      - uri: dp.apps.rancher.io
        authentication:
          username: $APPS.RANCHER.IO_USERNAME
          password: $APPS.RANCHER.IO_ACCESS_TOKEN
    - name: dp.apps.rancher.io/containers/kubernetes-csi-external-attacher:4.11.0-13.2
    - name: dp.apps.rancher.io/containers/kubernetes-csi-external-provisioner:5.3.0-14.1
    - name: dp.apps.rancher.io/containers/kubernetes-csi-external-resizer:2.1.0-6.2
    - name: dp.apps.rancher.io/containers/kubernetes-csi-external-snapshotter:8.5.0-13.2
    - name: dp.apps.rancher.io/containers/kubernetes-csi-livenessprobe:2.18.0-13.2
    - name: dp.apps.rancher.io/containers/kubernetes-csi-node-driver-registrar:2.16.0-13.2
    - name: dp.apps.rancher.io/containers/longhorn-backing-image-manager:1.11.2-4.1
    - name: dp.apps.rancher.io/containers/longhorn-engine:1.11.2-4.2
    - name: dp.apps.rancher.io/containers/longhorn-instance-manager:1.11.2-4.3
    - name: dp.apps.rancher.io/containers/longhorn-manager:1.11.2-4.2
    - name: dp.apps.rancher.io/containers/longhorn-share-manager:1.11.2-4.1
    - name: dp.apps.rancher.io/containers/longhorn-ui:1.11.2-4.1
    - name: dp.apps.rancher.io/containers/rancher-support-bundle-kit:0.0.84-9.4
Nota
Nota

Observaréis que el archivo de definición enumera el paquete open-iscsi. Esto es necesario ya que Longhorn depende de un daemon iscsiadm que se ejecuta en los diferentes nodos para proporcionar volúmenes persistentes a Kubernetes.

Vamos a compilar la imagen:

podman run --rm -it --privileged -v $CONFIG_DIR:/eib \
registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 \
build --definition-file eib-iso-definition.yaml

La salida debería ser similar a la siguiente:

Setting up Podman API listener...
Pulling selected Helm charts... 100% |██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| (2/2, 3 it/s)
Generating image customization components...
Identifier ................... [SUCCESS]
Custom Files ................. [SKIPPED]
Time ......................... [SKIPPED]
Network ...................... [SUCCESS]
Groups ....................... [SKIPPED]
Users ........................ [SUCCESS]
Proxy ........................ [SKIPPED]
Resolving package dependencies...
Rpm .......................... [SUCCESS]
Os Files ..................... [SKIPPED]
Systemd ...................... [SKIPPED]
Fips ......................... [SKIPPED]
Elemental .................... [SKIPPED]
Suma ......................... [SKIPPED]
Populating Embedded Artifact Registry... 100% |███████████████████████████████████████████████████████████████████████████████████████████████████████████| (15/15, 20956 it/s)
Embedded Artifact Registry ... [SUCCESS]
Keymap ....................... [SUCCESS]
Configuring Kubernetes component...
The Kubernetes CNI is not explicitly set, defaulting to 'cilium'.
Downloading file: rke2_installer.sh
Downloading file: rke2-images-core.linux-amd64.tar.zst 100% (782/782 MB, 108 MB/s)
Downloading file: rke2-images-cilium.linux-amd64.tar.zst 100% (367/367 MB, 104 MB/s)
Downloading file: rke2.linux-amd64.tar.gz 100% (34/34 MB, 108 MB/s)
Downloading file: sha256sum-amd64.txt 100% (3.9/3.9 kB, 7.5 MB/s)
Kubernetes ................... [SUCCESS]
Certificates ................. [SKIPPED]
Cleanup ...................... [SKIPPED]
Building ISO image...
Kernel Params ................ [SKIPPED]
Build complete, the image can be found at: eib-image.iso

Una vez que se aprovisione un nodo que utilice la imagen compilada, podemos verificar la instalación de Longhorn:

/var/lib/rancher/rke2/bin/kubectl get all -n longhorn-system --kubeconfig /etc/rancher/rke2/rke2.yaml

El resultado debería ser similar al siguiente, mostrando que todo se ha desplegado correctamente:

NAME                                                    READY   STATUS    RESTARTS   AGE
pod/csi-attacher-787fd9c6c8-sf42d                       1/1     Running   0          2m28s
pod/csi-attacher-787fd9c6c8-tb82p                       1/1     Running   0          2m28s
pod/csi-attacher-787fd9c6c8-zhc6s                       1/1     Running   0          2m28s
pod/csi-provisioner-74486b95c6-b2v9s                    1/1     Running   0          2m28s
pod/csi-provisioner-74486b95c6-hwllt                    1/1     Running   0          2m28s
pod/csi-provisioner-74486b95c6-mlrpk                    1/1     Running   0          2m28s
pod/csi-resizer-859d4557fd-t54zk                        1/1     Running   0          2m28s
pod/csi-resizer-859d4557fd-vdt5d                        1/1     Running   0          2m28s
pod/csi-resizer-859d4557fd-x9kh4                        1/1     Running   0          2m28s
pod/csi-snapshotter-6f69c6c8cc-r62gr                    1/1     Running   0          2m28s
pod/csi-snapshotter-6f69c6c8cc-vrwjn                    1/1     Running   0          2m28s
pod/csi-snapshotter-6f69c6c8cc-z65nb                    1/1     Running   0          2m28s
pod/engine-image-ei-4623b511-9vhkb                      1/1     Running   0          3m13s
pod/instance-manager-6f95fd57d4a4cd0459e469d75a300552   1/1     Running   0          2m43s
pod/longhorn-csi-plugin-gx98x                           3/3     Running   0          2m28s
pod/longhorn-driver-deployer-55f9c88499-fbm6q           1/1     Running   0          3m28s
pod/longhorn-manager-dpdp7                              2/2     Running   0          3m28s
pod/longhorn-ui-59c85fcf94-gg5hq                        1/1     Running   0          3m28s
pod/longhorn-ui-59c85fcf94-s49jc                        1/1     Running   0          3m28s

NAME                                  TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/longhorn-admission-webhook    ClusterIP   10.43.77.89    <none>        9502/TCP   3m28s
service/longhorn-backend              ClusterIP   10.43.56.17    <none>        9500/TCP   3m28s
service/longhorn-conversion-webhook   ClusterIP   10.43.54.73    <none>        9501/TCP   3m28s
service/longhorn-frontend             ClusterIP   10.43.22.82    <none>        80/TCP     3m28s
service/longhorn-recovery-backend     ClusterIP   10.43.45.143   <none>        9503/TCP   3m28s

NAME                                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/engine-image-ei-4623b511   1         1         1       1            1           <none>          3m13s
daemonset.apps/longhorn-csi-plugin        1         1         1       1            1           <none>          2m28s
daemonset.apps/longhorn-manager           1         1         1       1            1           <none>          3m28s

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/csi-attacher               3/3     3            3           2m28s
deployment.apps/csi-provisioner            3/3     3            3           2m28s
deployment.apps/csi-resizer                3/3     3            3           2m28s
deployment.apps/csi-snapshotter            3/3     3            3           2m28s
deployment.apps/longhorn-driver-deployer   1/1     1            1           3m28s
deployment.apps/longhorn-ui                2/2     2            2           3m28s

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/csi-attacher-787fd9c6c8               3         3         3       2m28s
replicaset.apps/csi-provisioner-74486b95c6            3         3         3       2m28s
replicaset.apps/csi-resizer-859d4557fd                3         3         3       2m28s
replicaset.apps/csi-snapshotter-6f69c6c8cc            3         3         3       2m28s
replicaset.apps/longhorn-driver-deployer-55f9c88499   1         1         1       3m28s
replicaset.apps/longhorn-ui-59c85fcf94                2         2         2       3m28s

25.9 Instalación de KubeVirt y CDI

Los charts de Helm tanto para KubeVirt como para CDI solo instalan sus respectivos operadores. Depende de los operadores desplegar el resto de los sistemas, lo que significa que tendremos que incluir todas las imágenes de contenedor necesarias en nuestro archivo de definición. Vamos a crearlo:

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-image.iso
operatingSystem:
  users:
    - username: root
      encryptedPassword: $6$jHugJNNd3HElGsUZ$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
kubernetes:
  version: v1.35.4+rke2r1
  helm:
    charts:
      - name: kubevirt
        repositoryName: suse-edge
        version: 306.0.2+up0.7.0
        targetNamespace: kubevirt-system
        createNamespace: true
        installationNamespace: kube-system
      - name: cdi
        repositoryName: suse-edge
        version: 306.0.2+up0.7.0
        targetNamespace: cdi-system
        createNamespace: true
        installationNamespace: kube-system
    repositories:
      - name: suse-edge
        url: oci://registry.suse.com/edge/charts
embeddedArtifactRegistry:
  images:
    - name: registry.suse.com/suse/sles/15.7/cdi-apiserver:1.64.0-150700.9.6.1
    - name: registry.suse.com/suse/sles/15.7/cdi-controller:1.64.0-150700.9.6.1
    - name: registry.suse.com/suse/sles/15.7/cdi-operator:1.64.0-150700.9.6.1
    - name: registry.suse.com/suse/sles/15.7/cdi-uploadproxy:1.64.0-150700.9.6.1
    - name: registry.suse.com/suse/sles/15.7/virt-api:1.7.0-150700.3.16.2
    - name: registry.suse.com/suse/sles/15.7/virt-controller:1.7.0-150700.3.16.2
    - name: registry.suse.com/suse/sles/15.7/virt-handler:1.7.0-150700.3.16.2
    - name: registry.suse.com/suse/sles/15.7/virt-launcher:1.7.0-150700.3.16.2
    - name: registry.suse.com/suse/sles/15.7/virt-operator:1.7.0-150700.3.16.2

Vamos a compilar la imagen:

podman run --rm -it --privileged -v $CONFIG_DIR:/eib \
registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 \
build --definition-file eib-iso-definition.yaml

La salida debería ser similar a la siguiente:

Pulling selected Helm charts... 100% |███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| (2/2, 48 it/min)
Generating image customization components...
Identifier ................... [SUCCESS]
Custom Files ................. [SKIPPED]
Time ......................... [SKIPPED]
Network ...................... [SUCCESS]
Groups ....................... [SKIPPED]
Users ........................ [SUCCESS]
Proxy ........................ [SKIPPED]
Rpm .......................... [SKIPPED]
Os Files ..................... [SKIPPED]
Systemd ...................... [SKIPPED]
Fips ......................... [SKIPPED]
Elemental .................... [SKIPPED]
Suma ......................... [SKIPPED]
Populating Embedded Artifact Registry... 100% |██████████████████████████████████████████████████████████████████████████████████████████████████████████| (15/15, 4 it/min)
Embedded Artifact Registry ... [SUCCESS]
Keymap ....................... [SUCCESS]
Configuring Kubernetes component...
The Kubernetes CNI is not explicitly set, defaulting to 'cilium'.
Downloading file: rke2_installer.sh
Kubernetes ................... [SUCCESS]
Certificates ................. [SKIPPED]
Cleanup ...................... [SKIPPED]
Building ISO image...
Kernel Params ................ [SKIPPED]
Build complete, the image can be found at: eib-image.iso

Una vez que se aprovisione un nodo que utilice la imagen compilada, podemos verificar la instalación tanto de KubeVirt como de CDI.

Verify KubeVirt:

/var/lib/rancher/rke2/bin/kubectl get all -n kubevirt-system --kubeconfig /etc/rancher/rke2/rke2.yaml

El resultado debería ser similar al siguiente, mostrando que todo se ha desplegado correctamente:

NAME                                  READY   STATUS    RESTARTS   AGE
pod/virt-api-59cb997648-mmt67         1/1     Running   0          2m34s
pod/virt-controller-69786b785-7cc96   1/1     Running   0          2m8s
pod/virt-controller-69786b785-wq2dz   1/1     Running   0          2m8s
pod/virt-handler-2l4dm                1/1     Running   0          2m8s
pod/virt-operator-7c444cff46-nps4l    1/1     Running   0          3m1s
pod/virt-operator-7c444cff46-r25xq    1/1     Running   0          3m1s

NAME                                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubevirt-operator-webhook     ClusterIP   10.43.167.109   <none>        443/TCP   2m36s
service/kubevirt-prometheus-metrics   ClusterIP   None            <none>        443/TCP   2m36s
service/virt-api                      ClusterIP   10.43.18.202    <none>        443/TCP   2m36s
service/virt-exportproxy              ClusterIP   10.43.142.188   <none>        443/TCP   2m36s

NAME                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/virt-handler   1         1         1       1            1           kubernetes.io/os=linux   2m8s

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/virt-api          1/1     1            1           2m34s
deployment.apps/virt-controller   2/2     2            2           2m8s
deployment.apps/virt-operator     2/2     2            2           3m1s

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/virt-api-59cb997648         1         1         1       2m34s
replicaset.apps/virt-controller-69786b785   2         2         2       2m8s
replicaset.apps/virt-operator-7c444cff46    2         2         2       3m1s

NAME                            AGE    PHASE
kubevirt.kubevirt.io/kubevirt   3m1s   Deployed

Verify CDI:

/var/lib/rancher/rke2/bin/kubectl get all -n cdi-system --kubeconfig /etc/rancher/rke2/rke2.yaml

El resultado debería ser similar al siguiente, mostrando que todo se ha desplegado correctamente:

NAME                                   READY   STATUS    RESTARTS   AGE
pod/cdi-apiserver-5598c9bf47-pqfxw     1/1     Running   0          3m44s
pod/cdi-deployment-7cbc5db7f8-g46z7    1/1     Running   0          3m44s
pod/cdi-operator-777c865745-2qcnj      1/1     Running   0          3m48s
pod/cdi-uploadproxy-646f4cd7f7-fzkv7   1/1     Running   0          3m44s

NAME                             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/cdi-api                  ClusterIP   10.43.2.224    <none>        443/TCP    3m44s
service/cdi-prometheus-metrics   ClusterIP   10.43.237.13   <none>        8080/TCP   3m44s
service/cdi-uploadproxy          ClusterIP   10.43.114.91   <none>        443/TCP    3m44s

NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/cdi-apiserver     1/1     1            1           3m44s
deployment.apps/cdi-deployment    1/1     1            1           3m44s
deployment.apps/cdi-operator      1/1     1            1           3m48s
deployment.apps/cdi-uploadproxy   1/1     1            1           3m44s

NAME                                         DESIRED   CURRENT   READY   AGE
replicaset.apps/cdi-apiserver-5598c9bf47     1         1         1       3m44s
replicaset.apps/cdi-deployment-7cbc5db7f8    1         1         1       3m44s
replicaset.apps/cdi-operator-777c865745      1         1         1       3m48s
replicaset.apps/cdi-uploadproxy-646f4cd7f7   1         1         1       3m44s

25.10 Instalación de SUSE Private Registry

Para incluir SUSE Private Registry en una ampliación en entorno aislado, debemos actualizar el archivo de definición para incluir el chart de Helm requerido, así como los artefactos integrados para las nuevas imágenes.

Actualicemos el archivo de definición:

apiVersion: 1.3
image:
  imageType: iso
  arch: x86_64
  baseImage: slemicro.iso
  outputImageName: eib-image.iso
operatingSystem:
  users:
    - username: root
      encryptedPassword: $6$jHugJNNd3HElGsUZ$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
kubernetes:
  version: v1.35.4+rke2r1
  helm:
    charts:
      - name: metallb
        version: 306.0.2+up0.15.3
        targetNamespace: metallb-system
        createNamespace: true
        repositoryName: suse-edge-charts
        installationNamespace: kube-system
      - name: suse-storage
        releaseName: longhorn
        repositoryName: rancher-application-collection
        targetNamespace: longhorn-system
        createNamespace: true
        version: 1.11.2
      - name: private-registry-helm
        createNamespace: true
        installationNamespace: kube-system
        repositoryName: privateregistry
        targetNamespace: suse-private-registry
        valuesFile: privateregistry.yaml
        version: 1.1.1
    repositories:
      - name: privateregistry
        authentication:
          username: ${PRIVATE_REGISTRY_USERNAME}
          password: ${PRIVATE_REGISTRY_PASSWORD}
        plainHTTP: false
        skipTLSVerify: false
        url: oci://registry.suse.com/private-registry
      - name: rancher-application-collection
        url: oci://dp.apps.rancher.io/charts
        authentication:
          username: $APPS.RANCHER.IO_USERNAME
          password: $APPS.RANCHER.IO_ACCESS_TOKEN
embeddedArtifactRegistry:
  registries:
    - uri: registry.suse.com
      authentication:
        username: ${PRIVATE_REGISTRY_USERNAME}
        password: ${PRIVATE_REGISTRY_PASSWORD}
    - uri: dp.apps.rancher.io
        authentication:
          username: $APPS.RANCHER.IO_USERNAME
          password: $APPS.RANCHER.IO_ACCESS_TOKEN
  images:
    - name: registry.suse.com/private-registry/harbor-core:1.1.1-1.19
    - name: registry.suse.com/private-registry/harbor-jobservice:1.1.1-1.19
    - name: registry.suse.com/private-registry/harbor-portal:1.1.1-1.20
    - name: registry.suse.com/private-registry/harbor-registry:1.1.1-1.19
    - name: registry.suse.com/private-registry/harbor-registryctl:1.1.1-1.19
    - name: registry.suse.com/private-registry/harbor-trivy-adapter:1.1.1-1.24
Nota
Nota

Necesitaréis ciertas credenciales, que pueden obtenerse siguiendo la documentación oficial de SUSE Private Registry. También deberéis modificar las variables ${PRIVATE_REGISTRY_USERNAME} y ${PRIVATE_REGISTRY_PASSWORD}. Aseguraos de enumerar las imágenes que contienen las versiones de los componentes que necesitáis.

Ahora necesitamos añadir los manifiestos de Kubernetes requeridos para configurar correctamente SUSE Private Registry.

Debe modificar el ${MGMT_CLUSTER_REGISTRY_IP} con una IP estática reservada para SUSE Private Registry en los siguientes archivos:

  1. kubernetes/manifests/metallb-registry.yaml

    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: private-registry
      namespace: metallb-system
    spec:
      ipAddressPools:
      - private-registry-pool
    ---
    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      name: private-registry-pool
      namespace: metallb-system
    spec:
      addresses:
      - ${MGMT_CLUSTER_REGISTRY_IP}/32
      serviceAllocation:
        namespaces:
        - suse-private-registry
  2. kubernetes/helm/values/privateregistry.yaml

    core:
      secretName: suse-registry-tls
    expose:
      tls:
        certSource: secret
        enabled: true
        secret:
          secretName: suse-registry-tls
      type: loadBalancer
    externalURL: https://${MGMT_CLUSTER_REGISTRY_IP}
    persistence:
      persistentVolumeClaim:
        registry:
          size: 20Gi

Finalmente, el kubernetes/manifests/suse-private-registry-creds.yaml debe crearse con el siguiente contenido:

apiVersion: v1
kind: Secret
metadata:
  name: suse-registry
  namespace: suse-private-registry
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: ${DOCKER_CONFIG_JSON_BASE64}
---
apiVersion: v1
kind: Secret
metadata:
    name: suse-registry-tls
    namespace: suse-private-registry
type: kubernetes.io/tls
data:
    tls.crt: ${TLS_CRT_BASE64}
    tls.key: ${TLS_KEY_BASE64}

Para configurar correctamente el json de configuración de docker (base64) para ${DOCKER_CONFIG_JSON_BASE64}, ejecute:

# ${DOCKER_CONFIG_JSON_BASE64} CONTENT
echo -n '{"auths": {"<MGMT_CLUSTER_REGISTRY_IP>": {"username": "<USERNAME>", "password": "<PASSWORD>", "auth": "<AUTH>"}}}' | base64

Donde la IP es la misma que el ${MGMT_CLUSTER_REGISTRY_IP} configurado anteriormente, y el username, password y auth se pueden obtener de la documentación oficial de SUSE Private Registry.

Para generar el certificado TLS y la clave codificados en base64 (tls.crt y tls.key) para ${TLS_CRT_BASE64} y ${TLS_KEY_BASE64}, puede crear los suyos propios ejecutando:

# Generate a self-signed certificate and key
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365 -nodes

# Convert them to base64 for the suse-private-registry-creds.yaml file
cat cert.pem | base64 -w 0
cat key.pem | base64 -w 0

Verifique SUSE Private Registry:

/var/lib/rancher/rke2/bin/kubectl get pods -n suse-private-registry --kubeconfig /etc/rancher/rke2/rke2.yaml

El resultado debería ser similar al siguiente, mostrando que todo se ha desplegado correctamente:

NAME                                                      READY   STATUS    RESTARTS   AGE
pod/private-registry-harbor-core-588fd4876f-8tqnv         1/1     Running   0          4m30s
pod/private-registry-harbor-database-0                    1/1     Running   0          4m30s
pod/private-registry-harbor-jobservice-7658f97fbc-4vq6n   1/1     Running   0          4m30s
pod/private-registry-harbor-portal-5455ccc4bc-jpmt5       1/1     Running   0          4m30s
pod/private-registry-harbor-redis-0                       1/1     Running   0          4m30s
pod/private-registry-harbor-registry-5648b9d89-wdswz      2/2     Running   0          4m30s
pod/private-registry-harbor-trivy-0                       1/1     Running   0          4m30s

25.11 Solución de problemas

Si encuentra algún problema durante la creación de las imágenes o desea realizar más pruebas y depurar el proceso, consulte la documentación en sentido ascendente.

26 Creación de imágenes actualizadas de SUSE Linux Micro con Kiwi

Esta sección explica cómo generar imágenes actualizadas de SUSE Linux Micro para ser utilizadas con Edge Image Builder, con Cluster API (CAPI) + Metal3, o para escribir la imagen de disco directamente en un dispositivo de bloque. Este proceso es útil en situaciones en las que se requiere incluir los últimos parches en las imágenes de arranque inicial del sistema (para minimizar la transferencia de parches tras la instalación), o para escenarios en los que se utiliza CAPI, donde se prefiere reinstalar el sistema operativo con una nueva imagen en lugar de actualizar los hosts in situ.

Este proceso utiliza Kiwi para ejecutar la creación de la imagen. SUSE Edge incluye una versión en contenedores que simplifica el proceso general con una utilidad auxiliar integrada, lo que permite especificar el perfil de destino requerido. El perfil define el tipo de imagen de salida requerida, con las más comunes enumeradas a continuación:

  • "Base" - Una imagen de disco de SUSE Linux Micro con un conjunto de paquetes reducido (incluye podman).

  • "Base-SelfInstall" - Una imagen SelfInstall basada en la "Base" anterior.

  • "Base-RT" - Igual que "Base" anterior, pero utilizando un kernel en tiempo real (rt) en su lugar.

  • "Base-RT-SelfInstall" - Una imagen SelfInstall basada en la "Base-RT" anterior

  • "Default" - Una imagen de disco de SUSE Linux Micro basada en la "Base" anterior, pero con algunas herramientas más, incluyendo la pila de virtualización, Cockpit y salt-minion.

  • "Default-SelfInstall" - Una imagen SelfInstall basada en la "Default" anterior

Consulte la documentación de SUSE Linux Micro 6.2 para obtener más detalles.

Nota
Nota

Este proceso funciona tanto para arquitecturas AMD64/Intel 64 como AArch64, pero es necesario utilizar un host de compilación con la misma arquitectura que las imágenes que se están creando. En otras palabras, para crear una imagen AArch64, es necesario utilizar un host de compilación AArch64, y viceversa para AMD64/Intel 64; las compilaciones cruzadas no son compatibles en este momento.

26.1 Requisitos previos

El generador de imágenes Kiwi requiere lo siguiente:

  • Un host de SUSE Linux Micro 6.2 (\"sistema de compilación\") con la misma arquitectura que la imagen que se está compilando.

  • El sistema de compilación debe estar ya registrado a través de SUSEConnect (el registro se utiliza para extraer los paquetes más recientes de los repositorios de SUSE)

  • Una conexión a internet que se pueda utilizar para obtener los paquetes necesarios. Si se conecta a través de un proxy, el host de compilación debe estar preconfigurado.

  • SELinux debe estar desactivado en el host de compilación (ya que el etiquetado de SELinux tiene lugar en el contenedor y puede entrar en conflicto con la directiva del host)

  • Al menos 10 GB de espacio libre en disco para alojar la imagen del contenedor, la raíz de compilación y la(s) imagen(es) de salida resultante(s)

26.2 Inicio

Debido a ciertas limitaciones, actualmente es necesario desactivar SELinux. Conéctese al host de compilación de imágenes de SUSE Linux Micro 6.2 y asegúrese de que SELinux esté desactivado:

# setenforce 0

Cree un directorio de salida para compartirlo con el contenedor de compilación de Kiwi y guardar las imágenes resultantes:

# mkdir ~/output

Descargue la última imagen del generador Kiwi desde el repositorio de SUSE:

# podman pull registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1
(...)

26.3 Compilación de la imagen predeterminada

Este es el comportamiento predeterminado del contenedor de imágenes Kiwi si no se proporcionan argumentos durante la ejecución de la imagen del contenedor. El siguiente comando ejecuta podman con dos directorios asignados al contenedor:

  • El directorio del repositorio de paquetes de SUSE Linux Micro /etc/zypp/repos.d del host subyacente.

  • El directorio de salida ~/output creado anteriormente.

El contenedor de imágenes Kiwi requiere ejecutar el script auxiliar build-image de la siguiente manera:

# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ~/output:/tmp/output \
    -it registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1 build-image
(...)
Nota
Nota

Se espera que, si ejecuta este script por primera vez, falle poco después de iniciarse con \"ERROR: La prueba inicial del dispositivo de bucle falló, vuelva a intentar la ejecución del contenedor.\", esto es un síntoma de que los dispositivos de bucle creados en el sistema host subyacente no son visibles inmediatamente dentro de la imagen del contenedor. Simplemente vuelva a ejecutar el comando y debería proceder sin problemas.

Tras unos minutos, las imágenes se pueden encontrar en el directorio de salida local:

(...)
INFO: Image build successful, generated images are available in the 'output' directory.

# ls -1 output/
SLE-Micro.x86_64-6.2.changes
SLE-Micro.x86_64-6.2.packages
SLE-Micro.x86_64-6.2.raw
SLE-Micro.x86_64-6.2.verified
build
kiwi.result
kiwi.result.json

26.4 Creación de imágenes con otros perfiles

Para crear diferentes perfiles de imagen, se utiliza la opción de comando \"-p\" en el script auxiliar de imagen de contenedor Kiwi. Por ejemplo, para crear la imagen ISO \"Default-SelfInstall\":

# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ~/output:/tmp/output \
    -it registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1 build-image -p Default-SelfInstall
(...)
Nota
Nota

Para evitar la pérdida de datos, Kiwi se negará a ejecutarse si hay imágenes en el directorio output. Es necesario eliminar el contenido del directorio de salida antes de continuar con rm -f output/*.

Alternativamente, para crear una imagen ISO SelfInstall con el kernel RealTime (\"kernel-rt\"):

# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ~/output:/tmp/output \
    -it registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1 build-image -p Base-RT-SelfInstall
(...)

26.5 Creación de imágenes con tamaños de sector grandes

Algunos hardware requieren una imagen con un tamaño de sector grande, es decir, 4096 bytes en lugar de los 512 bytes estándar. El generador Kiwi en contenedores admite la capacidad de generar imágenes con un tamaño de bloque grande especificando el parámetro "-b". Por ejemplo, para crear una imagen \"Default-SelfInstall\" con un tamaño de sector grande:

# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ~/output:/tmp/output \
    -it registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1 build-image -p Default-SelfInstall -b
(...)

26.6 Uso de un archivo de definición de imagen Kiwi personalizado

Para casos de uso avanzados, se puede utilizar un archivo de definición de imagen Kiwi personalizado (SL-Micro.kiwi) junto con los scripts posteriores a la compilación necesarios. Esto requiere anular las definiciones predeterminadas preempaquetadas por el equipo de SUSE Edge.

Cree un nuevo directorio y asígnelo a la imagen del contenedor donde el guion auxiliar está buscando (/micro-sdk/defs):

# mkdir ~/mydefs/
# cp /path/to/SL-Micro.kiwi ~/mydefs/
# cp /path/to/config.sh ~/mydefs/
# podman run --privileged -v /etc/zypp/repos.d:/micro-sdk/repos/ -v ~/output:/tmp/output -v ~/mydefs/:/micro-sdk/defs/ \
    -it registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1 build-image
(...)
Aviso
Aviso

Esto solo es necesario para casos de uso avanzados y puede causar problemas de soporte. Póngase en contacto con su representante de SUSE para obtener más consejos y orientación.

Para obtener los archivos de definición de imagen Kiwi predeterminados incluidos en el contenedor, se pueden utilizar los siguientes comandos:

$ podman create --name kiwi-builder registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1
$ podman cp kiwi-builder:/micro-sdk/defs/SL-Micro.kiwi .
$ podman cp kiwi-builder:/micro-sdk/defs/SL-Micro.kiwi.4096 .
$ podman rm kiwi-builder
$ ls ./SL-Micro.*
(...)

Parte IV Consejos y trucos

Consejos y trucos para los componentes de Edge

  • 27 Edge Image Builder
  • Si se encuentra en un entorno que no es Linux y sigue estas instrucciones para crear una imagen, es probable que esté ejecutando Podman a través de una máquina virtual. Por defecto, esta máquina virtual estará configurada para tener una pequeña cantidad de recursos del sistema asignados y puede caus…

  • 28 Elemental
  • Al utilizar RKE2 o K3s, necesitamos exponer los servicios (Rancher en este contexto) desde el clúster de gestión, ya que no se exponen de forma predeterminada. Tanto en RKE2 como en k3s existe un controlador Traefik Ingress. El flujo de trabajo actual sugiere utilizar MetalLB para anunciar un servic…

27 Edge Image Builder

27.1 Común

  • Si se encuentra en un entorno que no es Linux y sigue estas instrucciones para crear una imagen, es probable que esté ejecutando Podman a través de una máquina virtual. Por defecto, esta máquina virtual estará configurada para tener una pequeña cantidad de recursos del sistema asignados y puede causar inestabilidad en Edge Image Builder durante operaciones que consumen muchos recursos, como el proceso de resolución de RPM. Tendrá que ajustar los recursos de la máquina Podman, ya sea utilizando Podman Desktop (rueda dentada de ajustes → icono de edición de máquina Podman) o directamente a través del podman-machine-set comando.

  • En este momento, Edge Image Builder no es capaz de crear imágenes en una configuración de arquitectura cruzada, es decir, tiene que ejecutarlo en:

    • AArch64sistemas (como Apple Silicon) para crear imágenes de SL Micro aarch64

    • AMD64/Intel 64sistemas para crear imágenes de SL Micro x86_64.

27.2 SUSE Linux Micro

  • La carga de módulos del kernel durante el arranque puede realizarse utilizando el archivo /etc/modprobe.d/module.conf correspondiente. Cree la carpeta os-files correspondiente utilizando Edge Image Builder:

.
├── definition.yaml
└── os-files
    └── etc
        └── modprobe.d
            └── module.conf

Para obtener más información, consulte la sección «Managing kernel modules» de la documentación de SUSE Linux Enterprise Server

27.3 Kubernetes

  • La creación de clústeres de Kubernetes de varios nodos requiere ajustar kubernetes la sección en el archivo de definición a:

    • listar todos los nodos de servidor y agente bajo kubernetes.nodes

    • establecer una dirección IP virtual que se utilizaría para que todos los nodos que no sean inicializadores se unan al clúster bajo kubernetes.network.apiVIP

    • opcionalmente, establecer un host de API para especificar una dirección de dominio para acceder al clúster bajo kubernetes.network.apiHost Para obtener más información sobre esta configuración, consulte la documentación de la sección de Kubernetes.

  • Edge Image Builder depende de los nombres de host de los diferentes nodos para determinar su tipo de Kubernetes (server o agent). Aunque esta configuración se gestiona en el archivo de definición, para la configuración de red general de las máquinas podemos utilizar la configuración DHCP tal y como se describe en Capítulo 9, Redes edge.

28 Elemental

28.1 Común

28.1.1 Exponer el servicio de Rancher

Al utilizar RKE2 o K3s, necesitamos exponer los servicios (Rancher en este contexto) desde el clúster de gestión, ya que no se exponen de forma predeterminada. Tanto en RKE2 como en k3s existe un controlador Traefik Ingress. El flujo de trabajo actual sugiere utilizar MetalLB para anunciar un servicio (mediante L2 o BGP Advertisement) y el Ingress Controller respectivo para crear un Ingress mediante HelmChartConfig, ya que crear un nuevo objeto Ingress sobrescribiría la configuración existente.

  1. Instalar Rancher Prime (mediante Helm) y configurar los valores necesarios

    hostname: rancher-192.168.64.101.sslip.io
    replicas: 1
    bootstrapPassword: Admin
    global.cattle.psp.enabled: "false"
    Sugerencia
    Sugerencia

    Siga la documentación de instalación de Rancher para obtener más detalles.

  2. Crear un servicio LoadBalancer para exponer Rancher

    kubectl apply -f - <<EOF
    apiVersion: helm.cattle.io/v1
    kind: HelmChartConfig
    metadata:
      name: rke2-traefik
      namespace: kube-system
    spec:
      valuesContent: |-
        ingressClass:
          isDefaultClass: true
        ports:
          web:
            hostPort: null    # disallow hostPort
            exposedPort: 80
          websecure:
            hostPort: null    # disallow hostPort
            exposedPort: 443
        service:
          enabled: true
          type: LoadBalancer
          spec:
            externalTrafficPolicy: Local
            allocateLoadBalancerNodePorts: false  # k8s GA from 1.24; supported by MetalLB
    EOF
  3. Crear un grupo de direcciones IP para el servicio utilizando la dirección IP que configuramos anteriormente en los valores de Helm

    kubectl apply -f - <<EOF
    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      name: ingress-ippool
      namespace: metallb-system
    spec:
      addresses:
      - 192.168.64.101/32
      serviceAllocation:
        priority: 100
        serviceSelectors:
        - matchExpressions:
          - {key: app.kubernetes.io/name, operator: In, values: [rke2-traefik]}
    EOF
  4. Crear un anuncio L2 para el grupo de direcciones IP

    kubectl apply -f - <<EOF
    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: ingress-l2-adv
      namespace: metallb-system
    spec:
      ipAddressPools:
      - ingress-ippool
    EOF
  5. Asegurarse de que Elemental esté instalado correctamente

    1. Instalar el operador de Elemental y la interfaz de usuario de Elemental en los nodos de gestión

    2. Añadir la configuración de Elemental en el nodo de sentido descendente junto con un código de registro, ya que eso hará que Edge Image Builder incluya la opción de registro remoto para la máquina.

Sugerencia
Sugerencia

Consulte Sección 1.5, “Instalar Elemental” y Sección 1.6, “Configurad Elemental” para obtener información y ejemplos adicionales.

28.2 Específico del hardware

28.2.1 Módulo de plataforma de confianza (TPM)

Es necesario gestionar correctamente la configuración del Módulo de plataforma de confianza (TPM). Si no se hace, se producirán errores similares a los siguientes:

Nov 25 18:17:06 eled elemental-register[4038]: Error: registering machine: cannot generate authentication token: opening tpm for getting attestation data: TPM device not available

Esto puede mitigarse mediante uno de los siguientes enfoques:

  • Habilitar TPM en la configuración de la máquina virtual

Ejemplo con UTM en MacOS

TPM
  • Emular TPM utilizando un valor negativo para la semilla TPM en el recurso MachineRegistration

apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
metadata:
  name: ...
  namespace: ...
spec:
    ...
    elemental:
      ...
      registration:
        emulate-tpm: true
        emulated-tpm-seed: -1
  • Deshabilitar TPM en el recurso MachineRegistration

apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
metadata:
  name: ...
  namespace: ...
spec:
    ...
    elemental:
      ...
      registration:
        emulate-tpm: false

Parte V Integración de terceros

Cómo integrar herramientas de terceros

  • 29 NATS
  • NATS es una tecnología de conectividad creada para el mundo hiperconectado en constante crecimiento. Es una tecnología única que permite a las aplicaciones comunicarse de forma segura a través de cualquier combinación de proveedores de nube, in situ, edge, web y dispositivos móviles. NATS consta de …

  • 30 GPUs de NVIDIA en SUSE Linux Micro
  • Esta guía demuestra cómo implementar soporte para GPU de NVIDIA a nivel de host a través de los controladores de código abierto precompilados en SUSE Linux Micro 6.2. Estos son controladores que están integrados en el sistema operativo en lugar de ser cargados dinámicamente por el operador de GPU de…

29 NATS

NATS es una tecnología de conectividad creada para el mundo hiperconectado en constante crecimiento. Es una tecnología única que permite a las aplicaciones comunicarse de forma segura a través de cualquier combinación de proveedores de nube, in situ, edge, web y dispositivos móviles. NATS consta de una familia de productos de código abierto que están estrechamente integrados, pero que pueden implementarse de forma sencilla e independiente. NATS es utilizado a nivel mundial por miles de empresas, abarcando casos de uso que incluyen microservicios, edge computing, dispositivos móviles e IoT, y puede utilizarse para aumentar o reemplazar la mensajería tradicional.

29.1 Arquitectura

NATS es una infraestructura que permite el intercambio de datos entre aplicaciones en forma de mensajes.

29.1.1 Aplicaciones cliente de NATS

Las bibliotecas cliente de NATS pueden utilizarse para permitir que las aplicaciones publiquen, se suscriban, soliciten y respondan entre diferentes instancias. Estas aplicaciones se denominan generalmente client applications.

29.1.2 Infraestructura de servicio de NATS

Los servicios de NATS son proporcionados por uno o más procesos de servidor NATS que están configurados para interconectarse entre sí y proporcionar una infraestructura de servicio de NATS. La infraestructura de servicio de NATS puede escalar desde un único proceso de servidor NATS ejecutándose en un dispositivo final hasta un superclúster global público de muchos clústeres que abarcan todos los principales proveedores de nube y todas las regiones del mundo.

29.1.3 Diseño de mensajería sencillo

NATS facilita que las aplicaciones se comuniquen mediante el envío y la recepción de mensajes. Estos mensajes se dirigen e identifican mediante cadenas de asunto y no dependen de la ubicación en la red. Los datos se codifican y se enmarcan como un mensaje y lo envía un publicador. El mensaje es recibido, decodificado y procesado por uno o más suscriptores.

29.1.4 NATS JetStream

NATS tiene un sistema de persistencia distribuido integrado llamado JetStream. JetStream se creó para resolver los problemas identificados con el streaming en la tecnología actual: complejidad, fragilidad y falta de escalabilidad. JetStream también resuelve el problema del acoplamiento entre el publicador y el suscriptor (los suscriptores deben estar activos y en funcionamiento para recibir el mensaje cuando se publica). Puede encontrar más información sobre NATS JetStream aquí.

29.2 Instalación

29.2.1 Instalación de NATS sobre K3s

NATS está diseñado para múltiples arquitecturas, por lo que se puede instalar fácilmente en K3s. (Capítulo 11, K3s)

Vamos a crear un archivo de valores para sobrescribir los valores predeterminados de NATS.

cat > values.yaml <<EOF
cluster:
  # Enable the HA setup of the NATS
  enabled: true
  replicas: 3

nats:
  jetstream:
    # Enable JetStream
    enabled: true

    memStorage:
      enabled: true
      size: 2Gi

    fileStorage:
      enabled: true
      size: 1Gi
      storageDirectory: /data/
EOF

Ahora instalemos NATS mediante Helm:

helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm install nats nats/nats --namespace nats --values values.yaml \
 --create-namespace

Con el archivo values.yaml anterior, los siguientes componentes estarán en el espacio de nombres nats:

  1. Versión de alta disponibilidad (HA) del Statefulset de NATS que contiene tres contenedores: Servidor NATS + sidecars de recarga de configuración y métricas.

  2. Contenedor NATS box, que viene con un conjunto de utilidades NATS que se pueden utilizar para verificar la configuración.

  3. JetStream también aprovecha su sistema secundario Key-Value que viene con PVCs vinculado a los pods.

29.2.1.1 Probando la configuración

kubectl exec -n nats -it deployment/nats-box -- /bin/sh -l
  1. Cree una suscripción para el asunto de prueba:

    nats sub test &
  2. Envíe un mensaje al asunto de prueba:

    nats pub test hi

29.2.1.2 Limpiando

helm -n nats uninstall nats
rm values.yaml

29.2.2 NATS como sistema secundario para K3s

Un componente que aprovecha K3s es KINE, que es un shim que permite la sustitución de etcd por sistemas secundarios de almacenamiento alternativos dirigidos originalmente a bases de datos relacionales. Como JetStream proporciona una API de Key Value, esto hace posible tener a NATS como sistema secundario para el clúster de K3s.

Ya existe una PR fusionada que hace que NATS integrado en K3s sea sencillo, pero el cambio todavía no está incluido en las versiones de K3s.

Por este motivo, el binario de K3s debe compilarse manualmente.

29.2.2.1 Compilación de K3s

git clone --depth 1 https://github.com/k3s-io/k3s.git && cd k3s

El comando siguiente añade nats en las etiquetas de compilación para habilitar la función integrada de NATS en K3s:

sed -i '' 's/TAGS="ctrd/TAGS="nats ctrd/g' scripts/build
make local

Reemplace <node-ip> por la IP real del nodo donde se iniciará K3s:

export NODE_IP=<node-ip>
sudo scp dist/artifacts/k3s-arm64 ${NODE_IP}:/usr/local/bin/k3s
Nota
Nota

La compilación local de K3s requiere el plugin buildx de la CLI de Docker. Se puede instalar manualmente si $ make local falla.

29.2.2.2 Instalación de la CLI de NATS

TMPDIR=$(mktemp -d)
nats_version="nats-0.0.35-linux-arm64"
curl -o "${TMPDIR}/nats.zip" -sfL https://github.com/nats-io/natscli/releases/download/v0.0.35/${nats_version}.zip
unzip "${TMPDIR}/nats.zip" -d "${TMPDIR}"

sudo scp ${TMPDIR}/${nats_version}/nats ${NODE_IP}:/usr/local/bin/nats
rm -rf ${TMPDIR}

29.2.2.3 Ejecución de NATS como sistema secundario de K3s

Vamos a ssh en el nodo y ejecutar K3s con el flag --datastore-endpoint apuntando a nats.

Nota
Nota

El comando siguiente inicia K3s como un proceso en primer plano, por lo que los registros pueden seguirse fácilmente para ver si hay algún problema. Para no bloquear el terminal actual, se podría añadir un flag & antes del comando para iniciarlo como un proceso en segundo plano.

k3s server  --datastore-endpoint=nats://
Nota
Nota

Para hacer que el servidor K3s con el sistema secundario de NATS sea permanente en su VM slemicro, se puede ejecutar el siguiente script, que crea un servicio systemd con las configuraciones necesarias.

export INSTALL_K3S_SKIP_START=false
export INSTALL_K3S_SKIP_DOWNLOAD=true

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server \
 --datastore-endpoint=nats://"  sh -

29.2.2.4 Solución de problemas

Los comandos siguientes se pueden ejecutar en el nodo para verificar que todo lo relacionado con el flujo funciona correctamente:

nats str report -a
nats str view -a

30 GPUs de NVIDIA en SUSE Linux Micro

30.1 Introducción

Esta guía demuestra cómo implementar soporte para GPU de NVIDIA a nivel de host a través de los controladores de código abierto precompilados en SUSE Linux Micro 6.2. Estos son controladores que están integrados en el sistema operativo en lugar de ser cargados dinámicamente por el operador de GPU de NVIDIA. Esta configuración es muy deseable para los clientes que desean preintegrar todos los artefactos necesarios para la ampliación en la imagen, y donde la selección dinámica de la versión del controlador, es decir, que el usuario seleccione la versión del controlador a través de Kubernetes, no es un requisito. Esta guía explica inicialmente cómo desplegar los componentes adicionales en un sistema que ya ha sido predesplegado, pero continúa con una sección que describe cómo integrar esta configuración en la ampliación inicial a través de Edge Image Builder. Si no desea repasar los conceptos básicos y configurar las cosas manualmente, pase directamente a esa sección.

Es importante señalar que el soporte para estos controladores lo proporcionan tanto SUSE como NVIDIA en estrecha colaboración, donde el controlador es compilado y distribuido por SUSE como parte de los repositorios de paquetes. Sin embargo, si tiene alguna duda o pregunta sobre la combinación en la que utiliza los controladores, solicite más ayuda a sus gestores de cuenta de SUSE o NVIDIA. Si planea utilizar NVIDIA AI Enterprise (NVAIE), asegúrese de utilizar una GPU certificada para NVAIE, lo cual podría requerir el uso de controladores propietarios de NVIDIA. Si no está seguro, hable con su representante de NVIDIA.

Más información sobre la integración del operador de GPU de NVIDIA no está cubierta en esta guía. Aunque la integración del operador de GPU de NVIDIA para Kubernetes no se trata aquí, puede seguir la mayoría de los pasos de esta guía para configurar el sistema operativo subyacente y simplemente habilitar el operador de GPU para utilizar los controladores preinstalados a través del indicador driver.enabled=false en el gráfico de Helm del operador de GPU de NVIDIA, donde simplemente detectará los controladores instalados en el host. Puede encontrar instrucciones más completas de NVIDIA aquí.

30.2 Requisitos previos

Si está siguiendo esta guía, se asume que ya dispone de lo siguiente:

  • Al menos un host con SUSE Linux Micro 6.2 instalado; puede ser físico o virtual.

  • Sus hosts están asociados a una suscripción, ya que es necesario para acceder a los paquetes; hay una evaluación disponible aquí.

  • Una GPU NVIDIA compatible instalada (o totalmente transferida a la máquina virtual en la que se ejecuta SUSE Linux Micro).

  • Acceso a la raíz: estas instrucciones asumen que es la raíz y no que está escalando sus privilegios mediante sudo.

30.3 Instalación manual

En esta sección, va a instalar los controladores de NVIDIA directamente en el sistema operativo SUSE Linux Micro, ya que el controlador abierto de NVIDIA forma parte ahora de los repositorios de paquetes principales de SUSE Linux Micro, lo que lo hace tan fácil como instalar los paquetes RPM necesarios. No es necesario compilar ni descargar paquetes ejecutables. A continuación, veremos cómo implementar la generación "G06" de controlador, que es compatible con las GPUs más recientes (consulte aquí para obtener más información), así que seleccione una generación de controlador adecuada para la GPU NVIDIA presente en su sistema. Para las GPU modernas, el controlador \"G06\" es la opción más común.

Antes de empezar, es importante reconocer que, además del controlador abierto de NVIDIA que SUSE distribuye como parte de SUSE Linux Micro, es posible que también necesite componentes adicionales de NVIDIA para su configuración. Estos podrían incluir bibliotecas OpenGL, kits de herramientas CUDA, utilidades de línea de comandos como nvidia-smi y componentes de integración de contenedores como nvidia-container-toolkit. Muchos de estos componentes no son distribuidos por SUSE, ya que son software propietario de NVIDIA, o no tiene sentido que los distribuyamos nosotros en lugar de NVIDIA. Por lo tanto, como parte de las instrucciones, vamos a configurar repositorios adicionales que nos den acceso a dichos componentes y veremos ciertos ejemplos de cómo utilizar estas herramientas, lo que dará como resultado un sistema totalmente funcional. Es importante distinguir entre los repositorios de SUSE y los de NVIDIA, ya que en ocasiones puede haber una discrepancia entre las versiones de los paquetes que NVIDIA pone a disposición y las que ha compilado SUSE. Esto suele ocurrir cuando SUSE pone a disposición una nueva versión del controlador abierto y pasan un par de días hasta que los paquetes equivalentes están disponibles en los repositorios de NVIDIA para que coincidan.

Le recomendamos que se asegure de que la versión del controlador que está seleccionando es compatible con su GPU y cumple con cualquier requisito de CUDA que pueda tener comprobando:

Sugerencia
Sugerencia

Para encontrar las versiones del controlador abierto de NVIDIA, ejecute zypper se -s nvidia-open-driver en la máquina de destino o busque \"nvidia-open-driver\" en el Centro de servicios al cliente de SUSE en SUSE Linux Micro 6.2 para AMD64/Intel 64.

Centro de servicios al cliente de SUSE

Cuando haya confirmado que existe una versión equivalente en los repositorios de NVIDIA, estará listo para instalar los paquetes en el sistema operativo anfitrión. Para ello, necesitamos abrir una sesión transactional-update, que crea una nueva instantánea de lectura/escritura del sistema operativo subyacente para que podamos realizar cambios en la plataforma inmutable (para obtener más instrucciones sobre transactional-update, consulte aquí):

transactional-update shell

Cuando se encuentre en su shell transactional-update, añada un repositorio de paquetes adicional de NVIDIA. Esto permite incorporar utilidades adicionales, por ejemplo, nvidia-smi:

zypper ar https://download.nvidia.com/suse/sle15sp6/ nvidia-suse-main
zypper --gpg-auto-import-keys refresh

A continuación, puede instalar el controlador y nvidia-compute-utils para utilidades adicionales. Si no necesitas las utilidades, puedes omitirlas, pero para fines de prueba, vale la pena instalarlas en esta etapa:

zypper install -y --auto-agree-with-licenses nvidia-open-driver-G06-signed-kmp nvidia-compute-utils-G06
Nota
Nota

Si la instalación falla, esto podría indicar una incompatibilidad de dependencias entre la versión del controlador seleccionada y la que NVIDIA ofrece en sus repositorios. Consulte la sección anterior para verificar que sus versiones coinciden. Intenta instalar una versión de controlador diferente. Por ejemplo, si los repositorios de NVIDIA tienen una versión anterior, puede intentar especificar nvidia-open-driver-G06-signed-kmp=550.54.14 en su comando de instalación para indicar una versión que coincida.

A continuación, si no está utilizando una GPU compatible (recuerde que puede encontrar la lista aquí), puede comprobar si el controlador funciona habilitando la compatibilidad a nivel de módulo, pero los resultados pueden variar; omita este paso si está utilizando una GPU compatible:

sed -i '/NVreg_OpenRmEnableUnsupportedGpus/s/^#//g' /etc/modprobe.d/50-nvidia-default.conf

Ahora que ha instalado estos paquetes, es el momento de salir de la sesión transactional-update:

exit
Nota
Nota

Asegúrate de haber salido de la sesión transactional-update antes de continuar.

Ahora que ha instalado los controladores, es el momento de reiniciar. Como SUSE Linux Micro es un sistema operativo inmutable, necesita reiniciarse en la nueva instantánea que creó en un paso anterior. Los controladores solo se instalan en esta nueva instantánea, por lo que no es posible cargarlos sin reiniciar en esta nueva instantánea, lo cual ocurre automáticamente. Emite el comando de reinicio cuando estés listo:

reboot

Una vez que el sistema se haya reiniciado correctamente, vuelva a iniciar sesión y utilice la herramienta nvidia-smi para verificar que el controlador se ha cargado correctamente y que puede acceder a sus GPUs y enumerarlas:

nvidia-smi

La salida de este comando debería mostrar algo similar a lo siguiente, teniendo en cuenta que en el ejemplo de abajo hay dos GPUs:

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.29.06              Driver Version: 545.29.06    CUDA Version: 12.3     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA A100-PCIE-40GB          Off | 00000000:17:00.0 Off |                    0 |
| N/A   29C    P0              35W / 250W |      4MiB / 40960MiB |      0%      Default |
|                                         |                      |             Disabled |
+-----------------------------------------+----------------------+----------------------+
|   1  NVIDIA A100-PCIE-40GB          Off | 00000000:CA:00.0 Off |                    0 |
| N/A   30C    P0              33W / 250W |      4MiB / 40960MiB |      0%      Default |
|                                         |                      |             Disabled |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

Esto concluye el proceso de instalación y verificación de los controladores de NVIDIA en su sistema SUSE Linux Micro.

30.4 Validación adicional de la instalación manual

En esta etapa, todo lo que hemos podido verificar es que, a nivel de host, se puede acceder al dispositivo NVIDIA y que los controladores se están cargando correctamente. Sin embargo, si queremos estar seguros de que funciona, una prueba sencilla sería validar que la GPU puede recibir instrucciones de una aplicación en espacio de usuario, idealmente a través de un contenedor y mediante la biblioteca CUDA, ya que eso es lo que normalmente utilizaría una carga de trabajo real. Para ello, podemos realizar una modificación adicional en el sistema operativo anfitrión instalando el nvidia-container-toolkit (NVIDIA Container Toolkit). Primero, abre otro shell transactional-update, teniendo en cuenta que podrías haber hecho esto en una sola transacción en el paso anterior, y verás cómo hacerlo de forma totalmente automatizada en una sección posterior:

transactional-update shell

A continuación, instale el paquete nvidia-container-toolkit del repositorio de NVIDIA Container Toolkit:

  • El nvidia-container-toolkit.repo a continuación contiene un repositorio estable (nvidia-container-toolkit) y uno experimental (nvidia-container-toolkit-experimental). El repositorio estable se recomienda para uso en producción. El repositorio experimental está deshabilitado por defecto.

zypper ar https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo
zypper --gpg-auto-import-keys install -y nvidia-container-toolkit

Cuando estéis listos, podéis salir del shell transactional-update:

exit

…​y reiniciad la máquina en la nueva instantánea:

reboot
Nota
Nota

Como antes, debéis aseguraros de haber salido del transactional-shell y reiniciado la máquina para que los cambios surtan efecto.

Con la máquina reiniciada, podéis verificar que el sistema puede enumerar correctamente los dispositivos utilizando el NVIDIA Container Toolkit. La salida debería ser detallada, con mensajes INFO y WARN, pero sin mensajes ERROR:

nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml

Esto garantiza que cualquier contenedor iniciado en la máquina pueda emplear los dispositivos GPU de NVIDIA que se hayan descubierto. Cuando estéis listos, podéis ejecutar un contenedor basado en podman. Hacer esto mediante podman nos proporciona una buena forma de validar el acceso al dispositivo NVIDIA desde dentro de un contenedor, lo que debería dar confianza para hacer lo mismo con Kubernetes en una etapa posterior. Dad a podman acceso a los dispositivos NVIDIA etiquetados de los que se ocupó el comando anterior, basándoos en SLE BCI, y simplemente ejecutad el comando Bash:

podman run --rm --device nvidia.com/gpu=all --security-opt=label=disable -it registry.suse.com/bci/bci-base:latest bash

Ahora ejecutaréis comandos desde dentro de un contenedor podman temporal. No tiene acceso a vuestro sistema subyacente y es efímero, por lo que cualquier cosa que hagamos aquí no persistirá, y no deberíais poder romper nada en el host subyacente. Como ahora estamos en un contenedor, podemos instalar las bibliotecas CUDA necesarias, comprobando de nuevo la versión correcta de CUDA para su controlador aquí, aunque la salida anterior de nvidia-smi debería mostrar la versión de CUDA requerida. En el ejemplo siguiente, instale CUDA 12.3 y descargue muchos ejemplos, demostraciones y kits de desarrollo para que pueda validar completamente la GPU:

zypper ar https://developer.download.nvidia.com/compute/cuda/repos/sles15/x86_64/ cuda-suse
zypper in -y cuda-libraries-devel-12-3 cuda-minimal-build-12-3 cuda-demo-suite-12-3

Una vez que se haya instalado correctamente, no salga del contenedor. Ejecutaremos el ejemplo de CUDA deviceQuery, que valida exhaustivamente el acceso a la GPU a través de CUDA, y desde dentro del propio contenedor:

/usr/local/cuda-12/extras/demo_suite/deviceQuery

Si tiene éxito, debería ver una salida que muestre algo similar a lo siguiente, observando el mensaje Result = PASS al final del comando, y observando que en la salida a continuación, el sistema identifica correctamente dos GPU, mientras que su entorno puede tener solo una:

/usr/local/cuda-12/extras/demo_suite/deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 2 CUDA Capable device(s)

Device 0: "NVIDIA A100-PCIE-40GB"
  CUDA Driver Version / Runtime Version          12.2 / 12.1
  CUDA Capability Major/Minor version number:    8.0
  Total amount of global memory:                 40339 MBytes (42298834944 bytes)
  (108) Multiprocessors, ( 64) CUDA Cores/MP:     6912 CUDA Cores
  GPU Max Clock rate:                            1410 MHz (1.41 GHz)
  Memory Clock rate:                             1215 Mhz
  Memory Bus Width:                              5120-bit
  L2 Cache Size:                                 41943040 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
  Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 3 copy engine(s)
  Run time limit on kernels:                     No
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Enabled
  Device supports Unified Addressing (UVA):      Yes
  Device supports Compute Preemption:            Yes
  Supports Cooperative Kernel Launch:            Yes
  Supports MultiDevice Co-op Kernel Launch:      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 23 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

Device 1: <snip to reduce output for multiple devices>
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
> Peer access from NVIDIA A100-PCIE-40GB (GPU0) -> NVIDIA A100-PCIE-40GB (GPU1) : Yes
> Peer access from NVIDIA A100-PCIE-40GB (GPU1) -> NVIDIA A100-PCIE-40GB (GPU0) : Yes

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 12.3, CUDA Runtime Version = 12.3, NumDevs = 2, Device0 = NVIDIA A100-PCIE-40GB, Device1 = NVIDIA A100-PCIE-40GB
Result = PASS

Desde aquí, puede continuar ejecutando cualquier otra carga de trabajo de CUDA: utilice compiladores y cualquier otro aspecto del ecosistema CUDA para realizar más pruebas. Cuando haya terminado, puede salir del contenedor, teniendo en cuenta que todo lo que haya instalado allí es efímero (¡así que se perderá!) y no ha afectado al sistema operativo subyacente:

exit

30.5 Implementación con Kubernetes

Ahora que hemos probado la instalación y el uso del controlador abierto de NVIDIA en SUSE Linux Micro, exploremos la configuración de Kubernetes en la misma máquina. Esta guía no le explica cómo desplegar Kubernetes, pero asume que ha instalado K3s o RKE2 y que su kubeconfig está configurado en consecuencia, de modo que los comandos estándar de kubectl se puedan ejecutar como superusuario. Asumimos que su nodo forma un clúster de un solo nodo, aunque los pasos principales deberían ser similares para clústeres de varios nodos. Primero, asegúrese de que su acceso a kubectl funciona:

kubectl get nodes

Esto debería mostrar algo similar a lo siguiente:

NAME       STATUS   ROLES                       AGE   VERSION
node0001   Ready    control-plane,etcd,master   13d   v1.35.4+rke2r1

Lo que debería encontrar es que su instalación de k3s/rke2 ha detectado el NVIDIA Container Toolkit en el host y ha autoconfigurado la integración del entorno de ejecución de NVIDIA en containerd (la interfaz de entorno de ejecución de contenedor que utilizan k3s/rke2). Confírmelo comprobando el archivo config.toml de containerd:

tail -n8 /var/lib/rancher/rke2/agent/etc/containerd/config.toml

Esto debe mostrar algo parecido a lo siguiente. La ubicación equivalente de K3s es /var/lib/rancher/k3s/agent/etc/containerd/config.toml:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes."nvidia"]
  runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes."nvidia".options]
  BinaryName = "/usr/bin/nvidia-container-runtime"
Nota
Nota

Si estas entradas no están presentes, es posible que la detección haya fallado. Esto podría deberse a que la máquina o los servicios de Kubernetes no se han reiniciado. Añada estos manualmente como se indica arriba, si es necesario.

A continuación, debemos configurar NVIDIA RuntimeClass como un tiempo de ejecución de Kubernetes adicional al predeterminado, asegurando que cualquier solicitud de usuario para pods que necesiten acceso a la GPU pueda utilizar el NVIDIA Container Toolkit para hacerlo, a través de nvidia-container-runtime, tal como se configura en la configuración de containerd:

kubectl apply -f - <<EOF
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: nvidia
handler: nvidia
EOF

El siguiente paso es configurar NVIDIA Device Plugin, que configura Kubernetes para aprovechar las GPUs de NVIDIA como recursos dentro del clúster que se pueden utilizar, trabajando en combinación con el NVIDIA Container Toolkit. Esta herramienta detecta inicialmente todas las capacidades del host subyacente, incluidas las GPUs, los controladores y otras capacidades (como GL) y, a continuación, le permite solicitar recursos de GPU y consumirlos como parte de sus aplicaciones.

En primer lugar, debe añadir y actualizar el repositorio de Helm para el NVIDIA Device Plugin:

helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update

Ahora puede instalar el NVIDIA Device Plugin:

helm upgrade -i nvdp nvdp/nvidia-device-plugin --namespace nvidia-device-plugin --create-namespace --version 0.14.5 --set runtimeClassName=nvidia

Después de unos minutos, verá un nuevo pod en ejecución que completará la detección en sus nodos disponibles y los etiquetará con el número de GPUs que se han detectado:

kubectl get pods -n nvidia-device-plugin
NAME                              READY   STATUS    RESTARTS      AGE
nvdp-nvidia-device-plugin-jp697   1/1     Running   2 (12h ago)   6d3h

kubectl get node node0001 -o json | jq .status.capacity
{
  "cpu": "128",
  "ephemeral-storage": "466889732Ki",
  "hugepages-1Gi": "0",
  "hugepages-2Mi": "0",
  "memory": "32545636Ki",
  "nvidia.com/gpu": "1",                      <----
  "pods": "110"
}

Ahora está listo para crear un pod de NVIDIA que intente utilizar esta GPU. Probemos con el contenedor CUDA Benchmark:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: nbody-gpu-benchmark
  namespace: default
spec:
  restartPolicy: OnFailure
  runtimeClassName: nvidia
  containers:
  - name: cuda-container
    image: nvcr.io/nvidia/k8s/cuda-sample:nbody
    args: ["nbody", "-gpu", "-benchmark"]
    resources:
      limits:
        nvidia.com/gpu: 1
    env:
    - name: NVIDIA_VISIBLE_DEVICES
      value: all
    - name: NVIDIA_DRIVER_CAPABILITIES
      value: all
EOF

Si todo ha ido bien, puede consultar los registros y ver la información de la prueba de rendimiento:

kubectl logs nbody-gpu-benchmark
Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance.
    -fullscreen       (run n-body simulation in fullscreen mode)
    -fp64             (use double precision floating point values for simulation)
    -hostmem          (stores simulation data in host memory)
    -benchmark        (run benchmark to measure performance)
    -numbodies=<N>    (number of bodies (>= 1) to run in simulation)
    -device=<d>       (where d=0,1,2.... for the CUDA device to use)
    -numdevices=<i>   (where i=(number of CUDA devices > 0) to use for simulation)
    -compare          (compares simulation results running once on the default GPU and once on the CPU)
    -cpu              (run n-body simulation on the CPU)
    -tipsy=<file.bin> (load a tipsy model file for simulation)

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
GPU Device 0: "Turing" with compute capability 7.5

> Compute 7.5 CUDA device: [Tesla T4]
40960 bodies, total time for 10 iterations: 101.677 ms
= 165.005 billion interactions per second
= 3300.103 single-precision GFLOP/s at 20 flops per interaction

Por último, si sus aplicaciones requieren OpenGL, puede instalar las bibliotecas de NVIDIA OpenGL necesarias a nivel de host, y el NVIDIA Device Plugin y el NVIDIA Container Toolkit pueden ponerlas a disposición de los contenedores. Para ello, instale el paquete de la siguiente manera:

transactional-update pkg install nvidia-gl-G06
Nota
Nota

Debe reiniciar para que este paquete esté disponible para sus aplicaciones. El NVIDIA Device Plugin debería redetectarlo automáticamente a través del NVIDIA Container Toolkit.

30.6 Integración a través de Edge Image Builder

Bien, ya ha demostrado la funcionalidad completa de sus aplicaciones y GPUs en SUSE Linux Micro y ahora desea utilizar Capítulo 8, Edge Image Builder para proporcionarlo todo en conjunto mediante una imagen de disco ISO o RAW lista para desplegar o consumir. Esta guía no explica cómo utilizar Edge Image Builder, pero proporciona la configuración necesaria para crear dicha imagen. A continuación puede encontrar un ejemplo de una definición de imagen, junto con los archivos de configuración de Kubernetes necesarios, para garantizar que todos los componentes requeridos se desplieguen automáticamente. Esta es la estructura de directorios del directorio de Edge Image Builder para el ejemplo que se muestra a continuación:

.
├── base-images
│   └── SL-Micro.x86_64-6.2-Base-SelfInstall-GM.install.iso
├── eib-config-iso.yaml
├── kubernetes
│   ├── config
│   │   └── server.yaml
│   ├── helm
│   │   └── values
│   │       └── nvidia-device-plugin.yaml
│   └── manifests
│       └── nvidia-runtime-class.yaml
└── rpms
    └── gpg-keys
        └── nvidia-container-toolkit.key

Exploremos esos archivos. En primer lugar, aquí tiene una definición de imagen de ejemplo para un clúster de un solo nodo que ejecuta K3s y que también despliega las utilidades y los paquetes de OpenGL (eib-config-iso.yaml):

apiVersion: 1.3
image:
  arch: x86_64
  imageType: iso
  baseImage: SL-Micro.x86_64-6.2-Base-SelfInstall-GM.install.iso
  outputImageName: deployimage.iso
operatingSystem:
  time:
    timezone: Europe/London
    ntp:
      pools:
        - 2.suse.pool.ntp.org
  isoConfiguration:
    installDevice: /dev/sda
  users:
    - username: root
      encryptedPassword: $6$XcQN1xkuQKjWEtQG$WbhV80rbveDLJDz1c93K5Ga9JDjt3mF.ZUnhYtsS7uE52FR8mmT8Cnii/JPeFk9jzQO6eapESYZesZHO9EslD1
  packages:
    packageList:
      - nvidia-open-driver-G06-signed-kmp-default
      - nvidia-compute-utils-G06
      - nvidia-gl-G06
      - nvidia-container-toolkit
    additionalRepos:
      - url: https://download.nvidia.com/suse/sle15sp6/
      - url: https://nvidia.github.io/libnvidia-container/stable/rpm/x86_64
    sccRegistrationCode: [snip]
kubernetes:
  version: v1.35.4+k3s1
  helm:
    charts:
      - name: nvidia-device-plugin
        version: v0.14.5
        installationNamespace: kube-system
        targetNamespace: nvidia-device-plugin
        createNamespace: true
        valuesFile: nvidia-device-plugin.yaml
        repositoryName: nvidia
    repositories:
      - name: nvidia
        url: https://nvidia.github.io/k8s-device-plugin
Nota
Nota

Esto es solo un ejemplo. Es posible que deba personalizarlo para adaptarlo a sus requisitos y expectativas. Además, si utiliza SUSE Linux Micro, debe proporcionar su propio sccRegistrationCode para resolver las dependencias de los paquetes y extraer los controladores de NVIDIA.

Además de esto, necesitamos añadir componentes adicionales para que Kubernetes los cargue en el momento del arranque. El directorio EIB necesita primero un directorio kubernetes, con subdirectorios para la configuración, los valores del chart de Helm y cualquier manifiesto adicional requerido:

mkdir -p kubernetes/config kubernetes/helm/values kubernetes/manifests

Configuremos ahora la configuración (opcional) de Kubernetes eligiendo un CNI (que utiliza Cilium por defecto si no se selecciona) y habilitando SELinux:

cat << EOF > kubernetes/config/server.yaml
cni: cilium
ingress-controller: traefik
selinux: true
EOF

Ahora asegúrese de que la RuntimeClass de NVIDIA se cree en el clúster de Kubernetes:

cat << EOF > kubernetes/manifests/nvidia-runtime-class.yaml
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: nvidia
handler: nvidia
EOF

Utilizamos el controlador de Helm integrado para desplegar el complemento de dispositivo NVIDIA a través del propio Kubernetes. Proporcionemos la clase de tiempo de ejecución en el archivo de valores del chart:

cat << EOF > kubernetes/helm/values/nvidia-device-plugin.yaml
runtimeClassName: nvidia
EOF

Necesitamos obtener la clave pública RPM del NVIDIA Container Toolkit antes de continuar:

mkdir -p rpms/gpg-keys
curl -o rpms/gpg-keys/nvidia-container-toolkit.key https://nvidia.github.io/libnvidia-container/gpgkey

Todos los artefactos necesarios, incluidos el binario de Kubernetes, las imágenes de contenedor, los charts de Helm (y cualquier imagen referenciada), se incluirán automáticamente en un entorno aislado, lo que significa que los sistemas en el momento del despliegue no deberían requerir conectividad a Internet por defecto. Ahora solo necesita obtener la ISO de SUSE Linux Micro de la Página de Descargas de SUSE (y colocarla en el directorio base-images), y puede ejecutar la herramienta Edge Image Builder para generar la ISO por usted. Para completar el ejemplo, aquí está el comando que se utilizó para compilar la imagen:

podman run --rm --privileged -it -v /path/to/eib-files/:/eib \
registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 \
build --definition-file eib-config-iso.yaml

Para obtener más instrucciones, consulte la documentación de Edge Image Builder.

30.7 Resolución de problemas

30.7.1 nvidia-smi no encuentra la GPU

Compruebe los mensajes del kernel utilizando dmesg. Si esto indica que no puede asignar NvKMSKapDevice, aplique la solución alternativa para GPU no admitidas:

sed -i '/NVreg_OpenRmEnableUnsupportedGpus/s/^#//g' /etc/modprobe.d/50-nvidia-default.conf

NOTA: Deberá volver a cargar el módulo del kernel, o reiniciar, si cambia la configuración del módulo del kernel en el paso anterior para que tenga efecto.

Parte VI Operaciones del día 2

Esta sección explica cómo los administradores pueden gestionar diferentes tareas de operaciones del «día dos», tanto en la gestión como en los clústeres en sentido descendente.

  • 31 Migración edge 3.6
  • Esta sección explica cómo migrar sus clústeres management y downstream de SUSE Edge 3.5 a SUSE Edge 3.6.0.

  • 32 Clúster de gestión
  • Actualmente, existen dos formas de realizar operaciones de «Día 2» en su clúster management:

  • 33 Clústeres en sentido descendente
  • Esta sección cubre las posibles formas de realizar operaciones de "Día 2" para diferentes partes de su downstream clúster.

31 Migración edge 3.6

Esta sección explica cómo migrar sus clústeres management y downstream de SUSE Edge 3.5 a SUSE Edge 3.6.0.

Importante
Importante

Realice siempre las migraciones de clúster desde la latest Z-stream release de SUSE Edge 3.5.

Migre siempre a la SUSE Edge 3.6.0 release. Para actualizaciones posteriores a la migración, consulte las management (Capítulo 32, Clúster de gestión) y clúster en sentido descendente (Capítulo 33, Clústeres en sentido descendente) secciones.

La siguiente tabla enumera los diferentes tipos de clústeres y los métodos para actualizarlos:

Tabla 31.1: Clústeres y métodos para actualizar clústeres en sentido descendente
Tipo de clústerMétodo

Clústeres aprovisionados por EIB

Consulte el Sección 31.1.3, “Fleet” para obtener más información.

Clústeres aprovisionados por Phone-home

Consulte Actualización de la versión de Kubernetes para la actualización de la versión de Kubernetes y Clústeres en sentido descendente (Capítulo 33, Clústeres en sentido descendente) para SUC, el sistema operativo y otros componentes.

31.1 Clúster de gestión

Esta sección cubre los temas siguientes:

Sección 31.1.1, “Requisitos previos” - pasos previos necesarios antes de comenzar la migración.

Sección 31.1.2, “Upgrade Controller” - cómo realizar una migración de clúster management utilizando Capítulo 19, Controlador de actualización.

Sección 31.1.3, “Fleet” - cómo realizar una migración de clúster management utilizando Capítulo 6, Fleet.

31.1.1 Requisitos previos

31.1.1.1 Migrar la configuración del certificado de CA de Metal3

Nota
Nota

Se aplica solo a las implementaciones de Metal3 que utilizan CA de confianza adicionales para servidores de medios externos con TLS.

El gráfico de Helm de Metal3 ha cambiado la forma en que se configuran los certificados de CA de confianza. Anteriormente, las CA adicionales se proporcionaban a través de un Secret (tls-ca-additional) con el indicador booleano additionalTrustedCAs. La nueva versión utiliza un ConfigMap que contiene el paquete de CA completo al que hace referencia el valor global.trustedCAs.

Si ha configurado CA de confianza adicionales para Metal3, debe migrar del enfoque basado en Secret al enfoque basado en ConfigMap:

  1. Cree un ConfigMap que contenga su paquete de CA a partir del Secret existente:

    Extraiga los certificados del Secret antiguo:

    kubectl get secret tls-ca-additional -n metal3-system -o jsonpath='{.data}' | \
      jq -r 'to_entries[] | .value' | base64 -d > ca-bundle.pem

    Opcional: incluya el paquete de CA del sistema: Si el despliegue de Metal3 también necesita confiar en CA públicas (por ejemplo, al acceder a recursos externos a través de HTTPS), debe incluir el paquete de CA del sistema además de sus CA personalizadas. Extraiga el paquete de CA del sistema de una imagen de contenedor y antepóngalo a sus CA personalizadas:

    # Extract system CAs from a container image (using podman or docker)
    podman run --rm registry.suse.com/bci/bci-base:latest cat /etc/ssl/certs/ca-certificates.crt > system-cas.pem
    
    # Combine system CAs with your custom CAs
    cat system-cas.pem ca-bundle.pem > combined-ca-bundle.pem
    mv combined-ca-bundle.pem ca-bundle.pem
    Importante
    Importante

    Si incluye el paquete de CA del sistema, es su responsabilidad mantenerlo actualizado. Los certificados de CA del sistema en la imagen de contenedor pueden quedar obsoletos con el tiempo a medida que los certificados de CA caducan o son revocados. Debe actualizar periódicamente el paquete de CA del sistema volviéndolo a extraer de una imagen de contenedor actualizada.

    Cree el ConfigMap con el paquete de CA final:

    kubectl create configmap tls-ca-bundle -n metal3-system --from-file=ca-bundle.pem=ca-bundle.pem
  2. Actualice los valores de Helm de Metal3 para utilizar la nueva referencia de ConfigMap:

    Cambie de:

    global:
      additionalTrustedCAs: true

    A:

    global:
      trustedCAs: tls-ca-bundle
  3. Tras actualizar el gráfico de Helm de Metal3 con la nueva configuración, puede eliminar el Secret antiguo:

    kubectl delete secret tls-ca-additional -n metal3-system

31.1.2 Upgrade Controller

Importante
Importante

Upgrade Controller actualmente solo admite migraciones de versiones de SUSE Edge para clústeres de gestión no en entorno aislado.

Los siguientes temas se tratan como parte de esta sección:

Sección 31.1.2.1, “Requisitos previos”: requisitos previos específicos para Upgrade Controller.

Sección 31.1.2.2, “Pasos de migración”: pasos para migrar un clúster management a una nueva versión de SUSE Edge utilizando Upgrade Controller.

31.1.2.1 Requisitos previos

31.1.2.1.1 SUSE Edge 3.6 Upgrade Controller

Antes de utilizar Upgrade Controller, debe asegurarse primero de que está ejecutando una versión capaz de migrar a la versión de SUSE Edge deseada.

Para realizar esta operación:

  1. Si ya tiene Upgrade Controller desplegado desde una versión de SUSE Edge anterior, actualice su gráfico:

    helm upgrade upgrade-controller -n upgrade-controller-system oci://registry.suse.com/edge/charts/upgrade-controller --version 306.0.4+up0.1.3
  2. Si no tiene Upgrade Controller desplegado, siga Sección 19.3, “Instalación del Controlador de actualización”.

31.1.2.2 Pasos de migración

Realizar una migración de clúster management con Upgrade Controller es fundamentalmente similar a ejecutar una actualización.

La única diferencia es que su UpgradePlan debe especificar la versión de lanzamiento 3.6.0:

apiVersion: lifecycle.suse.com/v1alpha1
kind: UpgradePlan
metadata:
  name: upgrade-plan-mgmt
  # Change to the namespace of your Upgrade Controller
  namespace: CHANGE_ME
spec:
  releaseVersion: 3.6.0

Para obtener información sobre cómo utilizar el UpgradePlan anterior para realizar una migración, consulte el proceso de actualización del Upgrade Controller (Sección 32.1, “Upgrade Controller”).

31.1.3 Fleet

Nota
Nota

Siempre que sea posible, utilice Sección 31.1.2, “Upgrade Controller” para la migración.

Consulte esta sección solo para casos de uso no cubiertos por Upgrade Controller.

Realizar una migración de clúster management con Fleet es fundamentalmente similar a ejecutar una actualización.

Las diferencias clave son que:

  1. Las flotas deben utilizarse desde la versión release-3.6.0 del repositorio suse-edge/fleet-examples.

  2. Los gráficos programados para una actualización deben actualizarse a versiones compatibles con la versión SUSE Edge 3.6.0. Para obtener una lista de los componentes SUSE Edge 3.6.0, consulte Sección 41.4, “Versión 3.6.0”.

Importante
Importante

Para garantizar una migración SUSE Edge 3.6.0 correcta, es importante que los usuarios cumplan los puntos indicados anteriormente.

Teniendo en cuenta los puntos anteriores, los usuarios pueden seguir la documentación de Fleet (Sección 32.2, “Fleet”) del management clúster para obtener una guía completa sobre los pasos necesarios para realizar una migración.

31.2 Clústeres descendentes

Sección 31.2.1, “Fleet” - cómo realizar una migración de clúster downstream utilizando Capítulo 6, Fleet.

31.2.1 Fleet

Realizar una migración de clúster downstream con Fleet es fundamentalmente similar a ejecutar una actualización.

Las diferencias clave son que:

  1. Las flotas deben utilizarse desde la versión release-3.6.0 del repositorio suse-edge/fleet-examples.

  2. Los gráficos programados para una actualización deben actualizarse a versiones compatibles con la versión SUSE Edge 3.6.0. Para obtener una lista de los componentes SUSE Edge 3.6.0, consulte Sección 41.4, “Versión 3.6.0”.

Importante
Importante

Para garantizar una migración SUSE Edge 3.6.0 correcta, es importante que los usuarios cumplan los puntos indicados anteriormente.

Teniendo en cuenta los puntos anteriores, los usuarios pueden seguir la documentación de Fleet (Sección 33.1, “Fleet”) del downstream clúster para obtener una guía completa sobre los pasos necesarios para realizar una migración.

32 Clúster de gestión

Actualmente, existen dos formas de realizar operaciones de «Día 2» en su clúster management:

32.1 Upgrade Controller

Importante
Importante

El Upgrade Controller actualmente solo admite operaciones Day 2 para clústeres de gestión sin entorno aislado.

Esta sección cubre cómo realizar las diversas operaciones de Day 2 relacionadas con la actualización de su clúster management de una versión de plataforma SUSE Edge a otra.

Las operaciones de Day 2 están automatizadas por el Upgrade Controller (Capítulo 19, Controlador de actualización) e incluyen:

32.1.1 Requisitos previos

Antes de actualizar su clúster management, se deben cumplir los siguientes requisitos previos:

  1. SCC registered nodes - asegúrese de que el SO de los nodos de su clúster esté registrado con una clave de suscripción que admita la versión del SO especificada en la SUSE Edge release (Capítulo 41, Notas de la versión) a la que pretende actualizar.

  2. Upgrade Controller - asegúrese de que el Upgrade Controller se haya desplegado en su clúster management. Para conocer los pasos de instalación, consulte Sección 19.3, “Instalación del Controlador de actualización”.

32.1.2 Actualización

  1. Determine la versión de SUSE Edge release (Capítulo 41, Notas de la versión) a la que desea actualizar su clúster management.

  2. En el clúster management, despliegue un UpgradePlan que especifique la release version deseada. El UpgradePlan debe desplegarse en el espacio de nombres del Upgrade Controller.

    kubectl apply -n <upgrade_controller_namespace> -f - <<EOF
    apiVersion: lifecycle.suse.com/v1alpha1
    kind: UpgradePlan
    metadata:
      name: upgrade-plan-mgmt
    spec:
      # Version retrieved from release notes
      releaseVersion: 3.X.Y
    EOF
    Nota
    Nota

    Puede haber casos de uso en los que desee realizar configuraciones adicionales sobre el UpgradePlan. Para todas las configuraciones posibles, consulte Sección 19.6.1, “UpgradePlan”.

  3. El despliegue del UpgradePlan en el espacio de nombres Upgrade Controller’s iniciará el upgrade process.

    Nota
    Nota

    Para obtener más información sobre el upgrade process real, consulte Sección 19.5, “¿Cómo funciona el Controlador de actualización?”.

    Para obtener información sobre cómo realizar el seguimiento del upgrade process, consulte Sección 19.7, “Seguimiento del proceso de actualización”.

32.1.3 Pasos posteriores a la actualización

Las actualizaciones de SUSE Edge desde la última versión z-stream de 3.5 a 3.6.0 pueden requerir algunos pasos manuales finales que deben realizarse después de que el Upgrade Controller haya completado el proceso de actualización. Estos están relacionados con la sustitución de Ingress-NGINX por Traefik como el único controlador de entrada admitido en SUSE Edge a partir de la versión 3.6.

Nota
Nota

El proveedor de entrada Traefik integrado en RKE2/K3s es el único controlador de entrada admitido en la versión SUSE Edge 3.6, siendo todavía posible ejecutar temporalmente Ingress-NGINX junto con Traefik para admitir escenarios complejos de migración de entrada, pero solo después de que los clústeres de gestión y/o sentido descendente SUSE Edge se hayan actualizado a la versión 3.6 y durante el tiempo necesario para realizar dicha migración.

La guía de RKE2 Migración de Ingress NGINX a Traefik proporciona detalles sobre las rutas de migración de entrada disponibles una vez que el controlador de entrada Traefik sustituya al Ingress-NGINX discontinuado.

En caso de que el clúster de gestión recién actualizado no estuviera ejecutando el controlador de entrada Traefik (sino el predeterminado Ingress-NGINX) antes de iniciar la actualización, ahora es necesario desplegar manualmente Traefik.

Primero vamos a asegurarnos de que la instancia de ingress-NGINX implementada esté configurada correctamente (por ejemplo, para evitar colisiones innecesarias de hostPort entre los pods de los dos controladores de entrada):

kubectl apply -f - <<- EOF
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-ingress-nginx
  namespace: kube-system
spec:
  valuesContent: |-
    controller:
      hostPort:
        enabled: false  # not needed when exposing through a type:LoadBalancer service
      config:
        use-forwarded-headers: "true"
        enable-real-ip: "true"
      publishService:
        enabled: true
      service:
        enabled: true
        type: LoadBalancer
        externalTrafficPolicy: Local
EOF

Ahora podemos proceder con el despliegue de Traefik, mediante la instalación de los gráficos de Helm rke2-traefik-crd y rke2-traefik.

Nota
Nota

Despliegue estos gráficos de Helm a través de manifiestos HelmChart, como se muestra a continuación, para asegurar que Upgrade Controller se encargue también de actualizar estos gráficos de Helm en futuras actualizaciones del clúster de gestión.

kubectl apply -f - <<- EOF
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: rke2-traefik-crd
  namespace: kube-system
spec:
  chart: rke2-traefik-crd
  version: {rke2-traefik-crd Helm chart version}
  repo: https://rke2-charts.rancher.io
  bootstrap: false
  failurePolicy: reinstall
  backOffLimit: 20
  targetNamespace: kube-system
  set:
    global.cattle.systemDefaultRegistry: registry.rancher.com
    global.rke2DataDir: /var/lib/rancher/rke2
    global.systemDefaultRegistry: registry.rancher.com
---
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: rke2-traefik
  namespace: kube-system
spec:
  chart: rke2-traefik
  version: {rke2-traefik Helm chart version}
  repo: https://rke2-charts.rancher.io
  bootstrap: false
  failurePolicy: reinstall
  backOffLimit: 20
  targetNamespace: kube-system
  set:
    global.cattle.systemDefaultRegistry: registry.rancher.com
    global.rke2DataDir: /var/lib/rancher/rke2
    global.systemDefaultRegistry: registry.rancher.com
  valuesContent: |-
    ingressClass:
      isDefaultClass: false  # if traefik deployed alongside ingress-nginx
    ports:
      web:
        hostPort: null    # disallow hostPort
        exposedPort: 80
      websecure:
        hostPort: null    # disallow hostPort
        exposedPort: 443
    service:
      enabled: true
      type: LoadBalancer
      spec:
        externalTrafficPolicy: Local
        allocateLoadBalancerNodePorts: false  # k8s GA from 1.24; supported by MetalLB
    providers:
      kubernetesIngressNginx:  # this provider allows traefik to "understand" most of the ingress-nginx annotations
        enabled: true
        ingressClass: "rke2-ingress-nginx-migration"
        controllerClass: "rke2.​cattle.​io/ingress-nginx-migration"
EOF

El {rke2-traefik-crd Helm chart version} y el {rke2-traefik-crd Helm chart version} son los dictados por la versión de RKE2/k3s a la que hemos actualizado.

En el último paso, creamos finalmente los objetos necesarios de MetalLB para exponer el servicio Traefik a través de un servicio de tipo LoadBalancer:

kubectl apply -f - <<- EOF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: ingress-ippool-traefik
  namespace: metallb-system
spec:
  addresses:
  - {EXTERNAL_IP_FOR_TRAEFIK_SERVICE}/32
  serviceAllocation:
    priority: 100
    serviceSelectors:
    - matchExpressions:
      - {key: app.kubernetes.io/name, operator: In, values: [rke2-traefik]}
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: ingress-l2-adv-traefik
  namespace: metallb-system
spec:
  ipAddressPools:
  - ingress-ippool-traefik
EOF

Ahora tanto Traefik como Ingress-NGINX se ejecutan simultáneamente, lo que le permite realizar de forma segura la migración necesaria de sus ingresses de uno a otro.

Importante
Importante

Una vez que todos los ingresses se hayan migrado y ya no necesite Ingress-NGINX, asegúrese de desinstalarlo y limpiar todos los recursos relacionados para evitar cualquier consumo innecesario de recursos en su clúster.

32.2 Fleet

Esta sección ofrece información sobre cómo realizar operaciones de «Día 2» utilizando el componente Fleet (Capítulo 6, Fleet).

Los siguientes temas se tratan como parte de esta sección:

  1. Sección 32.2.1, “Componentes” - componentes predeterminados utilizados para todas las operaciones de «Día 2».

  2. Sección 32.2.2, “Determinad vuestro caso de uso” - proporciona una visión general de los recursos personalizados de Fleet que se utilizarán y su idoneidad para diferentes casos de uso de operaciones de «Día 2».

  3. Sección 32.2.3, “Flujo de trabajo de Día 2” - proporciona una guía de flujo de trabajo para ejecutar operaciones de «Día 2» con Fleet.

  4. Sección 32.2.4, “Actualización del SO” - describe cómo realizar actualizaciones del SO utilizando Fleet.

  5. Sección 32.2.5, “Actualización de la versión de Kubernetes” - describe cómo realizar actualizaciones de la versión de Kubernetes utilizando Fleet.

  6. Sección 32.2.6, “Actualización de Helm chart” - describe cómo realizar actualizaciones de Helm charts utilizando Fleet.

32.2.1 Componentes

A continuación, podéis encontrar una descripción de los componentes predeterminados que deben configurarse en vuestro clúster management para que podáis realizar con éxito operaciones de «Día 2» utilizando Fleet.

32.2.1.1 Rancher

Opcional; responsable de gestionar downstream clusters y desplegar System Upgrade Controller en vuestro management cluster.

Para obtener más información, consulte el Capítulo 4, Rancher.

32.2.1.2 System Upgrade Controller (SUC)

System Upgrade Controller es responsable de ejecutar tareas en nodos especificados basándose en los datos de configuración proporcionados a través de un recurso personalizado, llamado Plan.

SUC se utiliza activamente para actualizar el sistema operativo y la distribución de Kubernetes.

Para obtener más información sobre el componente SUC y cómo encaja en la pila Edge, consultad Capítulo 18, Controlador de actualización del sistema.

32.2.2 Determinad vuestro caso de uso

Fleet utiliza dos tipos de recursos personalizados para permitir la gestión de recursos de Kubernetes y Helm.

A continuación, podéis encontrar información sobre el propósito de estos recursos y los casos de uso para los que son más adecuados en el contexto de las operaciones de «Día 2».

32.2.2.1 GitRepo

Un GitRepo es un recurso de Fleet (Capítulo 6, Fleet) que representa un repositorio Git desde el cual Fleet puede crear Bundles. Cada Bundle se crea en función de las rutas de configuración definidas dentro del recurso GitRepo. Para obtener más información, consultad la documentación de GitRepo.

En el contexto de las operaciones de «Día 2», los recursos GitRepo se utilizan normalmente para desplegar SUC o SUC Plans en entornos no aislados que utilizan un enfoque de Fleet GitOps.

Alternativamente, los recursos GitRepo también pueden utilizarse para desplegar SUC o SUC Plans en entornos aislados, siempre que reflejéis la configuración de vuestro repositorio a través de un servidor git local.

32.2.2.2 Bundle

Bundles contienen recursos de Kubernetes sin procesar que se implementarán en el clúster de destino. Normalmente se crean a partir de un recurso GitRepo, pero existen casos de uso en los que se pueden desplegar manualmente. Para obtener más información, consultad la documentación de Bundle.

En el contexto de las operaciones de "Día 2", los recursos Bundle se utilizan normalmente para desplegar SUC o SUC Plans en entornos aislados que no utilizan ningún tipo de procedimiento de GitOps local (por ejemplo, un servidor git local).

Alternativamente, si vuestro caso de uso no permite un flujo de trabajo GitOps (por ejemplo, mediante un repositorio Git), los recursos Bundle también podrían utilizarse para desplegar SUC o SUC Plans en entornos no aislados.

32.2.3 Flujo de trabajo de Día 2

A continuación se muestra un flujo de trabajo de «Día 2» que debe seguirse al actualizar la versión de un clúster management a una versión específica de Edge.

  1. Actualización de versión del SO (Sección 32.2.4, “Actualización del SO”)

  2. Actualización de versión de Kubernetes (Sección 32.2.5, “Actualización de la versión de Kubernetes”)

  3. Actualización de versión de Helm charts (Sección 32.2.6, “Actualización de Helm chart”)

32.2.4 Actualización del SO

Esta sección describe cómo realizar una actualización del sistema operativo utilizando Capítulo 6, Fleet y Capítulo 18, Controlador de actualización del sistema.

Los siguientes temas se tratan como parte de esta sección:

  1. Sección 32.2.4.1, “Componentes” - componentes adicionales utilizados por el proceso de actualización.

  2. Sección 32.2.4.2, “Descripción general” - descripción general del proceso de actualización.

  3. Sección 32.2.4.3, “Requisitos” - requisitos del proceso de actualización.

  4. Sección 32.2.4.4, “Actualización del SO - Ampliación del plan SUC” - información sobre cómo desplegar SUC plans, responsable de activar el proceso de actualización.

32.2.4.1 Componentes

Esta sección cubre los componentes personalizados que utiliza el proceso OS upgrade sobre los componentes predeterminados (Sección 32.2.1, “Componentes”) de «Día 2».

32.2.4.1.1 systemd.service

La actualización del SO en un nodo específico se gestiona mediante un systemd.service.

Se crea un servicio diferente dependiendo del tipo de actualización que requiera el SO de una versión de Edge a otra:

  • Para las versiones de Edge que requieren la misma versión de SO (p. ej., 6.1), se creará el os-pkg-update.service. Utiliza transactional-update para realizar una actualización normal de paquetes.

  • Para las versiones de Edge que requieren una migración de versión de SO (p. ej., 6.1 → 6.2), se creará el os-migration.service. Utiliza transactional-update para realizar:

    1. Una actualización normal de paquetes que garantiza que todos los paquetes estén actualizados para mitigar cualquier fallo en la migración relacionado con versiones antiguas de paquetes.

    2. Una migración de SO utilizando el comando zypper migration.

Los servicios mencionados anteriormente se envían a cada nodo a través de un SUC plan que debe estar ubicado en el clúster management que necesita una actualización del SO.

32.2.4.2 Descripción general

La actualización del sistema operativo para los nodos del clúster management se realiza utilizando Fleet y el System Upgrade Controller (SUC).

Fleet se utiliza para desplegar y gestionar SUC plans en el clúster deseado.

Nota
Nota

SUC plans son recursos personalizados que describen los pasos que SUC debe seguir para que se ejecute una tarea específica en un conjunto de nodos. Para ver un ejemplo de cómo es un SUC plan, consultad el repositorio upstream.

Los OS SUC plans se envían a cada clúster desplegando un recurso GitRepo o Bundle en un espacio de trabajo de Fleet específico. Fleet recupera el GitRepo/Bundle desplegado y despliega su contenido (el OS SUC plans) en el clúster o clústeres deseados.

Nota
Nota

Los recursos GitRepo/Bundle siempre se despliegan en el management cluster. Si utilizar un recurso GitRepo o Bundle depende de vuestro caso de uso, consultad Sección 32.2.2, “Determinad vuestro caso de uso” para obtener más información.

OS SUC plans describe el siguiente flujo de trabajo:

  1. Acordonad siempre los nodos antes de las actualizaciones del SO.

  2. Actualizad siempre los nodos control-plane antes que los nodos worker.

  3. Actualizad siempre el clúster uno a uno.

Una vez que los OS SUC plans se hayan desplegado, el flujo de trabajo tiene este aspecto:

  1. SUC reconcilia los OS SUC plans desplegados y crea un Kubernetes Job en cada nodo.

  2. El Kubernetes Job crea un systemd.service (Sección 32.2.4.1.1, “systemd.service”) para la actualización de paquetes o la migración del SO.

  3. El systemd.service creado activa el proceso de actualización del SO en el nodo específico.

    Importante
    Importante

    Una vez que finalice el proceso de actualización del SO, el nodo correspondiente se rebooted para aplicar las actualizaciones en el sistema.

A continuación podéis encontrar un diagrama de la descripción anterior:

fleet day2 management os upgrade

32.2.4.3 Requisitos

General:

  1. Máquina registrada en SCC - Todos los management nodos del clúster deben estar registrados en https://scc.suse.com/, lo cual es necesario para que el systemd.service correspondiente pueda conectarse correctamente al repositorio RPM deseado.

    Importante
    Importante

    Para las versiones Edge que requieran una migración de la versión del SO (p. ej., 6.1 → 6.2), aseguraos de que vuestra clave SCC admita la migración a la nueva versión.

  2. Aseguraos de que las tolerancias del plan SUC coincidan con las tolerancias de los nodos - Si los nodos de vuestro clúster de Kubernetes tienen taints personalizados, aseguraos de añadir tolerancias para esas taints en los planes SUC. Por defecto, los planes SUC solo tienen tolerancias para los nodos del plano de control. Las tolerancias por defecto incluyen:

    • CriticalAddonsOnly=true:NoExecute

    • node-role.kubernetes.io/control-plane:NoSchedule

    • node-role.kubernetes.io/etcd:NoExecute

      Nota
      Nota

      Cualquier tolerancia adicional debe añadirse bajo la sección .spec.tolerations de cada plan. Los planes SUC relacionados con la actualización del SO se pueden encontrar en el repositorio suse-edge/fleet-examples bajo fleets/day2/system-upgrade-controller-plans/os-upgrade. Aseguraos de utilizar los planes de una etiqueta de versión de repositorio válida.

      Un ejemplo de cómo definir tolerancias personalizadas para el plan SUC de plano de control sería el siguiente:

      apiVersion: upgrade.cattle.io/v1
      kind: Plan
      metadata:
        name: os-upgrade-control-plane
      spec:
        ...
        tolerations:
        # default tolerations
        - key: "CriticalAddonsOnly"
          operator: "Equal"
          value: "true"
          effect: "NoExecute"
        - key: "node-role.kubernetes.io/control-plane"
          operator: "Equal"
          effect: "NoSchedule"
        - key: "node-role.kubernetes.io/etcd"
          operator: "Equal"
          effect: "NoExecute"
        # custom toleration
        - key: "foo"
          operator: "Equal"
          value: "bar"
          effect: "NoSchedule"
      ...

Entorno aislado:

  1. Duplicar repositorios RPM de SUSE - Los repositorios RPM del SO deben estar duplicados localmente para que el systemd.service pueda tener acceso a ellos. Esto se puede lograr utilizando RMT o SUMA.

32.2.4.4 Actualización del SO - Ampliación del plan SUC

Importante
Importante

Para los entornos actualizados previamente mediante este procedimiento, los usuarios deben asegurarse de que se complete uno de los siguientes pasos:

  • Remove any previously deployed SUC Plans related to older Edge release versions from the management cluster - se puede realizar eliminando el clúster deseado de la GitRepo/Bundle configuración de destino existente, o eliminando el recurso GitRepo/Bundle por completo.

  • Reuse the existing GitRepo/Bundle resource - se puede realizar apuntando la revisión del recurso a una nueva etiqueta que contenga las flotas correctas para la suse-edge/fleet-examples release deseada.

Esto se hace para evitar conflictos entre SUC Plans para versiones de release de Edge anteriores.

Si los usuarios intentan actualizar mientras existen SUC Plans en el clúster management, verán el siguiente error de fleet:

Not installed: Unable to continue with install: Plan <plan_name> in namespace <plan_namespace> exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error..

Como se menciona en Sección 32.2.4.2, “Descripción general”, las actualizaciones del SO se realizan enviando SUC plans al clúster deseado a través de una de las siguientes formas:

Para determinar qué recurso debéis utilizar, consultad Sección 32.2.2, “Determinad vuestro caso de uso”.

Para casos de uso en los que deseéis desplegar el OS SUC plans desde una herramienta GitOps de terceros, consultad Sección 32.2.4.4.3, “Despliegue del plan SUC: flujo de trabajo GitOps de terceros”

32.2.4.4.1 Ampliación del plan SUC - Recurso GitRepo

Un recurso GitRepo, que envía el OS SUC plans necesario, puede desplegarse de una de las siguientes formas:

  1. A través del Rancher UI - Sección 32.2.4.4.1.1, “Creación de GitRepo - Interfaz de usuario de Rancher” (cuando Rancher esté disponible).

  2. Mediante desplegar manualmente (Sección 32.2.4.4.1.2, “Creación de GitRepo - manual”) el recurso en vuestro management cluster.

Una vez desplegado, para supervisar el proceso de actualización del SO de los nodos de vuestro clúster de destino, consultad Sección 18.3, “Monitorización de los planes del controlador de actualización del sistema”.

32.2.4.4.1.1 Creación de GitRepo - Interfaz de usuario de Rancher

Para crear un recurso GitRepo a través de la interfaz de usuario de Rancher, seguid su documentación oficial.

El equipo de Edge mantiene un fleet listo para usar. Dependiendo de vuestro entorno, este fleet podría utilizarse directamente o como plantilla.

Importante
Importante

Utilizad siempre este fleet a partir de una etiqueta de release de Edge válida.

Para casos de uso en los que no sea necesario incluir cambios personalizados en el SUC plans que distribuye el fleet, referenciad directamente el fleet os-upgrade desde el repositorio suse-edge/fleet-examples.

En los casos en los que se necesiten cambios personalizados (por ejemplo, para añadir tolerancias personalizadas), referenciad el fleet os-upgrade desde un repositorio independiente, lo que os permite añadir los cambios a los planes SUC según sea necesario.

Podéis ver un ejemplo de cómo se puede configurar un GitRepo para utilizar el fleet del repositorio suse-edge/fleet-examples aquí.

32.2.4.4.1.2 Creación de GitRepo - manual
  1. Extraed el recurso GitRepo:

    curl -o os-upgrade-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/gitrepos/day2/os-upgrade-gitrepo.yaml
  2. Edita la configuración de GitRepo:

    • Elimina la sección spec.targets: solo es necesaria para los clústeres en sentido descendente.

      # Example using sed
      sed -i.bak '/^  targets:/,$d' os-upgrade-gitrepo.yaml && rm -f os-upgrade-gitrepo.yaml.bak
      
      # Example using yq (v4+)
      yq eval 'del(.spec.targets)' -i os-upgrade-gitrepo.yaml
    • Apunta el espacio de nombres del GitRepo al espacio de nombres fleet-local: se hace para desplegar el recurso en el clúster de gestión.

      # Example using sed
      sed -i.bak 's/namespace: fleet-default/namespace: fleet-local/' os-upgrade-gitrepo.yaml && rm -f os-upgrade-gitrepo.yaml.bak
      
      # Example using yq (v4+)
      yq eval '.metadata.namespace = "fleet-local"' -i os-upgrade-gitrepo.yaml
  3. Aplica el recurso GitRepo en tu management cluster:

    kubectl apply -f os-upgrade-gitrepo.yaml
  4. Visualiza el recurso GitRepo creado bajo el espacio de nombres fleet-local:

    kubectl get gitrepo os-upgrade -n fleet-local
    
    # Example output
    NAME            REPO                                              COMMIT         BUNDLEDEPLOYMENTS-READY   STATUS
    os-upgrade      https://github.com/suse-edge/fleet-examples.git   release-3.6.1  0/0
32.2.4.4.2 Despliegue del plan SUC - Recurso Bundle

Un recurso Bundle, que incluye los OS SUC Plans necesarios, puede desplegarse de una de las siguientes maneras:

  1. A través del Rancher UI - Sección 32.2.4.4.2.1, “Creación de Bundle - Interfaz de usuario de Rancher” (cuando Rancher esté disponible).

  2. Mediante el despliegue manual (Sección 32.2.4.4.2.2, “Creación de bundle - manual”) del recurso en tu management cluster.

Una vez desplegado, para supervisar el proceso de actualización del SO de los nodos de tu clúster de destino, consulta Sección 18.3, “Monitorización de los planes del controlador de actualización del sistema”.

32.2.4.4.2.1 Creación de Bundle - Interfaz de usuario de Rancher

El equipo de Edge mantiene un bundle listo para usar que puede utilizarse en los pasos siguientes.

Importante
Importante

Utiliza siempre este bundle a partir de una etiqueta de release de Edge válida.

Para crear un bundle a través de la interfaz de usuario de Rancher:

  1. En la esquina superior izquierda, haz clic en ☰ → Continuous Delivery

  2. Ve a Avanzado > Bundles

  3. Selecciona Crear a partir de YAML

  4. Desde aquí puedes crear el Bundle de una de las siguientes maneras:

    Nota
    Nota

    Puede haber casos de uso en los que necesites incluir cambios personalizados en el SUC plans que incorpora el bundle (por ejemplo, para añadir tolerancias personalizadas). Asegúrate de incluir esos cambios en el bundle que se generará mediante los pasos siguientes.

    1. Copiando manualmente el contenido del bundle desde suse-edge/fleet-examples a la página Crear a partir de YAML.

    2. Clonando el repositorio suse-edge/fleet-examples desde la etiqueta de release deseada y seleccionando la opción Leer desde archivo en la página Crear a partir de YAML. Desde ahí, navega a la ubicación del bundle (bundles/day2/system-upgrade-controller-plans/os-upgrade) y selecciona el archivo del bundle. Esto rellenará automáticamente la página Crear a partir de YAML con el contenido del bundle.

  5. Edita el bundle en la interfaz de usuario de Rancher:

    • Cambia el espacio de nombres del Bundle para que apunte al espacio de nombres fleet-local.

      # Example
      kind: Bundle
      apiVersion: fleet.cattle.io/v1alpha1
      metadata:
        name: os-upgrade
        namespace: fleet-local
      ...
    • Cambia los clústeres target del Bundle para que apunten a tu clúster local (gestión):

      spec:
        targets:
        - clusterName: local
      Nota
      Nota

      Existen algunos casos de uso en los que tu clúster local podría tener un nombre diferente.

      Para recuperar el nombre de tu clúster local, ejecuta el comando siguiente:

      kubectl get clusters.fleet.cattle.io -n fleet-local
  6. Selecciona Crear

32.2.4.4.2.2 Creación de bundle - manual
  1. Obtén el recurso Bundle:

    curl -o os-upgrade-bundle.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/bundles/day2/system-upgrade-controller-plans/os-upgrade/os-upgrade-bundle.yaml
  2. Editad la configuración del Bundle:

    • Cambia los clústeres target del Bundle para que apunten a tu clúster local (gestión):

      spec:
        targets:
        - clusterName: local
      Nota
      Nota

      Existen algunos casos de uso en los que tu clúster local podría tener un nombre diferente.

      Para recuperar el nombre de tu clúster local, ejecuta el comando siguiente:

      kubectl get clusters.fleet.cattle.io -n fleet-local
    • Cambia el espacio de nombres del Bundle para que apunte al espacio de nombres fleet-local.

      # Example
      kind: Bundle
      apiVersion: fleet.cattle.io/v1alpha1
      metadata:
        name: os-upgrade
        namespace: fleet-local
      ...
  3. Aplica el recurso Bundle a tu management cluster:

    kubectl apply -f os-upgrade-bundle.yaml
  4. Visualiza el recurso Bundle creado en el espacio de nombres fleet-local:

    kubectl get bundles -n fleet-local
32.2.4.4.3 Despliegue del plan SUC: flujo de trabajo GitOps de terceros

Puede haber casos de uso en los que desees incorporar el OS SUC plans a tu propio flujo de trabajo GitOps de terceros (p. ej., Flux).

Para obtener los recursos de actualización del SO que necesitas, primero determina la etiqueta de release de Edge del repositorio suse-edge/fleet-examples que desees utilizar.

Después de eso, los recursos se pueden encontrar en fleets/day2/system-upgrade-controller-plans/os-upgrade, donde:

  • plan-control-plane.yaml es un recurso de plan SUC para nodos de control-plane.

  • plan-worker.yaml es un recurso de plan SUC para nodos worker.

  • secret.yaml es un Secret que contiene el script upgrade.sh, el cual es responsable de crear el systemd.service (Sección 32.2.4.1.1, “systemd.service”).

  • config-map.yaml es un ConfigMap que contiene la configuración que consume el script upgrade.sh.

Importante
Importante

Estos recursos Plan son interpretados por el System Upgrade Controller y deben desplegarse en cada clúster descendente que desees actualizar. Para obtener información sobre el despliegue de SUC, consulta Sección 18.2, “Instalación del controlador de actualización del sistema”.

Para comprender mejor cómo puede utilizar tu flujo de trabajo GitOps para desplegar los SUC Plans para la actualización del SO, puede resultar útil echar un vistazo a visión general (Sección 32.2.4.2, “Descripción general”).

32.2.5 Actualización de la versión de Kubernetes

Esta sección describe cómo realizar una actualización de Kubernetes utilizando Capítulo 6, Fleet y Capítulo 18, Controlador de actualización del sistema.

Los siguientes temas se tratan como parte de esta sección:

  1. Sección 32.2.5.1, “Componentes” - componentes adicionales utilizados por el proceso de actualización.

  2. Sección 32.2.5.2, “Descripción general” - visión general del proceso de actualización.

  3. Sección 32.2.5.3, “Requisitos” - requisitos del proceso de actualización.

  4. Sección 32.2.5.4, “Actualización de K8s - Ampliación del plan SUC” - información sobre cómo desplegar SUC plans, responsable de activar el proceso de actualización.

32.2.5.1 Componentes

Esta sección cubre los componentes personalizados que utiliza el proceso K8s upgrade sobre los componentes (Sección 32.2.1, “Componentes”) predeterminados del "Día 2".

32.2.5.1.1 rke2-upgrade

Imagen de contenedor responsable de actualizar la versión de RKE2 de un nodo específico.

Distribuida a través de un Pod creado por SUC basado en un Plan SUC. El Plan debe estar ubicado en cada clúster que necesite una actualización de RKE2.

Para obtener más información sobre cómo la imagen rke2-upgrade realiza la actualización, consultad la documentación de sentido ascendente.

32.2.5.1.2 k3s-upgrade

Imagen de contenedor responsable de actualizar la versión de K3s de un nodo específico.

Distribuida a través de un Pod creado por SUC basado en un Plan SUC. El Plan debe estar ubicado en cada clúster que necesite una actualización de K3s.

Para obtener más información sobre cómo la imagen k3s-upgrade realiza la actualización, consultad la documentación de sentido ascendente.

32.2.5.2 Descripción general

La actualización de la distribución de Kubernetes para los nodos del clúster management se realiza utilizando Fleet y System Upgrade Controller (SUC).

Fleet se utiliza para desplegar y gestionar SUC plans en el clúster deseado.

Nota
Nota

SUC plans son recursos personalizados que describen los pasos que SUC debe seguir para que se ejecute una tarea específica en un conjunto de nodos. Para ver un ejemplo de cómo es un SUC plan, consultad el repositorio de sentido ascendente.

Los K8s SUC plans se distribuyen en cada clúster desplegando un recurso GitRepo o Bundle en un espacio de trabajo de Fleet específico. Fleet recupera el GitRepo/Bundle desplegado y despliega su contenido (el K8s SUC plans) en el clúster o clústeres deseados.

Nota
Nota

Los recursos GitRepo/Bundle se despliegan siempre en el management cluster. El uso de un recurso GitRepo o Bundle depende de su caso de uso; consulte Sección 32.2.2, “Determinad vuestro caso de uso” para obtener más información.

K8s SUC plans describen el siguiente flujo de trabajo:

  1. Acordonad siempre los nodos antes de actualizar la versión de K8s.

  2. Actualizad siempre los nodos control-plane antes que los nodos worker.

  3. Actualizad siempre los nodos control-plane de uno en uno y los nodos worker de dos en dos.

Una vez desplegados los K8s SUC plans, el flujo de trabajo es el siguiente:

  1. SUC reconcilia el K8s SUC plans desplegado y crea un Kubernetes Job en cada nodo.

  2. Dependiendo de la distribución de Kubernetes, el Job creará un Pod que ejecute la imagen de contenedor rke2-upgrade (Sección 32.2.5.1.1, “rke2-upgrade”) o k3s-upgrade (Sección 32.2.5.1.2, “k3s-upgrade”).

  3. El Pod creado seguirá el siguiente flujo de trabajo:

    1. Reemplazad el binario rke2/k3s existente en el nodo por el de la imagen rke2-upgrade/k3s-upgrade.

    2. Matad el proceso rke2/k3s en ejecución.

  4. Matar el proceso rke2/k3s provoca un reinicio, lo que lanza un nuevo proceso que ejecuta el binario actualizado, dando lugar a una versión de distribución de Kubernetes actualizada.

A continuación podéis encontrar un diagrama de la descripción anterior:

fleet day2 management k8s upgrade

32.2.5.3 Requisitos

  1. Haced una copia de seguridad de vuestra distribución de Kubernetes:

    1. Para clústeres RKE2, consultad la documentación de copia de seguridad y restauración de RKE2.

    2. Para clústeres K3s, consultad la documentación de copia de seguridad y restauración de K3s.

  2. Aseguraos de que las tolerancias del Plan SUC coincidan con las tolerancias del nodo - Si los nodos de vuestro clúster de Kubernetes tienen taints personalizados, aseguraos de añadir tolerancias para esas taints en los Planes SUC. Por defecto, los Planes SUC solo tienen tolerancias para los nodos del plano de control. Las tolerancias predeterminadas incluyen:

    • CriticalAddonsOnly=true:NoExecute

    • node-role.kubernetes.io/control-plane:NoSchedule

    • node-role.kubernetes.io/etcd:NoExecute

      Nota
      Nota

      Cualquier tolerancia adicional debe añadirse en la sección .spec.tolerations de cada Plan. Los Planes SUC relacionados con la actualización de versión de Kubernetes se pueden encontrar en el repositorio suse-edge/fleet-examples en:

      • Para RKE2 - fleets/day2/system-upgrade-controller-plans/rke2-upgrade

      • Para K3s - fleets/day2/system-upgrade-controller-plans/k3s-upgrade

      Aseguraos de utilizar los Planes de una etiqueta de versión de repositorio válida.

      Un ejemplo de cómo definir tolerancias personalizadas para el Plan SUC del plano de control de RKE2 tendría este aspecto:

      apiVersion: upgrade.cattle.io/v1
      kind: Plan
      metadata:
        name: rke2-upgrade-control-plane
      spec:
        ...
        tolerations:
        # default tolerations
        - key: "CriticalAddonsOnly"
          operator: "Equal"
          value: "true"
          effect: "NoExecute"
        - key: "node-role.kubernetes.io/control-plane"
          operator: "Equal"
          effect: "NoSchedule"
        - key: "node-role.kubernetes.io/etcd"
          operator: "Equal"
          effect: "NoExecute"
        # custom toleration
        - key: "foo"
          operator: "Equal"
          value: "bar"
          effect: "NoSchedule"
      ...

32.2.5.4 Actualización de K8s - Ampliación del plan SUC

Importante
Importante

Para entornos actualizados previamente mediante este procedimiento, los usuarios deben asegurarse de que se completa uno de los siguientes pasos:

  • Remove any previously deployed SUC Plans related to older Edge release versions from the management cluster - se puede hacer eliminando el clúster deseado de la GitRepo/Bundle configuración de destino existente, o eliminando el recurso GitRepo/Bundle por completo.

  • Reuse the existing GitRepo/Bundle resource - se puede hacer apuntando la revisión del recurso a una nueva etiqueta que contenga las flotas correctas para la suse-edge/fleet-examples versión deseada.

Esto se hace para evitar conflictos entre SUC Plans para versiones de lanzamiento de Edge más antiguas.

Si los usuarios intentan actualizar mientras existen SUC Plans en el clúster management, verán el siguiente error de flota:

Not installed: Unable to continue with install: Plan <plan_name> in namespace <plan_namespace> exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error..

Como se menciona en Sección 32.2.5.2, “Descripción general”, las actualizaciones de Kubernetes se realizan enviando SUC plans al clúster deseado a través de una de las siguientes formas:

Para determinar qué recurso debéis utilizar, consultad Sección 32.2.2, “Determinad vuestro caso de uso”.

Para casos de uso en los que deseéis desplegar el K8s SUC plans desde una herramienta GitOps de terceros, consultad Sección 32.2.5.4.3, “Ampliación del plan SUC: flujo de trabajo GitOps de terceros”

32.2.5.4.1 Ampliación del plan SUC - recurso GitRepo

Se puede desplegar un recurso GitRepo, que envía los K8s SUC plans necesarios, de una de las siguientes maneras:

  1. A través de Rancher UI - Sección 32.2.5.4.1.1, “Creación de GitRepo - Interfaz de usuario de Rancher” (cuando Rancher esté disponible).

  2. Mediante el despliegue manual (Sección 32.2.5.4.1.2, “Creación de GitRepo - manual”) del recurso en vuestro management cluster.

Una vez desplegado, para supervisar el proceso de actualización de Kubernetes de los nodos de vuestro clúster de destino, consultad Sección 18.3, “Monitorización de los planes del controlador de actualización del sistema”.

32.2.5.4.1.1 Creación de GitRepo - Interfaz de usuario de Rancher

Para crear un recurso GitRepo a través de la interfaz de usuario de Rancher, seguid su documentación oficial.

El equipo de Edge mantiene flotas listas para usar tanto para las distribuciones de Kubernetes rke2 como k3s. Dependiendo de vuestro entorno, esta flota podría utilizarse directamente o como plantilla.

Importante
Importante

Utilizad siempre estas flotas a partir de una etiqueta de versión de Edge válida.

Para casos de uso en los que no sea necesario incluir cambios personalizados en los SUC plans que envían estas flotas, los usuarios pueden referenciar directamente las flotas desde el repositorio suse-edge/fleet-examples.

En los casos en los que se necesiten cambios personalizados (p. ej., para añadir tolerancias personalizadas), los usuarios deben referenciar las flotas desde un repositorio independiente, lo que les permite añadir los cambios a los planes de SUC según sea necesario.

Ejemplos de configuración para un recurso GitRepo utilizando las flotas del repositorio suse-edge/fleet-examples:

32.2.5.4.1.2 Creación de GitRepo - manual
  1. Obtened el recurso GitRepo:

    • Para clústeres RKE2:

      curl -o rke2-upgrade-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/gitrepos/day2/rke2-upgrade-gitrepo.yaml
    • Para clústeres K3s:

      curl -o k3s-upgrade-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/gitrepos/day2/k3s-upgrade-gitrepo.yaml
  2. Editad la configuración del GitRepo:

    • Eliminad la sección spec.targets, solo es necesaria para los clústeres de sentido descendente.

      • Para RKE2:

        # Example using sed
        sed -i.bak '/^  targets:/,$d' rke2-upgrade-gitrepo.yaml && rm -f rke2-upgrade-gitrepo.yaml.bak
        
        # Example using yq (v4+)
        yq eval 'del(.spec.targets)' -i rke2-upgrade-gitrepo.yaml
      • Para K3s:

        # Example using sed
        sed -i.bak '/^  targets:/,$d' k3s-upgrade-gitrepo.yaml && rm -f k3s-upgrade-gitrepo.yaml.bak
        
        # Example using yq (v4+)
        yq eval 'del(.spec.targets)' -i k3s-upgrade-gitrepo.yaml
    • Apuntad el espacio de nombres del GitRepo al espacio de nombres fleet-local; esto se hace para desplegar el recurso en el clúster de gestión.

      • Para RKE2:

        # Example using sed
        sed -i.bak 's/namespace: fleet-default/namespace: fleet-local/' rke2-upgrade-gitrepo.yaml && rm -f rke2-upgrade-gitrepo.yaml.bak
        
        # Example using yq (v4+)
        yq eval '.metadata.namespace = "fleet-local"' -i rke2-upgrade-gitrepo.yaml
      • Para K3s:

        # Example using sed
        sed -i.bak 's/namespace: fleet-default/namespace: fleet-local/' k3s-upgrade-gitrepo.yaml && rm -f k3s-upgrade-gitrepo.yaml.bak
        
        # Example using yq (v4+)
        yq eval '.metadata.namespace = "fleet-local"' -i k3s-upgrade-gitrepo.yaml
  3. Aplicad los recursos GitRepo a vuestro management cluster:

    # RKE2
    kubectl apply -f rke2-upgrade-gitrepo.yaml
    
    # K3s
    kubectl apply -f k3s-upgrade-gitrepo.yaml
  4. Visualizad el recurso GitRepo creado en el espacio de nombres fleet-local:

    # RKE2
    kubectl get gitrepo rke2-upgrade -n fleet-local
    
    # K3s
    kubectl get gitrepo k3s-upgrade -n fleet-local
    
    # Example output
    NAME           REPO                                              COMMIT          BUNDLEDEPLOYMENTS-READY   STATUS
    k3s-upgrade    https://github.com/suse-edge/fleet-examples.git   fleet-local   0/0
    rke2-upgrade   https://github.com/suse-edge/fleet-examples.git   fleet-local   0/0
32.2.5.4.2 Ampliación del plan SUC - Recurso Bundle

Un recurso Bundle, que incluye los Kubernetes upgrade SUC Plans necesarios, puede desplegarse de una de las siguientes maneras:

  1. A través de Rancher UI - Sección 32.2.5.4.2.1, “Creación de Bundle - Interfaz de usuario de Rancher” (cuando Rancher esté disponible).

  2. Mediante el despliegue manual (Sección 32.2.5.4.2.2, “Creación de bundle - manual”) del recurso en vuestro management cluster.

Una vez desplegado, para supervisar el proceso de actualización de Kubernetes de los nodos de vuestro clúster de destino, consultad Sección 18.3, “Monitorización de los planes del controlador de actualización del sistema”.

32.2.5.4.2.1 Creación de Bundle - Interfaz de usuario de Rancher

El equipo de Edge mantiene bundles listos para usar tanto para las distribuciones de Kubernetes rke2 como k3s. Dependiendo de vuestro entorno, estos bundles podrían utilizarse directamente o como plantilla.

Importante
Importante

Utilizad siempre este bundle a partir de una etiqueta de release de Edge válida.

Para crear un bundle a través de la interfaz de usuario de Rancher:

  1. En la esquina superior izquierda, haced clic en ☰ → Entrega Continua

  2. Id a Advanced > Bundles

  3. Seleccionad Create from YAML

  4. Desde aquí podéis crear el Bundle de una de las siguientes maneras:

    Nota
    Nota

    Puede haber casos de uso en los que necesitéis incluir cambios personalizados en los SUC plans que el bundle incluye (p. ej., para añadir tolerancias personalizadas). Aseguraos de incluir esos cambios en el bundle que se generará mediante los siguientes pasos.

    1. Copiando manualmente el contenido del bundle para RKE2 o K3s desde suse-edge/fleet-examples a la página Create from YAML.

    2. Clonando el repositorio suse-edge/fleet-examples desde la release deseada y seleccionando la opción Read from File en la página Create from YAML. Desde allí, navegad hasta el bundle que necesitéis (bundles/day2/system-upgrade-controller-plans/rke2-upgrade/plan-bundle.yaml para RKE2 y bundles/day2/system-upgrade-controller-plans/k3s-upgrade/plan-bundle.yaml para K3s). Esto rellenará automáticamente la página Create from YAML con el contenido del bundle.

  5. Editad el Bundle en la interfaz de usuario de Rancher:

    • Cambiad el espacio de nombres del Bundle para que apunte al espacio de nombres fleet-local.

      # Example
      kind: Bundle
      apiVersion: fleet.cattle.io/v1alpha1
      metadata:
        name: rke2-upgrade
        namespace: fleet-local
      ...
    • Cambiad los clústeres target del Bundle para que apunten a vuestro clúster local (gestión):

      spec:
        targets:
        - clusterName: local
      Nota
      Nota

      Existen algunos casos de uso en los que vuestro clúster local podría tener un nombre diferente.

      Para recuperar el nombre de vuestro clúster local, ejecutad el siguiente comando:

      kubectl get clusters.fleet.cattle.io -n fleet-local
  6. Seleccionad Crear

32.2.5.4.2.2 Creación de bundle - manual
  1. Obtened los recursos del Bundle:

    • Para clústeres RKE2:

      curl -o rke2-plan-bundle.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/bundles/day2/system-upgrade-controller-plans/rke2-upgrade/plan-bundle.yaml
    • Para clústeres K3s:

      curl -o k3s-plan-bundle.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/bundles/day2/system-upgrade-controller-plans/k3s-upgrade/plan-bundle.yaml
  2. Editad la configuración del Bundle:

    • Cambiad los clústeres target del Bundle para que apunten a vuestro clúster local (gestión):

      spec:
        targets:
        - clusterName: local
      Nota
      Nota

      Existen algunos casos de uso en los que vuestro clúster local podría tener un nombre diferente.

      Para recuperar el nombre de vuestro clúster local, ejecutad el siguiente comando:

      kubectl get clusters.fleet.cattle.io -n fleet-local
    • Cambiad el espacio de nombres del Bundle para que apunte al espacio de nombres fleet-local.

      # Example
      kind: Bundle
      apiVersion: fleet.cattle.io/v1alpha1
      metadata:
        name: rke2-upgrade
        namespace: fleet-local
      ...
  3. Aplicad los recursos del Bundle a vuestro management cluster:

    # For RKE2
    kubectl apply -f rke2-plan-bundle.yaml
    
    # For K3s
    kubectl apply -f k3s-plan-bundle.yaml
  4. Visualizad el recurso Bundle creado en el espacio de nombres fleet-local:

    # For RKE2
    kubectl get bundles rke2-upgrade -n fleet-local
    
    # For K3s
    kubectl get bundles k3s-upgrade -n fleet-local
    
    # Example output
    NAME           BUNDLEDEPLOYMENTS-READY   STATUS
    k3s-upgrade    0/0
    rke2-upgrade   0/0
32.2.5.4.3 Ampliación del plan SUC: flujo de trabajo GitOps de terceros

Puede haber casos de uso en los que los usuarios deseen incorporar el Kubernetes upgrade SUC plans a su propio flujo de trabajo GitOps de terceros (p. ej., Flux).

Para obtener los recursos de actualización de K8s que necesitáis, determinad primero la etiqueta de release de Edge del repositorio suse-edge/fleet-examples que deseáis utilizar.

Después de eso, los recursos se pueden encontrar en:

  • Para una actualización de clúster RKE2:

    • Para nodos control-plane - fleets/day2/system-upgrade-controller-plans/rke2-upgrade/plan-control-plane.yaml

    • Para nodos worker - fleets/day2/system-upgrade-controller-plans/rke2-upgrade/plan-worker.yaml

  • Para una actualización de clúster K3s:

    • Para nodos control-plane - fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-control-plane.yaml

    • Para nodos worker - fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-worker.yaml

Importante
Importante

Estos recursos Plan son interpretados por el System Upgrade Controller y deben desplegarse en cada clúster de sentido descendente que deseéis actualizar. Para obtener información sobre la ampliación de SUC, consultad Sección 18.2, “Instalación del controlador de actualización del sistema”.

Para comprender mejor cómo podéis utilizar vuestro flujo de trabajo de GitOps para implementar los planes de SUC para la actualización de la versión de Kubernetes, puede resultar útil echar un vistazo a la descripción general (Sección 32.2.5.2, “Descripción general”) del procedimiento de actualización utilizando Fleet.

32.2.6 Actualización de Helm chart

Esta sección trata las siguientes partes:

  1. Sección 32.2.6.1, “Preparación para entornos aislados” - contiene información sobre cómo enviar gráficos e imágenes OCI relacionados con Edge a su registro privado.

  2. Sección 32.2.6.2, “Procedimiento de actualización” - contiene información sobre diferentes casos de uso de actualización de gráficos de Helm y su procedimiento de actualización.

32.2.6.1 Preparación para entornos aislados

32.2.6.1.1 Asegúrese de tener acceso a su Fleet de gráficos de Helm

Dependiendo de lo que admita su entorno, puede elegir una de las siguientes opciones:

  1. Aloje los recursos de Fleet de su gráfico en un servidor Git local al que pueda acceder su management cluster.

  2. Utilizad la CLI de Fleet para convertir un Helm chart en un Bundle que podáis usar directamente sin necesidad de alojarlo en otro sitio. La CLI de Fleet se puede obtener en su página de lanzamientos; para usuarios de Mac, existe una fleet-cli Homebrew Formulae.

32.2.6.1.2 Busque los activos necesarios para su versión de lanzamiento de Edge
  1. Vaya a la página de lanzamiento de «Día 2», busque el lanzamiento de Edge al que desea actualizar su gráfico y haga clic en Activos.

  2. Desde la sección «Activos», descargue los siguientes archivos:

    Archivo de lanzamiento

    Descripción

    edge-save-images.sh

    Extrae las imágenes especificadas en el archivo edge-release-images.txt y las empaqueta dentro de un archivo '.tar.gz'.

    edge-save-oci-artefacts.sh

    Extrae las imágenes de gráfico OCI relacionadas con la versión específica de Edge y las empaqueta dentro de un archivo '.tar.gz'.

    edge-load-images.sh

    Carga imágenes desde un archivo '.tar.gz', las vuelve a etiquetar y las envía a un registro privado.

    edge-load-oci-artefacts.sh

    Toma un directorio que contiene paquetes de gráfico OCI '.tgz' de Edge y los carga en un registro privado.

    edge-release-helm-oci-artefacts.txt

    Contiene una lista de imágenes de gráfico OCI relacionadas con una versión específica de Edge.

    edge-release-images.txt

    Contiene una lista de imágenes relacionadas con una versión específica de Edge.

32.2.6.1.3 Cread el archivo de imágenes de la versión de Edge

En una máquina con acceso a internet:

  1. Haced que edge-save-images.sh sea ejecutable:

    chmod +x edge-save-images.sh
  2. Generad el archivo de imagen:

    ./edge-save-images.sh --source-registry registry.suse.com
  3. Esto creará un archivo listo para cargar llamado edge-images.tar.gz.

    Nota
    Nota

    Si se especifica la opción -i|--images, el nombre del archivo puede variar.

  4. Copiad este archivo a vuestra máquina air-gapped:

    scp edge-images.tar.gz <user>@<machine_ip>:/path
32.2.6.1.4 Cread el archivo de imágenes de gráfico OCI de Edge

En una máquina con acceso a internet:

  1. Haced que edge-save-oci-artefacts.sh sea ejecutable:

    chmod +x edge-save-oci-artefacts.sh
  2. Generad el archivo de imagen de gráfico OCI:

    ./edge-save-oci-artefacts.sh --source-registry registry.suse.com
  3. Esto creará un archivo llamado oci-artefacts.tar.gz.

    Nota
    Nota

    Si se especifica la opción -a|--archive, el nombre del archivo puede variar.

  4. Copiad este archivo a vuestra máquina air-gapped:

    scp oci-artefacts.tar.gz <user>@<machine_ip>:/path
32.2.6.1.5 Cargad las imágenes de la versión de Edge en vuestra máquina en entorno aislado.

En vuestra máquina en entorno aislado:

  1. Iniciad sesión en vuestro registro privado (si es necesario):

    podman login <REGISTRY.YOURDOMAIN.COM:PORT>
  2. Haced que edge-load-images.sh sea ejecutable:

    chmod +x edge-load-images.sh
  3. Ejecutad el script, pasando el archivo edge-images.tar.gz que fue copiado anteriormente:

    ./edge-load-images.sh --source-registry registry.suse.com --registry <REGISTRY.YOURDOMAIN.COM:PORT> --images edge-images.tar.gz
    Nota
    Nota

    Esto cargará todas las imágenes desde edge-images.tar.gz, las volverá a etiquetar y las enviará al registro especificado en la opción --registry.

32.2.6.1.6 Cargad las imágenes del gráfico Edge OCI en vuestra máquina en entorno aislado.

En vuestra máquina en entorno aislado:

  1. Iniciad sesión en vuestro registro privado (si es necesario):

    podman login <REGISTRY.YOURDOMAIN.COM:PORT>
  2. Haced que edge-load-oci-artefacts.sh sea ejecutable:

    chmod +x edge-load-oci-artefacts.sh
  3. Desempaquetad el archivo oci-artefacts.tar.gz copiado:

    tar -xvf oci-artefacts.tar.gz
  4. Esto producirá un directorio con la plantilla de nomenclatura edge-release-oci-tgz-<date>

  5. Pasad este directorio al script edge-load-oci-artefacts.sh para cargar las imágenes del gráfico Edge OCI en vuestro registro privado:

    Nota
    Nota

    Este script asume que la CLI de helm ha sido preinstalada en vuestro entorno. Para obtener instrucciones sobre la instalación de Helm, consultad Instalación de Helm.

    ./edge-load-oci-artefacts.sh --archive-directory edge-release-oci-tgz-<date> --registry <REGISTRY.YOURDOMAIN.COM:PORT> --source-registry registry.suse.com
32.2.6.1.7 Configurad vuestro registro privado en vuestra distribución de Kubernetes

Para RKE2, consultad Configuración de registro privado.

Para K3s, consultad Configuración de registro privado.

32.2.6.2 Procedimiento de actualización

Esta sección se centra en los siguientes casos de uso del procedimiento de actualización de Helm:

Importante
Importante

Los gráficos de Helm desplegados manualmente no se pueden actualizar de forma fiable. Sugerimos volver a desplegar el gráfico de Helm utilizando el método Sección 32.2.6.2.1, “Tengo un nuevo clúster y me gustaría desplegar y gestionar un Helm chart de Edge”.

32.2.6.2.1 Tengo un nuevo clúster y me gustaría desplegar y gestionar un Helm chart de Edge

Esta sección cubre cómo:

32.2.6.2.1.1 Preparad los recursos de Fleet para vuestro Helm chart
  1. Adquirid los recursos de Fleet de vuestro Helm chart desde la etiqueta de lanzamiento de Edge que deseéis utilizar.

  2. Navegad hasta el Fleet de vuestro Helm chart (fleets/day2/chart-templates/<chart>)

  3. Si tenéis la intención de utilizar un flujo de trabajo GitOps, copiad el directorio Fleet del Helm chart al repositorio Git desde donde realizaréis GitOps.

  4. Opcionalmente, si el Helm chart requiere configuraciones en sus valores, editad la configuración .helm.values dentro del archivo fleet.yaml del directorio copiado.

  5. Opcionalmente, puede haber casos de uso en los que necesitéis añadir recursos adicionales a la flota de vuestro gráfico para que se adapte mejor a vuestro entorno. Para obtener información sobre cómo mejorar vuestro directorio de Fleet, consultad Contenido del repositorio Git.

Nota
Nota

En algunos casos, el tiempo de espera predeterminado que utiliza Fleet para las operaciones de Helm puede ser insuficiente, lo que da lugar al siguiente error:

failed pre-install: context deadline exceeded

En tales casos, añadid la propiedad timeoutSeconds bajo la configuración helm de vuestro archivo fleet.yaml.

Un ejemplo para el Helm chart longhorn sería así:

  • Estructura del repositorio Git del usuario:

    <user_repository_root>
    ├── longhorn
    │   └── fleet.yaml
    └── longhorn-crd
        └── fleet.yaml
  • Contenido de fleet.yaml poblado con datos de usuario Longhorn:

    defaultNamespace: longhorn-system
    
    helm:
      # timeoutSeconds: 10
      releaseName: "longhorn"
      chart: "longhorn"
      repo: "https://charts.rancher.io/"
      version: "1.11.2"
      takeOwnership: true
      # custom chart value overrides
      values:
        # Example for user provided custom values content
        defaultSettings:
          deletingConfirmationFlag: true
    
    # https://fleet.rancher.io/bundle-diffs
    diff:
      comparePatches:
      - apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        name: engineimages.longhorn.io
        operations:
        - {"op":"remove", "path":"/status/conditions"}
        - {"op":"remove", "path":"/status/storedVersions"}
        - {"op":"remove", "path":"/status/acceptedNames"}
      - apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        name: nodes.longhorn.io
        operations:
        - {"op":"remove", "path":"/status/conditions"}
        - {"op":"remove", "path":"/status/storedVersions"}
        - {"op":"remove", "path":"/status/acceptedNames"}
      - apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        name: volumes.longhorn.io
        operations:
        - {"op":"remove", "path":"/status/conditions"}
        - {"op":"remove", "path":"/status/storedVersions"}
        - {"op":"remove", "path":"/status/acceptedNames"}
    Nota
    Nota

    Estos son solo valores de ejemplo que se utilizan para ilustrar configuraciones personalizadas sobre el Helm chart longhorn. NO deben tratarse como directrices de despliegue para el Helm chart longhorn.

32.2.6.2.1.2 Desplegad la flota para vuestro Helm chart

Podéis desplegar la flota para vuestro Helm chart utilizando un GitRepo (Sección 32.2.6.2.1.2.1, “GitRepo”) o un Bundle (Sección 32.2.6.2.1.2.2, “Bundle”).

Nota
Nota

Al desplegar vuestra flota, si recibís un mensaje de Modified, aseguraos de añadir la entrada comparePatches correspondiente a la sección diff de la flota. Para más información, consultad Generación de diferencias para ignorar GitRepos modificados.

32.2.6.2.1.2.1 GitRepo

El recurso GitRepo de Fleet contiene información sobre cómo acceder a los recursos de flota de vuestro Helm chart y a qué clústeres debe aplicar dichos recursos.

El recurso GitRepo puede desplegarse a través de la interfaz de usuario de Rancher, o manualmente, desplegando el recurso en management cluster.

Ejemplo de recurso Longhorn GitRepo para despliegue manual:

apiVersion: fleet.cattle.io/v1alpha1
kind: GitRepo
metadata:
  name: longhorn-git-repo
  namespace: fleet-local
spec:
  # If using a tag
  # revision: user_repository_tag
  #
  # If using a branch
  # branch: user_repository_branch
  paths:
  # As seen in the 'Prepare your Fleet resources' example
  - longhorn
  - longhorn-crd
  repo: user_repository_url
32.2.6.2.1.2.2 Bundle

Los recursos Bundle contienen los recursos brutos de Kubernetes que deben ser desplegados por Fleet. Normalmente se recomienda utilizar el enfoque GitRepo, pero para casos de uso en los que el entorno sea aislado y no pueda admitir un servidor Git local, Bundles puede ayudaros a propagar vuestro Helm chart con Fleet a vuestros clústeres de destino.

Un Bundle puede desplegarse a través de la interfaz de usuario de Rancher (Continuous Delivery → Advanced → Bundles → Create from YAML) o desplegando manualmente el recurso Bundle en el espacio de nombres de Fleet correcto. Para obtener información sobre los espacios de nombres de Fleet, consulte la documentación original.

Se pueden crear Bundles para los Helm charts de Edge utilizando el enfoque Convertir un Helm chart en un Bundle de Fleet.

A continuación, podéis encontrar un ejemplo sobre cómo crear un recurso Bundle a partir de las plantillas de Fleet de los Helm charts longhorn y longhorn-crd, y desplegad manualmente este Bundle en vuestro management cluster.

Nota
Nota

Para ilustrar el flujo de trabajo, el siguiente ejemplo utiliza la estructura de directorio suse-edge/fleet-examples.

  1. Navegad hasta la plantilla de Fleet del Helm chart longhorn:

    cd fleets/day2/chart-templates/longhorn/longhorn
  2. Cread un archivo targets.yaml que indique a Fleet en qué clústeres debe desplegar el Helm chart:

    cat > targets.yaml <<EOF
    targets:
    # Match your local (management) cluster
    - clusterName: local
    EOF
    Nota
    Nota

    Existen algunos casos de uso en los que vuestro clúster local podría tener un nombre diferente.

    Para recuperar el nombre de su clúster local, ejecute el siguiente comando:

    kubectl get clusters.fleet.cattle.io -n fleet-local
  3. Convierta el recurso Fleet del gráfico de Helm Longhorn en un recurso Bundle utilizando la fleet-cli.

    Nota
    Nota

    La CLI de Fleet se puede obtener desde su página de lanzamientos Assets (fleet-linux-amd64).

    Para los usuarios de Mac, existe una fórmula de Homebrew para fleet-cli.

    fleet apply --compress --targets-file=targets.yaml -n fleet-local -o - longhorn-bundle > longhorn-bundle.yaml
  4. Navegue hasta la plantilla de Fleet del gráfico longhorn-crd:

    cd fleets/day2/chart-templates/longhorn/longhorn-crd
  5. Cree un archivo targets.yaml que indique a Fleet en qué clústeres debe desplegar el gráfico de Helm:

    cat > targets.yaml <<EOF
    targets:
    # Match your local (management) cluster
    - clusterName: local
    EOF
  6. Convierta el recurso Fleet del gráfico de Helm Longhorn CRD en un recurso Bundle utilizando la fleet-cli.

    fleet apply --compress --targets-file=targets.yaml -n fleet-local -o - longhorn-crd-bundle > longhorn-crd-bundle.yaml
  7. Despliegue los archivos longhorn-bundle.yaml y longhorn-crd-bundle.yaml en su management cluster:

    kubectl apply -f longhorn-crd-bundle.yaml
    kubectl apply -f longhorn-bundle.yaml

Seguir estos pasos garantizará que SUSE Storage se despliegue en todos los management clústeres especificados.

32.2.6.2.1.3 Gestionar el gráfico de Helm desplegado

Una vez desplegado con Fleet, para las actualizaciones del gráfico de Helm, consulte Sección 32.2.6.2.2, “Me gustaría actualizar un gráfico de Helm gestionado por Fleet”.

32.2.6.2.2 Me gustaría actualizar un gráfico de Helm gestionado por Fleet
  1. Determine la versión a la que necesita actualizar su gráfico para que sea compatible con la versión de Edge deseada. La versión del gráfico de Helm por versión de Edge se puede consultar en las notas de la versión (Capítulo 41, Notas de la versión).

  2. En su repositorio Git supervisado por Fleet, edite el archivo fleet.yaml del gráfico de Helm con la versión y el repositorio correctos de las notas de la versión (Capítulo 41, Notas de la versión).

  3. Tras confirmar y enviar los cambios a su repositorio, esto activará una actualización del gráfico de Helm deseado.

32.2.6.2.3 Me gustaría actualizar un gráfico de Helm desplegado a través de EIB.

Capítulo 8, Edge Image Builder despliega gráficos de Helm creando un recurso HelmChart y utilizando el helm-controller introducido por la función de integración de Helm de RKE2/K3s.

Para garantizar que un gráfico de Helm desplegado a través de EIB se actualice correctamente, los usuarios deben realizar una actualización sobre los recursos HelmChart respectivos.

A continuación, puede encontrar información sobre:

32.2.6.2.3.1 Descripción general

Los gráficos de Helm que se despliegan a través de EIB se actualizan mediante un fleet llamado eib-charts-upgrader.

Este fleet procesa datos proporcionados por el usuario para actualizar un conjunto específico de recursos HelmChart.

La actualización de estos recursos activa el helm-controller, que actualiza la versión de los gráficos de Helm asociados con los recursos HelmChart modificados.

Solo se espera que el usuario:

  1. Localmente, extraed los archivos comprimidos para cada gráfico de Helm que deba actualizarse.

  2. Pasad estos archivos al script generate-chart-upgrade-data.sh generate-chart-upgrade-data.sh, que incluirá los datos de estos archivos en la flota eib-charts-upgrader.

  3. Desplegad la flota eib-charts-upgrader en vuestro management cluster. Esto se realiza a través de un recurso GitRepo o Bundle.

Una vez desplegado, el eib-charts-upgrader, con la ayuda de Fleet, enviará sus recursos al clúster management deseado.

Estos recursos incluyen:

  1. Un conjunto de Secrets que contiene los datos del gráfico de Helm proporcionados por el usuario.

  2. Un Kubernetes Job que desplegará un Pod que montará los Secrets mencionados anteriormente y, basándose en ellos, parcheará los recursos de HelmChart correspondientes.

Como se mencionó anteriormente, esto activará el helm-controller que realizará la actualización real del gráfico de Helm.

A continuación podéis encontrar un diagrama de la descripción anterior:

fleet day2 management helm eib upgrade
32.2.6.2.3.2 Pasos de actualización
  1. Clonad el repositorio suse-edge/fleet-examples desde la etiqueta de la versión correcta.

  2. Cread un directorio en el que almacenaréis el/los archivo(s) comprimido(s) del gráfico de Helm descargado(s).

    mkdir archives
  3. Dentro del directorio de archivos comprimidos recién creado, descargad el/los archivo(s) comprimido(s) para el/los gráfico(s) de Helm que deseéis actualizar:

    cd archives
    helm pull [chart URL | repo/chartname]
    
    # Alternatively if you want to pull a specific version:
    # helm pull [chart URL | repo/chartname] --version 0.0.0
  4. Desde Assets de la etiqueta de versión deseada, descargad el script generate-chart-upgrade-data.sh.

  5. Ejecutad el script generate-chart-upgrade-data.sh:

    chmod +x ./generate-chart-upgrade-data.sh
    
    ./generate-chart-upgrade-data.sh --archive-dir /foo/bar/archives/ --fleet-path /foo/bar/fleet-examples/fleets/day2/eib-charts-upgrader

    Para cada archivo de gráfico en el directorio --archive-dir, el script genera un archivo Kubernetes Secret YAML que contiene los datos de actualización del gráfico y los almacena en el directorio base/secrets de la flota especificada por --fleet-path.

    El script generate-chart-upgrade-data.sh también aplica modificaciones adicionales a la flota para garantizar que los archivos Kubernetes Secret YAML generados sean utilizados correctamente por la carga de trabajo desplegada por la flota.

    Importante
    Importante

    Los usuarios no deben realizar cambios sobre lo que genera el script generate-chart-upgrade-data.sh.

Los pasos siguientes dependen del entorno en el que estéis ejecutando:

  1. Para un entorno que admita GitOps (por ejemplo, que no esté aislado o que esté aislado, pero permita el soporte de un servidor Git local):

    1. Copiad la flota fleets/day2/eib-charts-upgrader al repositorio que utilizaréis para GitOps.

      Nota
      Nota

      Aseguraos de que la flota incluya los cambios realizados por el script generate-chart-upgrade-data.sh.

    2. Configurad un recurso GitRepo que se utilizará para enviar todos los recursos de la flota eib-charts-upgrader.

      1. Para la configuración y el despliegue de GitRepo a través de la interfaz de usuario de Rancher, consultad Acceso a Fleet en la interfaz de usuario de Rancher.

      2. Para la configuración y el despliegue manual de GitRepo, consultad Creación de un despliegue.

  2. Para un entorno que no admita GitOps (por ejemplo, que sea un entorno aislado y no permita el uso de un servidor Git local):

    1. Descargad el binario fleet-cli desde la página rancher/fleet release (fleet-linux-amd64 para Linux). Para los usuarios de Mac, existe una fórmula de Homebrew que se puede utilizar: fleet-cli.

    2. Navegad a eib-charts-upgrader Fleet:

      cd /foo/bar/fleet-examples/fleets/day2/eib-charts-upgrader
    3. Cread un archivo targets.yaml que indique a Fleet dónde desplegar vuestros recursos:

      cat > targets.yaml <<EOF
      targets:
      # To map the local(management) cluster
      - clusterName: local
      EOF
      Nota
      Nota

      Existen algunos casos de uso en los que vuestro clúster local podría tener un nombre diferente.

      Para recuperar el nombre de vuestro clúster local, ejecutad el siguiente comando:

      kubectl get clusters.fleet.cattle.io -n fleet-local
    4. Utilizad fleet-cli para convertir Fleet en un recurso Bundle:

      fleet apply --compress --targets-file=targets.yaml -n fleet-local -o - eib-charts-upgrade > bundle.yaml

      Esto creará un Bundle (bundle.yaml) que contendrá todos los recursos con plantilla del Fleet eib-charts-upgrader.

      Para obtener más información sobre el comando fleet apply, consultad fleet apply.

      Para obtener más información sobre la conversión de Fleets a Bundles, consultad Convertir un gráfico de Helm en un Bundle.

    5. Desplegad Bundle. Esto se puede hacer de dos formas:

      1. A través de la interfaz de usuario de Rancher: navegad a Continuous Delivery → Advanced → Bundles → Create from YAML y pegad el contenido de bundle.yaml o haced clic en la opción Read from File y enviad el archivo directamente.

      2. Manualmente: desplegad el archivo bundle.yaml manualmente dentro de vuestro management cluster.

La ejecución de estos pasos dará como resultado un recurso GitRepo/Bundle desplegado correctamente. Fleet detectará el recurso y su contenido se desplegará en los clústeres de destino que hayáis especificado en los pasos anteriores. Para obtener una visión general del proceso, consultad Sección 32.2.6.2.3.1, “Descripción general”.

Para obtener información sobre cómo realizar el seguimiento del proceso de actualización, podéis consultar Sección 32.2.6.2.3.3, “Ejemplo”.

Importante
Importante

Una vez que se haya verificado correctamente la actualización del gráfico, eliminad el recurso Bundle/GitRepo.

Esto eliminará los recursos de actualización que ya no son necesarios de vuestro clúster management, asegurando que no se produzcan conflictos de versiones en el futuro.

32.2.6.2.3.3 Ejemplo
Nota
Nota

El siguiente ejemplo demuestra cómo actualizar un gráfico de Helm desplegado mediante EIB de una versión a otra en un clúster management. Tened en cuenta que las versiones utilizadas en este ejemplo no son recomendaciones. Para obtener recomendaciones de versiones específicas de una versión Edge, consultad las notas de la versión (Capítulo 41, Notas de la versión).

Caso práctico:

  • Un clúster management está ejecutando una versión anterior de Longhorn.

  • El clúster se ha desplegado a través de EIB, utilizando la siguiente definición de imagen snippet:

    kubernetes:
      helm:
        charts:
        - name: longhorn-crd
          repositoryName: rancher-charts
          targetNamespace: longhorn-system
          createNamespace: true
          version: 104.2.0+up1.7.1
          installationNamespace: kube-system
        - name: longhorn
          repositoryName: rancher-charts
          targetNamespace: longhorn-system
          createNamespace: true
          version: 104.2.0+up1.7.1
          installationNamespace: kube-system
        repositories:
        - name: rancher-charts
          url: https://charts.rancher.io/
    ...
  • SUSE Storage necesita ser actualizado a una versión que sea compatible con la versión 3.6 de Edge. Lo que significa que debe actualizarse a 1.11.2.

  • Se asume que el management cluster está en un entorno aislado, sin soporte para un servidor Git local y tiene una configuración de Rancher en funcionamiento.

Seguid los Pasos de actualización (Sección 32.2.6.2.3.2, “Pasos de actualización”):

  1. Clonad el repositorio suse-edge/fleet-example desde la etiqueta release-3.6.1.

    git clone -b release-3.6.1 https://github.com/suse-edge/fleet-examples.git
  2. Cread un directorio donde se almacenará el archivo de actualización de Longhorn.

    mkdir archives
  3. Descargad la versión del archivo del chart Longhorn deseada:

    # First add the Rancher Helm chart repository
    helm repo add rancher-charts https://charts.rancher.io/
    
    # Pull the Longhorn 1.11.2 chart archive
    helm pull oci://dp.apps.rancher.io/charts/suse-storage --version 1.11.2
  4. Fuera del directorio archives, descargad el script generate-chart-upgrade-data.sh desde la suse-edge/fleet-examples etiqueta de la versión.

  5. La configuración del directorio debería ser similar a:

    .
    ├── archives
    │   └── longhorn-1.11.2.tgz
    ├── fleet-examples
    ...
    │   ├── fleets
    │   │   ├── day2
    |   |   |   ├── ...
    │   │   │   ├── eib-charts-upgrader
    │   │   │   │   ├── base
    │   │   │   │   │   ├── job.yaml
    │   │   │   │   │   ├── kustomization.yaml
    │   │   │   │   │   ├── patches
    │   │   │   │   │   │   └── job-patch.yaml
    │   │   │   │   │   ├── rbac
    │   │   │   │   │   │   ├── cluster-role-binding.yaml
    │   │   │   │   │   │   ├── cluster-role.yaml
    │   │   │   │   │   │   ├── kustomization.yaml
    │   │   │   │   │   │   └── sa.yaml
    │   │   │   │   │   └── secrets
    │   │   │   │   │       ├── eib-charts-upgrader-script.yaml
    │   │   │   │   │       └── kustomization.yaml
    │   │   │   │   ├── fleet.yaml
    │   │   │   │   └── kustomization.yaml
    │   │   │   └── ...
    │   └── ...
    └── generate-chart-upgrade-data.sh
  6. Ejecutad el script generate-chart-upgrade-data.sh:

    # First make the script executable
    chmod +x ./generate-chart-upgrade-data.sh
    
    # Then execute the script
    ./generate-chart-upgrade-data.sh --archive-dir ./archives --fleet-path ./fleet-examples/fleets/day2/eib-charts-upgrader

    La estructura del directorio después de la ejecución del script debería ser similar a:

    .
    ├── archives
    │   └── longhorn-1.11.2.tgz
    ├── fleet-examples
    ...
    │   ├── fleets
    │   │   ├── day2
    │   │   │   ├── ...
    │   │   │   ├── eib-charts-upgrader
    │   │   │   │   ├── base
    │   │   │   │   │   ├── job.yaml
    │   │   │   │   │   ├── kustomization.yaml
    │   │   │   │   │   ├── patches
    │   │   │   │   │   │   └── job-patch.yaml
    │   │   │   │   │   ├── rbac
    │   │   │   │   │   │   ├── cluster-role-binding.yaml
    │   │   │   │   │   │   ├── cluster-role.yaml
    │   │   │   │   │   │   ├── kustomization.yaml
    │   │   │   │   │   │   └── sa.yaml
    │   │   │   │   │   └── secrets
    │   │   │   │   │       ├── eib-charts-upgrader-script.yaml
    │   │   │   │   │       ├── kustomization.yaml
    │   │   │   │   │       ├── longhorn-VERSION.yaml - secret created by the generate-chart-upgrade-data.sh script
    │   │   │   │   │       └── longhorn-crd-VERSION.yaml - secret created by the generate-chart-upgrade-data.sh script
    │   │   │   │   ├── fleet.yaml
    │   │   │   │   └── kustomization.yaml
    │   │   │   └── ...
    │   └── ...
    └── generate-chart-upgrade-data.sh

    Los archivos modificados en git deberían tener este aspecto:

    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
        modified:   fleets/day2/eib-charts-upgrader/base/patches/job-patch.yaml
        modified:   fleets/day2/eib-charts-upgrader/base/secrets/kustomization.yaml
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        fleets/day2/eib-charts-upgrader/base/secrets/longhorn-VERSION.yaml
        fleets/day2/eib-charts-upgrader/base/secrets/longhorn-crd-VERSION.yaml
  7. Cread un Bundle para el Fleet eib-charts-upgrader:

    1. Primero, navegad hasta el Fleet:

      cd ./fleet-examples/fleets/day2/eib-charts-upgrader
    2. A continuación, cread un archivo targets.yaml:

      cat > targets.yaml <<EOF
      targets:
      - clusterName: local
      EOF
    3. Después, utilizad el binario fleet-cli para convertir el Fleet en un Bundle:

      fleet apply --compress --targets-file=targets.yaml -n fleet-local -o - eib-charts-upgrade > bundle.yaml
  8. Desplegad el Bundle a través de la interfaz de usuario de Rancher:

    day2 helm chart upgrade example 1
    Figura 32.1: Desplegad el Bundle a través de la interfaz de usuario de Rancher

    Desde aquí, seleccionad Leer desde archivo y buscad el archivo bundle.yaml en vuestro sistema.

    Esto rellenará automáticamente el Bundle dentro de la interfaz de usuario de Rancher.

    Seleccionad Crear.

  9. Tras un despliegue correcto, vuestro Bundle debería tener un aspecto similar a:

    day2 helm chart upgrade example 2
    Figura 32.2: Bundle desplegado correctamente

Tras el despliegue correcto del Bundle, para supervisar el proceso de actualización:

  1. Verificad los registros del Upgrade Pod:

    day2 helm chart upgrade example 3 management
  2. Ahora verificad los registros del Pod creado para la actualización por el helm-controller:

    1. El nombre del Pod seguirá la siguiente plantilla: helm-install-longhorn-<random-suffix>

    2. El Pod estará en el espacio de nombres donde se desplegó el recurso HelmChart. En nuestro caso, es kube-system.

      day2 helm chart upgrade example 4 management
      Figura 32.3: Registros de la actualización correcta del chart de Longhorn
  3. Verificad que la versión de HelmChart se ha actualizado navegando a la sección HelmCharts de Rancher (More Resources → HelmCharts). Seleccionad el espacio de nombres donde se desplegó el chart; para este ejemplo, sería kube-system.

  4. Finalmente, comprobad que los Pods de Longhorn se están ejecutando.

Tras realizar las validaciones anteriores, es seguro asumir que el chart de Helm de Longhorn se ha actualizado a la versión 1.11.2.

32.2.6.2.3.4 Actualización del chart de Helm mediante una herramienta GitOps de terceros

Puede haber casos de uso en los que los usuarios deseen utilizar este procedimiento de actualización con un flujo de trabajo GitOps distinto de Fleet (por ejemplo, Flux).

Para generar los recursos necesarios para el procedimiento de actualización, puede utilizar el script generate-chart-upgrade-data.sh para poblar el Fleet eib-charts-upgrader con los datos proporcionados por el usuario. Para obtener información sobre cómo hacerlo, consulte Sección 32.2.6.2.3.2, “Pasos de actualización”.

Una vez que tengáis la configuración completa, podéis utilizar kustomize para generar una solución funcional completa que podáis desplegar en vuestro clúster:

cd /foo/bar/fleets/day2/eib-charts-upgrader

kustomize build .

Si queréis incluir la solución en vuestro flujo de trabajo GitOps, podéis eliminar el archivo fleet.yaml y usar lo que queda como una configuración Kustomize válida. Simplemente, no olvidéis ejecutar primero el script generate-chart-upgrade-data.sh, para que pueda poblar la configuración Kustomize con los datos de los charts de Helm a los que queráis actualizar.

Para entender cómo se pretende utilizar este flujo de trabajo, consultad Sección 32.2.6.2.3.1, “Descripción general” y Sección 32.2.6.2.3.2, “Pasos de actualización”.

33 Clústeres en sentido descendente

Esta sección cubre las posibles formas de realizar operaciones de "Día 2" para diferentes partes de su downstream clúster.

33.1 Fleet

Esta sección ofrece información sobre cómo realizar operaciones de «Día 2» utilizando el componente Fleet (Capítulo 6, Fleet).

Los siguientes temas se tratan como parte de esta sección:

  1. Sección 33.1.1, “Componentes” - componentes predeterminados utilizados para todas las operaciones de «Día 2».

  2. Sección 33.1.2, “Determinad vuestro caso de uso” - proporciona una visión general de los recursos personalizados de Fleet que se utilizarán y su idoneidad para diferentes casos de uso de operaciones de «Día 2».

  3. Sección 33.1.3, “Flujo de trabajo de Día 2” - proporciona una guía de flujo de trabajo para ejecutar operaciones de «Día 2» con Fleet.

  4. Sección 33.1.4, “Actualización del SO” - describe cómo realizar actualizaciones del SO utilizando Fleet.

  5. Sección 33.1.5, “Actualización de la versión de Kubernetes” - describe cómo realizar actualizaciones de la versión de Kubernetes utilizando Fleet.

  6. Sección 33.1.6, “Actualización de Helm chart” - describe cómo realizar actualizaciones de Helm charts utilizando Fleet.

33.1.1 Componentes

A continuación, podéis encontrar una descripción de los componentes predeterminados que deben configurarse en vuestro clúster downstream para que podáis realizar con éxito operaciones de «Día 2» utilizando Fleet.

33.1.1.1 System Upgrade Controller (SUC)

Nota
Nota

Debe desplegarse en cada clúster descendente.

System Upgrade Controller es responsable de ejecutar tareas en nodos especificados basándose en los datos de configuración proporcionados a través de un recurso personalizado, llamado Plan.

SUC se utiliza activamente para actualizar el sistema operativo y la distribución de Kubernetes.

Para obtener más información sobre el componente SUC y cómo encaja en la pila Edge, consultad Capítulo 18, Controlador de actualización del sistema.

Para obtener información sobre cómo desplegar SUC, primero determinad vuestro caso de uso (Sección 33.1.2, “Determinad vuestro caso de uso”) y, a continuación, consultad Instalación del controlador de actualización del sistema - GitRepo (Sección 18.2.1.1, “Instalación del controlador de actualización del sistema - GitRepo”) o Instalación del controlador de actualización del sistema - Bundle (Sección 18.2.1.2, “Instalación del controlador de actualización del sistema - Bundle”).

33.1.2 Determinad vuestro caso de uso

Fleet utiliza dos tipos de recursos personalizados para permitir la gestión de recursos de Kubernetes y Helm.

A continuación, podéis encontrar información sobre el propósito de estos recursos y los casos de uso para los que son más adecuados en el contexto de las operaciones de «Día 2».

33.1.2.1 GitRepo

Un GitRepo es un recurso de Fleet (Capítulo 6, Fleet) que representa un repositorio Git desde el cual Fleet puede crear Bundles. Cada Bundle se crea en función de las rutas de configuración definidas dentro del recurso GitRepo. Para obtener más información, consultad la documentación de GitRepo.

En el contexto de las operaciones de «Día 2», los recursos GitRepo se utilizan normalmente para desplegar SUC o SUC Plans en entornos no aislados que utilizan un enfoque de Fleet GitOps.

Alternativamente, los recursos GitRepo también pueden utilizarse para desplegar SUC o SUC Plans en entornos aislados, siempre que reflejéis la configuración de vuestro repositorio a través de un servidor git local.

33.1.2.2 Bundle

Bundles contienen recursos de Kubernetes sin procesar que se implementarán en el clúster de destino. Normalmente se crean a partir de un recurso GitRepo, pero existen casos de uso en los que se pueden desplegar manualmente. Para obtener más información, consultad la documentación de Bundle.

En el contexto de las operaciones de "Día 2", los recursos Bundle se utilizan normalmente para desplegar SUC o SUC Plans en entornos aislados que no utilizan ningún tipo de procedimiento de GitOps local (por ejemplo, un servidor git local).

Alternativamente, si vuestro caso de uso no permite un flujo de trabajo GitOps (por ejemplo, mediante un repositorio Git), los recursos Bundle también podrían utilizarse para desplegar SUC o SUC Plans en entornos no aislados.

33.1.3 Flujo de trabajo de Día 2

A continuación se muestra un flujo de trabajo de «Día 2» que debe seguirse al actualizar la versión de un clúster downstream a una versión específica de Edge.

  1. Actualización de versión del SO (Sección 33.1.4, “Actualización del SO”)

  2. Actualización de versión de Kubernetes (Sección 33.1.5, “Actualización de la versión de Kubernetes”)

  3. Actualización de versión de Helm charts (Sección 33.1.6, “Actualización de Helm chart”)

33.1.4 Actualización del SO

Esta sección describe cómo realizar una actualización del sistema operativo utilizando Capítulo 6, Fleet y Capítulo 18, Controlador de actualización del sistema.

Los siguientes temas se tratan como parte de esta sección:

  1. Sección 33.1.4.1, “Componentes” - componentes adicionales utilizados por el proceso de actualización.

  2. Sección 33.1.4.2, “Descripción general” - descripción general del proceso de actualización.

  3. Sección 33.1.4.3, “Requisitos” - requisitos del proceso de actualización.

  4. Sección 33.1.4.4, “Actualización del SO - Ampliación del plan SUC” - información sobre cómo desplegar SUC plans, responsable de activar el proceso de actualización.

33.1.4.1 Componentes

Esta sección cubre los componentes personalizados que utiliza el proceso OS upgrade sobre los componentes predeterminados (Sección 33.1.1, “Componentes”) de «Día 2».

33.1.4.1.1 systemd.service

La actualización del SO en un nodo específico se gestiona mediante un systemd.service.

Se crea un servicio diferente dependiendo del tipo de actualización que requiera el SO de una versión de Edge a otra:

  • Para las versiones de Edge que requieren la misma versión de SO (p. ej., 6.1), se creará el os-pkg-update.service. Utiliza transactional-update para realizar una actualización normal de paquetes.

  • Para las versiones de Edge que requieren una migración de versión de SO (p. ej., 6.1 → 6.2), se creará el os-migration.service. Utiliza transactional-update para realizar:

    1. Una actualización normal de paquetes que garantiza que todos los paquetes estén actualizados para mitigar cualquier fallo en la migración relacionado con versiones antiguas de paquetes.

    2. Una migración de SO utilizando el comando zypper migration.

Los servicios mencionados anteriormente se envían a cada nodo a través de un SUC plan que debe estar ubicado en el clúster downstream que necesita una actualización del SO.

33.1.4.2 Descripción general

La actualización del sistema operativo para los nodos del clúster downstream se realiza utilizando Fleet y el System Upgrade Controller (SUC).

Fleet se utiliza para desplegar y gestionar SUC plans en el clúster deseado.

Nota
Nota

SUC plans son recursos personalizados que describen los pasos que SUC debe seguir para que se ejecute una tarea específica en un conjunto de nodos. Para ver un ejemplo de cómo es un SUC plan, consultad el repositorio upstream.

Los OS SUC plans se envían a cada clúster desplegando un recurso GitRepo o Bundle en un espacio de trabajo de Fleet específico. Fleet recupera el GitRepo/Bundle desplegado y despliega su contenido (el OS SUC plans) en el clúster o clústeres deseados.

Nota
Nota

Los recursos GitRepo/Bundle siempre se despliegan en el management cluster. Si utilizar un recurso GitRepo o Bundle depende de vuestro caso de uso, consultad Sección 33.1.2, “Determinad vuestro caso de uso” para obtener más información.

OS SUC plans describe el siguiente flujo de trabajo:

  1. Acordonad siempre los nodos antes de las actualizaciones del SO.

  2. Actualizad siempre los nodos control-plane antes que los nodos worker.

  3. Actualizad siempre el clúster uno a uno.

Una vez que los OS SUC plans se hayan desplegado, el flujo de trabajo tiene este aspecto:

  1. SUC reconcilia los OS SUC plans desplegados y crea un Kubernetes Job en cada nodo.

  2. El Kubernetes Job crea un systemd.service (Sección 33.1.4.1.1, “systemd.service”) para la actualización de paquetes o la migración del SO.

  3. El systemd.service creado activa el proceso de actualización del SO en el nodo específico.

    Importante
    Importante

    Una vez que finalice el proceso de actualización del SO, el nodo correspondiente se rebooted para aplicar las actualizaciones en el sistema.

A continuación podéis encontrar un diagrama de la descripción anterior:

fleet day2 downstream os upgrade

33.1.4.3 Requisitos

General:

  1. Máquina registrada en SCC - Todos los downstream nodos del clúster deben estar registrados en https://scc.suse.com/, lo cual es necesario para que el systemd.service correspondiente pueda conectarse correctamente al repositorio RPM deseado.

    Importante
    Importante

    Para las versiones Edge que requieran una migración de la versión del SO (p. ej., 6.1 → 6.2), aseguraos de que vuestra clave SCC admita la migración a la nueva versión.

  2. Aseguraos de que las tolerancias del plan SUC coincidan con las tolerancias de los nodos - Si los nodos de vuestro clúster de Kubernetes tienen taints personalizados, aseguraos de añadir tolerancias para esas taints en los planes SUC. Por defecto, los planes SUC solo tienen tolerancias para los nodos del plano de control. Las tolerancias por defecto incluyen:

    • CriticalAddonsOnly=true:NoExecute

    • node-role.kubernetes.io/control-plane:NoSchedule

    • node-role.kubernetes.io/etcd:NoExecute

      Nota
      Nota

      Cualquier tolerancia adicional debe añadirse bajo la sección .spec.tolerations de cada plan. Los planes SUC relacionados con la actualización del SO se pueden encontrar en el repositorio suse-edge/fleet-examples bajo fleets/day2/system-upgrade-controller-plans/os-upgrade. Aseguraos de utilizar los planes de una etiqueta de versión de repositorio válida.

      Un ejemplo de cómo definir tolerancias personalizadas para el plan SUC de plano de control sería el siguiente:

      apiVersion: upgrade.cattle.io/v1
      kind: Plan
      metadata:
        name: os-upgrade-control-plane
      spec:
        ...
        tolerations:
        # default tolerations
        - key: "CriticalAddonsOnly"
          operator: "Equal"
          value: "true"
          effect: "NoExecute"
        - key: "node-role.kubernetes.io/control-plane"
          operator: "Equal"
          effect: "NoSchedule"
        - key: "node-role.kubernetes.io/etcd"
          operator: "Equal"
          effect: "NoExecute"
        # custom toleration
        - key: "foo"
          operator: "Equal"
          value: "bar"
          effect: "NoSchedule"
      ...

Entorno aislado:

  1. Duplicar repositorios RPM de SUSE - Los repositorios RPM del SO deben estar duplicados localmente para que el systemd.service pueda tener acceso a ellos. Esto se puede lograr utilizando RMT o SUMA.

33.1.4.4 Actualización del SO - Ampliación del plan SUC

Importante
Importante

Para los entornos actualizados previamente mediante este procedimiento, los usuarios deben asegurarse de que se complete uno de los siguientes pasos:

  • Remove any previously deployed SUC Plans related to older Edge release versions from the downstream cluster - se puede realizar eliminando el clúster deseado de la GitRepo/Bundle configuración de destino existente, o eliminando el recurso GitRepo/Bundle por completo.

  • Reuse the existing GitRepo/Bundle resource - se puede realizar apuntando la revisión del recurso a una nueva etiqueta que contenga las flotas correctas para la suse-edge/fleet-examples release deseada.

Esto se hace para evitar conflictos entre SUC Plans para versiones de release de Edge anteriores.

Si los usuarios intentan actualizar mientras existen SUC Plans en el clúster downstream, verán el siguiente error de fleet:

Not installed: Unable to continue with install: Plan <plan_name> in namespace <plan_namespace> exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error..

Como se menciona en Sección 33.1.4.2, “Descripción general”, las actualizaciones del SO se realizan enviando SUC plans al clúster deseado a través de una de las siguientes formas:

Para determinar qué recurso debéis utilizar, consultad Sección 33.1.2, “Determinad vuestro caso de uso”.

Para casos de uso en los que deseéis desplegar el OS SUC plans desde una herramienta GitOps de terceros, consultad Sección 33.1.4.4.3, “Despliegue del plan SUC: flujo de trabajo GitOps de terceros”

33.1.4.4.1 Ampliación del plan SUC - Recurso GitRepo

Un recurso GitRepo, que envía el OS SUC plans necesario, puede desplegarse de una de las siguientes formas:

  1. A través del Rancher UI - Sección 33.1.4.4.1.1, “Creación de GitRepo - Interfaz de usuario de Rancher” (cuando Rancher esté disponible).

  2. Mediante desplegar manualmente (Sección 33.1.4.4.1.2, “Creación de GitRepo - manual”) el recurso en vuestro management cluster.

Una vez desplegado, para supervisar el proceso de actualización del SO de los nodos de vuestro clúster de destino, consultad Sección 18.3, “Monitorización de los planes del controlador de actualización del sistema”.

33.1.4.4.1.1 Creación de GitRepo - Interfaz de usuario de Rancher

Para crear un recurso GitRepo a través de la interfaz de usuario de Rancher, seguid su documentación oficial.

El equipo de Edge mantiene un fleet listo para usar. Dependiendo de vuestro entorno, este fleet podría utilizarse directamente o como plantilla.

Importante
Importante

Utilizad siempre este fleet a partir de una etiqueta de release de Edge válida.

Para casos de uso en los que no sea necesario incluir cambios personalizados en el SUC plans que distribuye el fleet, referenciad directamente el fleet os-upgrade desde el repositorio suse-edge/fleet-examples.

En los casos en los que se necesiten cambios personalizados (por ejemplo, para añadir tolerancias personalizadas), referenciad el fleet os-upgrade desde un repositorio independiente, lo que os permite añadir los cambios a los planes SUC según sea necesario.

Podéis ver un ejemplo de cómo se puede configurar un GitRepo para utilizar el fleet del repositorio suse-edge/fleet-examples aquí.

33.1.4.4.1.2 Creación de GitRepo - manual
  1. Extraed el recurso GitRepo:

    curl -o os-upgrade-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/gitrepos/day2/os-upgrade-gitrepo.yaml
  2. Editad la configuración de GitRepo, bajo spec.targets especificad vuestra lista de destino deseada. Por defecto, los recursos GitRepo del suse-edge/fleet-examples NO están asignados a ningún clúster en sentido descendente.

    • Para hacer coincidir todos los clústeres, cambiad el GitRepo target por defecto a:

      spec:
        targets:
        - clusterSelector: {}
    • Alternativamente, si deseas una selección de clústeres más granular, consulta Mapeo a clústeres en sentido descendente

  3. Aplica el recurso GitRepo en tu management cluster:

    kubectl apply -f os-upgrade-gitrepo.yaml
  4. Visualiza el recurso GitRepo creado bajo el espacio de nombres fleet-default:

    kubectl get gitrepo os-upgrade -n fleet-default
    
    # Example output
    NAME            REPO                                              COMMIT         BUNDLEDEPLOYMENTS-READY   STATUS
    os-upgrade      https://github.com/suse-edge/fleet-examples.git   release-3.6.1  0/0
33.1.4.4.2 Despliegue del plan SUC - Recurso Bundle

Un recurso Bundle, que incluye los OS SUC Plans necesarios, puede desplegarse de una de las siguientes maneras:

  1. A través del Rancher UI - Sección 33.1.4.4.2.1, “Creación de Bundle - Interfaz de usuario de Rancher” (cuando Rancher esté disponible).

  2. Mediante el despliegue manual (Sección 33.1.4.4.2.2, “Creación de bundle - manual”) del recurso en tu management cluster.

Una vez desplegado, para supervisar el proceso de actualización del SO de los nodos de tu clúster de destino, consulta Sección 18.3, “Monitorización de los planes del controlador de actualización del sistema”.

33.1.4.4.2.1 Creación de Bundle - Interfaz de usuario de Rancher

El equipo de Edge mantiene un bundle listo para usar que puede utilizarse en los pasos siguientes.

Importante
Importante

Utiliza siempre este bundle a partir de una etiqueta de release de Edge válida.

Para crear un bundle a través de la interfaz de usuario de Rancher:

  1. En la esquina superior izquierda, haz clic en ☰ → Continuous Delivery

  2. Ve a Avanzado > Bundles

  3. Selecciona Crear a partir de YAML

  4. Desde aquí puedes crear el Bundle de una de las siguientes maneras:

    Nota
    Nota

    Puede haber casos de uso en los que necesites incluir cambios personalizados en el SUC plans que incorpora el bundle (por ejemplo, para añadir tolerancias personalizadas). Asegúrate de incluir esos cambios en el bundle que se generará mediante los pasos siguientes.

    1. Copiando manualmente el contenido del bundle desde suse-edge/fleet-examples a la página Crear a partir de YAML.

    2. Clonando el repositorio suse-edge/fleet-examples desde la etiqueta de release deseada y seleccionando la opción Leer desde archivo en la página Crear a partir de YAML. Desde ahí, navega a la ubicación del bundle (bundles/day2/system-upgrade-controller-plans/os-upgrade) y selecciona el archivo del bundle. Esto rellenará automáticamente la página Crear a partir de YAML con el contenido del bundle.

  5. Cambia los clústeres target para el Bundle:

    • Para que coincida con todos los clústeres descendentes, cambia el .spec.targets del bundle predeterminado a:

      spec:
        targets:
        - clusterSelector: {}
    • Para obtener asignaciones de clústeres en sentido descendente más granulares, consulta Mapeo a clústeres en sentido descendente.

  6. Selecciona Crear

33.1.4.4.2.2 Creación de bundle - manual
  1. Obtén el recurso Bundle:

    curl -o os-upgrade-bundle.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/bundles/day2/system-upgrade-controller-plans/os-upgrade/os-upgrade-bundle.yaml
  2. Edita las configuraciones target del Bundle, y en spec.targets proporciona la lista de destinos deseada. Por defecto, los recursos Bundle del suse-edge/fleet-examples NO están asignados a ningún clúster descendente.

    • Para hacer coincidir todos los clústeres, cambia el Bundle target por defecto a:

      spec:
        targets:
        - clusterSelector: {}
    • Alternativamente, si deseas una selección de clústeres más granular, consulta Mapping to Downstream Clusters

  3. Aplica el recurso Bundle a tu management cluster:

    kubectl apply -f os-upgrade-bundle.yaml
  4. Visualiza el recurso Bundle creado en el espacio de nombres fleet-default:

    kubectl get bundles -n fleet-default
33.1.4.4.3 Despliegue del plan SUC: flujo de trabajo GitOps de terceros

Puede haber casos de uso en los que desees incorporar el OS SUC plans a tu propio flujo de trabajo GitOps de terceros (p. ej., Flux).

Para obtener los recursos de actualización del SO que necesitas, primero determina la etiqueta de release de Edge del repositorio suse-edge/fleet-examples que desees utilizar.

Después de eso, los recursos se pueden encontrar en fleets/day2/system-upgrade-controller-plans/os-upgrade, donde:

  • plan-control-plane.yaml es un recurso de plan SUC para nodos de control-plane.

  • plan-worker.yaml es un recurso de plan SUC para nodos worker.

  • secret.yaml es un Secret que contiene el script upgrade.sh, el cual es responsable de crear el systemd.service (Sección 33.1.4.1.1, “systemd.service”).

  • config-map.yaml es un ConfigMap que contiene la configuración que consume el script upgrade.sh.

Importante
Importante

Estos recursos Plan son interpretados por el System Upgrade Controller y deben desplegarse en cada clúster descendente que desees actualizar. Para obtener información sobre el despliegue de SUC, consulta Sección 18.2, “Instalación del controlador de actualización del sistema”.

Para comprender mejor cómo puede utilizar tu flujo de trabajo GitOps para desplegar los SUC Plans para la actualización del SO, puede resultar útil echar un vistazo a visión general (Sección 33.1.4.2, “Descripción general”).

33.1.5 Actualización de la versión de Kubernetes

Importante
Importante

Esta sección cubre las actualizaciones de Kubernetes para clústeres descendentes que NO se han creado a través de una instancia de Rancher (Capítulo 4, Rancher). Para obtener información sobre cómo actualizar la versión de Kubernetes de los clústeres creados por Rancher, consultad Actualización y reversión de Kubernetes.

Esta sección describe cómo realizar una actualización de Kubernetes utilizando Capítulo 6, Fleet y Capítulo 18, Controlador de actualización del sistema.

Los siguientes temas se tratan como parte de esta sección:

  1. Sección 33.1.5.1, “Componentes” - componentes adicionales utilizados por el proceso de actualización.

  2. Sección 33.1.5.2, “Descripción general” - visión general del proceso de actualización.

  3. Sección 33.1.5.3, “Requisitos” - requisitos del proceso de actualización.

  4. Sección 33.1.5.4, “Actualización de K8s - Ampliación del plan SUC” - información sobre cómo desplegar SUC plans, responsable de activar el proceso de actualización.

33.1.5.1 Componentes

Esta sección cubre los componentes personalizados que utiliza el proceso K8s upgrade sobre los componentes (Sección 33.1.1, “Componentes”) predeterminados del "Día 2".

33.1.5.1.1 rke2-upgrade

Imagen de contenedor responsable de actualizar la versión de RKE2 de un nodo específico.

Distribuida a través de un Pod creado por SUC basado en un Plan SUC. El Plan debe estar ubicado en cada clúster que necesite una actualización de RKE2.

Para obtener más información sobre cómo la imagen rke2-upgrade realiza la actualización, consultad la documentación de sentido ascendente.

33.1.5.1.2 k3s-upgrade

Imagen de contenedor responsable de actualizar la versión de K3s de un nodo específico.

Distribuida a través de un Pod creado por SUC basado en un Plan SUC. El Plan debe estar ubicado en cada clúster que necesite una actualización de K3s.

Para obtener más información sobre cómo la imagen k3s-upgrade realiza la actualización, consultad la documentación de sentido ascendente.

33.1.5.2 Descripción general

La actualización de la distribución de Kubernetes para los nodos del clúster downstream se realiza utilizando Fleet y System Upgrade Controller (SUC).

Fleet se utiliza para desplegar y gestionar SUC plans en el clúster deseado.

Nota
Nota

SUC plans son recursos personalizados que describen los pasos que SUC debe seguir para que se ejecute una tarea específica en un conjunto de nodos. Para ver un ejemplo de cómo es un SUC plan, consultad el repositorio de sentido ascendente.

Los K8s SUC plans se distribuyen en cada clúster desplegando un recurso GitRepo o Bundle en un espacio de trabajo de Fleet específico. Fleet recupera el GitRepo/Bundle desplegado y despliega su contenido (el K8s SUC plans) en el clúster o clústeres deseados.

Nota
Nota

Los recursos GitRepo/Bundle se despliegan siempre en el management cluster. El uso de un recurso GitRepo o Bundle depende de su caso de uso; consulte Sección 33.1.2, “Determinad vuestro caso de uso” para obtener más información.

K8s SUC plans describen el siguiente flujo de trabajo:

  1. Acordonad siempre los nodos antes de actualizar la versión de K8s.

  2. Actualizad siempre los nodos control-plane antes que los nodos worker.

  3. Actualizad siempre los nodos control-plane de uno en uno y los nodos worker de dos en dos.

Una vez desplegados los K8s SUC plans, el flujo de trabajo es el siguiente:

  1. SUC reconcilia el K8s SUC plans desplegado y crea un Kubernetes Job en cada nodo.

  2. Dependiendo de la distribución de Kubernetes, el Job creará un Pod que ejecute la imagen de contenedor rke2-upgrade (Sección 33.1.5.1.1, “rke2-upgrade”) o k3s-upgrade (Sección 33.1.5.1.2, “k3s-upgrade”).

  3. El Pod creado seguirá el siguiente flujo de trabajo:

    1. Reemplazad el binario rke2/k3s existente en el nodo por el de la imagen rke2-upgrade/k3s-upgrade.

    2. Matad el proceso rke2/k3s en ejecución.

  4. Matar el proceso rke2/k3s provoca un reinicio, lo que lanza un nuevo proceso que ejecuta el binario actualizado, dando lugar a una versión de distribución de Kubernetes actualizada.

A continuación podéis encontrar un diagrama de la descripción anterior:

fleet day2 downstream k8s upgrade

33.1.5.3 Requisitos

  1. Haced una copia de seguridad de vuestra distribución de Kubernetes:

    1. Para clústeres RKE2, consultad la documentación de copia de seguridad y restauración de RKE2.

    2. Para clústeres K3s, consultad la documentación de copia de seguridad y restauración de K3s.

  2. Aseguraos de que las tolerancias del Plan SUC coincidan con las tolerancias del nodo - Si los nodos de vuestro clúster de Kubernetes tienen taints personalizados, aseguraos de añadir tolerancias para esas taints en los Planes SUC. Por defecto, los Planes SUC solo tienen tolerancias para los nodos del plano de control. Las tolerancias predeterminadas incluyen:

    • CriticalAddonsOnly=true:NoExecute

    • node-role.kubernetes.io/control-plane:NoSchedule

    • node-role.kubernetes.io/etcd:NoExecute

      Nota
      Nota

      Cualquier tolerancia adicional debe añadirse en la sección .spec.tolerations de cada Plan. Los Planes SUC relacionados con la actualización de versión de Kubernetes se pueden encontrar en el repositorio suse-edge/fleet-examples en:

      • Para RKE2 - fleets/day2/system-upgrade-controller-plans/rke2-upgrade

      • Para K3s - fleets/day2/system-upgrade-controller-plans/k3s-upgrade

      Aseguraos de utilizar los Planes de una etiqueta de versión de repositorio válida.

      Un ejemplo de cómo definir tolerancias personalizadas para el Plan SUC del plano de control de RKE2 tendría este aspecto:

      apiVersion: upgrade.cattle.io/v1
      kind: Plan
      metadata:
        name: rke2-upgrade-control-plane
      spec:
        ...
        tolerations:
        # default tolerations
        - key: "CriticalAddonsOnly"
          operator: "Equal"
          value: "true"
          effect: "NoExecute"
        - key: "node-role.kubernetes.io/control-plane"
          operator: "Equal"
          effect: "NoSchedule"
        - key: "node-role.kubernetes.io/etcd"
          operator: "Equal"
          effect: "NoExecute"
        # custom toleration
        - key: "foo"
          operator: "Equal"
          value: "bar"
          effect: "NoSchedule"
      ...

33.1.5.4 Actualización de K8s - Ampliación del plan SUC

Importante
Importante

Para entornos actualizados previamente mediante este procedimiento, los usuarios deben asegurarse de que se completa uno de los siguientes pasos:

  • Remove any previously deployed SUC Plans related to older Edge release versions from the downstream cluster - se puede hacer eliminando el clúster deseado de la GitRepo/Bundle configuración de destino existente, o eliminando el recurso GitRepo/Bundle por completo.

  • Reuse the existing GitRepo/Bundle resource - se puede hacer apuntando la revisión del recurso a una nueva etiqueta que contenga las flotas correctas para la suse-edge/fleet-examples versión deseada.

Esto se hace para evitar conflictos entre SUC Plans para versiones de lanzamiento de Edge más antiguas.

Si los usuarios intentan actualizar mientras existen SUC Plans en el clúster downstream, verán el siguiente error de flota:

Not installed: Unable to continue with install: Plan <plan_name> in namespace <plan_namespace> exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error..

Como se menciona en Sección 33.1.5.2, “Descripción general”, las actualizaciones de Kubernetes se realizan enviando SUC plans al clúster deseado a través de una de las siguientes formas:

Para determinar qué recurso debéis utilizar, consultad Sección 33.1.2, “Determinad vuestro caso de uso”.

Para casos de uso en los que deseéis desplegar el K8s SUC plans desde una herramienta GitOps de terceros, consultad Sección 33.1.5.4.3, “Ampliación del plan SUC: flujo de trabajo GitOps de terceros”

33.1.5.4.1 Ampliación del plan SUC - recurso GitRepo

Se puede desplegar un recurso GitRepo, que envía los K8s SUC plans necesarios, de una de las siguientes maneras:

  1. A través de Rancher UI - Sección 33.1.5.4.1.1, “Creación de GitRepo - Interfaz de usuario de Rancher” (cuando Rancher esté disponible).

  2. Mediante el despliegue manual (Sección 33.1.5.4.1.2, “Creación de GitRepo - manual”) del recurso en vuestro management cluster.

Una vez desplegado, para supervisar el proceso de actualización de Kubernetes de los nodos de vuestro clúster de destino, consultad Sección 18.3, “Monitorización de los planes del controlador de actualización del sistema”.

33.1.5.4.1.1 Creación de GitRepo - Interfaz de usuario de Rancher

Para crear un recurso GitRepo a través de la interfaz de usuario de Rancher, seguid su documentación oficial.

El equipo de Edge mantiene flotas listas para usar tanto para las distribuciones de Kubernetes rke2 como k3s. Dependiendo de vuestro entorno, esta flota podría utilizarse directamente o como plantilla.

Importante
Importante

Utilizad siempre estas flotas a partir de una etiqueta de versión de Edge válida.

Para casos de uso en los que no sea necesario incluir cambios personalizados en los SUC plans que envían estas flotas, los usuarios pueden referenciar directamente las flotas desde el repositorio suse-edge/fleet-examples.

En los casos en los que se necesiten cambios personalizados (p. ej., para añadir tolerancias personalizadas), los usuarios deben referenciar las flotas desde un repositorio independiente, lo que les permite añadir los cambios a los planes de SUC según sea necesario.

Ejemplos de configuración para un recurso GitRepo utilizando las flotas del repositorio suse-edge/fleet-examples:

33.1.5.4.1.2 Creación de GitRepo - manual
  1. Obtened el recurso GitRepo:

    • Para clústeres RKE2:

      curl -o rke2-upgrade-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/gitrepos/day2/rke2-upgrade-gitrepo.yaml
    • Para clústeres K3s:

      curl -o k3s-upgrade-gitrepo.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/gitrepos/day2/k3s-upgrade-gitrepo.yaml
  2. Editad la configuración del GitRepo y, en spec.targets, especificad vuestra lista de destino deseada. Por defecto, los recursos GitRepo del suse-edge/fleet-examples NO están asignados a ningún clúster de sentido descendente.

    • Para hacer coincidir todos los clústeres, cambiad el GitRepo target por defecto a:

      spec:
        targets:
        - clusterSelector: {}
    • Alternativamente, si deseáis una selección de clústeres más granular, consultad Mapping to Downstream Clusters

  3. Aplicad los recursos GitRepo a vuestro management cluster:

    # RKE2
    kubectl apply -f rke2-upgrade-gitrepo.yaml
    
    # K3s
    kubectl apply -f k3s-upgrade-gitrepo.yaml
  4. Visualizad el recurso GitRepo creado en el espacio de nombres fleet-default:

    # RKE2
    kubectl get gitrepo rke2-upgrade -n fleet-default
    
    # K3s
    kubectl get gitrepo k3s-upgrade -n fleet-default
    
    # Example output
    NAME           REPO                                              COMMIT          BUNDLEDEPLOYMENTS-READY   STATUS
    k3s-upgrade    https://github.com/suse-edge/fleet-examples.git   fleet-default   0/0
    rke2-upgrade   https://github.com/suse-edge/fleet-examples.git   fleet-default   0/0
33.1.5.4.2 Ampliación del plan SUC - Recurso Bundle

Un recurso Bundle, que incluye los Kubernetes upgrade SUC Plans necesarios, puede desplegarse de una de las siguientes maneras:

  1. A través de Rancher UI - Sección 33.1.5.4.2.1, “Creación de Bundle - Interfaz de usuario de Rancher” (cuando Rancher esté disponible).

  2. Mediante el despliegue manual (Sección 33.1.5.4.2.2, “Creación de bundle - manual”) del recurso en vuestro management cluster.

Una vez desplegado, para supervisar el proceso de actualización de Kubernetes de los nodos de vuestro clúster de destino, consultad Sección 18.3, “Monitorización de los planes del controlador de actualización del sistema”.

33.1.5.4.2.1 Creación de Bundle - Interfaz de usuario de Rancher

El equipo de Edge mantiene bundles listos para usar tanto para las distribuciones de Kubernetes rke2 como k3s. Dependiendo de vuestro entorno, estos bundles podrían utilizarse directamente o como plantilla.

Importante
Importante

Utilizad siempre este bundle a partir de una etiqueta de release de Edge válida.

Para crear un bundle a través de la interfaz de usuario de Rancher:

  1. En la esquina superior izquierda, haced clic en ☰ → Entrega Continua

  2. Id a Advanced > Bundles

  3. Seleccionad Create from YAML

  4. Desde aquí podéis crear el Bundle de una de las siguientes maneras:

    Nota
    Nota

    Puede haber casos de uso en los que necesitéis incluir cambios personalizados en los SUC plans que el bundle incluye (p. ej., para añadir tolerancias personalizadas). Aseguraos de incluir esos cambios en el bundle que se generará mediante los siguientes pasos.

    1. Copiando manualmente el contenido del bundle para RKE2 o K3s desde suse-edge/fleet-examples a la página Create from YAML.

    2. Clonando el repositorio suse-edge/fleet-examples desde la release deseada y seleccionando la opción Read from File en la página Create from YAML. Desde allí, navegad hasta el bundle que necesitéis (bundles/day2/system-upgrade-controller-plans/rke2-upgrade/plan-bundle.yaml para RKE2 y bundles/day2/system-upgrade-controller-plans/k3s-upgrade/plan-bundle.yaml para K3s). Esto rellenará automáticamente la página Create from YAML con el contenido del bundle.

  5. Cambiad los clústeres target para el Bundle:

    • Para que coincida con todos los clústeres de sentido descendente, cambiad el .spec.targets del Bundle predeterminado a:

      spec:
        targets:
        - clusterSelector: {}
    • Para asignaciones de clústeres de sentido descendente más granulares, consultad Mapping to Downstream Clusters.

  6. Seleccionad Crear

33.1.5.4.2.2 Creación de bundle - manual
  1. Obtened los recursos del Bundle:

    • Para clústeres RKE2:

      curl -o rke2-plan-bundle.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/bundles/day2/system-upgrade-controller-plans/rke2-upgrade/plan-bundle.yaml
    • Para clústeres K3s:

      curl -o k3s-plan-bundle.yaml https://raw.githubusercontent.com/suse-edge/fleet-examples/refs/tags/release-3.6.1/bundles/day2/system-upgrade-controller-plans/k3s-upgrade/plan-bundle.yaml
  2. Editad las configuraciones Bundle target, bajo spec.targets proporcionad vuestra lista de destino deseada. Por defecto, los recursos Bundle del suse-edge/fleet-examples NO están asignados a ningún clúster de sentido descendente.

    • Para hacer coincidir todos los clústeres, cambiad el Bundle target por defecto a:

      spec:
        targets:
        - clusterSelector: {}
    • Alternativamente, si deseáis una selección de clústeres más granular, consultad Mapping to Downstream Clusters

  3. Aplicad los recursos del Bundle a vuestro management cluster:

    # For RKE2
    kubectl apply -f rke2-plan-bundle.yaml
    
    # For K3s
    kubectl apply -f k3s-plan-bundle.yaml
  4. Visualizad el recurso Bundle creado en el espacio de nombres fleet-default:

    # For RKE2
    kubectl get bundles rke2-upgrade -n fleet-default
    
    # For K3s
    kubectl get bundles k3s-upgrade -n fleet-default
    
    # Example output
    NAME           BUNDLEDEPLOYMENTS-READY   STATUS
    k3s-upgrade    0/0
    rke2-upgrade   0/0
33.1.5.4.3 Ampliación del plan SUC: flujo de trabajo GitOps de terceros

Puede haber casos de uso en los que los usuarios deseen incorporar el Kubernetes upgrade SUC plans a su propio flujo de trabajo GitOps de terceros (p. ej., Flux).

Para obtener los recursos de actualización de K8s que necesitáis, determinad primero la etiqueta de release de Edge del repositorio suse-edge/fleet-examples que deseáis utilizar.

Después de eso, los recursos se pueden encontrar en:

  • Para una actualización de clúster RKE2:

    • Para nodos control-plane - fleets/day2/system-upgrade-controller-plans/rke2-upgrade/plan-control-plane.yaml

    • Para nodos worker - fleets/day2/system-upgrade-controller-plans/rke2-upgrade/plan-worker.yaml

  • Para una actualización de clúster K3s:

    • Para nodos control-plane - fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-control-plane.yaml

    • Para nodos worker - fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-worker.yaml

Importante
Importante

Estos recursos Plan son interpretados por el System Upgrade Controller y deben desplegarse en cada clúster de sentido descendente que deseéis actualizar. Para obtener información sobre la ampliación de SUC, consultad Sección 18.2, “Instalación del controlador de actualización del sistema”.

Para comprender mejor cómo podéis utilizar vuestro flujo de trabajo de GitOps para implementar los planes de SUC para la actualización de la versión de Kubernetes, puede resultar útil echar un vistazo a la descripción general (Sección 33.1.5.2, “Descripción general”) del procedimiento de actualización utilizando Fleet.

33.1.6 Actualización de Helm chart

Esta sección trata las siguientes partes:

  1. Sección 33.1.6.1, “Preparación para entornos aislados” - contiene información sobre cómo enviar gráficos e imágenes OCI relacionados con Edge a su registro privado.

  2. Sección 33.1.6.2, “Procedimiento de actualización” - contiene información sobre diferentes casos de uso de actualización de gráficos de Helm y su procedimiento de actualización.

33.1.6.1 Preparación para entornos aislados

33.1.6.1.1 Asegúrese de tener acceso a su Fleet de gráficos de Helm

Dependiendo de lo que admita su entorno, puede elegir una de las siguientes opciones:

  1. Aloje los recursos de Fleet de su gráfico en un servidor Git local al que pueda acceder su management cluster.

  2. Utilizad la CLI de Fleet para convertir un Helm chart en un Bundle que podáis usar directamente sin necesidad de alojarlo en otro sitio. La CLI de Fleet se puede obtener en su página de lanzamientos; para usuarios de Mac, existe una fleet-cli Homebrew Formulae.

33.1.6.1.2 Busque los activos necesarios para su versión de lanzamiento de Edge
  1. Vaya a la página de lanzamiento de «Día 2», busque el lanzamiento de Edge al que desea actualizar su gráfico y haga clic en Activos.

  2. Desde la sección «Activos», descargue los siguientes archivos:

    Archivo de lanzamiento

    Descripción

    edge-save-images.sh

    Extrae las imágenes especificadas en el archivo edge-release-images.txt y las empaqueta dentro de un archivo '.tar.gz'.

    edge-save-oci-artefacts.sh

    Extrae las imágenes de gráfico OCI relacionadas con la versión específica de Edge y las empaqueta dentro de un archivo '.tar.gz'.

    edge-load-images.sh

    Carga imágenes desde un archivo '.tar.gz', las vuelve a etiquetar y las envía a un registro privado.

    edge-load-oci-artefacts.sh

    Toma un directorio que contiene paquetes de gráfico OCI '.tgz' de Edge y los carga en un registro privado.

    edge-release-helm-oci-artefacts.txt

    Contiene una lista de imágenes de gráfico OCI relacionadas con una versión específica de Edge.

    edge-release-images.txt

    Contiene una lista de imágenes relacionadas con una versión específica de Edge.

33.1.6.1.3 Cread el archivo de imágenes de la versión de Edge

En una máquina con acceso a internet:

  1. Haced que edge-save-images.sh sea ejecutable:

    chmod +x edge-save-images.sh
  2. Generad el archivo de imagen:

    ./edge-save-images.sh --source-registry registry.suse.com
  3. Esto creará un archivo listo para cargar llamado edge-images.tar.gz.

    Nota
    Nota

    Si se especifica la opción -i|--images, el nombre del archivo puede variar.

  4. Copiad este archivo a vuestra máquina air-gapped:

    scp edge-images.tar.gz <user>@<machine_ip>:/path
33.1.6.1.4 Cread el archivo de imágenes de gráfico OCI de Edge

En una máquina con acceso a internet:

  1. Haced que edge-save-oci-artefacts.sh sea ejecutable:

    chmod +x edge-save-oci-artefacts.sh
  2. Generad el archivo de imagen de gráfico OCI:

    ./edge-save-oci-artefacts.sh --source-registry registry.suse.com
  3. Esto creará un archivo llamado oci-artefacts.tar.gz.

    Nota
    Nota

    Si se especifica la opción -a|--archive, el nombre del archivo puede variar.

  4. Copiad este archivo a vuestra máquina air-gapped:

    scp oci-artefacts.tar.gz <user>@<machine_ip>:/path
33.1.6.1.5 Cargad las imágenes de la versión de Edge en vuestra máquina en entorno aislado.

En vuestra máquina en entorno aislado:

  1. Iniciad sesión en vuestro registro privado (si es necesario):

    podman login <REGISTRY.YOURDOMAIN.COM:PORT>
  2. Haced que edge-load-images.sh sea ejecutable:

    chmod +x edge-load-images.sh
  3. Ejecutad el script, pasando el archivo edge-images.tar.gz que fue copiado anteriormente:

    ./edge-load-images.sh --source-registry registry.suse.com --registry <REGISTRY.YOURDOMAIN.COM:PORT> --images edge-images.tar.gz
    Nota
    Nota

    Esto cargará todas las imágenes desde edge-images.tar.gz, las volverá a etiquetar y las enviará al registro especificado en la opción --registry.

33.1.6.1.6 Cargad las imágenes del gráfico Edge OCI en vuestra máquina en entorno aislado.

En vuestra máquina en entorno aislado:

  1. Iniciad sesión en vuestro registro privado (si es necesario):

    podman login <REGISTRY.YOURDOMAIN.COM:PORT>
  2. Haced que edge-load-oci-artefacts.sh sea ejecutable:

    chmod +x edge-load-oci-artefacts.sh
  3. Desempaquetad el archivo oci-artefacts.tar.gz copiado:

    tar -xvf oci-artefacts.tar.gz
  4. Esto producirá un directorio con la plantilla de nomenclatura edge-release-oci-tgz-<date>

  5. Pasad este directorio al script edge-load-oci-artefacts.sh para cargar las imágenes del gráfico Edge OCI en vuestro registro privado:

    Nota
    Nota

    Este script asume que la CLI de helm ha sido preinstalada en vuestro entorno. Para obtener instrucciones sobre la instalación de Helm, consultad Instalación de Helm.

    ./edge-load-oci-artefacts.sh --archive-directory edge-release-oci-tgz-<date> --registry <REGISTRY.YOURDOMAIN.COM:PORT> --source-registry registry.suse.com
33.1.6.1.7 Configurad vuestro registro privado en vuestra distribución de Kubernetes

Para RKE2, consultad Configuración de registro privado.

Para K3s, consultad Configuración de registro privado.

33.1.6.2 Procedimiento de actualización

Esta sección se centra en los siguientes casos de uso del procedimiento de actualización de Helm:

Importante
Importante

Los gráficos de Helm desplegados manualmente no se pueden actualizar de forma fiable. Sugerimos volver a desplegar el gráfico de Helm utilizando el método Sección 33.1.6.2.1, “Tengo un nuevo clúster y me gustaría desplegar y gestionar un Helm chart de Edge”.

33.1.6.2.1 Tengo un nuevo clúster y me gustaría desplegar y gestionar un Helm chart de Edge

Esta sección cubre cómo:

33.1.6.2.1.1 Preparad los recursos de Fleet para vuestro Helm chart
  1. Adquirid los recursos de Fleet de vuestro Helm chart desde la etiqueta de lanzamiento de Edge que deseéis utilizar.

  2. Navegad hasta el Fleet de vuestro Helm chart (fleets/day2/chart-templates/<chart>)

  3. Si tenéis la intención de utilizar un flujo de trabajo GitOps, copiad el directorio Fleet del Helm chart al repositorio Git desde donde realizaréis GitOps.

  4. Opcionalmente, si el Helm chart requiere configuraciones en sus valores, editad la configuración .helm.values dentro del archivo fleet.yaml del directorio copiado.

  5. Opcionalmente, puede haber casos de uso en los que necesitéis añadir recursos adicionales a la flota de vuestro gráfico para que se adapte mejor a vuestro entorno. Para obtener información sobre cómo mejorar vuestro directorio de Fleet, consultad Contenido del repositorio Git.

Nota
Nota

En algunos casos, el tiempo de espera predeterminado que utiliza Fleet para las operaciones de Helm puede ser insuficiente, lo que da lugar al siguiente error:

failed pre-install: context deadline exceeded

En tales casos, añadid la propiedad timeoutSeconds bajo la configuración helm de vuestro archivo fleet.yaml.

Un ejemplo para el Helm chart longhorn sería así:

  • Estructura del repositorio Git del usuario:

    <user_repository_root>
    ├── longhorn
    │   └── fleet.yaml
    └── longhorn-crd
        └── fleet.yaml
  • Contenido de fleet.yaml poblado con datos de usuario Longhorn:

    defaultNamespace: longhorn-system
    
    helm:
      # timeoutSeconds: 10
      releaseName: "longhorn"
      chart: "longhorn"
      repo: "https://charts.rancher.io/"
      version: "1.11.2"
      takeOwnership: true
      # custom chart value overrides
      values:
        # Example for user provided custom values content
        defaultSettings:
          deletingConfirmationFlag: true
    
    # https://fleet.rancher.io/bundle-diffs
    diff:
      comparePatches:
      - apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        name: engineimages.longhorn.io
        operations:
        - {"op":"remove", "path":"/status/conditions"}
        - {"op":"remove", "path":"/status/storedVersions"}
        - {"op":"remove", "path":"/status/acceptedNames"}
      - apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        name: nodes.longhorn.io
        operations:
        - {"op":"remove", "path":"/status/conditions"}
        - {"op":"remove", "path":"/status/storedVersions"}
        - {"op":"remove", "path":"/status/acceptedNames"}
      - apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        name: volumes.longhorn.io
        operations:
        - {"op":"remove", "path":"/status/conditions"}
        - {"op":"remove", "path":"/status/storedVersions"}
        - {"op":"remove", "path":"/status/acceptedNames"}
    Nota
    Nota

    Estos son solo valores de ejemplo que se utilizan para ilustrar configuraciones personalizadas sobre el Helm chart longhorn. NO deben tratarse como directrices de despliegue para el Helm chart longhorn.

33.1.6.2.1.2 Desplegad la flota para vuestro Helm chart

Podéis desplegar la flota para vuestro Helm chart utilizando un GitRepo (Sección 33.1.6.2.1.2.1, “GitRepo”) o un Bundle (Sección 33.1.6.2.1.2.2, “Bundle”).

Nota
Nota

Al desplegar vuestra flota, si recibís un mensaje de Modified, aseguraos de añadir la entrada comparePatches correspondiente a la sección diff de la flota. Para más información, consultad Generación de diferencias para ignorar GitRepos modificados.

33.1.6.2.1.2.1 GitRepo

El recurso GitRepo de Fleet contiene información sobre cómo acceder a los recursos de flota de vuestro Helm chart y a qué clústeres debe aplicar dichos recursos.

El recurso GitRepo puede desplegarse a través de la interfaz de usuario de Rancher, o manualmente, desplegando el recurso en management cluster.

Ejemplo de recurso Longhorn GitRepo para despliegue manual:

apiVersion: fleet.cattle.io/v1alpha1
kind: GitRepo
metadata:
  name: longhorn-git-repo
  namespace: fleet-default
spec:
  # If using a tag
  # revision: user_repository_tag
  #
  # If using a branch
  # branch: user_repository_branch
  paths:
  # As seen in the 'Prepare your Fleet resources' example
  - longhorn
  - longhorn-crd
  repo: user_repository_url
  targets:
  # Match all clusters
  - clusterSelector: {}
33.1.6.2.1.2.2 Bundle

Los recursos Bundle contienen los recursos brutos de Kubernetes que deben ser desplegados por Fleet. Normalmente se recomienda utilizar el enfoque GitRepo, pero para casos de uso en los que el entorno sea aislado y no pueda admitir un servidor Git local, Bundles puede ayudaros a propagar vuestro Helm chart con Fleet a vuestros clústeres de destino.

Un Bundle puede desplegarse a través de la interfaz de usuario de Rancher (Continuous Delivery → Advanced → Bundles → Create from YAML) o desplegando manualmente el recurso Bundle en el espacio de nombres de Fleet correcto. Para obtener información sobre los espacios de nombres de Fleet, consulte la documentación original.

Se pueden crear Bundles para los Helm charts de Edge utilizando el enfoque Convertir un Helm chart en un Bundle de Fleet.

A continuación, podéis encontrar un ejemplo sobre cómo crear un recurso Bundle a partir de las plantillas de Fleet de los Helm charts longhorn y longhorn-crd, y desplegad manualmente este Bundle en vuestro management cluster.

Nota
Nota

Para ilustrar el flujo de trabajo, el siguiente ejemplo utiliza la estructura de directorio suse-edge/fleet-examples.

  1. Navegad hasta la plantilla de Fleet del Helm chart longhorn:

    cd fleets/day2/chart-templates/longhorn/longhorn
  2. Cread un archivo targets.yaml que indique a Fleet en qué clústeres debe desplegar el Helm chart:

    cat > targets.yaml <<EOF
    targets:
    # Matches all downstream clusters
    - clusterSelector: {}
    EOF

    Para una selección de clústeres en sentido descendente más granular, consultad Asignación a clústeres en sentido descendente.

  3. Convierta el recurso Fleet del gráfico de Helm Longhorn en un recurso Bundle utilizando la fleet-cli.

    Nota
    Nota

    La CLI de Fleet se puede obtener desde su página de lanzamientos Assets (fleet-linux-amd64).

    Para los usuarios de Mac, existe una fórmula de Homebrew para fleet-cli.

    fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - longhorn-bundle > longhorn-bundle.yaml
  4. Navegue hasta la plantilla de Fleet del gráfico longhorn-crd:

    cd fleets/day2/chart-templates/longhorn/longhorn-crd
  5. Cree un archivo targets.yaml que indique a Fleet en qué clústeres debe desplegar el gráfico de Helm:

    cat > targets.yaml <<EOF
    targets:
    # Matches all downstream clusters
    - clusterSelector: {}
    EOF
  6. Convierta el recurso Fleet del gráfico de Helm Longhorn CRD en un recurso Bundle utilizando la fleet-cli.

    fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - longhorn-crd-bundle > longhorn-crd-bundle.yaml
  7. Despliegue los archivos longhorn-bundle.yaml y longhorn-crd-bundle.yaml en su management cluster:

    kubectl apply -f longhorn-crd-bundle.yaml
    kubectl apply -f longhorn-bundle.yaml

Seguir estos pasos garantizará que SUSE Storage se despliegue en todos los downstream clústeres especificados.

33.1.6.2.1.3 Gestionar el gráfico de Helm desplegado

Una vez desplegado con Fleet, para las actualizaciones del gráfico de Helm, consulte Sección 33.1.6.2.2, “Me gustaría actualizar un gráfico de Helm gestionado por Fleet”.

33.1.6.2.2 Me gustaría actualizar un gráfico de Helm gestionado por Fleet
  1. Determine la versión a la que necesita actualizar su gráfico para que sea compatible con la versión de Edge deseada. La versión del gráfico de Helm por versión de Edge se puede consultar en las notas de la versión (Capítulo 41, Notas de la versión).

  2. En su repositorio Git supervisado por Fleet, edite el archivo fleet.yaml del gráfico de Helm con la versión y el repositorio correctos de las notas de la versión (Capítulo 41, Notas de la versión).

  3. Tras confirmar y enviar los cambios a su repositorio, esto activará una actualización del gráfico de Helm deseado.

33.1.6.2.3 Me gustaría actualizar un gráfico de Helm desplegado a través de EIB.

Capítulo 8, Edge Image Builder despliega gráficos de Helm creando un recurso HelmChart y utilizando el helm-controller introducido por la función de integración de Helm de RKE2/K3s.

Para garantizar que un gráfico de Helm desplegado a través de EIB se actualice correctamente, los usuarios deben realizar una actualización sobre los recursos HelmChart respectivos.

A continuación, puede encontrar información sobre:

33.1.6.2.3.1 Descripción general

Los gráficos de Helm que se despliegan a través de EIB se actualizan mediante un fleet llamado eib-charts-upgrader.

Este fleet procesa datos proporcionados por el usuario para actualizar un conjunto específico de recursos HelmChart.

La actualización de estos recursos activa el helm-controller, que actualiza la versión de los gráficos de Helm asociados con los recursos HelmChart modificados.

Solo se espera que el usuario:

  1. Localmente, extraed los archivos comprimidos para cada gráfico de Helm que deba actualizarse.

  2. Pasad estos archivos al script generate-chart-upgrade-data.sh generate-chart-upgrade-data.sh, que incluirá los datos de estos archivos en la flota eib-charts-upgrader.

  3. Desplegad la flota eib-charts-upgrader en vuestro management cluster. Esto se realiza a través de un recurso GitRepo o Bundle.

Una vez desplegado, el eib-charts-upgrader, con la ayuda de Fleet, enviará sus recursos al clúster downstream deseado.

Estos recursos incluyen:

  1. Un conjunto de Secrets que contiene los datos del gráfico de Helm proporcionados por el usuario.

  2. Un Kubernetes Job que desplegará un Pod que montará los Secrets mencionados anteriormente y, basándose en ellos, parcheará los recursos de HelmChart correspondientes.

Como se mencionó anteriormente, esto activará el helm-controller que realizará la actualización real del gráfico de Helm.

A continuación podéis encontrar un diagrama de la descripción anterior:

fleet day2 downstream helm eib upgrade
33.1.6.2.3.2 Pasos de actualización
  1. Clonad el repositorio suse-edge/fleet-examples desde la etiqueta de la versión correcta.

  2. Cread un directorio en el que almacenaréis el/los archivo(s) comprimido(s) del gráfico de Helm descargado(s).

    mkdir archives
  3. Dentro del directorio de archivos comprimidos recién creado, descargad el/los archivo(s) comprimido(s) para el/los gráfico(s) de Helm que deseéis actualizar:

    cd archives
    helm pull [chart URL | repo/chartname]
    
    # Alternatively if you want to pull a specific version:
    # helm pull [chart URL | repo/chartname] --version 0.0.0
  4. Desde Assets de la etiqueta de versión deseada, descargad el script generate-chart-upgrade-data.sh.

  5. Ejecutad el script generate-chart-upgrade-data.sh:

    chmod +x ./generate-chart-upgrade-data.sh
    
    ./generate-chart-upgrade-data.sh --archive-dir /foo/bar/archives/ --fleet-path /foo/bar/fleet-examples/fleets/day2/eib-charts-upgrader

    Para cada archivo de gráfico en el directorio --archive-dir, el script genera un archivo Kubernetes Secret YAML que contiene los datos de actualización del gráfico y los almacena en el directorio base/secrets de la flota especificada por --fleet-path.

    El script generate-chart-upgrade-data.sh también aplica modificaciones adicionales a la flota para garantizar que los archivos Kubernetes Secret YAML generados sean utilizados correctamente por la carga de trabajo desplegada por la flota.

    Importante
    Importante

    Los usuarios no deben realizar cambios sobre lo que genera el script generate-chart-upgrade-data.sh.

Los pasos siguientes dependen del entorno en el que estéis ejecutando:

  1. Para un entorno que admita GitOps (por ejemplo, que no esté aislado o que esté aislado, pero permita el soporte de un servidor Git local):

    1. Copiad la flota fleets/day2/eib-charts-upgrader al repositorio que utilizaréis para GitOps.

      Nota
      Nota

      Aseguraos de que la flota incluya los cambios realizados por el script generate-chart-upgrade-data.sh.

    2. Configurad un recurso GitRepo que se utilizará para enviar todos los recursos de la flota eib-charts-upgrader.

      1. Para la configuración y el despliegue de GitRepo a través de la interfaz de usuario de Rancher, consultad Acceso a Fleet en la interfaz de usuario de Rancher.

      2. Para la configuración y el despliegue manual de GitRepo, consultad Creación de un despliegue.

  2. Para un entorno que no admita GitOps (por ejemplo, que sea un entorno aislado y no permita el uso de un servidor Git local):

    1. Descargad el binario fleet-cli desde la página rancher/fleet release (fleet-linux-amd64 para Linux). Para los usuarios de Mac, existe una fórmula de Homebrew que se puede utilizar: fleet-cli.

    2. Navegad a eib-charts-upgrader Fleet:

      cd /foo/bar/fleet-examples/fleets/day2/eib-charts-upgrader
    3. Cread un archivo targets.yaml que indique a Fleet dónde desplegar vuestros recursos:

      cat > targets.yaml <<EOF
      targets:
      # To match all downstream clusters
      - clusterSelector: {}
      EOF

      Para obtener información sobre cómo asignar clústeres de destino, consultad la documentación original.

    4. Utilizad fleet-cli para convertir Fleet en un recurso Bundle:

      fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - eib-charts-upgrade > bundle.yaml

      Esto creará un Bundle (bundle.yaml) que contendrá todos los recursos con plantilla del Fleet eib-charts-upgrader.

      Para obtener más información sobre el comando fleet apply, consultad fleet apply.

      Para obtener más información sobre la conversión de Fleets a Bundles, consultad Convertir un gráfico de Helm en un Bundle.

    5. Desplegad Bundle. Esto se puede hacer de dos formas:

      1. A través de la interfaz de usuario de Rancher: navegad a Continuous Delivery → Advanced → Bundles → Create from YAML y pegad el contenido de bundle.yaml o haced clic en la opción Read from File y enviad el archivo directamente.

      2. Manualmente: desplegad el archivo bundle.yaml manualmente dentro de vuestro management cluster.

La ejecución de estos pasos dará como resultado un recurso GitRepo/Bundle desplegado correctamente. Fleet detectará el recurso y su contenido se desplegará en los clústeres de destino que hayáis especificado en los pasos anteriores. Para obtener una visión general del proceso, consultad Sección 33.1.6.2.3.1, “Descripción general”.

Para obtener información sobre cómo realizar el seguimiento del proceso de actualización, podéis consultar Sección 33.1.6.2.3.3, “Ejemplo”.

Importante
Importante

Una vez que se haya verificado correctamente la actualización del gráfico, eliminad el recurso Bundle/GitRepo.

Esto eliminará los recursos de actualización que ya no son necesarios de vuestro clúster downstream, asegurando que no se produzcan conflictos de versiones en el futuro.

33.1.6.2.3.3 Ejemplo
Nota
Nota

El siguiente ejemplo demuestra cómo actualizar un gráfico de Helm desplegado mediante EIB de una versión a otra en un clúster downstream. Tened en cuenta que las versiones utilizadas en este ejemplo no son recomendaciones. Para obtener recomendaciones de versiones específicas de una versión Edge, consultad las notas de la versión (Capítulo 41, Notas de la versión).

Caso práctico:

  • Un clúster llamado doc-example está ejecutando una versión anterior de Longhorn.

  • El clúster se ha desplegado a través de EIB, utilizando la siguiente definición de imagen snippet:

    kubernetes:
      helm:
        charts:
        - name: longhorn-crd
          repositoryName: rancher-charts
          targetNamespace: longhorn-system
          createNamespace: true
          version: 104.2.0+up1.7.1
          installationNamespace: kube-system
        - name: longhorn
          repositoryName: rancher-charts
          targetNamespace: longhorn-system
          createNamespace: true
          version: 104.2.0+up1.7.1
          installationNamespace: kube-system
        repositories:
        - name: rancher-charts
          url: https://charts.rancher.io/
    ...
  • SUSE Storage necesita ser actualizado a una versión que sea compatible con la versión 3.6 de Edge. Lo que significa que debe actualizarse a 1.11.2.

  • Se asume que el management cluster encargado de gestionar doc-example está en un entorno aislado, sin soporte para un servidor Git local y tiene una configuración de Rancher en funcionamiento.

Seguid los Pasos de actualización (Sección 33.1.6.2.3.2, “Pasos de actualización”):

  1. Clonad el repositorio suse-edge/fleet-example desde la etiqueta release-3.6.1.

    git clone -b release-3.6.1 https://github.com/suse-edge/fleet-examples.git
  2. Cread un directorio donde se almacenará el archivo de actualización de Longhorn.

    mkdir archives
  3. Descargad la versión del archivo del chart Longhorn deseada:

    # First add the Rancher Helm chart repository
    helm repo add rancher-charts https://charts.rancher.io/
    
    # Pull the Longhorn 1.11.2 chart archive
    helm pull oci://dp.apps.rancher.io/charts/suse-storage --version 1.11.2
  4. Fuera del directorio archives, descargad el script generate-chart-upgrade-data.sh desde la suse-edge/fleet-examples etiqueta de la versión.

  5. La configuración del directorio debería ser similar a:

    .
    ├── archives
    │   └── longhorn-1.11.2.tgz
    ├── fleet-examples
    ...
    │   ├── fleets
    │   │   ├── day2
    |   |   |   ├── ...
    │   │   │   ├── eib-charts-upgrader
    │   │   │   │   ├── base
    │   │   │   │   │   ├── job.yaml
    │   │   │   │   │   ├── kustomization.yaml
    │   │   │   │   │   ├── patches
    │   │   │   │   │   │   └── job-patch.yaml
    │   │   │   │   │   ├── rbac
    │   │   │   │   │   │   ├── cluster-role-binding.yaml
    │   │   │   │   │   │   ├── cluster-role.yaml
    │   │   │   │   │   │   ├── kustomization.yaml
    │   │   │   │   │   │   └── sa.yaml
    │   │   │   │   │   └── secrets
    │   │   │   │   │       ├── eib-charts-upgrader-script.yaml
    │   │   │   │   │       └── kustomization.yaml
    │   │   │   │   ├── fleet.yaml
    │   │   │   │   └── kustomization.yaml
    │   │   │   └── ...
    │   └── ...
    └── generate-chart-upgrade-data.sh
  6. Ejecutad el script generate-chart-upgrade-data.sh:

    # First make the script executable
    chmod +x ./generate-chart-upgrade-data.sh
    
    # Then execute the script
    ./generate-chart-upgrade-data.sh --archive-dir ./archives --fleet-path ./fleet-examples/fleets/day2/eib-charts-upgrader

    La estructura del directorio después de la ejecución del script debería ser similar a:

    .
    ├── archives
    │   └── longhorn-1.11.2.tgz
    ├── fleet-examples
    ...
    │   ├── fleets
    │   │   ├── day2
    │   │   │   ├── ...
    │   │   │   ├── eib-charts-upgrader
    │   │   │   │   ├── base
    │   │   │   │   │   ├── job.yaml
    │   │   │   │   │   ├── kustomization.yaml
    │   │   │   │   │   ├── patches
    │   │   │   │   │   │   └── job-patch.yaml
    │   │   │   │   │   ├── rbac
    │   │   │   │   │   │   ├── cluster-role-binding.yaml
    │   │   │   │   │   │   ├── cluster-role.yaml
    │   │   │   │   │   │   ├── kustomization.yaml
    │   │   │   │   │   │   └── sa.yaml
    │   │   │   │   │   └── secrets
    │   │   │   │   │       ├── eib-charts-upgrader-script.yaml
    │   │   │   │   │       ├── kustomization.yaml
    │   │   │   │   │       ├── longhorn-VERSION.yaml - secret created by the generate-chart-upgrade-data.sh script
    │   │   │   │   │       └── longhorn-crd-VERSION.yaml - secret created by the generate-chart-upgrade-data.sh script
    │   │   │   │   ├── fleet.yaml
    │   │   │   │   └── kustomization.yaml
    │   │   │   └── ...
    │   └── ...
    └── generate-chart-upgrade-data.sh

    Los archivos modificados en git deberían tener este aspecto:

    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
        modified:   fleets/day2/eib-charts-upgrader/base/patches/job-patch.yaml
        modified:   fleets/day2/eib-charts-upgrader/base/secrets/kustomization.yaml
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        fleets/day2/eib-charts-upgrader/base/secrets/longhorn-VERSION.yaml
        fleets/day2/eib-charts-upgrader/base/secrets/longhorn-crd-VERSION.yaml
  7. Cread un Bundle para el Fleet eib-charts-upgrader:

    1. Primero, navegad hasta el Fleet:

      cd ./fleet-examples/fleets/day2/eib-charts-upgrader
    2. A continuación, cread un archivo targets.yaml:

      cat > targets.yaml <<EOF
      targets:
      - clusterName: doc-example
      EOF
    3. Después, utilizad el binario fleet-cli para convertir el Fleet en un Bundle:

      fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - eib-charts-upgrade > bundle.yaml
    4. Ahora, transferid el bundle.yaml en vuestra máquina management cluster.

  8. Desplegad el Bundle a través de la interfaz de usuario de Rancher:

    day2 helm chart upgrade example 1
    Figura 33.1: Desplegad el Bundle a través de la interfaz de usuario de Rancher

    Desde aquí, seleccionad Leer desde archivo y buscad el archivo bundle.yaml en vuestro sistema.

    Esto rellenará automáticamente el Bundle dentro de la interfaz de usuario de Rancher.

    Seleccionad Crear.

  9. Tras un despliegue correcto, vuestro Bundle debería tener un aspecto similar a:

    day2 helm chart upgrade example 2
    Figura 33.2: Bundle desplegado correctamente

Tras el despliegue correcto del Bundle, para supervisar el proceso de actualización:

  1. Verificad los registros del Upgrade Pod:

    day2 helm chart upgrade example 3 downstream
  2. Ahora verificad los registros del Pod creado para la actualización por el helm-controller:

    1. El nombre del Pod seguirá la siguiente plantilla: helm-install-longhorn-<random-suffix>

    2. El Pod estará en el espacio de nombres donde se desplegó el recurso HelmChart. En nuestro caso, es kube-system.

      day2 helm chart upgrade example 4 downstream
      Figura 33.3: Registros de la actualización correcta del chart de Longhorn
  3. Verificad que la versión de HelmChart se ha actualizado navegando a la sección HelmCharts de Rancher (More Resources → HelmCharts). Seleccionad el espacio de nombres donde se desplegó el chart; para este ejemplo, sería kube-system.

  4. Finalmente, comprobad que los Pods de Longhorn se están ejecutando.

Tras realizar las validaciones anteriores, es seguro asumir que el chart de Helm de Longhorn se ha actualizado a la versión 1.11.2.

33.1.6.2.3.4 Actualización del chart de Helm mediante una herramienta GitOps de terceros

Puede haber casos de uso en los que los usuarios deseen utilizar este procedimiento de actualización con un flujo de trabajo GitOps distinto de Fleet (por ejemplo, Flux).

Para generar los recursos necesarios para el procedimiento de actualización, puede utilizar el script generate-chart-upgrade-data.sh para poblar el Fleet eib-charts-upgrader con los datos proporcionados por el usuario. Para obtener información sobre cómo hacerlo, consulte Sección 33.1.6.2.3.2, “Pasos de actualización”.

Una vez que tengáis la configuración completa, podéis utilizar kustomize para generar una solución funcional completa que podáis desplegar en vuestro clúster:

cd /foo/bar/fleets/day2/eib-charts-upgrader

kustomize build .

Si queréis incluir la solución en vuestro flujo de trabajo GitOps, podéis eliminar el archivo fleet.yaml y usar lo que queda como una configuración Kustomize válida. Simplemente, no olvidéis ejecutar primero el script generate-chart-upgrade-data.sh, para que pueda poblar la configuración Kustomize con los datos de los charts de Helm a los que queráis actualizar.

Para entender cómo se pretende utilizar este flujo de trabajo, consultad Sección 33.1.6.2.3.1, “Descripción general” y Sección 33.1.6.2.3.2, “Pasos de actualización”.

Parte VII Solución de problemas

Esta sección proporciona orientación para diagnosticar y resolver problemas comunes con las ampliaciones y operaciones de SUSE Edge. Abarca diversos temas, ofreciendo pasos de solución de problemas específicos para cada componente, herramientas clave y las ubicaciones de los registros pertinentes.

34 Principios generales de resolución de problemas

Antes de profundizar en problemas específicos de los componentes, considera estos principios generales:

  • Comprobar registros: Los registros son la fuente principal de información. La mayoría de las veces, los errores se explican por sí mismos y contienen pistas sobre lo que falló.

  • Comprobar relojes: Tener diferencias de reloj entre sistemas puede provocar todo tipo de errores diferentes. Aseguraos de que los relojes estén sincronizados. Se puede indicar a EIB que fuerce la sincronización del reloj en el momento del arranque, véase Configuración de la hora del SO (Capítulo 2, Clústeres independientes con Edge Image Builder).

  • Problemas de arranque: Si el sistema se queda bloqueado durante el arranque, anotad los últimos mensajes mostrados. Acceded a la consola (física o a través de BMC) para observar los mensajes de arranque.

  • Problemas de red: Verificad la configuración de la interfaz de red (ip a), la tabla de enrutamiento (ip route), probad la conectividad desde/hacia otros nodos y servicios externos (ping, nc). Aseguraos de que las reglas del firewall no estén bloqueando los puertos necesarios.

  • Verificar el estado del componente: Utilizad kubectl get y kubectl describe para los recursos de Kubernetes. Utilizad kubectl get events --sort-by='.lastTimestamp' -n <namespace> para ver los eventos en un espacio de nombres de Kubernetes concreto.

  • Verificar el estado de los servicios: Utilizad systemctl status <service> para los servicios de systemd.

  • Comprobar la sintaxis: El software espera una estructura y una sintaxis determinadas en los archivos de configuración. Para los archivos yaml, por ejemplo, utilizad yamllint o herramientas similares para verificar la sintaxis correcta.

  • Aislar el problema: Intentad acotar el problema a un componente o capa específicos (por ejemplo, red, almacenamiento, SO, Kubernetes, Metal3, Ironic,…​).

  • Documentación: Consultad siempre la SUSE Edge documentación oficial y también la documentación del sentido ascendente para obtener información detallada.

  • Versiones: SUSE Edge es una versión preconfigurada y probada exhaustivamente de diferentes componentes de SUSE. Las versiones de cada componente por cada versión de SUSE Edge pueden consultarse en la SUSE Edge matriz de compatibilidad.

  • Problemas conocidos: Para cada versión de SUSE Edge existe una sección de «Problemas conocidos» en las notas de la versión que contiene información sobre problemas que se corregirán en futuras versiones, pero que pueden afectar a la actual.

35 Solución de problemas de Kiwi

Kiwi se utiliza para generar imágenes actualizadas de SUSE Linux Micro que se usarán con Edge Image Builder.

Problemas comunes
  • SL Micro Version Mismatch: La versión del sistema operativo del host de compilación debe coincidir con la versión del sistema operativo que se está compilando (host SL Micro 6.0 → imagen SL Micro 6.0).

  • SELinux en modo exigente: Debido a ciertas limitaciones, actualmente es necesario desactivar SELinux temporalmente para poder crear imágenes con Kiwi. Comprobad el estado de SELinux con getenforce y desactivadlo antes de ejecutar el proceso de compilación con setenforce 0.

  • Host de compilación no registrado: El proceso de compilación utiliza las suscripciones del host de compilación para poder extraer paquetes de SUSE SCC. Si el host no está registrado, fallará.

  • Error en la prueba del dispositivo de bucle: La primera vez que se ejecuta el proceso de compilación de Kiwi, fallará poco después de iniciarse con \"ERROR: La prueba inicial del dispositivo de bucle falló, por favor, reintentad la ejecución del contenedor. Esto es un síntoma de que se están creando dispositivos de bucle en el sistema host subyacente que no son inmediatamente visibles dentro de la imagen del contenedor. Volved a ejecutar el proceso de compilación de Kiwi y debería continuar sin problemas.

  • Permisos faltantes: El proceso de compilación requiere ejecutarse como usuario raíz (o mediante sudo).

  • Privilegios incorrectos: El proceso de compilación requiere el indicador --privileged al ejecutar el contenedor. Comprobad dos veces que esté presente.

Registros
  • Registros del contenedor de compilación: Comprobad los registros del contenedor de compilación. Los registros se generan en el directorio que se utilizó para almacenar los artefactos. Consultad también los registros de docker o podman para obtener la información necesaria.

  • Directorios de compilación temporales: Kiwi crea directorios temporales durante el proceso de compilación. Comprobadlos para ver si hay registros o artefactos intermedios si la salida principal es insuficiente.

Pasos para la solución de problemas
  1. Revisad la salida de build-image: El mensaje de error en la salida de la consola suele ser muy indicativo.

  2. Comprobad el entorno de compilación: Aseguraos de que se cumplen todos los requisitos previos para el propio Kiwi (por ejemplo, docker/podman, SELinux, espacio en disco suficiente) en la máquina que ejecuta Kiwi.

  3. Inspeccionad los registros del contenedor de compilación: Revisad los registros del contenedor fallido para obtener errores más detallados (véase más arriba).

  4. Verificad el archivo de definición: Si utilizáis un archivo de definición de imagen de Kiwi personalizado, comprobad de nuevo el archivo por si hubiera errores tipográficos o de sintaxis.

36 Solución de problemas de Edge Image Builder (EIB)

EIB se utiliza para crear imágenes SUSE Edge personalizadas.

Problemas comunes
  • Código SCC incorrecto: Asegúrese de que el código SCC utilizado en el archivo de definición de EIB coincida con la versión y la arquitectura de SL Micro.

  • Dependencias faltantes: Asegúrese de que no falten paquetes ni herramientas en el entorno de compilación.

  • Tamaño de imagen incorrecto: Para imágenes raw, el parámetro diskSize es obligatorio y depende en gran medida de las imágenes, los RPM y otros artefactos que se incluyan en la imagen.

  • Permisos: Si almacena un script en el directorio custom/files, asegúrese de que tenga permisos de ejecución, ya que esos archivos solo están disponibles en el momento de la combustión, pero EIB no realiza cambios.

  • Dependencias de grupos del sistema operativo: Al crear una imagen con usuarios y grupos personalizados, los grupos que se establezcan como “primaryGroup” deben crearse explícitamente.

  • Las claves ssh de usuario del sistema operativo requieren una carpeta de inicio: Al crear una imagen con usuarios con claves ssh, la carpeta de inicio también debe crearse con createHomeDir=true.

  • Problemas de combustión: EIB depende de la combustión para la personalización del SO y el despliegue de todos los demás componentes SUSE Edge. Esto también incluye los scripts personalizados que se colocan en la carpeta custom/scripts. Tenga en cuenta que el proceso de combustión se ejecuta en el momento initrd, por lo que el sistema no está completamente arrancado cuando se ejecutan los scripts.

  • Tamaño de la máquina Podman: Como se explica en la sección de consejos y trucos de EIB (Parte IV, “Consejos y trucos”), verifique que la máquina podman tenga suficiente CPU/memoria para ejecutar el contenedor EIB en sistemas operativos que no sean Linux.

  • Imagen incorrecta: Asegúrese de que la imagen base que se utiliza se descargue correctamente verificando el checksum. Si está compilando la imagen con kiwi-builder (Capítulo 26, Creación de imágenes actualizadas de SUSE Linux Micro con Kiwi), compruebe también el archivo de suma generado por el proceso.

Registros
  • Salida de EIB: La salida de consola del comando eib build es crucial.

  • Registros del contenedor de compilación: Compruebe los registros del contenedor de compilación. Los registros se generan en el directorio que se utilizó para almacenar los artefactos. Consulte también docker logs o podman logs para obtener la información necesaria.

    Nota
    Nota

    Para obtener más información, consulte Depuración.

  • Directorios de compilación temporales: EIB crea directorios temporales durante el proceso de compilación. Compruebe estos directorios en busca de registros intermedios o artefactos si la salida principal es insuficiente.

  • Registros de combustión: Si la imagen que se está creando con EIB no arranca por cualquier motivo, hay disponible una shell de root. Conéctese a la consola del host (ya sea físicamente, a través de BMC, etc.) y compruebe los registros de combustión con journalctl -u combustion y, en general, todos los registros del sistema operativo con journalctl para encontrar la causa raíz del fallo.

Pasos para la solución de problemas
  1. Revise la salida de eib-build: El mensaje de error en la salida de la consola suele ser muy indicativo.

  2. Compruebe el entorno de compilación: Asegúrese de que se cumplen todos los requisitos previos para el propio EIB (por ejemplo, docker/podman, espacio en disco suficiente) en la máquina que ejecuta EIB.

  3. Inspeccione los registros del contenedor de compilación: Revise los registros del contenedor fallido para obtener errores más detallados (véase más arriba).

  4. Verifique la configuración de eib: Compruebe dos veces el archivo de configuración eib en busca de errores tipográficos o rutas incorrectas a los archivos de origen o scripts de compilación.

    • Pruebe los componentes individualmente: Si su compilación de EIB implica scripts o etapas personalizados, ejecútelos de forma independiente para aislar los fallos.

37 Solución de problemas de Edge Networking (NMC)

NMC se inyecta en las imágenes EIB de SL Micro para configurar la red de los hosts Edge en el momento del arranque mediante combustión. También se ejecuta en el flujo de trabajo de Metal3 como parte del proceso de inspección. Pueden producirse problemas cuando el host arranca por primera vez o durante el proceso de inspección de Metal3.

Problemas comunes
  • El host no puede arrancar correctamente la primera vez: Los archivos de definición de red mal formados pueden provocar que la fase de combustión falle y, a continuación, el host muestre una shell de root.

  • Los archivos no se generan correctamente: Asegúrese de que los archivos de red coincidan con el formato NMState.

  • Las interfaces de red no están configuradas correctamente: Asegúrese de que las direcciones MAC coincidan con las interfaces que se utilizan en el host.

  • Desajuste entre los nombres de las interfaces: SL Micro habilita Predictable Naming Scheme for Network Interfaces de forma predeterminada, por lo que ya no existe eth0, sino otros esquemas de nomenclatura como enp2s0.

Registros
  • Registros de combustión: Como nmc se utiliza durante la combustión, compruebe los registros de combustión con journalctl -u combustion en el host que se está aprovisionando.

Pasos para la solución de problemas
  1. Verificad la sintaxis yaml: los archivos de configuración de nmc son archivos yaml, comprobad la sintaxis correcta con yamllint o herramientas similares.

  2. Ejecutad nmc manualmente: Como nmc forma parte del contenedor EIB, para depurar cualquier problema, se puede utilizar un comando podman local.

    1. Cread una carpeta temporal para almacenar los archivos de nmc.

      mkdir -p ${HOME}/tmp/foo
    2. Guardad los archivos de nmc en esa ubicación.

      ❯ tree --noreport ${HOME}/tmp/foo
      /Users/johndoe/tmp/foo
      ├── host1.example.com.yaml
      └── host2.example.com.yaml
    3. Ejecutad el contenedor EIB con nmc como punto de entrada y el comando generate para realizar las mismas tareas que nmc realizaría en el momento de la combustión:

      podman run -it --rm -v ${HOME}/tmp/foo:/tmp/foo:Z --entrypoint=/usr/bin/nmc registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1 generate --config-dir /tmp/foo --output-dir /tmp/foo/
      
      [2025-06-04T11:58:37Z INFO  nmc::generate_conf] Generating config from "/tmp/foo/host2.example.com.yaml"...
      [2025-06-04T11:58:37Z INFO  nmc::generate_conf] Generating config from "/tmp/foo/host1.example.com.yaml"...
      [2025-06-04T11:58:37Z INFO  nmc] Successfully generated and stored network config
    4. Observad los registros y los archivos que se generan en la carpeta temporal.

38 Solución de problemas de escenarios de Phone-Home

Los escenarios de Phone-home implican el uso de Elemental para volver a conectar con el clúster de gestión y EIB para crear una imagen de SO que incluya los bits de registro de Elemental. Pueden producirse problemas cuando el host se inicia por primera vez, durante el proceso de compilación de EIB o al intentar registrarse en el clúster de gestión.

Problemas comunes
  • El sistema no se registra: El nodo no se registra en la interfaz de usuario. Aseguraos de que el host se inicie correctamente, de que pueda comunicarse con Rancher, de que el reloj esté sincronizado y de que los servicios de Elemental funcionen correctamente.

  • El sistema no se aprovisiona: El nodo está registrado pero no se aprovisiona. Aseguraos de que el host pueda comunicarse con Rancher, de que el reloj esté sincronizado y de que los servicios de Elemental funcionen correctamente.

Registros
  • Registros del sistema: journalctl

  • Registros del agente del sistema Elemental: journalctl -u elemental-system-agent

  • Registros de K3s/RKE2: journalctl -u k3s or journalctl -u rke2-server (o rke2-agent)

  • Pod del Operador de Elemental: kubectl logs -n cattle-elemental-system -l app=elemental-operator

Pasos para la solución de problemas
  1. Revisar registros: Comprobad los registros del pod del operador de Elemental para ver si hay algún problema. Comprobad los registros del host si el nodo ha arrancado.

  2. Comprobad MachineRegistration y TPM: Por defecto, se utiliza TPM para autenticación, pero existen alternativas para hosts sin TPM.

39 Solución de problemas de otros componentes

Las guías de solución de problemas de otros SUSE Edge componentes pueden consultarse en su documentación oficial:

También puede consultar la base de conocimientos de SUSE.

40 Recopilación de diagnósticos para el soporte

Al ponerse en contacto con el soporte de SUSE, es fundamental proporcionar información de diagnóstico completa.

Información esencial a recopilar
  • Descripción detallada del problema: ¿Qué ha ocurrido?, ¿cuándo ha ocurrido?, ¿qué estaba haciendo?, ¿cuál es el comportamiento esperado y cuál es el comportamiento real?

  • Pasos para reproducir: ¿Puede reproducir el problema de forma fiable? En caso afirmativo, enumere los pasos exactos.

  • Versiones de los componentes: versión de SUSE Edge, versiones de los componentes (RKE2/K3, EIB, Metal3, Elemental, etc.).

  • Registros relevantes:

    • Salida de journalctl (filtrada por servicio si es posible, o registros de arranque completos).

    • Registros de pods de Kubernetes (kubectl logs).

    • Registros de los componentes de Metal³/Elemental.

    • Registros de compilación de EIB y otros registros

  • Información del sistema:

    • uname -a

    • df -h

    • ip a

    • /etc/os-release

  • Archivos de configuración: Archivos de configuración relevantes para Elemental, Metal3, EIB, tales como valores de gráficos helm, configmaps, etc.

  • Información de Kubernetes: Nodos, servicios, despliegues, etc.

  • Objetos de Kubernetes afectados: BMH, MachineRegistration, etc.

Cómo recopilar
  • Para registros: Redirija la salida del comando a archivos (por ejemplo, journalctl -u k3s > k3s_logs.txt).

  • Para recursos de Kubernetes: Utilice kubectl get <resource> -o yaml > <resource_name>.yaml para obtener definiciones YAML detalladas.

  • Para información del sistema: Recopile la salida de los comandos enumerados anteriormente.

  • For SL Micro: Consulte la documentación Guía de resolución de problemas de SUSE Linux Micro sobre cómo recopilar información del sistema para obtener asistencia con supportconfig.

  • Para RKE2/Rancher: Consulte el artículo El script recopilador de registros de Linux de Rancher v2.x para ejecutar dicho script.

  • Para Edge (Nessie): Nessie 1.1.0 es una potente herramienta de diagnóstico diseñada para recopilar registros y datos de configuración de entornos SUSE Edge. Recopila información exhaustiva tanto del sistema anfitrión como de los clústeres de Kubernetes, lo que la hace inestimable para la resolución de problemas y la asistencia.

    • Nessie tiene dos «modos»: un modo Kubernetes y un modo de sistema.

      • Para recopilar registros de un clúster SUSE Edge, ejecute (siempre que tenga acceso al archivo kubeconfig localmente):

        podman run --rm --privileged \
          -v /etc/rancher/k3s/k3s.yaml:/etc/rancher/k3s/k3s.yaml:ro \
          -v /var/log/journal:/var/log/journal:ro \
          -v /run/systemd:/run/systemd:ro \
          -v /etc/machine-id:/etc/machine-id:ro \
          -v /tmp:/tmp \
          -e NESSIE_LOG_DIR="/tmp" \
          -e NESSIE_ZIP_DIR="/tmp" \
          registry.suse.com/edge/3.6/nessie:1.1.0
        Nota
        Nota

        Ajuste las rutas del archivo k3s.yaml/rke2.yaml si es necesario. Consulte Nessie para obtener más información. Debería poder ejecutar este contenedor en modo sin privilegios si tiene los permisos adecuados (normalmente los archivos k3s.yaml / rke2-server.yaml son propiedad de root).

      • Para recopilar registros en el modo de sistema desde el sistema operativo real, ejecute:

        podman run --rm --privileged \
          -v /var/log/journal:/var/log/journal:ro \
          -v /run/systemd:/run/systemd:ro \
          -v /etc/machine-id:/etc/machine-id:ro \
          -v /tmp:/tmp \
          -e NESSIE_LOG_DIR="/tmp" \
          -e NESSIE_ZIP_DIR="/tmp" \
          -e NESSIE_VERBOSE="1" \
          -e NESSIE_SKIP_POD_LOGS="true" \
          -e NESSIE_SKIP_K8S_CONFIGS="true" \
          -e NESSIE_SKIP_METRICS="true" \
          registry.suse.com/edge/3.6/nessie:1.1.0
        Nota
        Nota

        Asegúrese de consultar Nessie para obtener más detalles e información sobre cómo ejecutar Nessie en su entorno. Asimismo, debería poder ejecutar este contenedor en modo sin privilegios siempre que tenga los permisos adecuados.

Contactar con el soporte. Consulte el artículo disponible en Instrucciones para trabajar eficazmente con el soporte técnico de SUSE y el manual de soporte ubicado en Manual de soporte técnico de SUSE para obtener más detalles sobre cómo ponerse en contacto con el soporte de SUSE.

Parte VIII Apéndice

  • 41 Notas de la versión
  • SUSE Edge 3.6 es una solución integral, estrechamente integrada y exhaustivamente validada para abordar los desafíos únicos del despliegue de infraestructura y aplicaciones nativas de nube en edge. Su objetivo principal es proporcionar una plataforma con lineamientos predefinidos, pero altamente fle…

41 Notas de la versión

41.1 Resumen

SUSE Edge 3.6 es una solución integral, estrechamente integrada y exhaustivamente validada para abordar los desafíos únicos del despliegue de infraestructura y aplicaciones nativas de nube en edge. Su objetivo principal es proporcionar una plataforma con lineamientos predefinidos, pero altamente flexible, escalable y segura que abarca la creación de imágenes para el despliegue inicial, el aprovisionamiento e incorporación de nodos, el despliegue de aplicaciones, la observabilidad y la gestión del ciclo de vida.

La solución está diseñada con la idea de que no existe una plataforma edge única debido a los requisitos y expectativas muy variados de nuestros clientes. Los despliegues en edge nos empujan a resolver, y a evolucionar continuamente, algunos de los problemas más desafiantes, incluyendo la escalabilidad masiva, la disponibilidad de red restringida, las limitaciones de espacio físico, las nuevas amenazas de seguridad y vectores de ataque, las variaciones en la arquitectura de hardware y los recursos del sistema, el requisito de desplegar e interactuar con infraestructura y aplicaciones heredadas, y las soluciones de los clientes que tienen una vida útil prolongada.

SUSE Edge se ha creado desde cero con el mejor software de código abierto, en consonancia tanto con nuestros 30 años de historia ofreciendo plataformas SUSE Linux seguras, estables y certificadas, como con nuestra experiencia proporcionando una gestión de Kubernetes altamente escalable y rica en funciones con nuestra cartera Rancher. SUSE Edge se basa en estas capacidades para ofrecer una funcionalidad que puede abordar un gran número de segmentos de mercado, incluyendo el comercio minorista, la medicina, el transporte, la logística, las telecomunicaciones, la fabricación inteligente y el IoT industrial.

Para obtener más información sobre las actualizaciones del ciclo de vida de soporte del producto para SUSE Edge, consulte Product Support Lifecycle.

Nota
Nota

SUSE Telco Cloud es un derivado de SUSE Edge, con optimizaciones y componentes adicionales que permiten a la plataforma abordar los requisitos que se encuentran en los casos de uso de telecomunicaciones.

41.2 Acerca de

Estas notas de la versión son, a menos que se especifique y explique explícitamente, idénticas en todas las arquitecturas, y la versión más reciente, junto con las notas de la versión de todos los demás productos de SUSE, están siempre disponibles en línea en https://www.suse.com/releasenotes.

Las entradas solo se enumeran una vez, pero pueden referenciarse en varios lugares si son importantes y pertenecen a más de una sección. Las notas de la versión suelen enumerar solo los cambios que se produjeron entre dos versiones consecutivas. Ciertas entradas importantes de las notas de la versión de versiones anteriores del producto pueden repetirse. Para facilitar la identificación de estas entradas, contienen una nota al respecto.

Sin embargo, las entradas repetidas se proporcionan solo por cortesía. Por lo tanto, si se salta una o más versiones, consulte también las notas de la versión de las versiones omitidas. Si solo lee las notas de la versión actual, podría pasar por alto cambios importantes que pueden afectar al comportamiento del sistema. Las versiones de SUSE Edge se definen como x.y.z, donde 'x' denota la versión principal, 'y' denota la versión menor y 'z' denota la versión de parche, también conocida como "z-stream". Los ciclos de vida del producto SUSE Edge se definen en torno a una versión menor determinada, p. ej. "3.6", pero se distribuyen con parches posteriores a lo largo de su ciclo de vida, p. ej. "3.6.1".

Nota
Nota

SUSE Edge Las versiones z-stream están estrechamente integradas y probadas exhaustivamente como una pila versionada. La actualización de cualquier componente individual a versiones diferentes a las enumeradas anteriormente probablemente resulte en tiempo de inactividad del sistema. Aunque es posible ejecutar clústeres Edge en configuraciones no probadas, no se recomienda y puede llevar más tiempo proporcionar una resolución a través de los canales de soporte.

41.3 Versión 3.6.1

Fecha de disponibilidad: 26 de junio de 2026

Fecha de finalización del soporte completo: 27 de noviembre de 2026

Fecha de finalización del soporte de mantenimiento: 27 de mayo de 2028

EOL: 28 de mayo de 2028

Resumen: SUSE Edge 3.6.1 es la primera versión z-stream en el flujo de versiones SUSE Edge 3.6.

41.3.1 Nuevas funciones

41.3.2 Corrección de fallos y actualizaciones de seguridad

41.3.3 Problemas conocidos

Aviso
Aviso

Si va a desplegar nuevos clústeres, siga Capítulo 26, Creación de imágenes actualizadas de SUSE Linux Micro con Kiwi para crear primero imágenes nuevas. Esto se recomienda para los clústeres de gestión y descendentes a fin de garantizar que las imágenes contengan las últimas correcciones de seguridad y de fallos.

  • Al realizar el despliegue a través de Edge Image Builder, los manifiestos HelmChartConfigs pueden fallar si se colocan en el directorio de configuración kubernetes/manifests. En su lugar, se recomienda colocar cualquier HelmChartConfigs en /var/lib/rancher/{rke2/k3s}/server/manifests/ utilizando la interfaz os-files de EIB. Si no se hace esto, los nodos podrían permanecer en estado NotReady durante el inicio inicial, tal como se comenta en #8357 RKE2 issue.

  • En las versiones 1.34 y 1.35 de RKE2/K3s, es posible que el directorio /etc/cni utilizado para almacenar las configuraciones de CNI no notifique a containerd cuando se escriben archivos en él debido a ciertas condiciones relacionadas con overlayfs (véase el #8356 RKE2 issue). Esto, a su vez, provoca que el despliegue de RKE2/K3s se quede bloqueado esperando a que se inicie la CNI y que los nodos de RKE2/K3s permanezcan en estado NotReady. Esto puede observarse a nivel de nodo con kubectl describe node <affected_node>:

Conditions:
  Type   Status  LastHeartbeatTime                LastTransitionTime               Reason           Message
  ----   ------  -----------------                ------------------               ------           -------
  Ready  False   Thu, 05 Jun 2025 17:41:28 +0000  Thu, 05 Jun 2025 14:38:16 +0000  KubeletNotReady  container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized

Como solución alternativa, se puede montar un volumen tmpfs en el directorio /etc/cni antes de que se inicie RKE2. Esto evita el uso de overlayfs, que provoca que containerd no reciba notificaciones, y las configuraciones deberían reescribirse cada vez que se reinicie el nodo y se vuelvan a ejecutar los initcontainers de los pods. Si utiliza EIB, puede tratarse de un script 04-tmpfs-cni.sh en el directorio custom/scripts (como se explica aquí) que tenga el siguiente aspecto:

#!/bin/bash
mkdir -p /etc/cni
mount -t tmpfs -o mode=0700,size=5M tmpfs /etc/cni
echo "tmpfs /etc/cni tmpfs defaults,size=5M,mode=0700 0 0" >> /etc/fstab
  • En este momento no hay documentación oficial ni ejemplos disponibles para configurar SyncE mediante synce4l y GNSS mediante gpsd; estos temas se tratarán en futuras versiones.

  • Algunos repositorios de contenedores solo son accesibles actualmente a través de IPv4; por este motivo, se requiere un repositorio local en el clúster de gestión para un clúster de sentido descendente que solo utilice IPv6.

41.3.4 Versiones de los componentes

La siguiente tabla describe los componentes individuales que conforman la versión 3.6.1, incluyendo la versión, la versión del gráfico de Helm (si procede) y desde dónde se puede extraer el artefacto publicado en formato binario. Siga la documentación asociada para ver ejemplos de uso y despliegue.

Nombre

Versión

Versión del gráfico de Helm

Ubicación del artefacto (URL/Imagen)

SUSE Linux Micro

6.2 (el más reciente)

N/D

Página de descarga de SUSE Linux Micro

SUSE Linux Micro

6.2 (el más reciente)

N/D

Las sumas de comprobación y las firmas están disponibles para su descarga en Página de descarga de SUSE Linux Micro
SL-Micro.x86_64-6.2-Base-SelfInstall-GM.install.iso
SL-Micro.x86_64-6.2-Base-RT-SelfInstall-GM.install.iso
SL-Micro.x86_64-6.2-Base-GM.raw.xz
SL-Micro.x86_64-6.2-Base-RT-GM.raw.xz

SUSE Multi-Linux Manager

5.1

N/D

Página de descarga de SUSE Multi-Linux Manager

K3s

1.35.4

N/D

Versión de K3s de sentido ascendente

RKE2

1.35.4

N/D

Versión upstream de RKE2

SUSE Rancher Prime

2.14.2

2.14.2

Repositorio de Helm de Rancher Prime
https://prime.ribs.rancher.io/rancher/v2.14.2/rancher-images.txt[Rancher 2.14.2 Container Images]

SUSE Storage (Longhorn)

1.11.2

1.11.2

Repositorio de Helm de SUSE Storage
https://apps.rancher.io/applications/suse-storage/components[SUSE Storage Container Images]

SUSE Security (NeuVector)

5.5.2

109.0.2+up2.10.2

Repositorio de Helm de Rancher Charts
registry.rancher.com/rancher/neuvector-controller:5.5.2
registry.rancher.com/rancher/neuvector-enforcer:5.5.2
registry.suse.com/rancher/neuvector-compliance-config:1.0.12

Proveedores de Rancher Turtles (CAPI)

0.26.2

306.0.7+up0.26.2

registry.suse.com/edge/3.6/rancher-turtles-providers-chart:306.0.7+up0.26.2
registry.rancher.com/rancher/cluster-api-controller:v1.12.2
registry.rancher.com/rancher/turtles:v0.26.2
registry.suse.com/rancher/cluster-api-provider-rke2-bootstrap:v0.24.3
registry.suse.com/rancher/cluster-api-provider-rke2-controlplane:v0.24.3

Metal3

0.15.0

306.0.29+up0.15.0

registry.suse.com/edge/3.6/metal3-chart:306.0.29+up0.15.0
registry.suse.com/edge/3.6/baremetal-operator:0.12.3.0
registry.suse.com/edge/3.6/ironic:35.0.0.2
registry.suse.com/edge/3.6/ironic-ipa-downloader:3.1.1
registry.suse.com/edge/3.6/ironic-python-agent:3.0.9

MetalLB

0.15.3

306.0.2+up0.15.3

registry.suse.com/edge/3.6/metallb-chart:306.0.2+up0.15.3
registry.suse.com/edge/3.6/metallb-controller:v0.15.3
registry.suse.com/edge/3.6/metallb-speaker:v0.15.3

Elemental

1.9.0

1.9.0

registry.suse.com/rancher/elemental-operator-chart:1.9.0
registry.suse.com/rancher/elemental-operator-crds-chart:1.9.0
registry.suse.com/rancher/elemental-operator:1.9.0

Extensión del panel de control de Elemental

3.0.1

3.0.1

Helm Chart de la extensión de Elemental

Edge Image Builder

1.3.3.1

N/D

registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1

KubeVirt

1.7.0

306.0.2+up0.7.0

registry.suse.com/edge/3.6/kubevirt-chart:306.0.2+up0.7.0
registry.suse.com/suse/sles/15.7/virt-operator:1.7.0-150700.3.16.2
registry.suse.com/suse/sles/15.7/virt-api:1.7.0-150700.3.16.2
registry.suse.com/suse/sles/15.7/virt-controller:1.7.0-150700.3.16.2
registry.suse.com/suse/sles/15.7/virt-handler:1.7.0-150700.3.16.2
registry.suse.com/suse/sles/15.7/virt-launcher:1.7.0-150700.3.16.2

Extensión del panel de control de KubeVirt

1.3.3

306.0.4+up1.3.3

registry.suse.com/edge/3.6/kubevirt-dashboard-extension-chart:306.0.4+up1.3.3

Importador de datos en contenedores (CDI)

1.64.0

306.0.2+up0.7.0

registry.suse.com/edge/3.6/cdi-chart:306.0.2+up0.7.0
registry.suse.com/suse/sles/15.7/cdi-operator:1.64.0-150700.9.6.1
registry.suse.com/suse/sles/15.7/cdi-controller:1.64.0-150700.9.6.1
registry.suse.com/suse/sles/15.7/cdi-apiserver:1.64.0-150700.9.6.1
registry.suse.com/suse/sles/15.7/cdi-uploadproxy:1.64.0-150700.9.6.1

Operador de Endpoint Copier

0.3.0

306.0.1+up0.3.0

registry.suse.com/edge/3.6/endpoint-copier-operator-chart:306.0.1+up0.3.0
registry.suse.com/edge/3.6/endpoint-copier-operator:0.3.0

Operador de red SR-IOV

1.6.0

306.0.4+up1.6.0

registry.suse.com/edge/3.6/sriov-network-operator-chart:306.0.4+up1.6.0
registry.suse.com/edge/3.6/sriov-crd-chart:306.0.4+up1.6.0

Upgrade Controller

0.19.1

109.0.1

Repositorio de Helm de Rancher Charts
registry.rancher.com/rancher/system-upgrade-controller:v0.19.1

Upgrade Controller

0.1.3

306.0.4+up0.1.3

registry.suse.com/edge/3.6/upgrade-controller-chart:306.0.4+up0.1.3
registry.suse.com/edge/3.6/upgrade-controller:0.1.3
registry.rancher.com/rancher/kubectl:v1.35.2
registry.suse.com/edge/3.6/release-manifest:3.6.1

SUSE Private Registry

1.1.1

1.1.1

oci://registry.suse.com/private-registry/private-registry-helm[Repositorio de Helm de SUSE Private Registry]
registry.suse.com/private-registry/harbor-core:1.1.1-1.19
registry.suse.com/private-registry/harbor-jobservice:1.1.1-1.19
registry.suse.com/private-registry/harbor-portal:1.1.1-1.20
registry.suse.com/private-registry/harbor-registry:1.1.1-1.19
registry.suse.com/private-registry/harbor-registryctl:1.1.1-1.19
registry.suse.com/private-registry/harbor-trivy-adapter:1.1.1-1.24

Kiwi Builder

10.2.29.1

N/D

registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1

Cert-Manager

1.20.1

1.20.1

Repositorio de Helm de Jetstack
quay.io/jetstack/cert-manager-controller:v1.20.1
quay.io/jetstack/cert-manager-webhook:v1.20.1
quay.io/jetstack/cert-manager-cainjector:v1.20.1

41.4 Versión 3.6.0

Fecha de disponibilidad: 27 de mayo de 2026

Fecha de finalización del soporte completo: 27 de noviembre de 2026

Fecha de finalización del soporte de mantenimiento: 27 de mayo de 2028

EOL: 28 de mayo de 2028

Resumen: SUSE Edge 3.6.0 es la primera versión en la línea de lanzamientos SUSE Edge 3.6.

41.4.1 Nuevas funciones

  • Actualizado a Kubernetes 1.35.3 y Rancher Prime 2.14.1

  • Actualizado a SUSE Security (NeuVector) 5.5.1 Notas de la versión de NeuVector

  • Actualizado a SUSE Storage (Longhorn) 1.11.1 Notas de la versión de Longhorn (upstream)

  • Actualizado a Rancher Turtles (CAPI) 0.26.1 Documentación de Rancher Turtles

  • Actualizado a MetalLB 0.15.3 Notas de la versión (upstream)

  • Actualizado a KubeVirt 1.7.0 y CDI (Importador de datos en contenedores) 1.64.0

  • Actualizado a Elemental 1.9.0 Notas de la versión de Elemental

  • Actualizado a Cert-Manager 1.20.1 Notas de la versión (upstream)

  • Actualizado Metal3/Ironic a 0.15.0 con Ironic 35.0.0

  • El modo BGP para MetalLB era una vista previa tecnológica en SUSE Edge 3.5 y ahora es totalmente compatible

  • El protocolo de tiempo de precisión (PTP) en despliegues descendentes era una vista previa tecnológica en SUSE Edge 3.5 y ahora es totalmente compatible, junto con la compatibilidad con SyncE y GNSS

  • Los despliegues de clústeres descendentes IPv6 de pila única ya son compatibles; no obstante, tenga en cuenta que esto requiere un clúster de gestión de pila dual (los clústeres de gestión de pila única siguen siendo una vista previa tecnológica)

41.4.2 Correcciones de errores y actualizaciones de seguridad

41.4.3 Problemas conocidos

Aviso
Aviso

Si va a desplegar nuevos clústeres, siga Capítulo 26, Creación de imágenes actualizadas de SUSE Linux Micro con Kiwi para crear primero imágenes nuevas. Esto se recomienda para los clústeres de gestión y de sentido descendente a fin de garantizar que las imágenes contengan las últimas correcciones de seguridad y de fallos.

  • Al desplegar a través de Edge Image Builder, los manifiestos HelmChartConfigs pueden fallar si se colocan en el directorio de configuración kubernetes/manifests. En su lugar, se recomienda colocar cualquier HelmChartConfigs en /var/lib/rancher/{rke2/k3s}/server/manifests/ utilizando la interfaz os-files de EIB. Si no se hace esto, los nodos podrían permanecer en estado NotReady durante el inicio inicial, tal como se comenta en #8357 RKE2 issue.

  • En las versiones 1.34 y 1.35 de RKE2/K3s, es posible que el directorio /etc/cni utilizado para almacenar las configuraciones de CNI no notifique a containerd cuando se escriben archivos en él debido a ciertas condiciones relacionadas con overlayfs (véase el #8356 RKE2 issue). Esto, a su vez, provoca que el despliegue de RKE2/K3s se quede bloqueado esperando a que se inicie la CNI, y que los nodos de RKE2/K3s permanezcan en estado NotReady. Esto puede observarse a nivel de nodo con kubectl describe node <affected_node>:

Conditions:
  Type   Status  LastHeartbeatTime                LastTransitionTime               Reason           Message
  ----   ------  -----------------                ------------------               ------           -------
  Ready  False   Thu, 05 Jun 2025 17:41:28 +0000  Thu, 05 Jun 2025 14:38:16 +0000  KubeletNotReady  container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized

Como solución alternativa, se puede montar un volumen tmpfs en el directorio /etc/cni antes de que se inicie RKE2. Esto evita el uso de overlayfs, que provoca que containerd no reciba notificaciones, y las configuraciones deberían reescribirse cada vez que se reinicie el nodo y se vuelvan a ejecutar los initcontainers de los pods. Si utiliza EIB, puede tratarse de un guion 04-tmpfs-cni.sh en el directorio custom/scripts (como se explica aquí) que tenga el siguiente aspecto:

#!/bin/bash
mkdir -p /etc/cni
mount -t tmpfs -o mode=0700,size=5M tmpfs /etc/cni
echo "tmpfs /etc/cni tmpfs defaults,size=5M,mode=0700 0 0" >> /etc/fstab
  • En este momento no hay documentación oficial ni ejemplos disponibles para configurar SyncE mediante synce4l y GNSS mediante gpsd; estos temas se tratarán en futuras versiones.

  • Algunos repositorios de contenedores solo son accesibles actualmente a través de IPv4; por este motivo, se requiere un registro local en el clúster de gestión para un clúster de sentido descendente que solo utilice IPv6.

41.4.4 Versiones de los componentes

La siguiente tabla describe los componentes individuales que conforman la versión 3.6.0, incluida la versión, la versión del gráfico de Helm (si procede) y desde dónde se puede extraer el artefacto publicado en formato binario. Siga la documentación asociada para ver ejemplos de uso y despliegue.

Nombre

Versión

Versión del chart de Helm

Ubicación del artefacto (URL/Imagen)

SUSE Linux Micro

6.2 (el más reciente)

N/D

Página de descarga de SUSE Linux Micro

SUSE Linux Micro

6.2 (el más reciente)

N/D

Las sumas de comprobación y las firmas están disponibles para descargar en Página de descarga de SUSE Linux Micro
SL-Micro.x86_64-6.2-Base-SelfInstall-GM.install.iso
SL-Micro.x86_64-6.2-Base-RT-SelfInstall-GM.install.iso
SL-Micro.x86_64-6.2-Base-GM.raw.xz
SL-Micro.x86_64-6.2-Base-RT-GM.raw.xz

SUSE Multi-Linux Manager

5.1

N/D

Página de descarga de SUSE Multi-Linux Manager

K3s

1.35.3

N/D

Versión en sentido ascendente de K3s

RKE2

1.35.3

N/D

Versión en sentido ascendente de RKE2

SUSE Rancher Prime

2.14.1

2.14.1

Repositorio de Helm de Rancher Prime
https://prime.ribs.rancher.io/rancher/v2.14.1/rancher-images.txt[Rancher 2.14.1 Container Images]

SUSE Storage (Longhorn)

1.11.1

1.11.1

Repositorio de Helm de SUSE Storage
https://apps.rancher.io/applications/suse-storage/components[SUSE Storage Container Images]

SUSE Security (NeuVector)

5.5.1

109.0.1+up2.8.13

Repositorio de Helm de Rancher Charts
registry.rancher.com/rancher/neuvector-controller:5.5.1
registry.rancher.com/rancher/neuvector-enforcer:5.5.1
registry.suse.com/rancher/neuvector-compliance-config:1.0.12

Proveedores de Rancher Turtles (CAPI)

0.26.1

306.0.6+up0.26.1

registry.suse.com/edge/3.6/rancher-turtles-providers-chart:306.0.6+up0.26.1
registry.rancher.com/rancher/cluster-api-controller:v1.12.2
registry.rancher.com/rancher/turtles:v0.26.1
registry.suse.com/rancher/cluster-api-provider-rke2-bootstrap:v0.24.3
registry.suse.com/rancher/cluster-api-provider-rke2-controlplane:v0.24.3

Metal3

0.15.0

306.0.26+up0.15.0

registry.suse.com/edge/3.6/metal3-chart:306.0.26+up0.15.0
registry.suse.com/edge/3.6/baremetal-operator:0.12.3.0
registry.suse.com/edge/3.6/ironic:35.0.0.1
registry.suse.com/edge/3.6/ironic-ipa-downloader:3.1.1
registry.suse.com/edge/3.6/ironic-python-agent:3.0.8

MetalLB

0.15.3

306.0.2+up0.15.3

registry.suse.com/edge/3.6/metallb-chart:306.0.2+up0.15.3
registry.suse.com/edge/3.6/metallb-controller:v0.15.3
registry.suse.com/edge/3.6/metallb-speaker:v0.15.3

Elemental

1.9.0

1.9.0

registry.suse.com/rancher/elemental-operator-chart:1.9.0
registry.suse.com/rancher/elemental-operator-crds-chart:1.9.0
registry.suse.com/rancher/elemental-operator:1.9.0

Extensión del panel de control de Elemental

3.0.1

3.0.1

Gráfico de Helm de la extensión de Elemental

Edge Image Builder

1.3.3.1

N/D

registry.suse.com/edge/3.6/edge-image-builder:1.3.3.1

KubeVirt

1.7.0

306.0.2+up0.7.0

registry.suse.com/edge/3.6/kubevirt-chart:306.0.2+up0.7.0
registry.suse.com/suse/sles/15.7/virt-operator:1.7.0-150700.3.16.2
registry.suse.com/suse/sles/15.7/virt-api:1.7.0-150700.3.16.2
registry.suse.com/suse/sles/15.7/virt-controller:1.7.0-150700.3.16.2
registry.suse.com/suse/sles/15.7/virt-handler:1.7.0-150700.3.16.2
registry.suse.com/suse/sles/15.7/virt-launcher:1.7.0-150700.3.16.2

Extensión del panel de control de KubeVirt

1.3.3

306.0.4+up1.3.3

registry.suse.com/edge/3.6/kubevirt-dashboard-extension-chart:306.0.4+up1.3.3

Importador de datos en contenedores (CDI)

1.64.0

306.0.2+up0.7.0

registry.suse.com/edge/3.6/cdi-chart:306.0.2+up0.7.0
registry.suse.com/suse/sles/15.7/cdi-operator:1.64.0-150700.9.6.1
registry.suse.com/suse/sles/15.7/cdi-controller:1.64.0-150700.9.6.1
registry.suse.com/suse/sles/15.7/cdi-apiserver:1.64.0-150700.9.6.1
registry.suse.com/suse/sles/15.7/cdi-uploadproxy:1.64.0-150700.9.6.1

Operador de Endpoint Copier

0.3.0

306.0.1+up0.3.0

registry.suse.com/edge/3.6/endpoint-copier-operator-chart:306.0.1+up0.3.0
registry.suse.com/edge/3.6/endpoint-copier-operator:0.3.0

Operador de red SR-IOV

1.6.0

306.0.4+up1.6.0

registry.suse.com/edge/3.6/sriov-network-operator-chart:306.0.4+up1.6.0
registry.suse.com/edge/3.6/sriov-crd-chart:306.0.4+up1.6.0

Controlador de actualización del sistema

0.19.1

109.0.1

Repositorio de Helm de Rancher Charts
registry.rancher.com/rancher/system-upgrade-controller:v0.19.1

Upgrade Controller

0.1.3

306.0.3+up0.1.3

registry.suse.com/edge/3.6/upgrade-controller-chart:306.0.3+up0.1.3
registry.suse.com/edge/3.6/upgrade-controller:0.1.3
registry.rancher.com/rancher/kubectl:v1.35.2
registry.suse.com/edge/3.6/release-manifest:3.6.0

SUSE Private Registry

1.1.1

1.1.1

oci://registry.suse.com/private-registry/private-registry-helm[Repositorio Helm de SUSE Private Registry]
registry.suse.com/private-registry/harbor-core:1.1.1-1.19
registry.suse.com/private-registry/harbor-jobservice:1.1.1-1.19
registry.suse.com/private-registry/harbor-portal:1.1.1-1.20
registry.suse.com/private-registry/harbor-registry:1.1.1-1.19
registry.suse.com/private-registry/harbor-registryctl:1.1.1-1.19
registry.suse.com/private-registry/harbor-trivy-adapter:1.1.1-1.24

Kiwi Builder

10.2.29.1

N/D

registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1

Cert-Manager

1.20.1

1.20.1

Repositorio Helm de Jetstack
quay.io/jetstack/cert-manager-controller:v1.20.1
quay.io/jetstack/cert-manager-webhook:v1.20.1
quay.io/jetstack/cert-manager-cainjector:v1.20.1

41.5 Funciones eliminadas

A menos que se indique lo contrario, esto se aplica a la versión 3.6.0 y a todas las versiones z-stream posteriores.

  • Akri era una oferta de vista previa tecnológica en versiones anteriores de Edge y ha quedado obsoleta a partir de la 3.4.0. Ahora se ha eliminado por completo de la oferta.

41.6 Tecnología en fase preliminar.

A menos que se indique lo contrario, esto se aplica a la versión 3.6.0 y a todas las versiones z-stream posteriores.

  • Los despliegues de clústeres de gestión IPv6 de pila única son una oferta de vista previa tecnológica y no están sujetos al ámbito de soporte estándar.

41.7 Verificación de componentes

Los componentes mencionados anteriormente pueden verificarse utilizando los datos de la Lista de materiales de software (SBOM); por ejemplo, utilizando cosign como se indica a continuación:

Descargue la clave pública del contenedor SUSE Edge desde la fuente de claves de firma de SUSE:

> cat key.pem
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7N0S2d8LFKW4WU43bq7Z
IZT537xlKe17OQEpYjNrdtqnSwA0/jLtK83m7bTzfYRK4wty/so0g3BGo+x6yDFt
SVXTPBqnYvabU/j7UKaybJtX3jc4SjaezeBqdi96h6yEslvg4VTZDpy6TFP5ZHxZ
A0fX6m5kU2/RYhGXItoeUmL5hZ+APYgYG4/455NBaZT2yOywJ6+1zRgpR0cRAekI
OZXl51k0ebsGV6ui/NGECO6MB5e3arAhszf8eHDE02FeNJw5cimXkgDh/1Lg3KpO
dvUNm0EPWvnkNYeMCKR+687QG0bXqSVyCbY6+HG/HLkeBWkv6Hn41oeTSLrjYVGa
T3zxPVQM726sami6pgZ5vULyOleQuKBZrlFhFLbFyXqv1/DokUqEppm2Y3xZQv77
fMNogapp0qYz+nE3wSK4UHPd9z+2bq5WEkQSalYxadyuqOzxqZgSoCNoX5iIuWte
Zf1RmHjiEndg/2UgxKUysVnyCpiWoGbalM4dnWE24102050Gj6M4B5fe73hbaRlf
NBqP+97uznnRlSl8FizhXzdzJiVPcRav1tDdRUyDE2XkNRXmGfD3aCmILhB27SOA
Lppkouw849PWBt9kDMvzelUYLpINYpHRi2+/eyhHNlufeyJ7e7d6N9VcvjR/6qWG
64iSkcF2DTW61CN5TrCe0k0CAwEAAQ==
-----END PUBLIC KEY-----

Verifique el hash de la imagen del contenedor, por ejemplo, utilizando crane:

> crane digest registry.suse.com/edge/3.6/baremetal-operator:0.12.3.0 --platform linux/amd64
sha256:example-digest-placeholder
Nota
Nota

Para imágenes multiarquitectura, también es necesario especificar una plataforma al obtener el resumen (digest), p. ej., --platform linux/amd64 o --platform linux/arm64. Si no se hace esto, se producirá un error en el siguiente paso (Error: no matching attestations).

Verifique con cosign:

> cosign verify-attestation --type spdxjson --key key.pem registry.suse.com/edge/3.6/baremetal-operator@sha256:example-digest-placeholder > /dev/null
#
Verification for registry.suse.com/edge/3.6/baremetal-operator@sha256:example-digest-placeholder --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The signatures were verified against the specified public key

Extraiga los datos de la SBOM como se describe en la documentación de SBOM de SUSE:

> cosign verify-attestation --type spdxjson --key key.pem registry.suse.com/edge/3.6/baremetal-operator@sha256:example-digest-placeholder | jq '.payload | @base64d | fromjson | .predicate'

41.8 Pasos de actualización

Consulte Parte VI, “Operaciones del día 2” para obtener detalles sobre cómo actualizar a una nueva versión.

41.9 Etapas de asistencia técnica de los productos

SUSE Edge cuenta con el respaldo del galardonado soporte de SUSE, un líder tecnológico consolidado con un historial probado en la prestación de servicios de soporte de calidad empresarial. Para obtener más información, consulte https://www.suse.com/lifecycle y la página de Política de soporte en https://www.suse.com/support/policy.html. Si tiene alguna pregunta sobre cómo abrir un caso de soporte, cómo clasifica SUSE los niveles de gravedad o el alcance del soporte, consulte el Manual de soporte técnico en https://www.suse.com/support/handbook/.

SUSE Edge «3.6» cuenta con 24 meses de soporte de producción, con 6 meses iniciales de «soporte completo», seguidos de 18 meses de «soporte de mantenimiento». Tras estas fases de soporte, el producto alcanza el «fin de vida útil» (EOL) y deja de recibir soporte. Puede encontrar más información sobre las fases del ciclo de vida en la siguiente tabla:

Soporte completo (6 meses)

Durante el periodo de soporte completo se publicarán correcciones de errores urgentes y de alta prioridad seleccionadas, y el resto de los parches (no urgentes, mejoras, nuevas capacidades) se publicarán siguiendo el calendario de lanzamientos habitual.

Soporte de mantenimiento (18 meses)

Durante este periodo, solo se publicarán correcciones críticas mediante parches. Es posible que se publiquen otras correcciones de errores a discreción de SUSE, pero no debe esperarse que así sea.

Fin de vida útil (EOL)

Una vez que una versión de producto alcanza su fecha de fin de vida útil, el cliente puede seguir utilizando el producto dentro de los términos del acuerdo de licencia del producto. Los planes de soporte de SUSE no se aplican a las versiones de productos que han superado su fecha de EOL.

A menos que se indique explícitamente, todos los componentes enumerados se consideran de disponibilidad general (GA) y están cubiertos por el alcance estándar de soporte de SUSE. Algunos componentes pueden aparecer como «Technology Preview», donde SUSE proporciona a los clientes acceso a características y funcionalidades tempranas previas a la GA para su evaluación, pero no están sujetos a las políticas de soporte estándar y no se recomiendan para casos de uso de producción. SUSE agradece enormemente los comentarios y sugerencias sobre las mejoras que se pueden realizar en los componentes de Technology Preview, pero SUSE se reserva el derecho de dejar obsoleta una característica de Technology Preview antes de que esté disponible de forma general si no satisface las necesidades de nuestros clientes o no alcanza el estado de madurez que requerimos.

Tenga en cuenta que SUSE debe dejar obsoletas ocasionalmente características o cambiar las especificaciones de la API. Las razones para que una característica quede obsoleta o para el cambio de una API podrían incluir que una característica se actualice o sea reemplazada por una nueva implementación, un nuevo conjunto de características, que la tecnología en sentido ascendente ya no esté disponible o que la comunidad en sentido ascendente haya introducido cambios incompatibles. No se pretende que esto ocurra nunca dentro de una versión menor determinada (x.z), por lo que todas las versiones z-stream mantendrán la compatibilidad de la API y la funcionalidad de las características. SUSE se esforzará por proporcionar avisos de obsolescencia con suficiente antelación en las notas de la versión, junto con soluciones alternativas, sugerencias y medidas de mitigación para minimizar la interrupción del servicio.

El equipo de SUSE Edge también agradece los comentarios de la comunidad, donde se pueden plantear problemas dentro del repositorio de código respectivo en https://www.github.com/suse-edge.

41.10 Obtención del código fuente

Este producto de SUSE incluye materiales con licencia para SUSE bajo la Licencia Pública General de GNU (GPL) y otras licencias de código abierto. La GPL requiere que SUSE proporcione el código fuente que corresponde al material con licencia GPL, y SUSE cumple con todos los demás requisitos de las licencias de código abierto. Como tal, SUSE pone a disposición todo el código fuente, que generalmente se puede encontrar en el repositorio de GitHub de SUSE Edge (https://www.github.com/suse-edge), el repositorio de GitHub de SUSE Rancher (https://www.github.com/rancher) para los componentes dependientes y, específicamente para SUSE Linux Micro, el código fuente está disponible para su descarga en https://www.suse.com/download/sle-micro en el «Medio 2».

41.11 Información legal

SUSE no otorga ninguna garantía respecto al contenido y el uso de esta documentación y, específicamente, renuncia a cualquier garantía explícita o implícita de posibilidad de comercialización o adecuación para un fin determinado. Asimismo, SUSE se reserva el derecho a revisar esta publicación y a realizar cambios en su contenido en cualquier momento, sin obligación de notificar tales cambios a ninguna persona o entidad.

Asimismo, SUSE no otorga ninguna garantía con respecto a ningún programa de software, y específicamente rechaza cualquier garantía explícita o implícita de comercialización o adecuación para un fin determinado. Por otra parte, SUSE se reserva el derecho a realizar cambios en cualquiera de las partes o en la totalidad del software de SUSE en cualquier momento, sin obligación de notificar de tales cambios a ninguna persona ni entidad.

Los productos o la información técnica que se proporcionan bajo este Acuerdo pueden están sujetos a los controles de exportación de Estados Unidos o a la legislación sobre comercio de otros países. Usted se compromete a cumplir todas las normativas de control de exportaciones y a obtener las licencias o clasificaciones necesarias para exportar, reexportar o importar los entregables. Usted acepta no realizar exportaciones ni reexportaciones a las entidades que se incluyan en las listas actuales de exclusión de exportaciones de EE. UU., así como a ningún país terrorista o sometido a embargo, tal y como queda recogido en las leyes de exportación de EE. UU. Usted acepta no utilizar los entregables para fines finales prohibidos relacionados con armamento nuclear, de misiles o químico/biológico. Consulte https://www.suse.com/company/legal/ para obtener más información sobre la exportación del software de SUSE. SUSE no asume ninguna responsabilidad por los fallos que cometa el usuario en la obtención de los permisos de exportación necesarios.

Copyright © 2024 SUSE LLC.

Este documento de notas de la versión cuenta con una licencia Creative Commons Attribution-NoDerivatives 4.0 International License (CC-BY-ND-4.0). Debería haber recibido una copia de la licencia junto con este documento. Si no es así, consulte https://creativecommons.org/licenses/by-nd/4.0/.

SUSE posee derechos de propiedad intelectual relacionados con la tecnología incorporada en el producto descrito en este documento. En concreto, y sin limitación, estos derechos de propiedad intelectual pueden incluir una o más de las patentes de EE. UU. que aparecen en https://www.suse.com/company/legal/ y una o más patentes adicionales o solicitudes de patentes pendientes en EE. UU. y en otros países.

Para consultar las marcas comerciales de SUSE, véase la lista de marcas comerciales y marcas de servicio de SUSE (https://www.suse.com/company/legal/). Todas las marcas comerciales de otros fabricantes son propiedad de sus propietarios respectivos. Para obtener información sobre la marca SUSE y los requisitos de uso, consulte las directrices publicadas en https://brand.suse.com/.