|Index|SUSE Edge Documentação
SUSE Edge 3.6

SUSE Edge Documentação

Data de Publicação: 2026-05-27

SUSE Edge 3.6 Documentação

Bem-vindo à SUSE Edge documentação. Você encontrará a visão geral arquitetônica de alto nível, guias de início rápido, designs validados, orientação sobre uso de componentes, integrações de terceiros e melhores práticas para gerenciar sua infraestrutura de computação distribuída e cargas de trabalho.

1 O que é o comando SUSE Edge?

SUSE Edge é uma solução de ponta a ponta criada especificamente, fortemente integrada e abrangentemente validada para enfrentar os desafios únicos da implantação de infraestrutura e aplicativos nativos de nuvem em ambientes de computação distribuída. Seu foco principal é fornecer uma plataforma opinativa, porém altamente flexível, altamente escalável e segura que abrange a criação da imagem de implantação inicial, provisionamento e integração de nós, implantação de aplicativos, observabilidade e operações completas de ciclo de vida. A plataforma foi criada desde o início com o melhor software de código aberto, consistente com nossa história de mais de 30 anos na entrega de plataformas SUSE Linux seguras, estáveis e certificadas, e nossa experiência no fornecimento de gerenciamento de Kubernetes altamente escalável e rico em recursos com nosso portfólio Rancher. SUSE Edge baseia-se nessas capacidades para oferecer funcionalidades que podem atender a um grande número de segmentos de mercado, incluindo varejo, médico, transporte, logística, telecomunicações, manufatura inteligente e IoT industrial.

2 Filosofia de Design

A solução foi projetada com a noção de que não existe uma plataforma de computação distribuída de "tamanho único" devido aos requisitos e expectativas amplamente variados dos clientes. As implantações de computação distribuída nos levam a resolver, e evoluir continuamente, alguns dos problemas mais desafiadores, incluindo escalabilidade massiva, disponibilidade de rede restrita, restrições de espaço físico, novas ameaças de segurança e vetores de ataque, variações na arquitetura de hardware e recursos do sistema, a necessidade de implantar e interagir com infraestrutura e aplicativos legados, e soluções de clientes que possuem vida útil estendida. Como muitos desses desafios são diferentes das formas tradicionais de pensar, por exemplo, a implantação de infraestrutura e aplicações em data centers ou na nuvem pública, precisamos analisar o design com muito mais detalhes granulares e repensar muitas suposições comuns.

Por exemplo, encontramos valor no minimalismo, na modularidade e na facilidade de operações. O minimalismo é importante para ambientes de computação distribuída, já que quanto mais complexo um sistema é, maior a probabilidade de falha. Ao observar centenas de locais, até centenas de milhares, sistemas complexos falharão de maneiras complexas. A modularidade em nossa solução permite mais escolha do usuário, ao mesmo tempo em que remove a complexidade desnecessária na plataforma implantada. Também precisamos equilibrar isso com a facilidade de operações. Os humanos podem cometer erros ao repetir um processo milhares de vezes, portanto, a plataforma deve garantir que quaisquer erros potenciais sejam recuperáveis, eliminando a necessidade de visitas de técnicos ao local, mas também se esforçar pela consistência e padronização.

3 Arquitetura de alto nível

A arquitetura de alto nível do sistema do SUSE Edge é dividida em duas categorias principais, a saber, clusters de "gerenciamento" e "downstream". O cluster de gerenciamento é responsável pelo gerenciamento remoto de um ou mais clusters downstream, embora seja reconhecido que, em certas circunstâncias, os clusters downstream precisam operar sem gerenciamento remoto, por exemplo, em situações em que um local de borda não tem conectividade externa e precisa operar de forma independente. No SUSE Edge, os componentes técnicos utilizados para a operação dos clusters de gerenciamento e downstream são amplamente comuns, embora provavelmente se diferenciem tanto nas especificações do sistema quanto nas aplicações que residem sobre eles; ou seja, o cluster de gerenciamento executa aplicações que permitem o gerenciamento de sistemas e operações do ciclo de vida, enquanto os clusters downstream atendem aos requisitos para servir aplicações de usuário.

3.1 Componentes usados no SUSE Edge

O SUSE Edge é composto por componentes existentes da SUSE e do Rancher, juntamente com recursos e componentes adicionais criados pela equipe de computação distribuída para nos permitir abordar as restrições e complexidades necessárias na computação distribuída. Os componentes usados tanto no cluster de gerenciamento quanto nos clusters downstream são explicados abaixo, com um diagrama de arquitetura de alto nível simplificado, observando que esta não é uma lista exaustiva:

3.1.1 Cluster de gerenciamento

suse edge management cluster
  • Gerenciamento: Esta é a parte centralizada do SUSE Edge que é usada para gerenciar o provisionamento e o ciclo de vida dos clusters downstream conectados. O cluster de gerenciamento normalmente inclui os seguintes componentes:

    • Gerenciamento de múltiplos clusters com Rancher Prime (Capítulo 4, Rancher), permitindo um painel comum para integração de clusters downstream e gerenciamento contínuo do ciclo de vida de VMs de infraestrutura e aplicações, também fornecendo isolamento abrangente de locatários e integrações de IDP (Provedor de Identidade), um grande marketplace de integrações e extensões de terceiros e uma API neutra em relação ao fornecedor.

    • Gerenciamento de sistemas Linux com SUSE Multi-Linux Manager, permitindo o gerenciamento automatizado de patches e configurações do sistema operacional Linux subjacente (*SUSE Linux Micro (Capítulo 7, SUSE Linux Micro)) que é executado nos clusters downstream. Observe que, embora este componente seja conteinerizado, ele atualmente precisa ser executado em um sistema separado do restante dos componentes de gerenciamento, sendo, portanto, rotulado como "Gerenciamento de Linux" no diagrama acima.

    • Um controlador dedicado de Gerenciamento de Ciclo de Vida (Capítulo 19, Upgrade Controller) que lida com fazer upgrade dos componentes do cluster de gerenciamento para uma determinada versão SUSE Edge.

    • Integração de sistema remoto ao Rancher Prime com Elemental (Capítulo 10, Elemental), permitindo a vinculação tardia de nós de borda conectados aos clusters Kubernetes desejados e a implantação de aplicativos, por exemplo, via GitOps.

    • Um mecanismo GitOps opcional chamado Fleet (Capítulo 6, Fleet) para gerenciar o provisionamento e o ciclo de vida de clusters downstream e as aplicações que residem neles.

    • A base do cluster de gerenciamento em si é o SUSE Linux Micro (Capítulo 7, SUSE Linux Micro) como sistema operacional base e o RKE2 (Capítulo 12, RKE2) como a distribuição Kubernetes que suporta as aplicações do cluster de gerenciamento.

3.1.2 Clusters downstream

suse edge downstream cluster
  • Downstream: Esta é a parte distribuída do SUSE Edge que é usada para executar as cargas de trabalho dos usuários na computação distribuída, ou seja, o software que é executado no próprio local de computação distribuída, e é tipicamente composto pelos seguintes componentes:

    • Uma escolha de distribuições Kubernetes, com distribuições seguras e leves como K3s (Capítulo 11, K3s) e RKE2 (Capítulo 12, RKE2) (RKE2 é reforçado, certificado e otimizado para uso em governo e setores regulamentados).

    • SUSE Security (Capítulo 14, SUSE Security) para habilitar recursos de segurança como verificação de vulnerabilidade de imagem, inspeção profunda de pacotes e proteção contra ameaças e vulnerabilidades em tempo real.

    • Armazenamento em blocos de software com SUSE Storage (Capítulo 13, SUSE Storage) para habilitar armazenamento em blocos persistente, resiliente e escalável de forma leve.

    • Um sistema operacional Linux leve, otimizado para contêineres e reforçado com SUSE Linux Micro (Capítulo 7, SUSE Linux Micro), fornecendo um SO imutável e altamente resiliente para executar contêineres e máquinas virtuais na borda. O SUSE Linux Micro está disponível para arquiteturas AArch64 e AMD64/Intel 64, e também oferece suporte a Real-Time Kernel para aplicações sensíveis à latência (por exemplo, casos de uso de telecomunicações).

    • Para clusters conectados (ou seja, aqueles que possuem conectividade com o cluster de gerenciamento), dois agentes são implantados, nomeadamente o Rancher System Agent para gerenciar a conectividade com o Rancher Prime, e o venv-salt-minion para receber instruções do SUSE Multi-Linux Manager para aplicar atualizações de software Linux. Esses agentes não são necessários para o gerenciamento de clusters desconectados.

3.2 Conectividade

suse edge connected architecture

A imagem acima fornece uma visão geral arquitetônica de alto nível para clusters downstream conectados e sua conexão ao cluster de gerenciamento. O cluster de gerenciamento pode ser implantado em uma ampla variedade de plataformas de infraestrutura subjacentes, tanto em capacidades no local quanto em nuvem, dependendo da disponibilidade de rede entre os clusters downstream e o cluster de gerenciamento de destino. O único requisito para que isso funcione é que a API e as URLs de retorno sejam acessíveis pela rede que conecta os nós do cluster downstream à infraestrutura de gerenciamento.

É importante reconhecer que existem mecanismos distintos nos quais essa conectividade é estabelecida em relação ao mecanismo de implantação do cluster downstream. Os detalhes disso são explicados com muito mais profundidade na próxima seção, mas para estabelecer uma compreensão básica, existem três mecanismos principais para que clusters downstream conectados sejam estabelecidos como um cluster "gerenciado":

  1. Os clusters downstream são implantados em uma capacidade "desconectada" no início (por exemplo, via Edge Image Builder (Capítulo 8, Edge Image Builder)) e, em seguida, são importados para o cluster de gerenciamento se/quando a conectividade permitir.

  2. Os clusters downstream são configurados para utilizar o mecanismo de onboarding incorporado. (por exemplo, via Elemental (Capítulo 10, Elemental)), e eles se registram automaticamente no cluster de gerenciamento na primeira inicialização, permitindo a vinculação tardia da configuração do cluster.

  3. Os clusters downstream foram provisionados com os recursos de gerenciamento bare metal (CAPI + Metal3) e são importados automaticamente para o cluster de gerenciamento assim que o cluster é implantado e configurado (via operador Rancher Turtles).

Nota
Nota

Recomenda-se que vários clusters de gerenciamento sejam implementados para acomodar a escala de grandes implantações, otimizar as questões de largura de banda e latência em ambientes geograficamente dispersos e minimizar a interrupção no caso de uma falha ou upgrade do cluster de gerenciamento. Você pode encontrar os limites atuais de escalabilidade do cluster de gerenciamento e os requisitos do sistema aqui.

4 Padrões comuns de implantação de borda

Devido ao conjunto variável de ambientes operacionais e requisitos de ciclo de vida, implementamos suporte para vários padrões de implantação distintos que se alinham vagamente aos segmentos de mercado e casos de uso em que o SUSE Edge opera. Documentamos um guia de início rápido para cada um desses padrões de implantação para ajudá-lo a se familiarizar com a plataforma SUSE Edge com base em suas necessidades. Os três padrões de implantação que suportamos hoje estão descritos abaixo, com um link para a respectiva página de início rápido.

4.1 Provisionamento de rede "Phone Home"

Às vezes, você opera em um ambiente onde o cluster de gerenciamento central não consegue gerenciar o hardware diretamente (por exemplo, sua rede remota está atrás de um gateway de segurança ou não há interface de gerenciamento fora de banda; comum em hardware do tipo "PC" frequentemente encontrado na borda). Neste cenário, fornecemos ferramentas para provisionar remotamente clusters e suas cargas de trabalho sem a necessidade de saber para onde o hardware está sendo enviado quando ele é inicializado. É nisso que a maioria das pessoas pensa quando pensa em computação de borda; são milhares ou dezenas de milhares de sistemas um tanto desconhecidos inicializando em locais de borda e entrando em contato com a central de forma segura, validando quem são e recebendo suas instruções sobre o que devem fazer. Nossos requisitos aqui preveem provisionamento e gerenciamento do ciclo de vida com pouquíssima intervenção do usuário, exceto pela pré-instalação da imagem na máquina na fábrica ou simplesmente anexar uma imagem de inicialização, por exemplo, via USB, e ligar o sistema. Os principais desafios neste espaço são abordar a escala, a consistência, a segurança e o ciclo de vida desses dispositivos em campo.

Esta solução oferece uma grande flexibilidade e consistência na forma como os sistemas são provisionados e passam por onboarding, independentemente de sua localização, tipo ou especificação de sistema, ou de quando são ligados pela primeira vez. SUSE Edge permite total flexibilidade e personalização do sistema por meio do Edge Image Builder, e aproveita os recursos de registro da oferta Elemental do Rancher para o onboarding de nós e provisionamento de Kubernetes, juntamente com o SUSE Multi-Linux Manager para patching do sistema operacional. O início rápido para esta solução pode ser encontrado em Capítulo 1, Integração de host remoto com Elemental.

4.2 Provisionamento baseado em imagem

Para clientes que precisam operar em ambientes autônomos, isolados (air-gapped) ou com rede limitada, o SUSE Edge fornece uma solução que permite aos clientes gerar mídia de instalação totalmente personalizada que contém todos os artefatos de implantação necessários para habilitar clusters Kubernetes de alta disponibilidade de nó único e multi-nó na borda, incluindo quaisquer cargas de trabalho ou componentes em camadas adicionais necessários, tudo sem qualquer conectividade de rede com o mundo exterior e sem a intervenção de uma plataforma de gerenciamento centralizada. A experiência do usuário segue de perto a solução "phone home", na qual a mídia de instalação é fornecida aos sistemas de destino, mas a solução fará o "bootstrap in-place". Neste cenário, é possível anexar os clusters resultantes ao Rancher para gerenciamento contínuo (ou seja, passar de um modo de operação "desconectado" para "conectado" sem grandes reconfigurações ou reimplantações), ou continuar operando isoladamente. Observe que, em ambos os casos, o mesmo mecanismo consistente para automatizar operações de ciclo de vida pode ser aplicado.

Além disso, esta solução pode ser usada para criar rapidamente clusters de gerenciamento que podem hospedar a infraestrutura centralizada que suporta tanto os modelos de "provisionamento de rede direcionado" quanto de "provisionamento de rede phone home", pois pode ser a maneira mais rápida e simples de provisionar todos os tipos de infraestrutura de Borda. Esta solução utiliza intensamente os recursos do SUSE Edge Image Builder para criar mídia de instalação totalmente personalizada e autônoma; o guia de início rápido pode ser encontrado em Capítulo 2, Clusters autônomos com o Edge Image Builder.

5 SUSE Edge Validação de Pilha

Todas as versões do SUSE Edge compreendem componentes fortemente integrados e completamente validados que são versionados como um só. Como parte dos esforços de integração contínua e validação de pilha que não apenas testam a integração entre os componentes, mas garantem que o sistema funcione conforme o esperado em cenários de falha forçada, a equipe do SUSE Edge publica todos os testes realizados e os resultados publicamente. Os resultados, juntamente com todos os parâmetros de entrada, podem ser encontrados em ci.edge.suse.com.

6 Lista Completa de Componentes

A lista completa de componentes, juntamente com um link para uma descrição de alto nível de cada um e como ele é usado no SUSE Edge, pode ser encontrada abaixo:

Parte I Inicializações rápidas

Início rápido aqui

  • 1 Integração de host remoto com Elemental
  • Esta seção documenta a solução de "provisionamento de rede phone home" como parte de SUSE Edge, onde usamos o Elemental para auxiliar na integração de nós. O Elemental é uma pilha de software que permite o registro remoto de hosts e o gerenciamento centralizado de SO nativo da nuvem com Kubernetes. …

  • 2 Clusters autônomos com o Edge Image Builder
  • O Edge Image Builder (EIB) é uma ferramenta que simplifica o processo de geração de imagens de disco personalizadas e prontas para inicialização (CRB) para inicializar máquinas, mesmo em cenários totalmente air-gapped. O EIB é usado para criar imagens de implantação para uso em todos os três tipos d…

  • 3 SUSE Multi-Linux Manager
  • A versão do SUSE Multi-Linux Manager incluída com SUSE Edge 3.6 (5.0.6) ainda não oferece suporte ao SUSE Linux Micro 6.2. Ela será atualizada e suportada em futuras versões do SUSE Edge 3.6.

1 Integração de host remoto com Elemental

Esta seção documenta a solução de "provisionamento de rede phone home" como parte de SUSE Edge, onde usamos o Elemental para auxiliar na integração de nós. O Elemental é uma pilha de software que permite o registro remoto de hosts e o gerenciamento centralizado de SO nativo da nuvem com Kubernetes. Na pilha SUSE Edge, usamos o recurso de registro do Elemental para permitir a integração de hosts remotos no Rancher, para que os hosts possam ser integrados a uma plataforma de gerenciamento centralizada e, a partir daí, implantar e gerenciar clusters Kubernetes junto com componentes em camadas, aplicativos e seu ciclo de vida, tudo a partir de um local comum.

Essa abordagem pode ser útil em cenários onde os dispositivos que você deseja controlar não estão na mesma rede que o cluster de gerenciamento ou não possuem um controlador de gerenciamento fora de banda integrado para permitir um controle mais direto, e onde você está inicializando muitos sistemas "desconhecidos" diferentes na borda, e precisa integrá-los e gerenciá-los com segurança em escala. Este é um cenário comum para casos de uso em varejo, IoT industrial ou outros espaços onde você tem pouco controle sobre a rede em que seus dispositivos estão sendo instalados.

1.1 Arquitetura de alto nível

quickstart elemental architecture

1.2 Recursos necessários

O seguinte descreve os requisitos mínimos de sistema e ambiente para realizar este guia de início rápido:

  • Um host para o cluster de gerenciamento centralizado (aquele que hospeda o Rancher e o Elemental):

    • Mínimo de 8 GB de RAM e 20 GB de espaço em disco para desenvolvimento ou teste (veja aqui para uso em produção)

  • Um nó de destino a ser provisionado, ou seja, o dispositivo de borda (uma máquina virtual pode ser usada para fins de demonstração ou teste)

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

  • Um nome de host resolúvel para o cluster de gerenciamento ou um endereço IP estático para usar com um serviço como sslip.io

  • Um host para criar a mídia de instalação via Edge Image Builder

    • Executando SLES 15 SP6, openSUSE Leap 15.6 ou outro sistema operacional compatível que suporte Podman.

    • Com Kubectl, Podman e Helm instalados

  • Uma unidade flash USB para inicializar (se estiver usando hardware físico)

  • Uma cópia baixada da imagem ISO mais recente do SUSE Linux Micro 6.2 SelfInstall encontrada aqui.

Nota
Nota

Os dados existentes encontrados nas máquinas de destino serão sobrescritos como parte do processo; certifique-se de fazer backup de quaisquer dados em quaisquer dispositivos de armazenamento USB e discos conectados aos nós de implantação de destino.

Este guia foi criado usando um droplet da Digital Ocean para hospedar o cluster upstream e um Intel NUC como dispositivo downstream. Para criar a mídia de instalação, o SUSE Linux Enterprise Server é usado.

1.3 Criar cluster de inicialização

Comece criando um cluster capaz de hospedar o Rancher e o Elemental. Este cluster precisa ser roteável a partir da rede à qual os nós downstream estão conectados.

1.3.1 Criar cluster Kubernetes

Se você estiver usando um hiperescalador (como Azure, AWS ou Google Cloud), a maneira mais fácil de configurar um cluster é usando as ferramentas incorporadas deles. Para fins de concisão neste guia, não detalhamos o processo de cada uma dessas opções.

Se você estiver instalando em bare metal ou em outro serviço de hospedagem onde também precise fornecer a própria distribuição do Kubernetes, recomendamos usar RKE2.

1.3.2 Configurar DNS

Antes de continuar, você precisa configurar o acesso ao seu cluster. Assim como na configuração do próprio cluster, a forma como você configura o DNS será diferente dependendo de onde ele está sendo hospedado.

Dica
Dica

Se você não quiser lidar com a configuração de registros DNS (por exemplo, este é apenas um servidor de teste efêmero), você pode usar um serviço como sslip.io em vez disso. Com este serviço, você pode resolver qualquer endereço IP com <address>.sslip.io.

1.4 Instalar o Rancher

Para instalar o Rancher, você precisa obter acesso à API do Kubernetes do cluster que acabou de criar. Isso parece diferente dependendo de qual distribuição do Kubernetes está sendo usada.

Para o RKE2, o arquivo kubeconfig terá sido gravado em /etc/rancher/rke2/rke2.yaml. Salve este arquivo como ~/.kube/config em seu sistema local. Talvez você precise editar o arquivo para incluir o endereço IP ou nome de host roteável externamente correto.

Instale o Rancher facilmente com os comandos da Documentação do Rancher:

Instale o 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

Em seguida, instale o próprio 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

Se este sistema for destinado à produção, use o cert-manager para configurar um certificado real (como um da Let’s Encrypt).

Navegue até o nome de host que você configurou e faça login no Rancher com o bootstrapPassword que você usou. Você será guiado por um breve processo de configuração.

1.5 Instale o Elemental

Com o Rancher instalado, você agora pode instalar o operador Elemental e os CRDs necessários. O gráfico Helm para o Elemental é publicado como um artefato OCI, portanto a instalação é um pouco mais simples do que a de outros gráficos. Ele pode ser instalado a partir do mesmo shell que você usou para instalar o Rancher ou no navegador, dentro do shell do 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) Instale a extensão da GUI do Elemental

  1. Para usar a interface do usuário do Elemental, faça login na sua instância do Rancher e clique no menu de três linhas no canto superior esquerdo:

    Instalando a extensão Elemental 1
  2. Na guia "Disponível" nesta página, clique em "Instalar" no cartão do Elemental:

    Instalando a extensão Elemental 2
  3. Confirme que você deseja instalar a extensão:

    Instalando a extensão Elemental 3
  4. Após a instalação, você será solicitado a recarregar a página.

    Instalando a extensão Elemental 4
  5. Após recarregar, você pode acessar a extensão Elemental através do app global "Gerenciamento de SO".

    Acessando a extensão Elemental

1.6 Configurar Elemental

Para simplificar, recomendamos definir a variável $ELEM para o caminho completo de onde você deseja o diretório de configuração:

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

Para permitir que as máquinas se registrem no Elemental, precisamos criar um objeto MachineRegistration no namespace fleet-default.

Vamos criar uma versão básica deste 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

O comando cat escapa cada $ com uma barra invertida (\) para que o Bash não os processe como modelos. Remova as barras invertidas se estiver copiando manualmente.

Assim que o objeto for criado, encontre e anote o endpoint que foi atribuído:

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

Alternativamente, isso também pode ser feito pela GUI.

Extensão da GUI
  1. Na extensão de Gerenciamento de SO, clique em "Criar Endpoint de Registro":

    Clique em Criar Registro
  2. Dê um nome a esta configuração.

    Adicionar Nome
    Nota
    Nota

    Você pode ignorar o campo Configuração de Nuvem, pois os dados aqui são substituídos pelas etapas a seguir com o Edge Image Builder.

  3. Em seguida, role para baixo e clique em "Adicionar Rótulo" para cada rótulo que você deseja que esteja no recurso criado quando uma máquina for registrada. Isso é útil para distinguir máquinas.

    Adicionar rótulos
  4. Clique em "Criar" para salvar a configuração.

  5. Assim que o registro for criado, você deverá ver a URL de Registro listada e poderá clicar em "Copiar" para copiar o endereço:

    Copy URL
    Dica
    Dica

    Se você saiu dessa tela, pode clicar em "Endpoints de Registro" no menu à esquerda e, em seguida, clicar no nome do endpoint que você acabou de criar.

    Esta URL é usada na próxima etapa.

1.7 Crie a imagem

Embora a versão atual do Elemental tenha uma maneira de criar sua própria mídia de instalação, no SUSE Edge 3.6 fazemos isso com o Kiwi e o Edge Image Builder, para que o sistema resultante seja criado com o SUSE Linux Micro como o Sistema Operacional base.

Dica
Dica

Para obter mais detalhes sobre o Kiwi, siga o processo do Kiwi Image Builder (Capítulo 26, Criando imagens atualizadas do SUSE Linux Micro com o Kiwi) para criar novas imagens primeiro e, para o Edge Image Builder, confira o Guia de Introdução ao Edge Image Builder (Capítulo 2, Clusters autônomos com o Edge Image Builder) e também a Documentação de Componentes (Capítulo 8, Edge Image Builder).

A partir de um sistema Linux com Podman instalado, crie os diretórios e coloque a imagem base sendo criada pelo Kiwi:

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
  • A seção time é opcional, mas é altamente recomendável que seja configurada para evitar possíveis problemas com certificados e defasagem de relógio. Os valores fornecidos neste exemplo são apenas para fins ilustrativos. Por favor, ajuste-os para atender aos seus requisitos específicos.

  • A senha não codificada é eib.

  • O sccRegistrationCode é necessário para baixar e instalar os RPMs necessários das fontes oficiais (alternativamente, os RPMs elemental-register e elemental-system-agent podem ser carregados manualmente)

  • O comando cat escapa cada $ com uma barra invertida (\) para que o Bash não os processe como modelos. Remova as barras invertidas se estiver copiando manualmente.

  • O dispositivo de instalação será apagado durante a instalação.

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

Se você estiver inicializando um dispositivo físico, precisamos gravar a imagem em uma unidade flash USB. Isso pode ser feito com:

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

1.8 Inicialize os nós downstream

Agora que criamos o meio de instalação, podemos inicializar nossos nós downstream com ele.

Para cada um dos sistemas que você deseja controlar com o Elemental, adicione o meio de instalação e inicialize o dispositivo. Após a instalação, ele será reiniciado e se registrará automaticamente.

Se você estiver usando a extensão da UI, deverá ver seu nó aparecer no "Inventário de Máquinas".

Nota
Nota

Não remova o meio de instalação até ver o prompt de login; durante a primeira inicialização, os arquivos ainda são acessados na unidade flash.

1.9 Crie clusters downstream

Existem dois objetos que precisamos criar ao provisionar um novo cluster usando o Elemental.

  • O teste do Linux
  • Extensão da UI

O primeiro é o MachineInventorySelectorTemplate. Este objeto nos permite especificar um mapeamento entre clusters e as máquinas no inventário.

  1. Crie um seletor que corresponderá a qualquer máquina no inventário com um rótulo:

    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. Aplique o recurso ao cluster:

    kubectl apply -f $ELEM/selector.yaml
  3. Obtenha o nome da máquina e adicione o rótulo correspondente:

    MACHINENAME=$(kubectl get MachineInventory -n fleet-default | awk 'NR>1 {print $1}')
    
    kubectl label MachineInventory -n fleet-default \
     $MACHINENAME locationID=123
  4. Crie um recurso de cluster K3s de nó único simples e aplique-o ao cluster:

    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

Após criar esses objetos, você deve ver um novo cluster Kubernetes iniciar usando o novo nó com o qual você acabou de instalar.

1.10 Redefinição de Nó (Opcional)

O SUSE Rancher Elemental suporta a capacidade de realizar uma "redefinição de nó", que pode ser acionada opcionalmente quando um cluster inteiro é excluído do Rancher, um único nó é excluído de um cluster ou um nó é excluído manualmente do inventário de máquinas. Isso é útil quando você deseja redefinir e limpar quaisquer recursos órfãos e deseja trazer automaticamente o nó limpo de volta para o inventário de máquinas para que ele possa ser reutilizado. Isso não está habilitado por padrão e, portanto, qualquer sistema que for removido não será limpo (ou seja, os dados não serão removidos e quaisquer recursos de cluster do Kubernetes continuarão a operar nos clusters downstream) e exigirá intervenção manual para apagar os dados e registrar novamente a máquina no Rancher via Elemental.

Se você deseja que esta funcionalidade seja habilitada por padrão, você precisa garantir que seu MachineRegistration habilite isso explicitamente adicionando config.elemental.reset.enabled: true, por exemplo:

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

Então, todos os sistemas registrados com este MachineRegistration receberão automaticamente a anotação elemental.cattle.io/resettable: 'true' em sua configuração. Se você deseja fazer isso manualmente em nós individuais, por exemplo, porque você tem um MachineInventory existente que não possui esta anotação, ou você já implantou nós, você pode modificar o MachineInventory e adicionar a configuração resettable, por exemplo:

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

No SUSE Edge 3.1, o Operador Elemental coloca um marcador no sistema operacional que acionará o processo de limpeza automaticamente; ele interromperá todos os serviços do Kubernetes, removerá todos os dados persistentes, desinstalará todos os serviços do Kubernetes, limpará quaisquer diretórios restantes do Kubernetes/Rancher e forçará um novo registro no Rancher via configuração original do MachineRegistration Elemental. Isso acontece automaticamente, não há necessidade de qualquer intervenção manual. O script que é chamado pode ser encontrado em /opt/edge/elemental_node_cleanup.sh e é acionado via systemd.path após a colocação do marcador, portanto sua execução é imediata.

Atenção
Atenção

O uso da funcionalidade resettable pressupõe que o comportamento desejado ao remover um nó/cluster do Rancher é limpar os dados e forçar um novo registro. A perda de dados é garantida nesta situação, portanto, use isso apenas se você tiver certeza de que deseja que a redefinição automática seja realizada.

1.11 Próximas etapas

Aqui estão alguns recursos recomendados para pesquisar após usar este guia:

2 Clusters autônomos com o Edge Image Builder

O Edge Image Builder (EIB) é uma ferramenta que simplifica o processo de geração de imagens de disco personalizadas e prontas para inicialização (CRB) para inicializar máquinas, mesmo em cenários totalmente air-gapped. O EIB é usado para criar imagens de implantação para uso em todos os três tipos de pegadas de implantação SUSE Edge, pois é flexível o suficiente para oferecer desde as menores personalizações, por exemplo, adicionar um usuário ou definir o fuso horário, até oferecer uma imagem configurada de forma abrangente que configura, por exemplo, configurações de rede complexas, implanta clusters Kubernetes de vários nós, implanta cargas de trabalho do cliente e registra na plataforma de gerenciamento centralizado via Rancher/Elemental e SUSE Multi-Linux Manager. O EIB é executado como uma imagem de contêiner, tornando-o incrivelmente portátil entre plataformas e garantindo que todas as dependências necessárias sejam autocontidas, tendo um impacto muito mínimo nos pacotes instalados do sistema que está sendo usado para operar a ferramenta.

Nota
Nota

Para cenários de vários nós, o EIB implanta automaticamente o MetalLB e o Endpoint Copier Operator para que os hosts provisionados usando a mesma imagem criada ingressem automaticamente em um cluster Kubernetes.

Para mais informações, leia a Introdução ao Edge Image Builder (Capítulo 8, Edge Image Builder).

Atenção
Atenção

O Edge Image Builder 1.3.3.1 oferece suporte à personalização de imagens do SUSE Linux Micro 6.2. Versões mais antigas, como o SUSE Linux Enterprise Micro 5.5 ou 6.0, não são suportadas.

2.1 Pré-requisitos

Nota
Nota

Para fins que não sejam de produção, o openSUSE Leap 15.6 ou o openSUSE Tumbleweed podem ser usados como máquina host de compilação. Outros sistemas operacionais podem funcionar, desde que um tempo de execução do contêiner compatível esteja disponível.

2.1.1 Obtendo a imagem do EIB

A imagem de contêiner do EIB está disponível publicamente e pode ser baixada do registro SUSE Edge executando o seguinte comando em seu host de compilação de imagem:

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

2.2 Criando o diretório de configuração da imagem

Como o EIB é executado dentro de um contêiner, precisamos montar um diretório de configuração a partir do host, permitindo que você especifique a configuração desejada e, durante o processo de compilação, o EIB tenha acesso a quaisquer arquivos de entrada e artefatos de suporte necessários. Este diretório deve seguir uma estrutura específica. Vamos criá-lo, assumindo que este diretório existirá em seu diretório home e será chamado de "eib":

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

Na etapa anterior, criamos um diretório "base-images" que hospedará a imagem de entrada do SUSE Linux Micro 6.2, vamos garantir que a imagem seja copiada para o diretório de configuração:

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

Durante a execução do EIB, a imagem base original não é modificada; uma versão nova e personalizada é criada com a configuração desejada na raiz do diretório de configuração do EIB.

O diretório de configuração neste ponto deve estar assim:

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

2.3 Criando o arquivo de definição de imagem

O arquivo de definição descreve a maioria das opções configuráveis que o Edge Image Builder suporta; um exemplo completo de opções pode ser encontrado aqui, e recomendamos que você dê uma olhada no guia de construção de imagens upstream para exemplos mais abrangentes do que o que vamos analisar abaixo. Vamos começar com um arquivo de definição muito básico para nossa imagem 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 definição especifica que estamos gerando uma imagem de saída para um sistema baseado em AMD64/Intel 64. A imagem que será usada como base para modificações posteriores é uma imagem iso chamada slemicro.iso, esperada para estar localizada em $CONFIG_DIR/base-images/slemicro.iso. Ela também descreve que, após o EIB terminar de modificar a imagem, a imagem de saída será nomeada eib-image.iso e, por padrão, residirá em $CONFIG_DIR.

Agora, nossa estrutura de diretórios deve estar assim:

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

Nas seções a seguir, percorreremos alguns exemplos de operações comuns:

2.3.1 Configurando o Sistema Operacional (SO)

A seção operatingSystem do EIB destina-se a configurar onde o sistema operacional será instalado, o tamanho da imagem, etc. É uma seção opcional e não deve ser incluída, a menos que uma ou mais personalizações estejam sendo aplicadas.

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

Configuração específica do tipo. Dependendo do tipo de imagem que está sendo personalizada, uma das seguintes seções opcionais pode ser incluída.

  • isoConfiguration - Opcional; a configuração nesta seção aplica-se apenas à imagem ISO.

  • installDevice - Opcional; especifica o disco que deve ser usado como dispositivo de instalação. Este precisa ser um dispositivo de bloco e, por padrão, apagará automaticamente quaisquer dados encontrados no disco. Além disso, especificar este atributo aciona uma substituição do GRUB para instalar automaticamente o sistema operacional em vez de solicitar ao usuário que inicie a instalação, permitindo uma instalação totalmente autônoma e automatizada. Se omitido, o usuário é solicitado a selecionar a opção \"Install\" no menu do GRUB, além de ter que selecionar o disco de instalação e confirmar que o dispositivo será apagado no processo.

    Nota
    Nota

    O dispositivo sendo usado na seção installDevice pode ser especificado como /dev/sda ou usando a nomenclatura /dev/disk/by-id, /dev/disk/by-path para garantir que o dispositivo correto esteja sendo usado. Se estiver usando VMs libvirt, o valor do atributo serial pode ser especificado ao criar um disco para a VM (por exemplo, serial=111-disk1) para que possa ser usado no valor installDevice com a nomenclatura by-id, como por exemplo /dev/disk/by-id/ata-QEMU_HARDDISK_111-disk1 se estiver usando dispositivos ATA (libvirt prefixa automaticamente o ID com ata-QEMU_HARDDISK_ para dispositivos ATA, ou virtio- para dispositivos virtio, veja #17670 virtio issue para mais informações).

  • rawConfiguration - Opcional; a configuração nesta seção aplica-se apenas a imagens RAW.

  • diskSize - Opcional; define o tamanho desejado da imagem de disco bruta para o qual o EIB redimensionará a imagem resultante. Isso é importante para garantir que sua imagem de disco seja grande o suficiente para acomodar quaisquer artefatos sendo incorporados na imagem. É aconselhável definir isso como um valor ligeiramente menor que o tamanho do seu cartão SD (ou dispositivo de bloco, se estiver gravando diretamente em um disco), pois o sistema expandirá automaticamente no momento da inicialização para preencher o tamanho do dispositivo de bloco. Isso é opcional, mas altamente recomendado. Especifique como um número inteiro com \"M\" (Megabyte), \"G\" (Gigabyte) ou \"T\" (Terabyte) como sufixo (por exemplo, "32G").

  • luksKey - Obrigatório para imagens criptografadas; a chave LUKS fornecida para uma imagem RAW criptografada, que é necessária para que o EIB possa concluir o processo de construção.

  • expandEncryptedPartition - Opcional; desativado por padrão, quando ativado, expande automaticamente a partição criptografada para seu tamanho máximo. Por exemplo, se diskSize for 25G e este campo for true, o EIB expandirá a partição criptografada para 25G durante o processo de compilação.

2.3.2 Configurando usuários do SO

O EIB permite que você pré-configure usuários com informações de login, como senhas ou chaves SSH, incluindo a definição de uma senha de root fixa. Como parte deste exemplo, vamos definir a senha de root, e o primeiro passo é usar OpenSSL para criar uma senha criptografada de mão única:

openssl passwd -6 SecurePassword

Isso gerará algo semelhante a:

$6$G392FCbxVgn[...]Y7zTXnC1

Podemos então adicionar uma seção no arquivo de definição chamada operatingSystem com uma matriz users dentro dela. O arquivo resultante deve ter a seguinte aparência:

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

Também é possível adicionar usuários adicionais, criar os diretórios home, definir IDs de usuário, adicionar autenticação por chave SSH e modificar informações de grupo. Consulte o guia de criação de imagens upstream para obter mais exemplos.

2.3.3 Configurando o horário do SO

A seção time é opcional, mas é altamente recomendável que seja configurada para evitar possíveis problemas com certificados e desvio de relógio. O EIB configurará o chronyd e o /etc/localtime dependendo dos parâmetros aqui.

operatingSystem:
  time:
    timezone: Europe/London
    ntp:
      forceWait: true
      pools:
        - 2.suse.pool.ntp.org
      servers:
        - 10.0.0.1
        - 10.0.0.2
  • O timezone especifica o fuso horário no formato "Região/Localidade" (por exemplo, "Europe/London"). A lista completa pode ser encontrada executando timedatectl list-timezones em um sistema Linux.

  • ntp - Define atributos relacionados à configuração do NTP (usando chronyd):

  • forceWait - Solicita que o chronyd tente sincronizar as fontes de tempo antes de iniciar outros serviços, com um tempo limite de 180s.

  • pools - Especifica uma lista de pools que o chronyd usará como fontes de dados (usando iburst para melhorar o tempo necessário para a sincronização inicial).

  • servers - Especifica uma lista de servidores que o chronyd usará como fontes de dados (usando iburst para melhorar o tempo necessário para a sincronização inicial).

Nota
Nota

Os valores fornecidos neste exemplo são apenas para fins ilustrativos. Por favor, ajuste-os para atender aos seus requisitos específicos.

2.3.4 Adicionando certificados

Arquivos de certificado com a extensão ".pem" ou ".crt" armazenados no diretório certificates serão instalados no armazenamento de certificados de todo o sistema do nó:

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

Consulte o guia "Securing Communication with TLS Certificate" para obter mais informações.

2.3.5 Adicionando Arquivos de sistema operacional

Os arquivos colocados no diretório os-files no diretório de configuração da imagem são copiados automaticamente para o sistema de arquivos da imagem criada. O diretório exato será mantido quando eles forem copiados. Por exemplo, se um arquivo existe em um subdiretório chamado os-files/etc, ele é colocado no diretório /etc da imagem criada.

Nota
Nota

Se o diretório os-files existir, ele não pode estar vazio.

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

2.3.6 Configurando pacotes RPM

Um dos principais recursos do EIB é fornecer um mecanismo para adicionar pacotes de software adicionais à imagem, para que, quando a instalação for concluída, o sistema seja capaz de aproveitar os pacotes instalados imediatamente. O EIB permite que os usuários especifiquem o seguinte:

  • Pacotes por seus nomes dentro de uma lista na definição da imagem

  • Repositórios de rede para pesquisar esses pacotes

  • Credenciais do SUSE Customer Center (SCC) para pesquisar repositórios oficiais da SUSE pelos pacotes listados

  • Por meio de um diretório $CONFIG_DIR/rpms, carregue pacotes RPM personalizados que não existem em repositórios de rede

  • Por meio do mesmo diretório ($CONFIG_DIR/rpms/gpg-keys), chaves GPG para permitir a validação de pacotes de terceiros

O EIB então executará um processo de resolução de pacotes no momento da criação da imagem, tomando a imagem base como entrada, e tentará baixar e instalar todos os pacotes fornecidos, seja especificados por meio da lista ou fornecidos localmente. O EIB baixa todos os pacotes, incluindo quaisquer dependências, para um repositório que existe dentro da imagem de saída e instrui o sistema a instalá-los durante o processo de primeira inicialização. Realizar esse processo durante a criação da imagem garante que os pacotes sejam instalados com sucesso durante a primeira inicialização na plataforma desejada, por exemplo, o nó na borda. Isso também é vantajoso em ambientes onde você deseja incluir os pacotes adicionais na imagem em vez de baixá-los pela rede durante a operação, por exemplo, para ambientes air-gapped ou com rede restrita.

Como um exemplo simples para demonstrar isso, vamos instalar o pacote RPM nvidia-container-toolkit encontrado no repositório NVIDIA suportado por terceiros:

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

O arquivo de definição resultante parece com o seguinte:

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

O exemplo acima é simples, mas para fins de completude, baixe a chave de assinatura do pacote NVIDIA antes de executar a geração da imagem:

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

Adicionar pacotes RPM adicionais por meio deste método destina-se à adição de componentes de terceiros suportados ou pacotes fornecidos (e mantidos) pelo usuário; este mecanismo não deve ser usado para adicionar pacotes que normalmente não seriam suportados no SUSE Linux Micro. Se este mecanismo for usado para adicionar componentes de repositórios openSUSE (que não são suportados), incluindo de versões ou pacotes de serviço mais recentes, você pode acabar com uma configuração não suportada, especialmente quando a resolução de dependências resulta na substituição de partes principais do sistema operacional, mesmo que o sistema resultante possa parecer funcionar conforme o esperado. Se você não tiver certeza, entre em contato com seu representante SUSE para obter assistência na determinação da capacidade de suporte da configuração desejada.

Nota
Nota

Um guia mais abrangente com exemplos adicionais pode ser encontrado no guia de instalação de pacotes upstream.

2.3.7 Configurando o cluster Kubernetes e as cargas de trabalho do usuário

Outro recurso do EIB é sua capacidade de automatizar a implantação de clusters Kubernetes, tanto de nó único quanto de múltiplos nós altamente disponíveis que se inicializam no local (ou seja, não requerem qualquer forma de infraestrutura de gerenciamento centralizada para coordenação). O principal motivador por trás dessa abordagem são as implantações air-gapped ou ambientes com rede restrita, mas também serve como uma maneira de inicializar rapidamente clusters autônomos, mesmo que o acesso total e irrestrito à rede esteja disponível.

Este método permite não apenas a implantação do sistema operacional personalizado, mas também a capacidade de especificar a configuração do Kubernetes, quaisquer componentes em camadas adicionais via gráficos Helm e quaisquer cargas de trabalho do usuário via manifestos do Kubernetes fornecidos. No entanto, o princípio de design por trás deste método é que partimos do pressuposto de que o usuário deseja operar em ambiente air-gapped. Portanto, quaisquer itens especificados na definição da imagem serão incluídos na imagem, o que inclui cargas de trabalho fornecidas pelo usuário. O EIB garante que quaisquer imagens descobertas que sejam exigidas pelas definições sejam copiadas localmente e servidas pelo registro de imagem incorporado no sistema implantado resultante.

Neste próximo exemplo, vamos utilizar nossa definição de imagem existente e especificar uma configuração do Kubernetes (neste exemplo, como ela não lista os sistemas e suas funções, assumimos por padrão que se trata de um nó único), o que instruirá o EIB a provisionar um cluster Kubernetes RKE2 de nó único. Para demonstrar a automação na implantação tanto de cargas de trabalho fornecidas pelo usuário (via manifesto) quanto de componentes em camadas (via Helm), vamos instalar o KubeVirt utilizando o chart Helm SUSE Edge, assim como o NGINX por meio de um manifesto do Kubernetes. A configuração adicional que precisamos anexar à definição de imagem existente é a seguinte:

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

O arquivo de definição completo resultante deve agora ter a seguinte aparência:

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

Outros exemplos de opções, como implantações de vários nós, rede personalizada e opções/valores de gráfico Helm, podem ser encontrados na documentação upstream.

2.3.8 Configurando a rede

No último exemplo deste guia de início rápido, vamos configurar a rede que será ativada quando um sistema for provisionado com a imagem gerada pelo EIB. É importante entender que, a menos que uma configuração de rede seja fornecida, o modelo padrão é que o DHCP seja usado em todas as interfaces descobertas no momento da inicialização. No entanto, essa nem sempre é uma configuração desejável, especialmente se o DHCP não estiver disponível e você precisar fornecer configurações estáticas, ou se precisar configurar construções de rede mais complexas, por exemplo, bonds, LACP e VLANs, ou precisar substituir certos parâmetros, por exemplo, nomes de host, servidores DNS e rotas.

O EIB oferece a capacidade de fornecer configurações por nó (onde o sistema em questão é identificado exclusivamente pelo seu endereço MAC), ou uma substituição para fornecer uma configuração idêntica a cada máquina, o que é mais útil quando os endereços MAC do sistema não são conhecidos. Uma ferramenta adicional é usada pelo EIB chamada Network Manager Configurator, ou nmc para abreviar, que é uma ferramenta criada pela equipe SUSE Edge para permitir que configurações de rede personalizadas sejam aplicadas com base no esquema de rede declarativo nmstate.io e, no momento da inicialização, identificará o nó no qual está inicializando e aplicará a configuração de rede desejada antes que quaisquer serviços sejam iniciados.

Agora aplicaremos uma configuração de rede estática para um sistema com uma única interface descrevendo o estado de rede desejado em um arquivo específico do nó (com base no nome de host desejado) no diretório network necessário:

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
Atenção
Atenção

O exemplo acima está configurado para a sub-rede 192.168.122.0/24 padrão, assumindo que o teste está sendo executado em uma máquina virtual. Por favor, adapte-o para o seu ambiente, não se esquecendo do endereço MAC. Como a mesma imagem pode ser usada para provisionar vários nós, a rede configurada pelo EIB (via nmc) depende de sua capacidade de identificar exclusivamente o nó pelo seu endereço MAC e, portanto, durante a inicialização, o nmc aplicará a configuração de rede correta a cada máquina. Isso significa que você precisará saber os endereços MAC dos sistemas nos quais deseja instalar. Alternativamente, o comportamento padrão é confiar no DHCP, mas você pode utilizar o hook configure-network.sh para aplicar uma configuração comum a todos os nós. Consulte o guia de redes (Capítulo 9, Rede de borda) para obter mais detalhes.

A estrutura de arquivos resultante deve ser semelhante a:

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

A configuração de rede que acabamos de criar será analisada e os arquivos de conexão do NetworkManager necessários serão gerados automaticamente e inseridos na nova imagem de instalação que o EIB criará. Esses arquivos serão aplicados durante o provisionamento do host, resultando em uma configuração de rede completa.

Nota
Nota

Consulte o componente Edge Networking (Capítulo 9, Rede de borda) para obter uma explicação mais abrangente da configuração acima e exemplos desse recurso.

2.4 Criando a imagem

Agora que temos uma imagem base e uma definição de imagem para o EIB consumir, vamos prosseguir e criar a imagem. Para isso, usamos simplesmente o podman para chamar o contêiner do EIB com o comando \"build\", especificando o arquivo de definição:

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

A saída do comando deve ser semelhante 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

A imagem ISO criada é armazenada em $CONFIG_DIR/eib-image.iso:

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

Cada compilação cria uma pasta com carimbo de data/hora em $CONFIG_DIR/_build/ que inclui os logs da compilação, os artefatos usados durante a compilação, e os diretórios combustion e artefacts, que contêm todos os scripts e artefatos que são adicionados à imagem CRB.

O conteúdo deste diretório deve ser semelhante 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
    └── ...

Se a compilação falhar, eib-build.log é o primeiro log que contém informações. A partir daí, ele o direcionará para o componente que falhou para depuração.

Neste ponto, você deve ter uma imagem pronta para uso que irá:

  1. Implantar o SUSE Linux Micro 6.2

  2. Configurar a senha de root

  3. Instale o pacote nvidia-container-toolkit

  4. Configure um registro de contêiner incorporado para servir conteúdo localmente

  5. Instale o RKE2 de nó único

  6. Configure a rede estática

  7. Instale o KubeVirt

  8. Implante um manifesto fornecido pelo usuário

2.5 Depuração do processo de criação de imagem

Se o processo de criação de imagem falhar, consulte o guia de depuração upstream.

2.6 Testando sua imagem recém-criada

Para obter instruções sobre como testar a imagem CRB recém-criada, consulte o guia de teste de imagem upstream.

3 SUSE Multi-Linux Manager

Atenção
Atenção

A versão do SUSE Multi-Linux Manager incluída com SUSE Edge 3.6 (5.0.6) ainda não oferece suporte ao SUSE Linux Micro 6.2. Ela será atualizada e suportada em futuras versões do SUSE Edge 3.6.

O SUSE Multi-Linux Manager está incluído no SUSE Edge para fornecer automação e controle para manter o SUSE Linux Micro como o sistema operacional subjacente consistentemente atualizado em todos os nós da sua implantação de borda. Ele também pode ser usado para gerenciar o Kubernetes e aplicativos implantados no Kubernetes em seus nós de borda.

Este guia de início rápido destina-se a familiarizá-lo com o SUSE Multi-Linux Manager o mais rápido possível, com o objetivo de fornecer atualizações para seus nós de borda. O guia de início rápido não aborda tópicos como dimensionamento de armazenamento, criação e gerenciamento de canais de software adicionais para fins de preparação, ou gerenciamento de usuários, grupos de sistema e organizações para implantações maiores. Para uso em produção, recomendamos fortemente que você se familiarize com a abrangente Documentação do SUSE Multi-Linux Manager.

As etapas a seguir são necessárias para preparar o SUSE Edge para usar o SUSE Multi-Linux Manager de forma eficaz:

  • Implante e configure o SUSE Multi-Linux Manager Server.

  • Sincronize os repositórios de pacotes do SUSE Linux Micro.

  • Crie grupos de sistema.

  • Crie chaves de ativação.

  • Use o Edge Image Builder para preparar a mídia de instalação para o registro no SUSE Multi-Linux Manager

3.1 Implante o SUSE Multi-Linux Manager Server

Se você já tiver uma instância do SUSE Multi-Linux Manager 5.1 em execução, poderá pular esta etapa.

Você pode executar o SUSE Multi-Linux Manager Server em um servidor físico dedicado, como uma máquina virtual em seu próprio hardware ou na nuvem. Imagens de máquina virtual pré-configuradas para o SUSE Multi-Linux Server são fornecidas para nuvens públicas suportadas.

Neste guia de início rápido, estamos usando a imagem \"qcow2\" SUSE-Manager-Server.x86_64-5.0.4-Qcow-5.0-2025-04.qcow2 para AMD64/Intel 64 que você pode encontrar em https://www.suse.com/download/suse-manager/ ou no SUSE Customer Center. Esta imagem funcionará como uma máquina virtual em hipervisores como o KVM. Verifique sempre a versão mais recente da imagem e use-a para novas instalações.

Você também pode instalar o SUSE Multi-Linux Manager Server em qualquer uma das outras arquiteturas de hardware suportadas. Nesse caso, escolha a imagem que corresponde à sua arquitetura de hardware.

Após baixar a imagem, crie uma máquina virtual que atenda pelo menos às seguintes especificações mínimas de hardware:

  • 16 GB de RAM

  • 4 núcleos físicos ou virtuais

  • um dispositivo de bloco adicional que tenha pelo menos 100 GB

Com a imagem qcow2, não há necessidade de instalar o sistema operacional. Você pode anexar a imagem diretamente como sua partição raiz.

Você precisa configurar a rede para que seus nós de borda possam acessar posteriormente o SUSE Multi-Linux Manager Server com um nome de host que contenha o Nome de Domínio Completo e Qualificado ("FQDN")!

Ao inicializar o SUSE Multi-Linux Manager pela primeira vez, você precisa realizar uma configuração inicial:

  • Selecione o layout do seu teclado

  • Aceitar o contrato de licença

  • Selecione o seu fuso horário

  • Insira a senha de root para o sistema operacional

As próximas etapas precisam ser feitas como usuário root:

Para a próxima etapa, você precisa do código de registro para a Extensão SUSE Multi-Linux Manager que pode ser encontrado no SUSE Customer Center. O mesmo código pode ser usado para registrar tanto o SUSE Linux Micro quanto o SUSE Multi-Linux Manager:

Registrar o SUSE Linux Micro:

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

Registrar o SUSE Multi-Linux Manager:

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

A string do produto depende da sua arquitetura de hardware! Por exemplo, se você estiver usando o SUSE Multi-Linux Manager em um sistema ARM de 64 bits, a string é "SUSE-Manager-Server/5.0/aarch64".

Reinicialize

Atualizar o sistema:

transactional-update

A menos que não hajam alterações, reinicie para aplicar as atualizações.

O SUSE Multi-Linux Manager é fornecido por meio de um contêiner gerenciado pelo Podman. O comando mgradm lida com a configuração para você.

Atenção
Atenção

É muito importante que o seu servidor SUSE Multi-Linux Manager tenha o nome de host configurado com um Nome de Domínio Completo e Qualificado ("FQDN") que os nós de borda que você deseja gerenciar possam resolver corretamente em sua rede!

Antes de instalar e configurar o contêiner do servidor SUSE Multi-Linux Manager, você precisa preparar o dispositivo de bloco adicional que adicionou anteriormente. Para isso, você precisa saber o nome que a máquina virtual deu ao dispositivo. Por exemplo, se o dispositivo de bloco for /dev/vdb, você pode configurá-lo para ser usado pelo SUSE Multi-Linux Manager usando o seguinte comando:

mgr-storage-server /dev/vdb

Implantar o SUSE Multi-Linux Manager:

mgradm install podman <FQDN>

Forneça a senha para o certificado da CA. Esta senha deve ser diferente das suas senhas de login. Você geralmente não precisa inseri-la mais tarde, mas deve anotá-la.

Forneça a senha para o usuário \"admin\". Este é o usuário inicial para fazer login no SUSE Multi-Linux Manager. Você pode criar usuários adicionais com direitos totais ou restritos mais tarde.

3.2 Configurar o SUSE Multi-Linux Manager

Assim que a implantação terminar, você poderá fazer login na interface da web do SUSE Multi-Linux Manager usando o nome de host que você forneceu anteriormente. O usuário inicial é \"admin\". Use a senha que você forneceu na etapa anterior.

Para a etapa seguinte, você precisa de suas Credenciais da Organização, que podem ser encontradas na 2ª subguia da guia "Usuários" da sua organização no SUSE Customer Center. Com essas credenciais, o SUSE Multi-Linux Manager pode sincronizar todos os produtos para os quais você possui assinaturas.

Selecione Admin > Setup Wizard.

Na guia Organization Credentials, crie uma nova credencial com seu Username e Password que você encontrou no SUSE Customer Center.

Vá para a próxima guia SUSE Products. Você precisa aguardar até que a primeira sincronização de dados com o SUSE Customer Center seja concluída.

Assim que a lista for preenchida, use o filtro para mostrar apenas "Micro 6.2". Marque a caixa para SUSE Linux Micro 6.2 para a arquitetura de hardware na qual seus nós de borda serão executados (x86_64 ou aarch64).

Clique em Add Products. Isso adicionará o repositório de pacotes principal ("canal") para o SUSE Linux Micro e adicionará automaticamente o canal para as ferramentas de cliente do SUSE Manager como um subcanal.

Dependendo da sua conexão com a Internet, a primeira sincronização levará algum tempo. Você já pode começar com as próximas etapas:

Em Systems > System Groups, crie pelo menos um grupo ao qual seus sistemas serão automaticamente associados quando forem adicionados. Os grupos são uma maneira importante de categorizar sistemas, para que você possa aplicar configurações ou ações a todo um conjunto de sistemas de uma só vez. Eles são conceitualmente semelhantes aos rótulos no Kubernetes.

Clique em + Create Group

Forneça um nome curto, por exemplo, "Edge Nodes", e uma descrição longa.

Em Systems > Activation Keys, crie pelo menos uma chave de ativação. As chaves de ativação podem ser consideradas como um perfil de configuração que é aplicado automaticamente aos sistemas quando eles são integrados ao SUSE Multi-Linux Manager. Se você quiser que determinados nós de borda sejam adicionados a grupos diferentes ou usem uma configuração diferente, você pode criar chaves de ativação separadas para eles e usá-las posteriormente no Edge Image Builder para criar uma mídia de instalação personalizada.

Um caso de uso avançado típico para chaves de ativação seria atribuir seus clusters de teste aos canais de software com as atualizações mais recentes e seus clusters de produção aos canais de software que só recebem essas atualizações mais recentes depois que você as testou no cluster de teste.

Clique em + Create Key

Escolha uma descrição curta, por exemplo, "Edge Nodes". Forneça um nome exclusivo que identifique a chave, por exemplo, "edge-x86_64" para seus nós de borda com AMD64/Intel 64 arquitetura de hardware. Um prefixo numérico é adicionado automaticamente à chave. Para a organização padrão, o número é sempre "1". Se você criar organizações adicionais no SUSE Multi-Linux Manager e criar chaves para elas, esse número poderá ser diferente.

Se você não criou nenhum canal de software clonado, pode manter a configuração do Canal Base como "SUSE Manager Default". Isso atribuirá automaticamente o repositório de atualização do SUSE correto para seus nós de borda.

Como "Canal Filho", selecione o controle deslizante "incluir recomendados" para a arquitetura de hardware para a qual sua chave de ativação é usada. Isso adicionará o canal "SUSE-Manager-Tools-For-SL-Micro-6.2".

Na guia "Grupos", adicione o grupo que você criou anteriormente. Todos os nós que forem integrados usando esta chave de ativação serão adicionados automaticamente a esse grupo.

3.3 Crie uma imagem de instalação personalizada com o Edge Image Builder

Para usar o Edge Image Builder, você só precisa de um ambiente onde possa iniciar um contêiner baseado em Linux com podman.

Para uma configuração de laboratório mínima, podemos usar a mesma máquina virtual na qual o SUSE Multi-Linux Manager Server está sendo executado. Certifique-se de que você tenha espaço em disco suficiente na máquina virtual! Esta não é uma configuração recomendada para uso em produção. Consulte Seção 2.1, “Pré-requisitos” para ver os sistemas operacionais host com os quais testamos o Edge Image Builder.

Faça login no seu host do SUSE Multi-Linux Manager Server como root.

Baixe o contêiner do Edge Image Builder:

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

Crie o diretório /opt/eib e um subdiretório base-images:

mkdir -p /opt/eib/base-images

Neste guia de início rápido, estamos usando a versão "self-install" da imagem do SUSE Linux Micro. Essa imagem pode ser gravada posteriormente em um pen drive USB físico que você pode usar para instalar em servidores físicos. Se o seu servidor tiver a opção de anexo remoto de ISOs de instalação via BMC (Baseboard Management Controller), você também pode usar essa abordagem. Finalmente, essa imagem também pode ser usada com a maioria das ferramentas de virtualização.

Se você deseja pré-carregar a imagem diretamente em um nó físico ou iniciá-la diretamente de uma VM, você também pode usar o tipo de imagem \"raw\".

Você pode encontrar essas imagens no SUSE Customer Center ou em https://www.suse.com/download/sle-micro/

Baixe ou copie a imagem SL-Micro.x86_64-6.2-Default-SelfInstall-GM.install.iso para o diretório base-images e nomeie-a como \"slemicro.iso\".

A criação de imagens AArch64 em um host de compilação baseado na família de arquiteturas ARM é uma prévia tecnológica no SUSE Edge 3.6. Muito provavelmente funcionará, mas ainda não é suportado. Se você quiser experimentá-lo, precisa estar executando o Podman em uma máquina da família de arquiteturas ARM de 64 bits e deve substituir "x86_64" em todos os exemplos e trechos de código por "aarch64".

Em /opt/eib, crie um arquivo chamado iso-definition.yaml. Esta é a sua definição de compilação para o Edge Image Builder.

Aqui está um exemplo simples que instala o SL Micro 6.2, define uma senha de root, um usuário adicional e o mapa do teclado, inicia a interface gráfica do Cockpit e registra seu nó no 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

O Edge Image Builder também pode configurar a rede, instalar automaticamente o Kubernetes no nó e até mesmo implantar aplicativos via Helm charts. Consulte Capítulo 2, Clusters autônomos com o Edge Image Builder para exemplos mais abrangentes.

Para baseImage, especifique o nome real da ISO no diretório base-images que você deseja usar.

Neste exemplo, a senha de root seria \"root\". Consulte Seção 2.3.2, “Configurando usuários do SO” para criar hashes de senha para a senha segura que você deseja usar.

Como o Cockpit proíbe a conexão como usuário root, um usuário adicional é necessário. Neste exemplo, esse usuário é "admin" com a senha "admin".

Defina o mapa do teclado para o layout real que você deseja que o sistema tenha após a instalação.

Nota
Nota

Usamos a opção noGPGCheck: true porque não vamos fornecer uma chave GPG para verificar pacotes RPM. Um guia abrangente com uma configuração mais segura que recomendamos para uso em produção pode ser encontrado no guia de instalação de pacotes upstream.

Como mencionado várias vezes, seu host SUSE Multi-Linux Manager requer um nome de host totalmente qualificado que possa ser resolvido na rede na qual seus nós de borda inicializarão.

O valor para activationKey precisa corresponder à chave que você criou no SUSE Multi-Linux Manager.

Para criar uma imagem de instalação que registre automaticamente seus nós de borda no SUSE Multi-Linux Manager após a instalação, você também precisa preparar dois artefatos:

  • o pacote Salt minion que instala o agente de gerenciamento para o SUSE Multi-Linux Manager

  • o certificado CA do seu servidor SUSE Multi-Linux Manager

3.3.1 Baixe o pacote venv-salt-minion

Em /opt/eib, crie um subdiretório rpms.

Baixe o pacote venv-salt-minion do seu servidor SUSE Multi-Linux Manager para esse diretório. Você pode obtê-lo através da interface web encontrando o pacote em Software > Channel List e baixando-o do canal SUSE-Manager-Tools …​ ou baixá-lo do "repositório de inicializar" do SUSE Multi-Linux Manager com uma ferramenta como o 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

O nome real do pacote pode diferir se uma versão mais recente já tiver sido lançada. Se houver vários pacotes para escolher, escolha sempre o mais recente.

Para contornar um problema documentado nas notas de lançamento do SUSE Multi-Linux Manager, você também precisa colocar a versão mais recente do pacote de chave de compilação no diretório rpms (suse-build-key-12.0-slfo.1.1_3.1.noarch.rpm no momento em que esta documentação foi criada). Você pode encontrá-lo na seção Software do SUSE Multi-Linux Manager através da aba Packages do canal Pool do SL Micro. Existe um botão Download na visualização Details.

3.4 Baixe o certificado CA do SUSE Multi-Linux Manager

Em /opt/eib, crie um subdiretório certificates

Baixe o certificado CA do SUSE Multi-Linux Manager para esse diretório:

curl -O http://${HOSTNAME_OF_SUSE_MANAGER}/pub/RHN-ORG-TRUSTED-SSL-CERT
Atenção
Atenção

Você deve renomear o certificado para RHN-ORG-TRUSTED-SSL-CERT.crt. O Edge Image Builder garantirá então que o certificado seja instalado e ativado no nó de borda durante a instalação.

Agora você pode executar o 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

Se você usou um nome diferente para o seu arquivo de definição YAML ou deseja usar uma versão diferente do Edge Image Builder, você precisa adaptar o comando de acordo.

Após a conclusão da compilação, você encontrará a ISO de instalação no diretório /opt/eib como eib-image.iso.

Essa imagem agora pode ser usada para implantar nós que tentarão se registrar no SUSE Multi-Linux Manager.

Após a instalação completa do nó, você verá sua chave listada como pending na seção Salt/Keys do SUSE Multi-Linux Manager. Assim que você aceitar a chave, o nó será integrado automaticamente ao SUSE Multi-Linux Manager e aparecerá na lista Systems após a conclusão desse processo. Ele terá os grupos do sistema atribuídos, conforme fornecido na chave de ativação.

Você deve então agendar uma reinicialização antes de aplicar qualquer configuração adicional.

Observe que a aceitação da chave pode ser totalmente automatizada usando listas de permissões conforme descrito aqui.

Parte II Componentes

Lista de componentes para Edge

  • 4 Rancher
  • Consulte a documentação do Rancher em https://ranchermanager.docs.rancher.com/v2.14.

  • 5 Extensões do Dashboard do Rancher
  • As extensões permitem que usuários, desenvolvedores, parceiros e clientes estendam e aprimorem a interface do Rancher. SUSE Edge fornece extensões do Dashboard do KubeVirt.

  • 6 Fleet
  • Fleet é um mecanismo de gerenciamento e implantação de contêineres projetado para oferecer aos usuários mais controle sobre o cluster local e monitoramento constante por meio de GitOps. O Fleet foca não apenas na capacidade de escalar, mas também oferece aos usuários um alto grau de controle e visib…

  • 7 SUSE Linux Micro
  • Consulte a documentação oficial do SUSE Linux Micro

  • 8 Edge Image Builder
  • Consulte o Repositório Oficial.

  • 9 Rede de borda
  • Esta seção descreve a abordagem para a configuração de rede na solução SUSE Edge. Mostraremos como configurar o NetworkManager no SUSE Linux Micro de maneira declarativa e explicaremos como as ferramentas relacionadas são integradas.

  • 10 Elemental
  • O Elemental é uma pilha de software que permite o gerenciamento centralizado e completo de sistemas operacionais nativos de nuvem com o Kubernetes. A pilha Elemental consiste em vários componentes que residem no próprio Rancher ou nos nós de borda. Os componentes principais são:

  • 11 K3s
  • K3s é uma distribuição Kubernetes certificada e de alta disponibilidade, projetada para cargas de trabalho de produção em locais remotos, autônomos e com restrição de recursos, ou dentro de dispositivos IoT.

  • 12 RKE2
  • Consulte a documentação oficial do RKE2.

  • 13 SUSE Storage
  • O SUSE Storage é um sistema de armazenamento em blocos distribuído, leve, confiável e fácil de usar, projetado para o Kubernetes. É um produto baseado no Longhorn, um projeto de código aberto inicialmente desenvolvido pela Rancher Labs e atualmente incubado na CNCF.

  • 14 SUSE Security
  • O SUSE Security é uma solução de segurança para Kubernetes que fornece segurança de rede L7, segurança de tempo de execução, segurança da cadeia de suprimento e verificações de conformidade em um pacote coeso.

  • 15 MetalLB
  • Consulte a documentação oficial do MetalLB.

  • 16 Operador Endpoint Copier
  • O Operador Endpoint Copier é um operador do Kubernetes cujo objetivo é criar uma cópia de um Serviço e Endpoint do Kubernetes e mantê-los sincronizados.

  • 17 virtualização de borda
  • Esta seção descreve como você pode usar a virtualização de borda para executar máquinas virtuais em seus nós de borda. A virtualização de borda foi projetada para casos de uso de virtualização leve, onde se espera que um fluxo de trabalho comum para a implantação e gerenciamento de aplicativos virtu…

  • 18 Upgrade Controller do Sistema
  • Consulte a documentação do Upgrade Controller do Sistema.

  • 19 Upgrade Controller
  • Um controlador Kubernetes capaz de realizar atualizações nos seguintes SUSE Edge componentes da plataforma:

  • 20 SUSE Multi-Linux Manager
  • O SUSE Multi-Linux Manager está incluído no SUSE Edge para fornecer automação e controle para manter o SUSE Linux Micro como o sistema operacional subjacente consistentemente atualizado em todos os nós da sua implantação de borda.

4 Rancher

Consulte a documentação do Rancher em https://ranchermanager.docs.rancher.com/v2.14.

O Rancher é uma poderosa plataforma de gerenciamento de Kubernetes de código aberto que simplifica a implantação, as operações e o monitoramento de clusters Kubernetes em vários ambientes. Quer você gerencie clusters no local, na nuvem ou na borda, o Rancher fornece uma plataforma unificada e centralizada para todas as suas necessidades de Kubernetes.

4.1 Principais recursos do Rancher

  • Gerenciamento de vários clusters: A interface intuitiva do Rancher permite que você gerencie clusters Kubernetes de qualquer lugar — nuvens públicas, data centers privados e locais de borda.

  • Segurança e conformidade: O Rancher impõe políticas de segurança, controle de acesso com base em função (RBAC) e padrões de conformidade em todo o seu ambiente Kubernetes.

  • Operações de cluster simplificadas: O Rancher automatiza o provisionamento, as atualizações e a solução de problemas de clusters, simplificando as operações de Kubernetes para equipes de todos os tamanhos.

  • Catálogo de aplicativos centralizado: O catálogo de aplicativos do Rancher oferece uma gama diversificada de gráficos Helm e operadores Kubernetes, facilitando a implantação e o gerenciamento de aplicativos conteinerizados.

  • Entrega contínua: O Rancher oferece suporte a pipelines de GitOps e CI/CD, permitindo processos de entrega de aplicativos automatizados e simplificados.

4.2 Uso do Rancher em SUSE Edge

O Rancher fornece várias funcionalidades principais para a pilha SUSE Edge:

4.2.1 Gerenciamento centralizado de Kubernetes

Em implantações de borda típicas com inúmeros clusters distribuídos, o Rancher atua como um plano de controle central para gerenciar esses clusters Kubernetes. Ele oferece uma interface unificada para provisionamento, atualização, monitoramento e solução de problemas, simplificando as operações e garantindo a consistência.

4.2.2 Implantação simplificada de cluster

O Rancher simplifica a criação de clusters Kubernetes no sistema operacional leve SUSE Linux Micro, facilitando a implementação de infraestrutura de borda com recursos robustos de Kubernetes.

4.2.3 Implantação e gerenciamento de aplicativos

O catálogo de aplicativos integrado do Rancher pode simplificar a implantação e o gerenciamento de aplicativos conteinerizados em SUSE Edge clusters, permitindo a implantação sem interrupções de cargas de trabalho de borda.

4.2.4 Segurança e aplicação de políticas

O Rancher fornece ferramentas de governança baseadas em políticas, controle de acesso com base em função (RBAC) e integração com provedores de autenticação externos. Isso ajuda as implantações SUSE Edge a manter a segurança e a conformidade, o que é fundamental em ambientes distribuídos.

4.3 Melhores práticas

4.3.1 GitOps

O Rancher inclui o Fleet como um componente incorporado para permitir o gerenciamento de configurações de cluster e implantações de aplicativos com código armazenado no git.

4.3.2 Observabilidade

O Rancher inclui ferramentas incorporadas de monitoramento e registro como Prometheus e Grafana para obter insights abrangentes sobre a integridade e o desempenho do seu cluster.

4.4 Instalação com o Edge Image Builder

O SUSE Edge está usando o Capítulo 8, Edge Image Builder para personalizar imagens base do sistema operacional SUSE Linux Micro. Siga Seção 25.6, “Instalação do Rancher” para uma instalação air-gapped do Rancher sobre clusters Kubernetes provisionados pelo EIB.

4.5 Recursos adicionais

5 Extensões do Dashboard do Rancher

As extensões permitem que usuários, desenvolvedores, parceiros e clientes estendam e aprimorem a interface do Rancher. SUSE Edge fornece extensões do Dashboard do KubeVirt.

Consulte Rancher documentation para obter informações gerais sobre as Extensões do Dashboard do Rancher.

5.1 Instalação

Todos os componentes SUSE Edge 3.6, incluindo extensões do Dashboard, são distribuídos como artefatos OCI. Para instalar as Extensões SUSE Edge, você pode usar a interface do Dashboard do Rancher, Helm ou Fleet:

5.1.1 Instalando com a interface do Dashboard do Rancher

  1. Clique em Extensions na seção Configuração da barra lateral de navegação.

  2. Na página Extensions, clique no menu de três pontos no canto superior direito e selecione Manage Repositories.

    Cada extensão é distribuída por meio de seu próprio artefato OCI. Elas estão disponíveis no SUSE Edge repositório de charts Helm.

  3. Na página de repositórios, clique em Create.

  4. No formulário, especifique o nome e a URL do repositório e clique em Create.

    SUSE Edge URL do repositório de charts Helm: oci://registry.suse.com/edge/charts

    dashboard extensions create oci repository
  5. Você pode ver que o repositório de extensão foi adicionado à lista e está no estado Active.

    dashboard extensions repositories list
  6. Navegue de volta para Extensions na seção Configuração da barra lateral de navegação.

    Na guia Available, você pode ver as extensões disponíveis para instalação.

    dashboard extensions available extensions
  7. No cartão da extensão, clique em Install e confirme a instalação.

    Assim que a extensão for instalada, a interface do Rancher solicitará que você recarregue a página, conforme descrito em https://ranchermanager.docs.rancher.com/v2.14/integrations-in-rancher/rancher-extensions#installing-extensions.

5.1.2 Instalando com 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

As extensões precisam ser instaladas no namespace cattle-ui-plugin-system.

Nota
Nota

Após a instalação de uma extensão, a interface do Dashboard do Rancher precisa ser recarregada.

5.1.3 Instalando com Fleet

A instalação de extensões do Dashboard com Fleet requer a definição de um recurso gitRepo que aponte para um repositório Git com arquivo(s) de configuração de bundle 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

A propriedade releaseName é obrigatória e precisa corresponder ao nome da extensão para que ela seja instalada corretamente.

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 obter mais informações, consulte Capítulo 6, Fleet e o repositório fleet-examples.

Uma vez que as extensões estejam instaladas, elas são listadas na seção Extensions sob as guias Installed. Como elas não são instaladas via Apps/Marketplace, elas são marcadas com o rótulo Third-Party.

installed dashboard extensions

5.2 Extensão de Dashboard do KubeVirt

A extensão do KubeVirt fornece gerenciamento básico de máquinas virtuais para a interface do Dashboard do Rancher. Suas capacidades estão descritas em Seção 17.7.2, “Usando a Extensão do Painel do Rancher para KubeVirt”.

6 Fleet

Fleet é um mecanismo de gerenciamento e implantação de contêineres projetado para oferecer aos usuários mais controle sobre o cluster local e monitoramento constante por meio de GitOps. O Fleet foca não apenas na capacidade de escalar, mas também oferece aos usuários um alto grau de controle e visibilidade para monitorar exatamente o que está instalado no cluster.

O Fleet pode gerenciar implantações a partir do Git de YAML bruto do Kubernetes, charts Helm, Kustomize ou qualquer combinação dos três. Independentemente da origem, todos os recursos são transformados dinamicamente em charts Helm, e o Helm é usado como o mecanismo para implantar todos os recursos no cluster. Como resultado, os usuários podem desfrutar de um alto grau de controle, consistência e auditabilidade de seus clusters.

Para obter informações sobre como o Fleet funciona, consulte Fleet Architecture.

6.1 Instalando o Fleet com Helm

O Fleet vem incorporado ao Rancher, mas também pode ser instalado como um aplicativo independente em qualquer cluster Kubernetes usando Helm.

6.2 Usando o Fleet com o Rancher

O Rancher usa o Fleet para implantar aplicativos em clusters gerenciados. A entrega contínua com o Fleet introduz o GitOps em escala, projetado para gerenciar aplicativos em execução em um grande número de clusters.

O Fleet se destaca como uma parte integrada do Rancher. Os clusters gerenciados com o Rancher recebem automaticamente o Fleet agent implantado como parte do processo de instalação/importação e o cluster fica imediatamente disponível para ser gerenciado pelo Fleet.

6.3 Acessando o Fleet na interface do usuário do Rancher

O Fleet vem incorporado no Rancher e é gerenciado pela opção Entrega contínua na interface do usuário do Rancher.

fleet dashboard

A seção Entrega contínua consiste nos seguintes itens:

6.3.1 Painel

Uma página de visão geral de todos os repositórios GitOps em todos os espaços de trabalho. Apenas os espaços de trabalho com repositórios são exibidos.

6.3.2 Repositórios Git

Uma lista de repositórios GitOps no espaço de trabalho selecionado. Selecione o espaço de trabalho ativo usando a lista suspensa na parte superior da página.

6.3.3 Clusters

Uma lista de clusters gerenciados. Por padrão, todos os clusters gerenciados pelo Rancher são adicionados ao espaço de trabalho fleet-default. O espaço de trabalho fleet-local inclui o cluster local (de gerenciamento). A partir daqui, é possível Pause ou Force update os clusters ou mover o cluster para outro espaço de trabalho. Editar o cluster permite atualizar rótulos e anotações usados para agrupar os clusters.

6.3.4 Grupos de clusters

Esta seção permite o agrupamento personalizado dos clusters dentro do espaço de trabalho usando seletores.

6.3.5 Avançado

A seção "Avançado" permite gerenciar espaços de trabalho e outros recursos relacionados do Fleet.

6.4 Exemplo de instalação do KubeVirt com Rancher e Fleet usando o painel do Rancher

  1. Crie um repositório Git contendo o arquivo 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. No painel do Rancher, navegue até ☰ > Entrega contínua > Repositórios Git e clique em Add Repository.

  3. O assistente de criação de repositório orienta durante a criação do repositório Git. Forneça Nome, URL do repositório (referenciando o repositório Git criado na etapa anterior) e selecione a branch ou revisão apropriada. No caso de um repositório mais complexo, especifique Caminhos para usar vários diretórios em um único repositório.

    fleet create repo1
  4. Clique em Next.

  5. Na próxima etapa, você pode definir onde as cargas de trabalho serão implantadas. A seleção de clusters oferece várias opções básicas: você pode não selecionar nenhum cluster, selecionar todos os clusters ou escolher diretamente um cluster gerenciado específico ou um grupo de clusters (se definido). A opção "Avançado" permite editar diretamente os seletores via YAML.

    fleet create repo2
  6. Clique em Create. O repositório é criado. A partir de agora, as cargas de trabalho são instaladas e mantidas sincronizadas nos clusters que correspondem à definição do repositório.

6.5 Depuração e solução de problemas

A seção de navegação "Avançado" fornece visões gerais de recursos de nível inferior do Fleet. Um bundle é um recurso interno usado para a orquestração de recursos a partir do Git. Quando um repositório Git é verificado, ele produz um ou mais bundles.

Para encontrar bundles relevantes para um repositório específico, vá para a página de detalhes do repositório Git e clique na guia Bundles.

fleet repo bundles

Para cada cluster, o bundle é aplicado a um recurso BundleDeployment que é criado. Para visualizar os detalhes do BundleDeployment, clique no botão Graph no canto superior direito da página de detalhes do repositório Git. Um gráfico de Repositório > Bundles > BundleDeployments é carregado. Clique no BundleDeployment no gráfico para ver seus detalhes e clique em Id para visualizar o YAML do BundleDeployment.

fleet repo graph

Para obter informações adicionais sobre dicas de solução de problemas do Fleet, consulte aqui.

6.6 Exemplos do Fleet

A equipe Edge mantém um repositório com exemplos de instalação de projetos Edge com o Fleet.

O projeto Fleet inclui um repositório fleet-examples que cobre todos os casos de uso para estrutura de repositório Git.

7 SUSE Linux Micro

Consulte a documentação oficial do SUSE Linux Micro

O SUSE Linux Micro é um sistema operacional leve e seguro para a borda. Ele funde os componentes corporativos robustos do SUSE Linux Enterprise com os recursos que os desenvolvedores desejam em um sistema operacional moderno e estável. Como resultado, você obtém uma plataforma de infraestrutura confiável, simples de usar e com a mais alta conformidade da categoria.

7.1 Como o SUSE Edge usa o SUSE Linux Micro?

Usamos o SUSE Linux Micro como o sistema operacional base para nossa pilha de plataforma. Isso nos fornece uma base segura, estável e mínima para construir.

O SUSE Linux Micro é único em seu uso de instantâneos do sistema de arquivos (Btrfs) para permitir rollbacks fáceis caso algo dê errado durante o fazer upgrade. Isso permite fazer upgrade remoto para toda a plataforma, mesmo sem acesso físico em caso de problemas.

7.2 Melhores práticas

7.2.1 Mídia de instalação

O SUSE Edge usa o Edge Image Builder (Capítulo 8, Edge Image Builder) para pré-configurar a imagem de instalação para auto-instalação do SUSE Linux Micro.

7.2.2 Administração local

O SUSE Linux Micro vem com o Cockpit para permitir o gerenciamento local do host por meio de um aplicativo Web.

Este serviço está desativado por padrão, mas pode ser iniciado ativando o serviço systemd cockpit.socket. Como o Cockpit proíbe o login root por padrão, a criação de um usuário com privilégios administrativos é recomendada; consulte a documentação oficial do SUSE Linux Micro para obter mais informações.

7.3 Problemas conhecidos

  • Não há ambiente de desktop disponível no SUSE Linux Micro no momento, mas uma solução conteinerizada está em desenvolvimento.

8 Edge Image Builder

Consulte o Repositório Oficial.

O Edge Image Builder (EIB) é uma ferramenta que simplifica a geração de imagens de disco personalizadas e prontas para inicialização (CRB) para máquinas de bootstrapping. Essas imagens permitem a implantação de ponta a ponta de toda a pilha de software SUSE com uma única imagem.

Embora o EIB possa criar imagens CRB para todos os cenários de provisionamento, o EIB demonstra um valor tremendo em implantações air-gapped com redes limitadas ou completamente isoladas.

8.1 Como o SUSE Edge usa o Edge Image Builder?

SUSE Edge usa o EIB para a configuração simplificada e rápida de imagens personalizadas do SUSE Linux Micro para uma variedade de cenários. Esses cenários incluem o bootstrapping de máquinas virtuais e bare metal:

  • Implantações totalmente air-gapped de K3s/RKE2 Kubernetes (nó único e multi-nó)

  • Implantações totalmente air-gapped de Helm charts e manifestos do Kubernetes

  • Registro no Rancher via API Elemental

  • Metal3

  • Rede personalizada (por exemplo, IP estático, nome de host, VLANs, bonding, etc.)

  • Configurações personalizadas do sistema operacional (por exemplo, usuários, grupos, senhas, chaves SSH, proxies, NTP, certificados SSL personalizados, etc.)

  • Instalação air-gapped de pacotes RPM em nível de host e carregados lateralmente (incluindo resolução de dependências)

  • Registro no SUSE Multi-Linux Manager para gerenciamento do sistema operacional

  • Imagens de contêiner incorporadas

  • Argumentos da linha de comando do kernel

  • Unidades do systemd a serem habilitadas/desabilitadas no momento da inicialização

  • Scripts e arquivos personalizados para quaisquer tarefas manuais

8.2 Operações iniciais

Documentação abrangente para o uso e teste do Edge Image Builder pode ser encontrada aqui.

Adicionalmente, veja Capítulo 2, Clusters autônomos com o Edge Image Builder cobrindo um cenário básico de implantação.

Assim que estiver familiarizado com esta ferramenta, encontre mais informações úteis em nossa página seção de Dicas e Truques do EIB (Parte IV, “Dicas e truques”).

8.3 Problemas conhecidos

  • O EIB aplica air-gap aos Helm charts por meio da criação de templates para os Helm charts e da análise de todas as imagens presentes no template. Se um Helm chart não mantiver todas as suas imagens dentro do template e, em vez disso, carregá-las lateralmente, o EIB não será capaz de air-gap essas imagens automaticamente. A solução para isso é adicionar manualmente quaisquer imagens não detectadas à seção embeddedArtifactRegistry do arquivo de definição.

9 Rede de borda

Esta seção descreve a abordagem para a configuração de rede na solução SUSE Edge. Mostraremos como configurar o NetworkManager no SUSE Linux Micro de maneira declarativa e explicaremos como as ferramentas relacionadas são integradas.

9.1 Visão geral do NetworkManager

O NetworkManager é uma ferramenta que gerencia a conexão de rede principal e outras interfaces de conexão.

O NetworkManager armazena configurações de rede como arquivos de conexão que contêm o estado desejado. Essas conexões são armazenadas como arquivos no diretório /etc/NetworkManager/system-connections/.

Detalhes sobre o NetworkManager podem ser encontrados na documentação do SUSE Linux Micro.

9.2 Visão geral do nmstate

O nmstate é uma biblioteca amplamente adotada (com uma ferramenta de CLI associada) que oferece uma API declarativa para configurações de rede por meio de um esquema predefinido.

Detalhes sobre o nmstate podem ser encontrados na documentação upstream.

9.3 Digite: NetworkManager Configurator (nmc)

As opções de personalização de rede disponíveis no SUSE Edge são obtidas por meio de uma ferramenta de CLI chamada NetworkManager Configurator ou nmc, para abreviar. Ela aproveita a funcionalidade fornecida pela biblioteca nmstate e, como tal, é totalmente capaz de configurar endereços IP estáticos, servidores DNS, VLANs, vínculo de rede, bridges, etc. Esta ferramenta nos permite gerar configurações de rede a partir de estados desejados predefinidos e aplicá-las em muitos nós diferentes de forma automatizada.

Detalhes sobre o NetworkManager Configurator (nmc) podem ser encontrados no repositório upstream.

9.4 Como o SUSE Edge usa o NetworkManager Configurator?

O SUSE Edge utiliza o nmc para as personalizações de rede nos vários modelos de provisionamento diferentes: * Configurações estáticas declarativas nos cenários de Provisionamento Baseado em Imagem (Capítulo 2, Clusters autônomos com o Edge Image Builder)

9.5 Configurando com o Edge Image Builder

O Edge Image Builder (EIB) é uma ferramenta que permite configurar vários hosts com uma única imagem de SO. Nesta seção, mostraremos como você pode usar uma abordagem declarativa para descrever os estados de rede desejados, como eles são convertidos para as respectivas conexões do NetworkManager e, em seguida, aplicados durante o processo de provisionamento.

9.5.1 Pré-requisitos

Se você está seguindo este guia, presume-se que você já tenha o seguinte disponível:

  • Um AMD64/Intel 64 host físico (ou máquina virtual) executando o SLES 15 SP6 ou openSUSE Leap 15.6

  • Um tempo de execução do contêiner disponível (por exemplo, Podman)

  • Uma cópia da imagem RAW do SUSE Linux Micro 6.2 encontrada aqui

9.5.2 Obtendo a imagem de contêiner do Edge Image Builder

A imagem de contêiner do EIB está disponível publicamente e pode ser baixada do registro SUSE Edge executando:

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

9.5.3 Criando o diretório de configuração da imagem

Vamos começar criando o diretório de configuração:

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

Agora, garantiremos que a cópia da imagem base baixada seja movida para o diretório de configuração:

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

O EIB nunca modificará a entrada da imagem base. Ele criará uma nova imagem com suas modificações.

O diretório de configuração neste ponto deve estar assim:

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

9.5.4 Criando o arquivo de definição da imagem

O arquivo de definição descreve a maioria das opções configuráveis que o Edge Image Builder suporta.

Vamos começar com um arquivo de definição bem básico para nossa imagem 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

A seção image é obrigatória e especifica a imagem de entrada, sua arquitetura e tipo, bem como o nome que a imagem de saída terá. A seção operatingSystem é opcional e contém a configuração para habilitar o login nos sistemas provisionados com o nome de usuário/senha root/eib.

Nota
Nota

Sinta-se à vontade para usar sua própria senha criptografada executando openssl passwd -6 <password>.

O diretório de configuração neste ponto deve estar assim:

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

9.5.5 Definindo as configurações de rede

As configurações de rede desejadas não fazem parte do arquivo de definição de imagem que acabamos de criar. Agora vamos preenchê-las no diretório especial network/. Vamos criá-lo:

mkdir -p $CONFIG_DIR/network

Como mencionado anteriormente, a ferramenta NetworkManager Configurator (nmc) espera uma entrada na forma de um esquema predefinido. Você pode encontrar como configurar uma ampla variedade de diferentes opções de rede na documentação de exemplos upstream do NMState.

Este guia explicará como configurar a rede em três nós diferentes:

  • Um nó que usa duas interfaces Ethernet

  • Um nó que usa vínculo de rede

  • Um nó que usa uma ponte de rede

Atenção
Atenção

O uso de configurações de rede completamente diferentes não é recomendado em compilações de produção, especialmente se estiver configurando clusters Kubernetes. As configurações de rede geralmente devem ser homogêneas entre os nós ou, pelo menos, entre as funções dentro de um determinado cluster. Este guia inclui várias opções diferentes apenas para servir como uma referência de exemplo.

Nota
Nota

O seguinte pressupõe uma rede libvirt padrão com um intervalo de endereços IP 192.168.122.1/24. Ajuste de acordo se isso for diferente em seu ambiente.

Vamos criar os estados desejados para o primeiro nó que chamaremos de 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

Neste exemplo, definimos um estado desejado de duas interfaces Ethernet (eth0 e eth3), seus endereços IP solicitados, roteamento e resolução de DNS.

Atenção
Atenção

Você deve garantir que os endereços MAC de todas as interfaces Ethernet estejam listados. Eles são usados durante o processo de provisionamento como os identificadores dos nós e servem para determinar quais configurações devem ser aplicadas. É assim que conseguimos configurar vários nós usando uma única imagem ISO ou RAW.

A seguir, temos o segundo nó, que chamaremos de node2.suse.com e que usará vínculo de rede:

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

Neste exemplo, definimos um estado desejado de duas interfaces Ethernet (eth0 e eth1) que não estão habilitando o endereçamento IP, bem como um vínculo de rede com uma política round-robin e seu respectivo endereço, que será usado para encaminhar o tráfego de rede.

Por último, criaremos o terceiro e último arquivo de estado desejado, que utilizará uma ponte de rede e que chamaremos de 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

O diretório de configuração neste ponto deve estar assim:

├── 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

Os nomes dos arquivos no diretório network/ são intencionais. Eles correspondem aos nomes de host que serão definidos durante o processo de provisionamento.

9.5.6 Criando a imagem do SO

Agora que todas as configurações necessárias estão no lugar, podemos criar a imagem simplesmente executando:

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

A saída deve ser similar ao seguinte:

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!

O trecho acima nos diz que o componente Network foi configurado com sucesso, e podemos prosseguir com o provisionamento de nossos nós de borda.

Nota
Nota

Um arquivo de log (network-config.log) e os respectivos arquivos de conexão do NetworkManager podem ser inspecionados no diretório _build resultante, dentro de um diretório com carimbo de data/hora para a execução da imagem.

9.5.7 Provisionando os nós de borda

Vamos copiar a imagem RAW resultante:

mkdir edge-nodes && cd edge-nodes
for i in {1..4}; do cp $CONFIG_DIR/modified-image.raw node$i.raw; done

Você notará que copiamos a imagem criada quatro vezes, mas especificamos as configurações de rede apenas para três nós. Isso ocorre porque também queremos mostrar o que acontecerá se provisionarmos um nó que não corresponda a nenhuma das configurações desejadas.

Nota
Nota

Este guia usará virtualização para os exemplos de provisionamento de nós. Certifique-se de que as extensões necessárias estejam habilitadas no BIOS (consulte aqui para obter detalhes).

Usaremos o virt-install para criar máquinas virtuais usando os discos brutos copiados. Cada máquina virtual usará 10 GB de RAM e 6 vCPUs.

9.5.7.1 Provisionando o primeiro nó

Vamos criar a 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

É importante que criemos as interfaces de rede com os mesmos endereços MAC que os descritos no estado desejado acima.

Assim que a operação for concluída, veremos algo semelhante ao seguinte:

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:

Agora podemos fazer login com o par de credenciais root:eib. Também podemos acessar o host via SSH se preferirmos isso em vez do virsh console que nos é apresentado aqui.

Uma vez logado, vamos confirmar se todas as configurações estão no lugar.

Verifique se o nome do host está definido corretamente:

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

Verifique se o roteamento está configurado corretamente:

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 se a conexão com a Internet está disponível:

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 se exatamente duas interfaces Ethernet estão configuradas e apenas uma delas está ativa:

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

Você notará que a segunda interface é eth1 em vez da eth3 predefinida em nosso estado de rede desejado. Isso ocorre porque o Configurador do NetworkManager (nmc) é capaz de detectar que o SO deu um nome diferente para a NIC com endereço MAC 34:8a:b1:4b:16:e2 e ajusta suas configurações de acordo.

Verifique se isso realmente aconteceu inspecionando a fase de Combustion do provisionamento:

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

Provisionaremos agora o restante dos nós, mas mostraremos apenas as diferenças na configuração final. Sinta-se à vontade para aplicar qualquer uma ou todas as verificações acima para todos os nós que você está prestes a provisionar.

9.5.7.2 Provisionando o segundo nó

Vamos criar a 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

Assim que a máquina virtual estiver em execução, podemos confirmar que este nó está usando interfaces de vínculo.

node2:~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond99 state UP group default qlen 1000
    link/ether 34:8a:b1:4b:16:e3 brd ff:ff:ff:ff:ff:ff
    altname enp0s2
    altname ens2
3: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond99 state UP group default qlen 1000
    link/ether 34:8a:b1:4b:16:e3 brd ff:ff:ff:ff:ff:ff permaddr 34:8a:b1:4b:16:e4
    altname enp0s3
    altname ens3
4: bond99: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 34:8a:b1:4b:16:e3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.60/24 brd 192.168.122.255 scope global noprefixroute bond99
       valid_lft forever preferred_lft forever

Confirme que o roteamento está usando a interface de vínculo:

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

Garanta que os arquivos de conexão estática sejam utilizados corretamente:

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 Provisionando o terceiro nó

Vamos criar a 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

Assim que a máquina virtual estiver em execução, podemos confirmar que este nó está usando uma ponte de rede:

node3:~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master linux-br0 state UP group default qlen 1000
    link/ether 34:8a:b1:4b:16:e5 brd ff:ff:ff:ff:ff:ff
    altname enp0s2
    altname ens2
3: linux-br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 34:8a:b1:4b:16:e5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.70/24 brd 192.168.122.255 scope global noprefixroute linux-br0
       valid_lft forever preferred_lft forever

Confirme que o roteamento está usando a ponte:

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

Garanta que os arquivos de conexão estática sejam utilizados corretamente:

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 Provisionando o quarto nó

Por último, provisionaremos um nó que não corresponderá a nenhuma das configurações predefinidas por um endereço MAC. Nestes casos, usaremos o DHCP por padrão para configurar as interfaces de rede.

Vamos criar a 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

Assim que a máquina virtual estiver em execução, podemos confirmar que este nó está usando um endereço IP aleatório para sua interface de rede:

localhost:~ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:56:63:71 brd ff:ff:ff:ff:ff:ff
    altname enp0s2
    altname ens2
    inet 192.168.122.86/24 brd 192.168.122.255 scope global dynamic noprefixroute eth0
       valid_lft 3542sec preferred_lft 3542sec
    inet6 fe80::5054:ff:fe56:6371/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

Verifique se o nmc falhou ao aplicar configurações estáticas para este nó:

localhost:~ # journalctl -u combustion | grep nmc
Apr 23 12:15:45 localhost.localdomain combustion[1357]: [2024-04-23T12:15:45Z ERROR nmc] Applying config failed: None of the preconfigured hosts match local NICs

Verifique se a interface Ethernet foi configurada via 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 Configurações de nó unificadas

Existem ocasiões em que depender de endereços MAC conhecidos não é uma opção. Nestes casos, podemos optar pela chamada configuração unificada, que nos permite especificar configurações em um arquivo _all.yaml que serão então aplicadas a todos os nós provisionados.

Vamos construir e provisionar um nó de borda usando uma estrutura de configuração diferente. Siga todos os passos começando de Seção 9.5.3, “Criando o diretório de configuração da imagem” até Seção 9.5.5, “Definindo as configurações de rede”.

Neste exemplo, definimos um estado desejado de duas interfaces Ethernet (eth0 e eth1) - uma usando DHCP e outra com um endereço IP estático atribuído.

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 construir a imagem:

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

Assim que a imagem for construída com sucesso, vamos criar uma máquina virtual usando-a:

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

O processo de provisionamento pode levar alguns minutos. Assim que terminar, faça login no sistema com as credenciais fornecidas.

Verifique se o roteamento está configurado corretamente:

localhost:~ # ip r
default via 192.168.122.1 dev eth0 proto dhcp src 192.168.122.100 metric 100
10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.1 metric 101
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.100 metric 100

Verifique se a conexão com a Internet está disponível:

localhost:~ # ping google.com
PING google.com (142.250.72.46) 56(84) bytes of data.
64 bytes from den16s08-in-f14.1e100.net (142.250.72.46): icmp_seq=1 ttl=56 time=14.3 ms
64 bytes from den16s08-in-f14.1e100.net (142.250.72.46): icmp_seq=2 ttl=56 time=14.2 ms
^C
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 14.196/14.260/14.324/0.064 ms

Verifique se as interfaces Ethernet estão configuradas e ativas:

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 Configurações de rede personalizadas

Já cobrimos a configuração de rede padrão para o Edge Image Builder, que depende do NetworkManager Configurator. No entanto, também existe a opção de modificá-la por meio de um script personalizado. Embora essa opção seja muito flexível e também não dependa do endereço MAC, sua limitação decorre do fato de que usá-la é muito menos conveniente ao inicializar vários nós com uma única imagem.

Nota
Nota

Recomenda-se usar a configuração de rede padrão por meio de arquivos que descrevem os estados de rede desejados no diretório /network. Opte pelo script personalizado apenas quando esse comportamento não for aplicável ao seu caso de uso.

Vamos construir e provisionar um nó de borda usando uma estrutura de configuração diferente. Siga todos os passos começando de Seção 9.5.3, “Criando o diretório de configuração da imagem” até Seção 9.5.5, “Definindo as configurações de rede”.

Neste exemplo, criaremos um script personalizado que aplica uma configuração estática para a interface eth0 em todos os nós provisionados, além de remover e desabilitar as conexões com fio criadas automaticamente pelo NetworkManager. Isso é benéfico em situações em que você deseja garantir que cada nó em seu cluster tenha uma configuração de rede idêntica e, como tal, você não precisa se preocupar com o endereço MAC de cada nó antes da criação da imagem.

Vamos começar armazenando o arquivo de conexão no diretório /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

Agora que a configuração estática foi criada, também criaremos nosso script de rede 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

O binário nmc ainda será incluído por padrão, portanto, ele também pode ser usado no script configure-network.sh, se necessário.

Atenção
Atenção

O script personalizado deve sempre ser fornecido em /network/configure-network.sh no diretório de configuração. Se presente, todos os outros arquivos serão ignorados. NÃO é possível configurar uma rede trabalhando com configurações estáticas em formato YAML e um script personalizado simultaneamente.

O diretório de configuração neste ponto deve estar assim:

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

Vamos construir a imagem:

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

Assim que a imagem for construída com sucesso, vamos criar uma máquina virtual usando-a:

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

O processo de provisionamento pode levar alguns minutos. Assim que terminar, faça login no sistema com as credenciais fornecidas.

Verifique se o roteamento está configurado corretamente:

localhost:~ # ip r
default via 192.168.122.1 dev eth0 proto dhcp src 192.168.122.185 metric 100
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.185 metric 100

Verifique se a conexão com a Internet está disponível:

localhost:~ # ping google.com
PING google.com (142.250.72.78) 56(84) bytes of data.
64 bytes from den16s09-in-f14.1e100.net (142.250.72.78): icmp_seq=1 ttl=56 time=13.6 ms
64 bytes from den16s09-in-f14.1e100.net (142.250.72.78): icmp_seq=2 ttl=56 time=13.6 ms
^C
--- google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 13.592/13.599/13.606/0.007 ms

Verifique se uma interface Ethernet está configurada estaticamente usando nosso arquivo de conexão e se está ativa:

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

O Elemental é uma pilha de software que permite o gerenciamento centralizado e completo de sistemas operacionais nativos de nuvem com o Kubernetes. A pilha Elemental consiste em vários componentes que residem no próprio Rancher ou nos nós de borda. Os componentes principais são:

  • elemental-operator - O operador principal que reside no Rancher e lida com solicitações de registro de clientes.

  • elemental-register - O cliente que é executado nos nós de borda permitindo o registro via elemental-operator.

  • elemental-system-agent - Um agente que reside nos nós de borda; sua configuração é alimentada pelo elemental-register e ele recebe um plan para configurar o rancher-system-agent

  • rancher-system-agent - Uma vez que o nó de borda tenha sido totalmente registrado, este assume o lugar do elemental-system-agent e aguarda por mais plans do Rancher Manager (por exemplo, para a instalação do Kubernetes).

Consulte a documentação upstream do Elemental para obter informações completas sobre o Elemental e seu relacionamento com o Rancher.

10.1 Como o SUSE Edge usa o Elemental?

Usamos partes do Elemental para gerenciar dispositivos remotos onde o Metal3 não é uma opção (por exemplo, não há BMC, ou o dispositivo está atrás de um gateway NAT). Essa ferramenta permite que um operador inicialize seus dispositivos em um laboratório antes de saber quando ou para onde eles serão enviados. Ou seja, aproveitamos os componentes elemental-register e elemental-system-agent para permitir a integração de hosts SUSE Linux Micro ao Rancher para casos de uso de provisionamento de rede "phone home". Ao usar o Edge Image Builder (EIB) para criar imagens de implantação, o registro automático através do Rancher via Elemental pode ser alcançado especificando a configuração de registro no diretório de configuração do EIB.

Nota
Nota

No SUSE Edge 3.6 nós não utilizamos os aspectos de gerenciamento do sistema operacional do Elemental e, portanto, não é possível gerenciar a aplicação de patches no seu sistema operacional via Rancher. Em vez de usar as ferramentas do Elemental para criar imagens de implantação, o SUSE Edge usa a ferramenta Edge Image Builder, que consome a configuração de registro.

10.2 Melhores práticas

10.2.1 Mídia de instalação

A SUSE Edge maneira recomendada de criar imagens de implantação que possam aproveitar o Elemental para registro no Rancher no cenário de implantação de "provisionamento de rede phone home" é seguir as instruções detalhadas no guia de início rápido remote host onboarding with Elemental (Capítulo 1, Integração de host remoto com Elemental).

10.2.2 Rótulos

O Elemental rastreia seu inventário com o MachineInventory CRD e fornece uma maneira de selecionar o inventário, por exemplo, para selecionar máquinas para implantar clusters do Kubernetes, com base em rótulos. Isso fornece uma maneira para os usuários predefinirem a maioria (se não todas) de suas necessidades de infraestrutura antes mesmo de o hardware ser comprado. Além disso, como os nós podem adicionar/remover rótulos em seus respectivos objetos de inventário (executando novamente o elemental-register com a flag adicional --label "FOO=BAR"), podemos escrever scripts que descobrirão e informarão ao Rancher onde um nó foi inicializado.

10.3 Problemas conhecidos

  • A interface do usuário do Elemental atualmente não sabe como criar mídia de instalação ou atualizar sistemas operacionais que não sejam "Elemental Teal". Isso deve ser abordado em versões futuras.

11 K3s

K3s é uma distribuição Kubernetes certificada e de alta disponibilidade, projetada para cargas de trabalho de produção em locais remotos, autônomos e com restrição de recursos, ou dentro de dispositivos IoT.

Ele é empacotado como um binário único e pequeno, portanto, as instalações e atualizações são rápidas e fáceis.

11.1 Como o SUSE Edge usa o K3s?

O K3s pode ser usado como a distribuição Kubernetes que sustenta a pilha SUSE Edge. Ele foi projetado para ser instalado em um sistema operacional SUSE Linux Micro.

O uso do K3s como a distribuição Kubernetes da pilha SUSE Edge só é recomendado quando o etcd como backend não atende às suas restrições. Se o etcd como backend for possível, é melhor usar o RKE2 (Capítulo 12, RKE2).

11.2 Melhores práticas

11.2.1 Instalação

A maneira recomendada de instalar o K3s como parte da pilha SUSE Edge é usando o Edge Image Builder (EIB). Consulte sua documentação (Capítulo 8, Edge Image Builder) para obter mais detalhes sobre como configurá-lo para implantar o K3s.

Ele oferece suporte automático à configuração de alta disponibilidade (HA), bem como à configuração do Elemental.

11.2.2 Fleet para fluxo de trabalho GitOps

A pilha SUSE Edge usa o Fleet como sua ferramenta GitOps preferencial. Para obter mais informações sobre sua instalação e uso, consulte a seção do Fleet (Capítulo 6, Fleet) nesta documentação.

11.2.3 Gerenciamento de armazenamento

O K3s vem com armazenamento local-path pré-configurado, o que é adequado para clusters de nó único. Para clusters que abrangem vários nós, recomendamos o uso do SUSE Storage (Capítulo 13, SUSE Storage).

11.2.4 Balanceamento de carga e HA

Se você instalou o K3s usando o EIB, esta parte já está coberta pela documentação do EIB na seção de HA.

Caso contrário, você precisa instalar e configurar o MetalLB conforme nossa documentação do MetalLB (Capítulo 21, MetalLB no K3s (usando o modo camada 2)).

12 RKE2

Consulte a documentação oficial do RKE2.

O RKE2 é uma distribuição Kubernetes totalmente compatível que se dedica à segurança e conformidade por meio de:

  • Fornecimento de padrões e opções de configuração que permitem que os clusters cumpram o CIS Kubernetes Benchmark v1.6 ou v1.23 com um mínimo de intervenção do operador

  • Habilitação da conformidade com FIPS 140-2

  • Verificando regularmente os componentes em busca de CVEs usando trivy no pipeline de build do RKE2

O RKE2 inicia os componentes do plano de controle como pods estáticos, gerenciados pelo kubelet. O tempo de execução do contêiner incorporado é o containerd.

Nota: O RKE2 também é conhecido como RKE Government para transmitir outro caso de uso e setor que ele atende atualmente.

12.1 RKE2 vs K3s

O K3s é uma distribuição Kubernetes totalmente compatível e leve, focada em Edge, IoT, ARM - otimizada para facilidade de uso e ambientes com recursos limitados.

O RKE2 combina o melhor dos dois mundos da versão 1.x do RKE (doravante denominada RKE1) e do K3s.

Do K3s, ele herda a usabilidade, a facilidade de operação e o modelo de implantação.

Do RKE1, ele herda o alinhamento próximo com o Kubernetes upstream. Em alguns pontos, o K3s divergiu do Kubernetes upstream para otimizar implantações de edge, mas o RKE1 e o RKE2 podem permanecer estreitamente alinhados com o upstream.

12.2 Como o SUSE Edge usa o RKE2?

O RKE2 é uma peça fundamental da pilha SUSE Edge. Ele fica sobre o SUSE Linux Micro (Capítulo 7, SUSE Linux Micro), fornecendo uma interface Kubernetes padrão necessária para implantar cargas de trabalho de Edge.

12.3 Melhores práticas

12.3.1 Instalação

A maneira recomendada de instalar o RKE2 como parte da pilha SUSE Edge é usando o Edge Image Builder (EIB). Consulte a documentação do EIB (Capítulo 8, Edge Image Builder) para obter mais detalhes sobre como configurá-lo para implantar o RKE2.

O EIB é flexível o suficiente para suportar qualquer parâmetro exigido pelo RKE2, como especificar a versão do RKE2, a configuração dos servidores ou dos agentes, cobrindo todos os casos de uso de Edge.

12.3.2 Alta disponibilidade

Para implantações de HA, o EIB implanta e configura automaticamente o MetalLB (Capítulo 15, MetalLB) e o Endpoint Copier Operator (Capítulo 16, Operador Endpoint Copier) para expor o endpoint da API do RKE2 externamente.

12.3.3 Projeto de Rede

A pilha SUSE Edge oferece suporte ao Cilium, Calico, com o Cilium como seu CNI padrão. O meta-plugin Multus também pode ser usado quando os pods exigem múltiplas interfaces de rede. O RKE2 independente oferece suporte a uma gama mais ampla de opções de CNI.

12.3.4 Armazenamento

O RKE2 não fornece nenhum tipo de classe de armazenamento persistente ou operadores. Para clusters que abrangem vários nós, recomenda-se usar o SUSE Storage (Capítulo 13, SUSE Storage).

O SUSE Storage é um sistema de armazenamento em blocos distribuído, leve, confiável e fácil de usar, projetado para o Kubernetes. É um produto baseado no Longhorn, um projeto de código aberto inicialmente desenvolvido pela Rancher Labs e atualmente incubado na CNCF.

13.1 Pré-requisitos

Se você está seguindo este guia, ele pressupõe que você já tenha o seguinte disponível:

  • Pelo menos um host com o SUSE Linux Micro 6.2 instalado; isso pode ser físico ou virtual

  • Um cluster Kubernetes instalado; seja K3s ou RKE2

  • Helm

13.2 Instalação manual do SUSE Storage

13.2.1 Instalando o Open-iSCSI

Um requisito fundamental para implantar e usar o SUSE Storage é a instalação do pacote open-iscsi e o daemon iscsid em execução em todos os nós do Kubernetes. Isso é necessário, já que o Longhorn depende do iscsiadm no host para fornecer volumes persistentes ao Kubernetes.

Vamos instalá-lo:

transactional-update pkg install open-iscsi

É importante observar que, uma vez concluída a operação, o pacote é instalado apenas em um novo snapshot, já que o SUSE Linux Micro é um sistema operacional imutável. Para carregá-lo e para que o daemon iscsid comece a ser executado, devemos reiniciar no novo snapshot que acabamos de criar. Emita o comando reboot quando estiver pronto:

reboot
Dica
Dica

Para obter ajuda adicional na instalação do open-iscsi, consulte a documentação oficial do Longhorn.

13.2.2 Instalando o SUSE Storage

Existem várias maneiras de instalar o SUSE Storage em seus clusters Kubernetes. Este guia seguirá a instalação via Helm; no entanto, sinta-se à vontade para seguir a documentação oficial caso deseje outra abordagem.

  1. Faça login na Coleção de Aplicativos do Rancher:

    helm registry login dp.apps.rancher.io --username $APPS.RANCHER.IO_USERNAME --password $APPS.RANCHER.IO_ACCESS_TOKEN
  2. Instale o SUSE Storage no namespace longhorn-system e adicione suas credenciais de registro de contêiner:

    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. Confirme se a implantação foi bem-sucedida:

    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 Criando volumes do SUSE Storage

O SUSE Storage utiliza recursos do Kubernetes chamados StorageClass para provisionar automaticamente objetos PersistentVolume para pods. Pense em StorageClass como uma maneira de os administradores descreverem as classes ou perfis de armazenamento que oferecem.

Vamos criar um StorageClass com algumas opções padrão:

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

Agora que temos nosso StorageClass disponível, precisamos de um PersistentVolumeClaim referenciando-o. Uma PersistentVolumeClaim (PVC) é uma solicitação de armazenamento feita por um usuário. PVCs consomem recursos de PersistentVolume. As solicitações podem pedir tamanhos e modos de acesso específicos (por exemplo, podem ser montadas uma vez como leitura/gravação ou várias vezes como somente leitura).

Vamos criar um 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

É isso! Assim que tivermos o PersistentVolumeClaim criado, podemos prosseguir com a anexação dele a um Pod. Quando o Pod é implantado, o Kubernetes cria o volume Longhorn e o vincula ao Pod se houver armazenamento disponível.

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
Dica
Dica

O conceito de armazenamento no Kubernetes é um tópico complexo, mas importante. Mencionamos brevemente alguns dos recursos mais comuns do Kubernetes, no entanto, sugerimos que você se familiarize com a documentação de terminologia que o Longhorn oferece.

Neste exemplo, o resultado deve ser semelhante a isto:

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 Acessando a interface do usuário

Se você instalou o SUSE Storage com kubectl ou Helm, precisará configurar um controlador Ingress para permitir tráfego externo no cluster. A autenticação não está habilitada por padrão. Se o aplicativo de catálogo do Rancher foi usado, o Rancher criou automaticamente um controlador Ingress com controle de acesso (o rancher-proxy).

  1. Obtenha o endereço IP do serviço externo do Longhorn:

    kubectl -n longhorn-system get svc
  2. Depois de recuperar o endereço IP longhorn-frontend, você pode começar a usar a interface do usuário navegando até ele em seu navegador.

13.5 Instalando com o Edge Image Builder

O SUSE Edge está usando o Capítulo 8, Edge Image Builder para personalizar imagens base do SUSE Linux Micro OS. Vamos demonstrar como fazer isso para provisionar um cluster RKE2 com o SUSE Storage sobre ele.

Vamos criar o arquivo de definição:

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

A personalização de qualquer um dos valores do gráfico Helm é possível por meio de um arquivo separado fornecido em helm.charts[].valuesFile. Consulte a documentação upstream para obter detalhes.

Vamos criar a imagem:

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

Após a criação da imagem, você pode usá-la para instalar seu SO em um host físico ou virtual. Assim que o provisionamento for concluído, você poderá fazer login no sistema usando o par de credenciais root:eib.

Certifique-se de que o SUSE Storage tenha sido implantado com sucesso:

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 instalação não funcionará para ambientes totalmente air-gapped. Nesses casos, consulte Seção 25.8, “Instalação do SUSE Storage”.

O SUSE Security é uma solução de segurança para Kubernetes que fornece segurança de rede L7, segurança de tempo de execução, segurança da cadeia de suprimento e verificações de conformidade em um pacote coeso.

O SUSE Security é um produto que é implantado como uma plataforma de múltiplos contêineres, cada um comunicando-se por várias portas e interfaces. Internamente, ele usa o NeuVector como seu componente de segurança de contêiner subjacente. Os seguintes contêineres compõem a plataforma SUSE Security:

  • Gerente. Um contêiner sem estado que apresenta o console baseado na Web. Normalmente, apenas um é necessário e ele pode ser executado em qualquer lugar. A falha do Gerente não afeta nenhuma das operações do controller ou enforcer. No entanto, certas notificações (eventos) e dados de conexão recentes são armazenados em cache na memória pelo Gerente, portanto, a visualização deles seria afetada.

  • Controller. O ‘plano de controle’ para o SUSE Security deve ser implantado em uma configuração de HA, para que a configuração não seja perdida em uma falha de nó. Eles podem ser executados em qualquer lugar, embora os clientes frequentemente escolham colocá-los em nós de ‘gerenciamento’, master ou infra devido à sua criticidade.

  • Enforcer. Este contêiner é implantado como um DaemonSet, portanto, um Enforcer está em cada nó a ser protegido. Normalmente é implantado em cada nó de trabalho, mas o agendamento pode ser habilitado para nós master e infra para implantar lá também. Nota: Se o Enforcer não estiver em um nó de cluster e as conexões vierem de um pod nesse nó, o SUSE Security os rotula como cargas de trabalho 'não gerenciadas'.

  • Scanner. Realiza a verificação de vulnerabilidade usando o banco de dados CVE incorporado, conforme direcionado pelo Controller. Vários scanners podem ser implantados para aumentar a capacidade de verificação. Os scanners podem ser executados em qualquer lugar, mas geralmente são executados nos nós onde os controllers são executados. Veja abaixo as considerações de dimensionamento dos nós do scanner. Um scanner também pode ser invocado independentemente quando usado para verificação na fase de compilação, por exemplo, dentro de um pipeline que aciona uma verificação, recupera os resultados e interrompe o scanner. O scanner contém o banco de dados CVE mais recente, portanto, deve ser atualizado diariamente.

  • Updater. O atualizador aciona uma atualização do scanner por meio de um cron job do Kubernetes quando uma atualização do banco de dados CVE é desejada. Certifique-se de configurar isso para o seu ambiente.

Uma documentação mais detalhada sobre a integração e as melhores práticas do SUSE Security pode ser encontrada aqui.

14.1 Como o SUSE Edge usa o SUSE Security?

O SUSE Edge fornece uma configuração mais enxuta do SUSE Security como ponto de partida para implantações de borda.

14.2 Notas importantes

  • O contêiner Scanner deve ter memória suficiente para carregar a imagem a ser escaneada na memória e expandi-la. Para verificar imagens que excedam 1 GB, aumente a memória do scanner para um valor ligeiramente superior ao tamanho da maior imagem esperada.

  • Alto número de conexões de rede esperado no modo Protect. O Enforcer requer CPU e memória quando está no modo Protect (bloqueio de firewall em linha) para manter e inspecionar conexões e possíveis cargas úteis (DLP). Aumentar a memória e dedicar um núcleo de CPU ao Enforcer pode garantir uma capacidade adequada de filtragem de pacotes.

14.3 Instalando com o Edge Image Builder

SUSE Edge está usando Capítulo 8, Edge Image Builder para personalizar imagens base do SUSE Linux Micro OS. Siga Seção 25.7, “Instalação do SUSE Security” para uma instalação air-gapped do SUSE Security sobre clusters Kubernetes provisionados pelo EIB.

15 MetalLB

Consulte a documentação oficial do MetalLB.

O MetalLB é uma implementação de balanceador de carga para clusters Kubernetes bare metal, usando protocolos de roteamento padrão.

Em ambientes bare metal, configurar balanceadores de carga de rede é notavelmente mais complexo do que em ambientes de nuvem. Ao contrário das chamadas de API diretas em configurações de nuvem, o bare metal requer dispositivos de rede dedicados ou uma combinação de balanceadores de carga e configurações de IP Virtual (VIP) para gerenciar a alta disponibilidade (HA) ou resolver o potencial ponto único de falha (SPOF) inerente a um balanceador de carga de nó único. Essas configurações não são facilmente automatizadas, apresentando desafios nas implantações do Kubernetes, onde os componentes aumentam e diminuem de escala dinamicamente.

O MetalLB resolve esses desafios aproveitando o modelo do Kubernetes para criar serviços do tipo LoadBalancer como se estivessem operando em um ambiente de nuvem, mesmo em configurações bare metal.

Existem duas abordagens diferentes, via modo L2 (usando truques de ARP) ou via BGP. Principalmente, o L2 não precisa de nenhum equipamento de rede especial, mas o BGP é, em geral, melhor. Depende dos casos de uso.

15.1 Como o SUSE Edge usa o MetalLB?

O SUSE Edge usa o MetalLB de três maneiras principais:

  • Como uma solução de balanceador de carga: O MetalLB serve como a solução de balanceador de carga para máquinas bare metal.

  • Para uma configuração de HA K3s/RKE2: O MetalLB permite o balanceamento de carga da API do Kubernetes usando um endereço IP virtual.

  • Como uma solução BGP L3 onde o MetalLB anuncia rotas para os IPs de serviço para roteadores próximos.

Nota
Nota

Para ser possível expor a API, o Endpoint Copier Operator (Capítulo 16, Operador Endpoint Copier) é usado para manter sincronizados os endpoints da API do K8s do serviço kubernetes para um serviço kubernetes-vip LoadBalancer.

15.2 Melhores práticas

A instalação do MetalLB no modo L2 é descrita em Capítulo 21, MetalLB no K3s (usando o modo camada 2) e para o modo L3 em Capítulo 22, MetalLB no K3s (usando modo de camada 3).

Um guia sobre a instalação do MetalLB à frente do kube-api-server para obter uma topologia de alta disponibilidade pode ser encontrado em Capítulo 24, MetalLB na frente do servidor de API do Kubernetes.

15.3 Problemas conhecidos

  • O K3s vem com sua solução de balanceador de carga chamada Klipper. Para usar o MetalLB, o Klipper deve ser desativado. Isso pode ser feito iniciando o servidor K3s com a opção --disable servicelb, conforme descrito na documentação do K3s.

16 Operador Endpoint Copier

O Operador Endpoint Copier é um operador do Kubernetes cujo objetivo é criar uma cópia de um Serviço e Endpoint do Kubernetes e mantê-los sincronizados.

16.1 Como o SUSE Edge usa o Operador Endpoint Copier?

Na SUSE Edge, o Operador Endpoint Copier desempenha um papel crucial na obtenção de uma configuração de Alta Disponibilidade (HA) para clusters K3s/RKE2. Isso é realizado criando um serviço kubernetes-vip do tipo LoadBalancer, garantindo que seu Endpoint permaneça em sincronização constante com o Endpoint do Kubernetes. MetalLB (Capítulo 15, MetalLB) é utilizado para gerenciar o serviço kubernetes-vip, já que o endereço IP exposto é usado por outros nós para ingressar no cluster.

16.2 Melhores práticas

A documentação abrangente para usar o Operador Endpoint Copier pode ser encontrada aqui.

Além disso, consulte nosso guia (Capítulo 21, MetalLB no K3s (usando o modo camada 2)) sobre como obter uma configuração de HA para K3s/RKE2 usando o Operador Endpoint Copier e MetalLB.

16.3 Problemas conhecidos

Atualmente, o Operador Endpoint Copier está limitado a trabalhar com apenas um Serviço/Endpoint. Melhorias para oferecer suporte a múltiplos Serviços/Endpoints estão planejadas para o futuro.

17 virtualização de borda

Esta seção descreve como você pode usar a virtualização de borda para executar máquinas virtuais em seus nós de borda. A virtualização de borda foi projetada para casos de uso de virtualização leve, onde se espera que um fluxo de trabalho comum para a implantação e gerenciamento de aplicativos virtualizados e conteinerizados seja utilizado.

SUSE Edge A virtualização suporta dois métodos de execução de máquinas virtuais:

  1. Implantar as máquinas virtuais manualmente via libvirt+qemu-kvm no nível do host (onde o Kubernetes não está envolvido)

  2. Implantar o operador KubeVirt para gerenciamento de máquinas virtuais baseado em Kubernetes

Ambas as opções são válidas, mas apenas a segunda é abordada abaixo. Se você deseja usar os mecanismos de virtualização padrão prontos para uso fornecidos pelo SUSE Linux Micro, um guia abrangente pode ser encontrado aqui, e embora tenha sido escrito principalmente para o SUSE Linux Enterprise Server, os conceitos são quase idênticos.

Este guia explica inicialmente como implantar os componentes de virtualização adicionais em um sistema que já foi pré-implantado, mas segue com uma seção que descreve como incorporar essa configuração na implantação inicial via Edge Image Builder. Se você não quiser passar pelo básico e configurar as coisas manualmente, pule direto para essa seção.

17.1 Visão geral do KubeVirt

O KubeVirt permite gerenciar Máquinas Virtuais com o Kubernetes juntamente com o restante de suas cargas de trabalho conteinerizadas. Ele faz isso executando a parte do espaço do usuário da pilha de virtualização do Linux em um contêiner. Isso minimiza os requisitos no sistema host, permitindo uma configuração e gerenciamento mais fáceis.

Detalhes sobre a arquitetura do KubeVirt podem ser encontrados em na documentação upstream.

17.2 Pré-requisitos

Se você está seguindo este guia, presumimos que você já tenha o seguinte disponível:

  • Pelo menos um host físico com SUSE Linux Micro 6.2 instalado e com extensões de virtualização habilitadas no BIOS (veja aqui para detalhes).

  • Em seus nós, um cluster Kubernetes K3s/RKE2 já implantado e com um kubeconfig apropriado que permite acesso de superusuário ao cluster.

  • Acesso ao usuário root — estas instruções presumem que você é o usuário root e não está elevando seus privilégios via sudo.

  • Você tem Helm disponível localmente com uma conexão de rede adequada para conseguir enviar configurações para seu cluster Kubernetes e baixar as imagens necessárias.

17.3 Instalação manual da virtualização de borda

Este guia não o conduzirá pela implantação do Kubernetes, mas pressupõe que você tenha instalado a versão apropriada do SUSE Edge de K3s ou RKE2 e que você tenha seu kubeconfig configurado adequadamente para que comandos kubectl padrão possam ser executados como superusuário. Presumimos que seu nó forma um cluster de nó único, embora não sejam esperadas diferenças significativas para implantação de vários nós.

SUSE Edge A virtualização é implantada por meio de três charts Helm separados, especificamente:

  • KubeVirt: Os componentes principais de virtualização, ou seja, CRDs do Kubernetes, operadores e outros componentes necessários para permitir que o Kubernetes implante e gerencie máquinas virtuais.

  • Extensão do Painel do KubeVirt: Uma extensão opcional da interface do Rancher que permite o gerenciamento básico de máquinas virtuais, por exemplo, iniciar/parar máquinas virtuais, bem como acessar o console.

  • Importador de Dados Conteinerizados (CDI): Um componente adicional que permite a integração de armazenamento persistente para o KubeVirt, fornecendo recursos para que as máquinas virtuais usem back-ends de armazenamento do Kubernetes existentes para dados, mas também permitindo que os usuários importem ou clonem volumes de dados para máquinas virtuais.

Cada um desses gráficos Helm é versionado de acordo com a versão do SUSE Edge que você está usando atualmente. Para uso em produção/suportado, empregue os artefatos que podem ser encontrados no Registro SUSE.

Primeiro, certifique-se de que seu acesso kubectl esteja funcionando:

$ kubectl get nodes

Isso deve mostrar algo semelhante ao seguinte:

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

Agora você pode prosseguir para instalar os gráficos Helm KubeVirt e Importador de Dados Conteinerizados (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

Em alguns minutos, você deverá ter todos os componentes do KubeVirt e do CDI implantados. Você pode validar isso verificando todos os recursos implantados nos namespaces kubevirt-system e cdi-system.

Verifique os recursos do KubeVirt:

$ kubectl get all -n kubevirt-system

Isso deve mostrar algo semelhante ao seguinte:

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

Verifique os recursos do CDI:

$ kubectl get all -n cdi-system

Isso deve mostrar algo semelhante ao seguinte:

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 se as definições de recursos personalizados (CRDs) VirtualMachine estão implantadas, você pode validar com:

$ kubectl explain virtualmachine

Isso deve imprimir a definição do objeto VirtualMachine, que deve ser exibida da seguinte forma:

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 Implantando máquinas virtuais

Agora que o KubeVirt e o CDI estão implantados, vamos definir uma máquina virtual simples baseada no openSUSE Tumbleweed. Esta máquina virtual tem a mais simples das configurações, usando "rede de pod" padrão para uma configuração de rede idêntica a qualquer outro pod. Ela também emprega armazenamento não persistente, garantindo que o armazenamento seja efêmero, assim como em qualquer contêiner que não possua um 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

Isso deve exibir que um VirtualMachine foi criado:

virtualmachine.kubevirt.io/tumbleweed created

Esta definição de VirtualMachine é mínima, especificando pouco sobre a configuração. Ela simplesmente descreve que é um tipo de máquina "q35" com 2 GB de memória que usa uma imagem de disco baseada em um containerDisk efêmero (ou seja, uma imagem de disco que é armazenada em uma imagem de contêiner de um repositório de imagens remoto), e especifica um disco cloudInit codificado em base64, que usamos apenas para criação de usuário e imposição de senha no momento da inicialização (use base64 -d para decodificá-lo).

Nota
Nota

Esta imagem de máquina virtual é apenas para teste. A imagem não é oficialmente suportada e destina-se apenas a um exemplo de documentação.

Esta máquina leva alguns minutos para inicializar, pois precisa baixar a imagem de disco do openSUSE Tumbleweed, mas assim que o fizer, você poderá visualizar mais detalhes sobre a máquina virtual verificando as informações da máquina virtual:

$ kubectl get vmi

Isso deve exibir o nó no qual a máquina virtual foi iniciada e o endereço IP da máquina virtual. Lembre-se, como ela usa rede de pod, o endereço IP relatado será igual ao de qualquer outro pod, e roteável como tal:

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

Ao executar esses comandos nos próprios nós do cluster Kubernetes, com uma CNI que roteia o tráfego diretamente para os pods (por exemplo, Cilium), você deve conseguir ssh diretamente para a própria máquina. Substitua o seguinte endereço IP pelo que foi atribuído à sua máquina virtual:

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

Uma vez dentro desta máquina virtual, você pode explorar, mas lembre-se de que ela é limitada em termos de recursos e possui apenas 1 GB de espaço em disco. Quando terminar, Ctrl-D ou exit para desconectar da sessão SSH.

O processo da máquina virtual ainda está envolvido em um pod padrão do Kubernetes. O CRD VirtualMachine é uma representação da máquina virtual desejada, mas o processo no qual a máquina virtual é realmente iniciada é via pod virt-launcher, um pod padrão do Kubernetes, assim como qualquer outra aplicação. Para cada máquina virtual iniciada, você pode ver que existe um pod virt-launcher:

$ kubectl get pods

Isso deve mostrar o único pod virt-launcher para a máquina Tumbleweed que definimos:

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

Se dermos uma olhada neste pod virt-launcher, você verá que ele está executando os processos libvirt e qemu-kvm. Podemos entrar no próprio pod e dar uma olhada nos bastidores, observando que você precisa adaptar o seguinte comando para o nome do seu pod:

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

Assim que estiver no pod, tente executar comandos virsh juntamente com a observação dos processos. Você verá o binário qemu-system-x86_64 em execução, juntamente com certos processos para monitorar a máquina virtual. Você também verá a localização da imagem de disco e como a rede está conectada (como um 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

Finalmente, vamos excluir esta máquina virtual para limpar:

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

17.5 Usando o virtctl

Junto com as ferramentas de CLI padrão do Kubernetes, isto é, kubectl, o KubeVirt vem com um utilitário de CLI complementar que permite interagir com seu cluster de uma maneira que preenche algumas lacunas entre o mundo da virtualização e o mundo para o qual o Kubernetes foi projetado. Por exemplo, a ferramenta virtctl oferece a capacidade de gerenciar o ciclo de vida de máquinas virtuais (iniciar, parar, reiniciar etc.), fornecendo acesso aos consoles virtuais, fazendo upload de imagens de máquinas virtuais, bem como interagindo com recursos do Kubernetes, como serviços, sem usar a API ou os CRDs diretamente.

Vamos baixar a versão estável mais recente da ferramenta virtctl:

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

Se você estiver usando uma arquitetura diferente ou uma máquina que não seja Linux, poderá encontrar outras versões aqui. Você precisa tornar isso executável antes de prosseguir, e pode ser útil movê-lo para um local dentro do seu $PATH:

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

Você pode então usar a ferramenta de linha de comando virtctl para criar máquinas virtuais. Vamos replicar nossa máquina virtual anterior, observando que estamos enviando a saída diretamente para o 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)"

Isso deve mostrar a máquina virtual em execução (ela deve iniciar muito mais rápido desta vez, já que a imagem do contêiner estará em cache):

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

Agora podemos usar virtctl para conectar diretamente à máquina virtual:

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

Existem muitos outros comandos que podem ser usados pela virtctl. Por exemplo, virtctl console pode lhe dar acesso ao console serial se a rede não estiver funcionando, e você pode usar virtctl guestosinfo para obter informações abrangentes do SO, desde que o convidado tenha o qemu-guest-agent instalado e em execução.

Finalmente, vamos pausar e retomar a máquina virtual:

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

Você descobre que o objeto VirtualMachine aparece como Pausada e o objeto VirtualMachineInstance aparece como Em execução, mas 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

Você também descobre que não consegue mais se conectar à 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

Vamos retomar a máquina virtual e tentar novamente:

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

Agora devemos ser capazes de restabelecer uma conexão:

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

Finalmente, vamos remover a máquina virtual:

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

17.6 Rede de entrada simples

Nesta seção, mostramos como você pode expor máquinas virtuais como serviços padrão do Kubernetes e disponibilizá-las por meio do serviço de entrada do Kubernetes, por exemplo, Traefik com RKE2 ou Traefik com K3s. Este documento pressupõe que esses componentes já estejam configurados adequadamente e que você tenha um ponteiro DNS apropriado, por exemplo, via curinga, para apontar para seus nós de servidor Kubernetes ou seu IP virtual de entrada para a resolução de entrada adequada.

Nota
Nota

Em SUSE Edge 3.1+, se você estiver usando o K3s em uma configuração de nó de servidor múltiplo, talvez tenha precisado configurar um VIP baseado em MetalLB para Ingress; isso não é necessário para o RKE2.

No ambiente de exemplo, outra máquina virtual openSUSE Tumbleweed é implantada, o cloud-init é usado para instalar o NGINX como um servidor Web simples no momento da inicialização, e uma mensagem simples é configurada para ser retornada para verificar se funciona conforme o esperado quando uma chamada é feita. Para ver como isso é feito, simplesmente base64 -d a seção cloud-init na saída abaixo.

Vamos criar esta máquina virtual agora:

$ 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

Quando esta máquina virtual tiver iniciado com sucesso, podemos usar o comando virtctl para expor a VirtualMachineInstance com uma porta externa de 8080 e uma porta de destino de 80 (onde o NGINX escuta por padrão). Usamos o comando virtctl aqui, pois ele entende o mapeamento entre o objeto da máquina virtual e o pod. Isso cria um novo serviço para nós:

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

Teremos então um serviço apropriado criado automaticamente:

$ 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

Em seguida, se você usar kubectl create ingress, podemos criar um objeto ingress que aponte para este serviço. Adapte a URL (conhecida como "host" no objeto ingress) aqui para corresponder à sua configuração de DNS e certifique-se de apontá-la para a porta 8080:

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

Com o DNS configurado corretamente, você deve conseguir usar o curl na URL imediatamente:

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

Vamos fazer uma limpeza removendo esta máquina virtual e seus recursos de serviço 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 Usando a extensão da interface do usuário do Rancher

SUSE Edge A extensão de Virtualização fornece uma extensão da interface do usuário para o Rancher Manager, permitindo o gerenciamento básico de máquinas virtuais usando o painel do Rancher.

17.7.1 Instalação

Consulte Rancher Dashboard Extensions (Capítulo 5, Extensões do Dashboard do Rancher) para obter orientações de instalação.

17.7.2 Usando a Extensão do Painel do Rancher para KubeVirt

A extensão introduz uma nova seção KubeVirt ao Cluster Explorer. Esta seção é adicionada a qualquer cluster gerenciado que tenha o KubeVirt instalado.

A extensão permite que você interaja diretamente com os recursos de Máquina Virtual do KubeVirt para gerenciar o ciclo de vida das Máquinas Virtuais.

17.7.2.1 Criando uma máquina virtual

  1. Navegue até Cluster Explorer clicando em um cluster gerenciado habilitado para KubeVirt na navegação à esquerda.

  2. Navegue até a página KubeVirt > Virtual Machines e clique em Create from YAML no canto superior direito da tela.

  3. Preencha ou cole uma definição de máquina virtual e pressione Create. Use a definição de máquina virtual da seção Implantando Máquinas Virtuais como inspiração.

virtual machines page

17.7.2.2 Ações de Máquina Virtual

Você pode usar o menu de ações acessado a partir da lista suspensa ⋮ à direita de cada máquina virtual para realizar ações de iniciar, parar, pausar ou reinicialização suave. Alternativamente, você também pode usar ações em grupo na parte superior da lista selecionando as máquinas virtuais nas quais deseja realizar a ação.

A execução das ações pode ter um efeito na Estratégia de Execução da Máquina Virtual. Consulte a tabela na documentação do KubeVirt para obter mais detalhes.

17.7.2.3 Acessando o console da máquina virtual

A lista de "Máquinas virtuais" fornece uma lista suspensa Console que permite conectar à máquina usando VNC ou Console Serial. Esta ação só está disponível para máquinas em execução.

Em alguns casos, leva um pouco de tempo até que o console esteja acessível em uma máquina virtual recém-iniciada.

vnc console ui

17.8 Instalando com o Edge Image Builder

SUSE Edge está usando Capítulo 8, Edge Image Builder para personalizar imagens base do SUSE Linux Micro OS. Siga Seção 25.9, “Instalação do KubeVirt e CDI” para uma instalação air-gapped do KubeVirt e do CDI sobre clusters Kubernetes provisionados pelo EIB.

18 Upgrade Controller do Sistema

Consulte a documentação do Upgrade Controller do Sistema.

O Upgrade Controller do Sistema (SUC) visa fornecer um Upgrade Controller de uso geral, nativo do Kubernetes (para nós). Ele introduz um novo CRD, o Plano, para definir todas e quaisquer políticas e requisitos para fazer upgrade. Um Plano representa a intenção de modificar os nós do seu cluster.

18.1 Como o SUSE Edge usa o Upgrade Controller do Sistema?

O SUSE Edge usa o SUC para facilitar várias operações de "Dia 2" relacionadas a atualizações de versão do SO e do Kubernetes em clusters de gerenciamento e downstream.

As operações de "Dia 2" são definidas por meio do SUC Plans. Com base nesses planos, o SUC implanta cargas de trabalho em cada nó para executar a respectiva operação de "Dia 2".

O SUC também é usado dentro do Capítulo 19, Upgrade Controller. Para saber mais sobre as principais diferenças entre o SUC e o Upgrade Controller, consulte Seção 19.2, “Upgrade Controller vs System Upgrade Controller”.

18.2 Instalando o Upgrade Controller do Sistema

Importante
Importante

A partir do Rancher v2.10.0, o System Upgrade Controller é instalado automaticamente.

Siga as etapas abaixo apenas se o seu ambiente não for gerenciado pelo Rancher, ou se a sua versão do Rancher for inferior a v2.10.0.

Recomendamos que você instale o SUC por meio do Fleet (Capítulo 6, Fleet) localizado no repositório suse-edge/fleet-examples.

Nota
Nota

Os recursos oferecidos pelo repositório suse-edge/fleet-examples devem ser sempre usados a partir de uma versão do fleet-examples válida. Para determinar qual versão você precisa usar, consulte as Notas de Versão (Capítulo 41, Notas de versão).

Se você não puder usar o Fleet para a instalação do SUC, poderá instalá-lo através do repositório de Helm charts do Rancher ou incorporar o Helm chart do Rancher em seu próprio fluxo de trabalho GitOps de terceiros.

Esta seção aborda:

18.2.1 Instalação do Upgrade Controller do Sistema via Fleet

Usando o Fleet, existem dois recursos possíveis que podem ser usados para implantar o SUC:

18.2.1.1 Instalação do Upgrade Controller - GitRepo

Nota
Nota

Este processo também pode ser feito através da interface do usuário do Rancher, caso esteja disponível. Para mais informações, consulte Acessar o Fleet na interface do usuário do Rancher.

No seu cluster de gerenciamento:

  1. Determine em quais clusters você deseja implantar o SUC. Isso é feito implantando um recurso GitRepo do SUC no workspace do Fleet correto em seu cluster de gerenciamento. Por padrão, o Fleet possui dois workspaces:

    • fleet-local - para recursos que precisam ser implantados no cluster de gerenciamento.

    • fleet-default - para recursos que precisam ser implantados em clusters downstream.

      Para obter mais informações sobre os workspaces do Fleet, consulte a documentação upstream.

  2. Implante o recurso GitRepo:

    • Para implantar o SUC em seu cluster de gerenciamento:

      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 implantar o SUC em seus clusters downstream:

      Nota
      Nota

      Antes de implantar o recurso abaixo, você deve fornecer uma configuração targets válida, para que o Fleet saiba em quais clusters downstream implantar seu recurso. Para obter informações sobre como mapear para clusters downstream, consulte 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. Valide se o recurso GitRepo está implantado:

    # 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. Valide a implantação do Upgrade Controller do 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 Instalação do Upgrade Controller - Bundle

Esta seção ilustra como criar e implantar um recurso Bundle a partir de uma configuração padrão do Fleet usando o fleet-cli.

  1. Em uma máquina com acesso à rede, baixe o fleet-cli:

    Nota
    Nota

    Certifique-se de que a versão do fleet-cli que você baixar corresponda à versão do Fleet que foi implantada em seu cluster.

    • Para usuários de Mac, existe uma fleet-cli Homebrew Formulae.

    • Para usuários de Linux e Windows, os binários estão presentes como assets em cada release do 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. Torne o fleet-cli executável:

    chmod +x fleet-cli
  3. Clone a suse-edge/fleet-examples release que você deseja usar:

    git clone -b release-3.6.1 https://github.com/suse-edge/fleet-examples.git
  4. Navegue até o fleet do SUC, localizado no repositório fleet-examples:

    cd fleet-examples/fleets/day2/system-upgrade-controller
  5. Determine em quais clusters você deseja implantar o SUC. Isso é feito implantando o SUC Bundle no workspace do Fleet correto dentro do seu cluster de gerenciamento. Por padrão, o Fleet possui dois workspaces:

    • fleet-local - para recursos que precisam ser implantados no cluster de gerenciamento.

    • fleet-default - para recursos que precisam ser implantados em clusters downstream.

      Para obter mais informações sobre os workspaces do Fleet, consulte a documentação upstream.

  6. Se você pretende implantar o SUC apenas em clusters downstream, crie um arquivo targets.yaml que corresponda aos clusters específicos:

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

    Para obter informações sobre como mapear para clusters downstream, consulte Mapping to Downstream Clusters

  7. Prossiga para a construção do Bundle:

    Nota
    Nota

    Certifique-se de não baixar o fleet-cli no diretório fleet-examples/fleets/day2/system-upgrade-controller, caso contrário, ele será empacotado com o Bundle, o que não é recomendado.

    • Para implantar o SUC no seu cluster de gerenciamento, execute:

      fleet-cli apply --compress -n fleet-local -o - system-upgrade-controller . > system-upgrade-controller-bundle.yaml
    • Para implantar o SUC nos seus clusters downstream, execute:

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

      Para mais informações sobre este processo, consulte Convert a Helm Chart into a Bundle.

      Para mais informações sobre o comando fleet-cli apply, consulte fleet apply.

  8. Transfira o Bundle system-upgrade-controller-bundle.yaml para a máquina do seu cluster de gerenciamento:

    scp system-upgrade-controller-bundle.yaml <machine-address>:<filesystem-path>
  9. No seu cluster de gerenciamento, implante o Bundle system-upgrade-controller-bundle.yaml:

    kubectl apply -f system-upgrade-controller-bundle.yaml
  10. No seu cluster de gerenciamento, valide se o Bundle está implantado:

    # 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. Com base no workspace do Fleet no qual você implantou seu Bundle, navegue até o cluster e valide a implantação do SUC:

    Nota
    Nota

    O SUC é sempre implantado no namespace 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 Instalação do Helm do Upgrade Controller do Sistema

  1. Adicione o repositório de charts do Rancher:

    helm repo add rancher-charts https://charts.rancher.io/
  2. Implante o chart do 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

    Isso instalará a versão v0.19.1 do SUC, que é necessária pela plataforma Edge 3.6.

  3. Valide a implantação do 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 Monitoramento de Planos do Upgrade Controller do Sistema

Os Planos SUC podem ser visualizados das seguintes maneiras:

Importante
Importante

Os Pods implantados para Planos SUC são mantidos ativos por 15 minutos após uma execução bem-sucedida. Após esse período, eles são removidos pelo Job correspondente que os criou. Para ter acesso aos logs do Pod após esse período, você deve habilitar o registro em log para seu cluster. Para obter informações sobre como fazer isso no Rancher, consulte Rancher Integration with Logging Services.

18.3.1 Monitoramento de Planos do Upgrade Controller do Sistema - Rancher UI

Para verificar os logs do Pod para o plano SUC específico:

  1. No canto superior esquerdo, ☰ → <your-cluster-name>

  2. Selecione Workloads → Pods

  3. Selecione o menu suspenso Only User Namespaces e adicione o namespace cattle-system

  4. Na barra de filtro de Pods, escreva o nome do Pod do seu Plano SUC. O nome estará no seguinte formato de modelo: apply-<plan_name>-on-<node_name>

    Nota
    Nota

    Podem existir Pods Completed e Unknown para um Plano SUC específico. Isso é esperado e acontece devido à natureza de algumas das atualizações.

  5. Selecione o pod cujos logs você deseja revisar e navegue até ⋮ → View Logs

18.3.2 Monitoramento de Planos do Upgrade Controller do Sistema - Manual

Nota
Nota

As etapas abaixo pressupõem que kubectl foi configurado para se conectar ao cluster onde os Planos SUC foram implantados.

  1. Liste os Planos SUC implantados:

    kubectl get plans -n cattle-system
  2. Obtenha o Pod para o plano SUC:

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

    Podem existir tanto Completed Pods quanto Unknown para um Plano SUC específico. Isso é esperado e acontece devido à natureza de alguns dos upgrades.

  3. Obtenha os logs para o Pod:

    kubectl logs <pod_name> -n cattle-system

19 Upgrade Controller

Um controlador Kubernetes capaz de realizar atualizações nos seguintes SUSE Edge componentes da plataforma:

  • Sistema Operacional (SUSE Linux Micro)

  • Kubernetes (K3s & RKE2)

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

O Upgrade Controller simplifica o processo de atualização para os componentes mencionados acima, encapsulando suas complexidades dentro de um único user-facing recurso que serve como um gatilho para a atualização. Os usuários só precisam configurar este recurso e o Upgrade Controller cuida do resto.

Nota
Nota

O Upgrade Controller atualmente suporta SUSE Edge atualizações de plataforma apenas para clusters de gerenciamento não air-gapped. Consulte a seção Seção 19.8, “Limitações conhecidas” para obter mais informações.

19.1 Como o SUSE Edge usa o Upgrade Controller?

O Upgrade Controller é essencial na automação das operações de "Dia 2" (anteriormente manuais) necessárias para atualizar clusters de gerenciamento de uma versão de lançamento SUSE Edge para a próxima.

Para alcançar essa automação, o Upgrade Controller utiliza ferramentas como o System Upgrade Controller (Capítulo 18, Upgrade Controller do Sistema) e o Helm Controller.

Para mais detalhes sobre como o Upgrade Controller funciona, consulte Seção 19.5, “Como funciona o Upgrade Controller?”.

Para limitações conhecidas que o Upgrade Controller possui, consulte Seção 19.8, “Limitações conhecidas”.

Para obter informações sobre a diferença entre o Upgrade Controller e o System Upgrade Controller, consulte Seção 19.2, “Upgrade Controller vs System Upgrade Controller”.

19.2 Upgrade Controller vs System Upgrade Controller

O System Upgrade Controller (SUC) (Capítulo 18, Upgrade Controller do Sistema) é uma ferramenta de propósito geral que propaga instruções de atualização para nós específicos do Kubernetes.

Embora ele suporte algumas operações de "Dia 2" para a plataforma SUSE Edge, ele não cobre todas elas. Além disso, mesmo para operações suportadas, os usuários precisam configurar, manter e implantar manualmente múltiplos SUC Plans — um processo sujeito a erros que pode levar a problemas inesperados.

Isso levou à necessidade de uma ferramenta que automatize e abstraia a complexidade de gerenciar várias operações de "Dia 2" para a plataforma SUSE Edge. Assim, o Upgrade Controller foi desenvolvido. Ele simplifica o processo de atualização ao introduzir um único user-facing resource que conduz a atualização. Os usuários só precisam gerenciar esse recurso, enquanto o Upgrade Controller cuida do resto.

19.3 Instalando o Upgrade Controller

19.3.1 Pré-requisitos

19.3.2 Etapas

  1. Instale o chart Helm do Upgrade Controller no seu cluster de gerenciamento:

    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 a implantação do Upgrade Controller:

    kubectl get deployment -n upgrade-controller-system
  3. Valide o pod do Upgrade Controller:

    kubectl get pods -n upgrade-controller-system
  4. Valide os logs do pod do Upgrade Controller:

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

19.4 Instalando o Upgrade Controller via Edge Image Builder

Como alternativa à instalação manual descrita acima, é possível instalar o Upgrade Controller como parte da implantação inicial orquestrada pelo Edge Image Builder (Capítulo 8, Edge Image Builder).

Nesse caso, é necessário adicionar a seguinte configuração de chart helm ao arquivo de configuração do 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 Como funciona o Upgrade Controller?

Para realizar uma atualização de versão do Edge, o Upgrade Controller introduz dois novos recursos personalizados do Kubernetes:

  • UpgradePlan (Seção 19.6.1, “UpgradePlan”) - criado pelo usuário; contém configurações referentes a uma atualização de versão do Edge.

  • ReleaseManifest (Seção 19.6.2, “ReleaseManifest”) - criado pelo Upgrade Controller; contém versões de componentes específicas para uma determinada versão de lançamento do Edge. Este arquivo não deve ser editado pelos usuários.

O Upgrade Controller prossegue criando um recurso ReleaseManifest que contém os dados do componente para a versão de lançamento do Edge especificada pelo usuário na propriedade releaseVersion no recurso UpgradePlan.

Usando os dados do componente do ReleaseManifest, o Upgrade Controller prossegue com a atualização dos componentes da versão do Edge na seguinte ordem:

Nota
Nota

Durante o processo de atualização, o Upgrade Controller gera continuamente informações de atualização para o UpgradePlan criado. Para obter mais informações sobre como acompanhar o processo de atualização, consulte Acompanhando o processo de atualização (Seção 19.7, “Acompanhando o processo de atualização”).

19.5.1 Atualização do Sistema operacional

Para atualizar o sistema operacional, o Upgrade Controller cria planos SUC (Capítulo 18, Upgrade Controller do Sistema) que possuem o seguinte modelo de nomenclatura:

  • Para planos SUC relacionados a atualizações do SO dos nós do plano de controle - control-plane-<os-name>-<os-version>-<suffix>.

  • Para planos SUC relacionados a atualizações do SO dos nós de trabalho - workers-<os-name>-<os-version>-<suffix>.

Com base nesses planos, o SUC prossegue criando cargas de trabalho em cada nó do cluster que realizam a atualização do SO propriamente dita.

Dependendo do ReleaseManifest, a atualização do SO pode incluir:

  • Atualizações apenas de pacotes - para casos de uso em que a versão do SO não muda entre as versões do Edge.

  • Migração completa do SO - para casos de uso em que a versão do SO muda entre as versões do Edge.

A atualização é executada um nó por vez, começando pelos nós do plano de controle. Somente se a atualização do nó do plano de controle terminar, os nós de trabalho começarão a ser atualizados.

Nota
Nota

O Controlador de Atualização configura os Planos SUC do SO para realizar um dreno dos nós do cluster se o cluster tiver mais de um nó do tipo especificado.

Para clusters onde os nós do plano de controle são maiores que um e há apenas um nó de trabalho, um dreno será realizado apenas para os nós do plano de controle e vice-versa.

Para obter informações sobre como desativar completamente os drenos de nós, consulte a seção UpgradePlan (Seção 19.6.1, “UpgradePlan”).

19.5.2 Fazer upgrade do Kubernetes

Para fazer upgrade da distribuição Kubernetes de um cluster, o Upgrade Controller cria Planos SUC (Capítulo 18, Upgrade Controller do Sistema) que possuem o seguinte modelo de nomenclatura:

  • Para Planos SUC relacionados a atualizações do Kubernetes de nós do plano de controle - control-plane-<k8s-version>-<suffix>.

  • Para Planos SUC relacionados a atualizações do Kubernetes de nós de trabalho - workers-<k8s-version>-<suffix>.

Com base nesses planos, o SUC prossegue criando cargas de trabalho em cada nó do cluster que realizam a atualização real do Kubernetes.

A atualização do Kubernetes ocorrerá um nó por vez, começando pelos nós do plano de controle. Somente se a atualização do nó do plano de controle terminar, os nós de trabalho começarão a ser atualizados.

Nota
Nota

O Controlador de Atualização configura os Planos SUC do Kubernetes para realizar um dreno dos nós do cluster se o cluster tiver mais de um nó do tipo especificado.

Para clusters onde os nós do plano de controle são maiores que um e há apenas um nó de trabalho, um dreno será realizado apenas para os nós do plano de controle e vice-versa.

Para obter informações sobre como desativar completamente os drenos de nós, consulte Seção 19.6.1, “UpgradePlan”.

19.5.3 Atualizações de Componentes Adicionais

Atualmente, todos os componentes adicionais são instalados via charts Helm. Para obter uma lista completa dos componentes de uma versão específica, consulte as Release Notes (Capítulo 41, Notas de versão).

Para charts Helm implantados por meio do EIB (Capítulo 8, Edge Image Builder), o Upgrade Controller atualiza o HelmChart CR existente de cada componente.

Para charts Helm implantados fora do EIB, o Upgrade Controller cria um recurso HelmChart para cada componente.

Após a criação/atualização do recurso HelmChart, o Upgrade Controller depende do helm-controller para detectar essa alteração e prosseguir com a atualização real do componente.

Os charts serão atualizados sequencialmente com base na ordem deles no ReleaseManifest. Valores adicionais também podem ser passados através do UpgradePlan. Se a versão de um chart permanecer inalterada na nova release SUSE Edge, ele não será atualizado. Para obter mais informações sobre isso, consulte a Seção 19.6.1, “UpgradePlan”.

19.6 Extensões da API do Kubernetes

Extensões para a API do Kubernetes introduzidas pelo Upgrade Controller.

19.6.1 UpgradePlan

O Upgrade Controller introduz um novo recurso personalizado do Kubernetes chamado UpgradePlan.

O UpgradePlan serve como um mecanismo de instrução para o Upgrade Controller e suporta as seguintes configurações:

  • releaseVersion - Versão da release do Edge para a qual o cluster deve ser atualizado. A versão da release deve seguir o versionamento semântico e deve ser obtida nas Release Notes (Capítulo 41, Notas de versão).

  • disableDrain - Opcional; instrui o Upgrade Controller sobre desabilitar os drains de nós. Útil para quando você tem cargas de trabalho com Orçamentos de Interrupção.

    • Exemplo para desativação da drenagem de nós do plano de controle:

      spec:
        disableDrain:
          controlPlane: true
    • Exemplo para desativação da drenagem dos nós do plano de controle e dos nós worker:

      spec:
        disableDrain:
          controlPlane: true
          worker: true
  • helm - Opcional; especifica valores adicionais para componentes instalados via Helm.

    Atenção
    Atenção

    É aconselhável usar este campo apenas para valores que são críticos para atualizações. Atualizações padrão de valores de chart devem ser realizadas após os respectivos charts terem sido atualizados para a próxima versão.

    • Exemplo:

      spec:
        helm:
        - chart: foo
          values:
            bar: baz

19.6.2 ReleaseManifest

O Upgrade Controller introduz um novo recurso personalizado do Kubernetes chamado ReleaseManifest.

O recurso ReleaseManifest é criado pelo Upgrade Controller e mantém dados de componentes para uma versão de lançamento do Edge específica. Isso significa que cada upgrade da versão de lançamento do Edge será representado por um recurso ReleaseManifest diferente.

Atenção
Atenção

O Manifesto de Lançamento deve ser sempre criado pelo Upgrade Controller.

Não é aconselhável criar ou editar manualmente os recursos ReleaseManifest. Usuários que decidirem fazer isso devem fazê-lo por sua própria conta e risco.

Os dados do componente que o Manifesto de Lançamento envia incluem, mas não estão limitados a:

  • Dados do Sistema Operacional - versão, arquiteturas suportadas, dados adicionais de atualização, etc.

  • Dados de distribuição do Kubernetes - versões suportadas do RKE2/K3s

  • Dados de componentes adicionais - dados do gráfico Helm da SUSE (localização, versão, nome, etc.)

Para um exemplo de como um Manifesto de Lançamento pode parecer, consulte a https://github.com/suse-edge/upgrade-controller/blob/main/config/samples/lifecycle_v1alpha1_releasemanifest.yamldocumentação [upstream]. Observe que este é apenas um exemplo e não se destina a ser criado como um recurso ReleaseManifest válido.

19.7 Acompanhando o processo de atualização

Esta seção serve como um meio para rastrear e depurar o processo de atualização que o Controlador de Atualização inicia assim que o usuário cria um recurso UpgradePlan.

19.7.1 Geral

Informações gerais sobre o estado do processo de atualização podem ser visualizadas nas condições de status do Plano de Atualização.

O status do recurso Plano de Atualização pode ser visualizado da seguinte forma:

kubectl get upgradeplan <upgradeplan_name> -n upgrade-controller-system -o yaml
Exemplo 19.1: Exemplo de Plano de Atualização em execução:
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

Aqui você pode visualizar cada componente para o qual o Controlador de Atualização tentará agendar uma atualização. Cada condição segue o modelo abaixo:

  • lastTransitionTime - a última vez que esta condição de componente transitou de um status para outro.

  • message - mensagem que indica o estado atual de atualização da condição específica do componente.

  • reason - o estado atual de atualização da condição específica do componente. Possíveis reasons incluem:

    • Succeeded - a atualização do componente específico foi bem-sucedida.

    • Failed - a atualização do componente específico falhou.

    • InProgress - o fazer upgrade do componente específico está em andamento.

    • Pending - o fazer upgrade do componente específico ainda não está agendado.

    • Skipped - o componente específico não foi encontrado no cluster, portanto, seu fazer upgrade será ignorado.

    • Error - o componente específico encontrou um erro transitório durante o fazer upgrade.

  • status - status da condição atual type, uma das True, False, Unknown.

  • type - indicador para o componente atualmente em fazer upgrade.

O Upgrade Controller cria Planos SUC para condições de componente do tipo OSUpgraded e KubernetesUpgraded. Para acompanhar melhor os Planos SUC criados para esses componentes, consulte Seção 18.3, “Monitoramento de Planos do Upgrade Controller do Sistema”.

Todos os outros tipos de condição de componente podem ser acompanhados visualizando os recursos criados para eles pelo helm-controller. Para obter mais informações, consulte Seção 19.7.2, “Helm Controller”.

Um Plano de Atualização agendado pelo Upgrade Controller pode ser marcado como successful quando:

  1. Não há condições de componente Pending ou InProgress.

  2. A propriedade lastSuccessfulReleaseVersion aponta para o releaseVersion que é especificado na configuração do Plano de Atualização. Esta propriedade é adicionada ao status do Plano de Atualização pelo Upgrade Controller assim que o processo de fazer upgrade for bem-sucedido.

Exemplo 19.2: Exemplo de UpgradePlan bem-sucedida:
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 Helm Controller

Esta seção aborda como rastrear recursos criados pelo helm-controller.

Nota
Nota

As etapas abaixo pressupõem que o kubectl foi configurado para se conectar ao cluster onde o Upgrade Controller foi implantado.

  1. Localize o recurso HelmChart para o componente específico:

    kubectl get helmcharts -n kube-system
  2. Usando o nome do recurso HelmChart, localize o Pod de fazer upgrade que foi criado pelo 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. Visualize os logs do pod específico de fazer upgrade do componente:

    kubectl logs <pod_name> -n kube-system

19.8 Limitações conhecidas

  • As atualizações de clusters downstream ainda não são gerenciadas pelo Upgrade Controller. Para obter informações sobre como fazer upgrade de clusters downstream, consulte Capítulo 33, Downstream clusters.

  • O Upgrade Controller espera que quaisquer gráficos Helm SUSE Edge adicionais implantados por meio do EIB (Capítulo 8, Edge Image Builder) tenham seu HelmChart CR implantado no namespace kube-system. Para fazer isso, configure a propriedade installationNamespace no seu arquivo de definição EIB. Para obter mais informações, consulte a documentação upstream.

  • Atualmente, o Upgrade Controller não tem como determinar a versão de lançamento do Edge atualmente em execução no cluster de gerenciamento. Certifique-se de fornecer uma versão de lançamento do Edge que seja superior à versão de lançamento do Edge atualmente em execução no cluster.

  • Atualmente, o Upgrade Controller oferece suporte apenas a fazer upgrade de ambientes non air-gapped. Fazer upgrade em ambientes air-gapped ainda não é possível.

20 SUSE Multi-Linux Manager

O SUSE Multi-Linux Manager está incluído no SUSE Edge para fornecer automação e controle para manter o SUSE Linux Micro como o sistema operacional subjacente consistentemente atualizado em todos os nós da sua implantação de borda.

Para mais informações, consulte o Capítulo 3, SUSE Multi-Linux Manager e o SUSE Multi-Linux Manager Documentation.

Parte III Guias de procedimentos

Guias de procedimentos e práticas recomendadas

  • 21 MetalLB no K3s (usando o modo camada 2)
  • O MetalLB é uma implementação de balanceador de carga para clusters Kubernetes bare metal, usando protocolos de roteamento padrão.

  • 22 MetalLB no K3s (usando modo de camada 3)
  • O MetalLB é uma implementação de balanceador de carga para clusters Kubernetes bare metal, usando protocolos de roteamento padrão.

  • 23 MetalLB no K3s (usando o modo FRR-K8s)
  • O MetalLB é uma implementação de balanceador de carga para clusters Kubernetes bare metal, usando protocolos de roteamento padrão.

  • 24 MetalLB na frente do servidor de API do Kubernetes
  • Este guia demonstra o uso de um serviço MetalLB para expor a API do RKE2/K3s externamente em um cluster de alta disponibilidade (HA) com três nós de plano de controle. Para conseguir isso, um Service do Kubernetes do tipo LoadBalancer será criado manualmente. Em seguida, um objeto EndpointSlices ser…

  • 25 Implantações air-gapped com o Edge Image Builder
  • Este guia mostrará como implantar vários dos componentes SUSE Edge de forma totalmente air-gapped no SUSE Linux Micro 6.2 utilizando o Edge Image Builder(EIB) (Capítulo 8, Edge Image Builder). Com isso, você poderá inicializar em uma imagem personalizada e pronta para inicializar (CRB) criada pelo E…

  • 26 Criando imagens atualizadas do SUSE Linux Micro com o Kiwi
  • Esta seção explica como gerar imagens atualizadas do SUSE Linux Micro para serem usadas com o Edge Image Builder, com Cluster API (CAPI) + Metal3, ou para gravar a imagem de disco diretamente em um dispositivo de bloco. Este processo é útil em situações onde é necessário incluir os patches mais rece…

21 MetalLB no K3s (usando o modo camada 2)

O MetalLB é uma implementação de balanceador de carga para clusters Kubernetes bare metal, usando protocolos de roteamento padrão.

Neste guia, demonstramos como implantar o MetalLB no modo camada 2 (L2).

21.1 Por que usar o MetalLB

O MetalLB é uma escolha atraente para balanceamento de carga em clusters Kubernetes bare metal por vários motivos:

  1. Integração Nativa com o Kubernetes: O MetalLB integra-se perfeitamente ao Kubernetes, tornando fácil implantar e gerenciar usando ferramentas e práticas familiares do Kubernetes.

  2. Compatibilidade bare metal: Ao contrário dos balanceadores de carga baseados em nuvem, o MetalLB foi projetado especificamente para implantações no local onde balanceadores de carga tradicionais podem não estar disponíveis ou ser viáveis.

  3. Suporta Vários Protocolos: O MetalLB suporta os modos camada 2 e BGP (Border Gateway Protocol), proporcionando flexibilidade para diferentes arquiteturas e requisitos de rede.

  4. Alta disponibilidade: Ao distribuir as responsabilidades de balanceamento de carga entre vários nós, o MetalLB garante alta disponibilidade e confiabilidade para seus serviços.

  5. Escalabilidade: O MetalLB pode lidar com implantações em larga escala, escalando junto com seu cluster Kubernetes para atender à demanda crescente.

No modo camada 2, um nó assume a responsabilidade de anunciar um serviço para a rede local. Da perspectiva da rede, parece simplesmente que aquela máquina tem vários endereços IP atribuídos à sua interface de rede.

A principal vantagem do modo camada 2 é sua universalidade: ele funciona em qualquer rede Ethernet, sem necessidade de hardware especial, nem mesmo roteadores sofisticados.

21.2 MetalLB no K3s (usando o modo camada 2)

Neste início rápido, o modo camada 2 (L2) será usado. Isso significa que não precisamos de nenhum equipamento de rede especial, apenas três IPs livres dentro do intervalo da rede.

21.3 Pré-requisitos

  • Um cluster K3s onde o MetalLB será implantado.

Atenção
Atenção

O K3s vem com seu próprio balanceador de carga de serviço chamado Klipper. Você precisa desativá-lo para executar o MetalLB. Para desativar o Klipper, o K3s precisa ser instalado usando a flag --disable=servicelb.

  • Helm

  • Três endereços IP livres dentro do intervalo da rede. Neste exemplo 192.168.122.10-192.168.122.12

Importante
Importante

Você deve garantir que esses endereços IP não estejam atribuídos. Em um ambiente DHCP, esses endereços não devem fazer parte do pool DHCP para evitar atribuições duplas.

21.4 Implantação

Usaremos o Helm chart do MetalLB publicado como parte da solução 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 Configuração

Neste ponto, a instalação está concluída. Agora é hora de configurar usando nossos valores de exemplo:

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

Agora, está pronto para ser usado. Você pode personalizar muitas coisas para o modo camada 2 (L2), como:

E muito mais para BGP.

21.5.1 Traefik e MetalLB

O Traefik é implantado por padrão com o K3s (pode ser desativado com --disable=traefik) e é exposto por padrão como LoadBalancer (para ser usado com o Klipper). No entanto, como o Klipper precisa ser desativado, o serviço do Traefik para ingress ainda é do tipo LoadBalancer. Portanto, no momento da implantação do MetalLB, o primeiro IP será atribuído automaticamente ao 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

Isso será aplicado mais tarde (Seção 21.6.1, “Ingress com MetalLB”) no processo.

21.6 Uso

Vamos criar uma implantação de exemplo:

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

E, finalmente, o serviço:

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

Vamos vê-lo em ação:

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 com MetalLB

Como o Traefik já está servindo como um controlador de ingress, podemos expor qualquer tráfego HTTP/HTTPS por meio de um 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

E então:

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>

Verifique se o MetalLB funciona corretamente:

% 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

No exemplo acima, o tráfego flui da seguinte forma:

  1. hellok3s.${IP}.sslip.io é resolvido para o IP real.

  2. Em seguida, o tráfego é tratado pelo pod metallb-speaker.

  3. metallb-speaker redireciona o tráfego para o controlador traefik.

  4. Finalmente, o Traefik encaminha a solicitação para o serviço hello-kubernetes.

22 MetalLB no K3s (usando modo de camada 3)

O MetalLB é uma implementação de balanceador de carga para clusters Kubernetes bare metal, usando protocolos de roteamento padrão.

Neste guia, demonstramos como implantar o MetalLB no modo BGP de camada 3 (L3).

22.1 Por que usar o MetalLB

O MetalLB é uma escolha atraente para balanceamento de carga em clusters Kubernetes bare metal por vários motivos:

  1. Integração Nativa com o Kubernetes: O MetalLB integra-se perfeitamente ao Kubernetes, facilitando a implantação e o gerenciamento usando ferramentas e práticas familiares do Kubernetes.

  2. Compatibilidade com bare metal: Ao contrário dos balanceadores de carga baseados em nuvem, o MetalLB foi projetado especificamente para implantações no local onde balanceadores de carga tradicionais podem não estar disponíveis ou ser viáveis.

  3. Suporta Vários Protocolos: O MetalLB suporta os modos de camada 2 e camada 3 BGP (Border Gateway Protocol), proporcionando flexibilidade para diferentes arquiteturas e requisitos de rede.

  4. Alta disponibilidade: Ao distribuir as responsabilidades de balanceamento de carga entre vários nós, o MetalLB garante alta disponibilidade e confiabilidade para seus serviços.

  5. Escalabilidade: O MetalLB pode lidar com implantações em larga escala, escalando junto com seu cluster Kubernetes para atender à demanda crescente.

No modo de camada 2, um nó assume a responsabilidade de anunciar um serviço para a rede local. Da perspectiva da rede, parece simplesmente que aquela máquina tem vários endereços IP atribuídos à sua interface de rede.

A principal vantagem do modo camada 2 é sua universalidade: ele funciona em qualquer rede Ethernet, sem necessidade de hardware especial, nem mesmo roteadores sofisticados.

22.2 MetalLB no K3s (usando camada 3)

Neste início rápido, o modo camada 3 é usado. Isso significa que precisamos ter roteador(es) vizinho(s) com recursos BGP dentro do intervalo da rede.

22.3 Pré-requisitos

  • Um cluster K3s onde o MetalLB será implantado.

  • Roteador(es) na rede que suportam o protocolo BGP.

  • Um endereço IP livre dentro do intervalo da rede para o serviço. Nesse exemplo 192.168.10.100

Importante
Importante

Você deve garantir que este endereço IP não esteja atribuído. Em um ambiente DHCP, este endereço não deve fazer parte do pool DHCP para evitar atribuições duplas.

22.4 Configuração para Anunciar Endereços IP de Serviço

Por padrão, o BGP anuncia um endereço IP de Serviço para todos os pares que estão configurados. Esses pares, que geralmente são roteadores, receberão uma rota para cada endereço IP de Serviço com uma máscara de rede de 32 bits. Nesse exemplo, usaremos um roteador baseado em FRR que está na mesma rede que nosso cluster. Usaremos então a capacidade BGP do MetalLB para anunciar um serviço para esse roteador baseado em FRR.

22.5 Implantação

Usaremos o Helm chart do MetalLB publicado como parte da solução 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 Configuração

  1. Neste ponto, a instalação está concluída. Crie um 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. Configure um BGPPeer.

Nota
Nota

O roteador FRR tem ASN 1000, enquanto nosso BGPPeer terá 1001. Também podemos ver que o Roteador FRR tem um endereço IP que é 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. Crie o 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. Crie um aplicativo de exemplo com um serviço. Neste caso, o endereço IP do IPAddressPool é 192.168.10.100 para esse serviço.

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 verificar, faça login no Roteador FRR para poder ver as rotas criadas a partir do anúncio 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. Se este roteador for o gateway padrão da sua rede, você pode executar o comando curl a partir de uma máquina nessa rede para verificar se eles conseguem alcançar o aplicativo de exemplo httpd.

# curl http://192.168.10.100:8080
<html><body><h1>It works!</h1></body></html>
#

23 MetalLB no K3s (usando o modo FRR-K8s)

O MetalLB é uma implementação de balanceador de carga para clusters Kubernetes bare metal, usando protocolos de roteamento padrão.

Neste guia, demonstramos como implantar o MetalLB no modo BGP FRR-K8s de camada 3.

23.1 MetalLB no K3s (usando FRR-K8s)

Nota
Nota

O FRR-K8s é atualmente um recurso de Visualização de Tecnologia. A documentação da comunidade do FRR-K8s está aqui.

Neste início rápido, o modo FRR-K8s é usado.

23.2 Pré-requisitos

  • Todos os pré-requisitos para o FRR-K8s são os mesmos que para o Capítulo 22, MetalLB no K3s (usando modo de camada 3), exceto pela necessidade de um endereço IP livre.

    Nota
    Nota

    O exemplo aqui não inclui a configuração de um serviço, portanto, não há necessidade de um endereço IP.

  • Um cluster K3s onde o MetalLB será implantado.

  • Roteador(es) na rede que suportam o protocolo BGP.

23.3 Configuração para Aceitar Rota de Entrada

Por padrão, o BGP do MetalLB anuncia um endereço IP de Serviço para todos os pares BGP que estão configurados. Esses pares, que geralmente são roteadores, receberão uma rota para cada endereço IP de Serviço com uma máscara de rede de 32 bits. Ao usar o FRR-K8s com o CR FRRConfiguration, também é possível receber rotas de roteadores externos. Essas rotas externas aparecerão na tabela de roteamento de cada nó. Existem vários benefícios nisso, mas o principal é que elimina a necessidade de atualizar manualmente as tabelas de roteamento do Linux nos nós quando a rede externa muda, especificamente em casos onde é desejável evitar o envio de tráfego através do gateway padrão.

23.4 Implantação

Usaremos o gráfico Helm do MetalLB publicado como parte da solução SUSE Edge. Observe que o FRR-K8s é um subchart do MetalLB e, para habilitá-lo, defina frrk8s.enabled como true. O FRR-K8s também requer alguns privilégios elevados no namespace.

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

Verifique se você tem 4 pods no namespace metallb-system e se todos estão sendo executados sem 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

Neste ponto, a instalação do MetalLB e do FRR-K8s está concluída.

23.5 Configuração

  1. Crie um FRRConfiguration para o 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

    O roteador BGP externo tem ASN 64512, enquanto nosso BGPPeer terá 64513. Também podemos ver que o roteador BGP externo tem um endereço IP que é 192.168.20.154.

  2. Verifique se o FRRConfiguration foi implantado:

    k get FRRConfiguration -A
    NAMESPACE        NAME      AGE
    metallb-system   frrdemo   4s
    Nota
    Nota

    As configurações de toReceive acima farão com que seu cluster aceite todas as rotas recebidas. Isso pode não ser aconselhável em um ambiente de produção, pois, dependendo dos seus roteadores externos, pode fazer com que as tabelas de roteamento dos seus nós fiquem cheias. Consulte a documentação em como filtrar para receber mais informações.

Com o FRR-K8s, essas são todas as configurações necessárias. Qualquer rota que seu roteador BGP externo estiver recebendo será compartilhada com seu cluster e todos os nós terão suas tabelas de roteamento atualizadas.

A configuração pode ser testada com o que está descrito em Capítulo 22, MetalLB no K3s (usando modo de camada 3). Para combinar essas configurações, existem alguns requisitos:

  • A configuração do FRR-K8s é feita em um cluster separado. Isso é necessário para evitar o roteamento interno do cluster.

  • Alterações nos IDs de ASN e no endereço IP do roteador são necessárias para corresponder a ambas as configurações.

Com ambas as configurações implementadas, o seguinte pode ser observado:

Nota
Nota

Em configurações padrão de roteamento FRR, as rotas são compartilhadas com o próximo salto definido como o endereço IP do FRR Router. Para obter um próximo salto sem o endereço IP do FRR Router, pode-se adicionar uma linha \"neighbor BGPPG next-hop-unchanged\" e uma linha \"neighbor BGPPG as-override\" ao arquivo /etc/frr/frr.conf no FRR Router. Com isso implementado, os nós no cluster FRR-K8s obterão uma rota direta para o serviço.

24 MetalLB na frente do servidor de API do Kubernetes

Este guia demonstra o uso de um serviço MetalLB para expor a API do RKE2/K3s externamente em um cluster de alta disponibilidade (HA) com três nós de plano de controle. Para conseguir isso, um Service do Kubernetes do tipo LoadBalancer será criado manualmente. Em seguida, um objeto EndpointSlices será criado automaticamente, o que mantém os IPs de todos os nós do plano de controle disponíveis no cluster. Para que os EndpointSlices sejam sincronizados continuamente com os eventos que ocorrem no cluster (adição/remoção de um nó ou um nó ficar offline), o Endpoint Copier Operator (Capítulo 16, Operador Endpoint Copier) será implantado. O operador monitora os eventos que ocorrem nos EndpointSlices kubernetes padrão e atualiza o gerenciado automaticamente para mantê-los sincronizados. Como o Service gerenciado é do tipo LoadBalancer, o MetalLB atribui a ele um ExternalIP estático. Este ExternalIP será usado para se comunicar com o servidor de API.

24.1 Pré-requisitos

  • Três hosts nos quais implantar o RKE2/K3s.

    • Certifique-se de que os hosts tenham nomes de host diferentes.

    • Para testes, podem ser máquinas virtuais

  • Pelo menos 2 IPs disponíveis na rede (um para o serviço exposto do controlador de entrada Traefik e um para o serviço gerenciado).

  • Helm

24.2 Instalando o RKE2/K3s

Nota
Nota

Se você não quiser usar um cluster novo, mas quiser usar um existente, pule esta etapa e prossiga para a próxima.

Primeiro, um IP livre na rede deve ser reservado, o qual será usado posteriormente para ExternalIP do Service gerenciado.

Conecte-se via SSH ao primeiro host e instale a distribuição desejada no modo de cluster.

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

Certifique-se de que a flag --disable=servicelb seja fornecida no comando k3s server.

Importante
Importante

A partir de agora, os comandos devem ser executados na máquina local.

Para acessar o servidor da API de fora, o IP da VM do RKE2/K3s será usado.

# 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 Configurando um cluster existente

Nota
Nota

Esta etapa é válida apenas se você pretende usar um cluster RKE2/K3s existente.

Para usar um cluster existente, as flags tls-san devem ser modificadas. Adicionalmente, o LB servicelb deve ser desativado para o K3s.

Para alterar as flags dos servidores RKE2 ou K3s, você precisa modificar o arquivo /etc/systemd/system/rke2.service ou /etc/systemd/system/k3s.service em todas as VMs no cluster, dependendo da distribuição.

As flags devem ser inseridas no ExecStart. Por exemplo:

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' \

Em seguida, os seguintes comandos devem ser executados para carregar as novas configurações:

systemctl daemon-reload
systemctl restart ${KUBE_DISTRIBUTION}

24.4 Instalando o MetalLB

Para implantar o MetalLB, o guia MetalLB no K3s (Capítulo 21, MetalLB no K3s (usando o modo camada 2)) pode ser usado.

NOTA: Certifique-se de que o endereço IP VIP_SERVICE_IP não se sobreponha ao IPAddressPools existente no cluster.

Crie um IpAddressPool e um L2Advertisement separados que serão usados apenas para o Service gerenciado.

NOTA: O IPAddressPool abaixo será atribuído a um serviço do tipo LoadBalancer no namespace default. Se existirem múltiplos serviços LoadBalancer lá, ServiceSelectors adicionais podem ser configurados para corresponder a este serviço VIP explicitamente.

# 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 Instalando o Operador Endpoint Copier

helm install \
endpoint-copier-operator oci://registry.suse.com/edge/charts/endpoint-copier-operator \
--namespace endpoint-copier-operator \
--create-namespace

O comando acima implantará o Deployment do operador endpoint-copier-operator com duas réplicas. Uma será a líder e a outra assumirá a função de líder, se necessário.

Agora, o Service kubernetes-vip deve ser implantado, o qual será reconciliado pelo operador e um EndpointSlices com as portas e o IP configurados será criado.

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

Verifique se o Service kubernetes-vip possui o endereço IP correto:

kubectl get service kubernetes-vip -n default \
 -o=jsonpath='{.status.loadBalancer.ingress[0].ip}'

Certifique-se de que os recursos EndpointSlices kubernetes-vip-* e kubernetes no namespace default apontem para os mesmos IPs.

kubectl get endpointslices | grep kubernetes

Se tudo estiver correto, a última coisa que resta é usar o VIP_SERVICE_IP em nosso Kubeconfig.

sed -i '' "s/${NODE_IP}/${VIP_SERVICE_IP}/g" ~/.kube/config

A partir de agora, todos os kubectl passarão pelo Service kubernetes-vip.

24.6 Adicionando nós do plano de controle

Para monitorar todo o processo, mais duas abas de terminal podem ser abertas.

Primeiro terminal:

watch kubectl get nodes

Segundo terminal:

watch kubectl get endpointslices

Agora execute os comandos abaixo no segundo e terceiro nós.

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 Implantações air-gapped com o Edge Image Builder

25.1 Intro

Este guia mostrará como implantar vários dos componentes SUSE Edge de forma totalmente air-gapped no SUSE Linux Micro 6.2 utilizando o Edge Image Builder(EIB) (Capítulo 8, Edge Image Builder). Com isso, você poderá inicializar em uma imagem personalizada e pronta para inicializar (CRB) criada pelo EIB e ter os componentes especificados implantados em um cluster RKE2 ou K3s sem uma conexão com a Internet ou quaisquer etapas manuais. Esta configuração é altamente desejável para clientes que desejam pré-incorporar todos os artefatos necessários para a implantação em sua imagem do SO, de modo que fiquem imediatamente disponíveis na inicialização.

Abordaremos uma instalação air-gapped de:

Atenção
Atenção

O EIB analisará e fará o pré-download de todas as imagens referenciadas nos Helm charts e manifestos do Kubernetes fornecidos. No entanto, algumas delas podem estar tentando baixar imagens de contêiner e criar recursos do Kubernetes com base nelas em tempo de execução. Nestes casos, temos que especificar manualmente as imagens necessárias no arquivo de definição se quisermos configurar um ambiente completamente air-gapped.

25.2 Pré-requisitos

Se você está seguindo este guia, presume-se que você já esteja familiarizado com o EIB (Capítulo 8, Edge Image Builder). Caso contrário, siga o guia de início rápido (Capítulo 2, Clusters autônomos com o Edge Image Builder) para entender melhor os conceitos mostrados na prática abaixo.

25.3 Configuração de rede Libvirt

Nota
Nota

Para demonstrar a implantação air-gapped, este guia será feito usando uma rede libvirt air-gapped simulada e a seguinte configuração será adaptada para isso. Para suas próprias implantações, você pode ter que modificar a configuração host1.local.yaml que será apresentada na próxima etapa.

Se você quiser usar a mesma configuração de rede libvirt, siga as instruções. Se não quiser, vá para Seção 25.4, “Configuração do diretório de base”.

Vamos criar uma configuração de rede isolada com um intervalo de endereços 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

Agora, a única coisa que resta é criar a rede e iniciá-la:

virsh net-define isolatednetwork.xml
virsh net-start isolatednetwork

25.4 Configuração do diretório de base

A configuração do diretório de base é a mesma em todos os diferentes componentes, então vamos configurá-la aqui.

Primeiro, criaremos os subdiretórios necessários:

export CONFIG_DIR=$HOME/config
mkdir -p $CONFIG_DIR/base-images
mkdir -p $CONFIG_DIR/network
mkdir -p $CONFIG_DIR/kubernetes/helm/values

Certifique-se de adicionar qualquer imagem base que você planeja usar no diretório base-images. Este guia focará na ISO de auto-instalação encontrada aqui.

Vamos copiar a imagem baixada:

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

O EIB nunca modificará a entrada da imagem base.

Vamos criar um arquivo contendo a configuração de rede desejada:

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 configuração garante que os seguintes estejam presentes nos sistemas provisionados (usando o endereço MAC especificado):

  • uma interface Ethernet com um endereço IP estático

  • roteamento

  • DNS

  • hostname (host1.local)

A estrutura de arquivos resultante deve ficar assim:

├── kubernetes/
│   └── helm/
│       └── values/
├── base-images/
│   └── slemicro.iso
└── network/
    └── host1.local.yaml

25.5 Arquivo de definição de base

O Edge Image Builder está usando arquivos de definição para modificar as imagens do SUSE Linux Micro. Esses arquivos contêm a maioria das opções configuráveis. Muitas dessas opções serão repetidas nas diferentes seções de componentes, portanto, listaremos e explicaremos essas aqui.

Dica
Dica

A lista completa de opções de personalização no arquivo de definição pode ser encontrada na documentação upstream

Daremos uma olhada nos seguintes campos que estarão presentes em todos os arquivos de definição:

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

A seção image é obrigatória e especifica a imagem de entrada, sua arquitetura e tipo, bem como a imagem de saída será chamada.

A seção operatingSystem é opcional e contém a configuração para habilitar o login nos sistemas provisionados com o nome de usuário/senha root/eib.

A seção kubernetes é opcional e define o tipo e a versão do Kubernetes. Vamos usar a distribuição RKE2. Use kubernetes.version: v1.35.4+k3s1 se o K3s for desejado. A menos que configurado explicitamente através do campo kubernetes.nodes, todos os clusters que inicializarmos neste guia serão de nó único.

A seção embeddedArtifactRegistry incluirá todas as imagens que são apenas referenciadas e baixadas em tempo de execução para o componente específico.

25.6 Instalação do Rancher

Nota
Nota

A implantação do Rancher (Capítulo 4, Rancher) que será demonstrada será bastante reduzida para fins de demonstração. Para suas implantações reais, artefatos adicionais podem ser necessários, dependendo da sua configuração.

Os ativos de lançamento do Rancher 2.14.2 contêm um arquivo rancher-images.txt que lista todas as imagens necessárias para uma instalação air-gapped.

Há mais de 600 imagens de contêiner no total, o que significa que a imagem CRB resultante teria aproximadamente 30 GB. Para nossa instalação do Rancher, reduziremos essa lista para a menor configuração funcional. A partir daí, você pode adicionar novamente quaisquer imagens que possa precisar para suas implantações.

Criaremos o arquivo de definição e incluiremos a lista de imagens reduzida:

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

Em comparação com a lista completa de mais de 600 imagens de contêiner, esta versão reduzida contém apenas ~60, o que torna a nova imagem CRB com apenas cerca de 7 GB.

Também precisamos criar um arquivo de valores Helm para o 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
Atenção
Atenção

Definir systemDefaultRegistry como registry.rancher.com permite que o Rancher procure automaticamente por imagens no registro de artefatos incorporado iniciado dentro da imagem CRB na inicialização. A omissão deste campo pode resultar em falha ao encontrar as imagens de contêiner no nó.

Vamos criar a imagem:

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

A saída deve ser similar ao seguinte:

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

Uma vez que um nó usando a imagem criada seja provisionado, podemos verificar a instalação do Rancher:

/var/lib/rancher/rke2/bin/kubectl get all -n cattle-system --kubeconfig /etc/rancher/rke2/rke2.yaml

A saída deve ser semelhante à seguinte, mostrando que tudo foi implantado com sucesso:

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

E quando vamos para https://192.168.100.50.sslip.io e fazemos login com a senha adminadminadmin que definimos anteriormente, somos recebidos com o painel do Rancher:

air gapped rancher

25.7 Instalação do SUSE Security

Ao contrário da instalação do Rancher, a instalação do SUSE Security não requer nenhum tratamento especial no EIB. O EIB fará automaticamente o air-gap de cada imagem necessária pelo seu componente subjacente NeuVector.

Criaremos o arquivo de definição:

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/

Também criaremos um arquivo de valores Helm para o 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 criar a imagem:

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

A saída deve ser similar ao seguinte:

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

Uma vez que um nó usando a imagem criada seja provisionado, podemos verificar a instalação do SUSE Security:

/var/lib/rancher/rke2/bin/kubectl get all -n neuvector --kubeconfig /etc/rancher/rke2/rke2.yaml

A saída deve ser semelhante à seguinte, mostrando que tudo foi implantado com sucesso:

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 Instalação do SUSE Storage

A documentação oficial do Longhorn contém um arquivo longhorn-images.txt que lista todas as imagens necessárias para uma instalação air-gapped. Incluiremos suas contrapartes espelhadas do registro de contêineres do Rancher em nosso arquivo de definição. Vamos criá-lo:

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

Você notará que o arquivo de definição lista o pacote open-iscsi. Isso é necessário, já que o Longhorn depende de um daemon iscsiadm sendo executado nos diferentes nós para fornecer volumes persistentes ao Kubernetes.

Vamos criar a imagem:

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

A saída deve ser similar ao seguinte:

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

Uma vez que um nó usando a imagem criada seja provisionado, podemos verificar a instalação do Longhorn:

/var/lib/rancher/rke2/bin/kubectl get all -n longhorn-system --kubeconfig /etc/rancher/rke2/rke2.yaml

A saída deve ser semelhante à seguinte, mostrando que tudo foi implantado com sucesso:

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 Instalação do KubeVirt e CDI

Os gráficos Helm para KubeVirt e CDI instalam apenas seus respectivos operadores. Cabe aos operadores implantar o restante dos sistemas, o que significa que teremos que incluir todas as imagens de contêiner necessárias em nosso arquivo de definição. Vamos criá-lo:

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 criar a imagem:

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

A saída deve ser similar ao seguinte:

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

Uma vez que um nó usando a imagem criada seja provisionado, podemos verificar a instalação do KubeVirt e do CDI.

Verify KubeVirt:

/var/lib/rancher/rke2/bin/kubectl get all -n kubevirt-system --kubeconfig /etc/rancher/rke2/rke2.yaml

A saída deve ser semelhante à seguinte, mostrando que tudo foi implantado com sucesso:

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

Verificar CDI:

/var/lib/rancher/rke2/bin/kubectl get all -n cdi-system --kubeconfig /etc/rancher/rke2/rke2.yaml

A saída deve ser semelhante à seguinte, mostrando que tudo foi implantado com sucesso:

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 Instalação do SUSE Private Registry

Para incluir o SUSE Private Registry em uma implantação air-gapped, devemos atualizar o arquivo de definição para incluir o gráfico helm necessário, bem como os artefatos incorporados para as novas imagens.

Vamos atualizar o arquivo de definição:

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

Você precisará de certas credenciais, que podem ser obtidas seguindo a documentação oficial do SUSE Private Registry. Você também deve modificar as variáveis ${PRIVATE_REGISTRY_USERNAME} e ${PRIVATE_REGISTRY_PASSWORD}. Certifique-se de listar as imagens que contêm as versões dos componentes de que você precisa.

Agora precisamos adicionar os manifestos do Kubernetes necessários para configurar corretamente o SUSE Private Registry.

Você precisa modificar o ${MGMT_CLUSTER_REGISTRY_IP} com um IP estático reservado para o SUSE Private Registry nos seguintes arquivos:

  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, o kubernetes/manifests/suse-private-registry-creds.yaml deve ser criado com o seguinte conteúdo:

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 corretamente o json de configuração do docker (base64) para o ${DOCKER_CONFIG_JSON_BASE64}, execute:

# ${DOCKER_CONFIG_JSON_BASE64} CONTENT
echo -n '{"auths": {"<MGMT_CLUSTER_REGISTRY_IP>": {"username": "<USERNAME>", "password": "<PASSWORD>", "auth": "<AUTH>"}}}' | base64

Onde o IP é o mesmo que o ${MGMT_CLUSTER_REGISTRY_IP} configurado anteriormente, e o username, password e auth podem ser obtidos na documentação oficial do SUSE Private Registry.

Para gerar o certificado TLS e a chave codificados em base64 (tls.crt e tls.key) para ${TLS_CRT_BASE64} e ${TLS_KEY_BASE64}, você pode criar os seus próprios executando:

# 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

Verificar SUSE Private Registry:

/var/lib/rancher/rke2/bin/kubectl get pods -n suse-private-registry --kubeconfig /etc/rancher/rke2/rke2.yaml

A saída deve ser semelhante à seguinte, mostrando que tudo foi implantado com sucesso:

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 Solução de problemas

Se você encontrar problemas ao criar as imagens ou quiser testar e depurar ainda mais o processo, consulte a documentação do upstream.

26 Criando imagens atualizadas do SUSE Linux Micro com o Kiwi

Esta seção explica como gerar imagens atualizadas do SUSE Linux Micro para serem usadas com o Edge Image Builder, com Cluster API (CAPI) + Metal3, ou para gravar a imagem de disco diretamente em um dispositivo de bloco. Este processo é útil em situações onde é necessário incluir os patches mais recentes nas imagens iniciais de inicialização do sistema (para minimizar a transferência de patches pós-instalação), ou para cenários onde o CAPI é usado, onde é preferível reinstalar o sistema operacional com uma nova imagem em vez de atualizar os hosts no local.

Este processo faz uso do Kiwi para executar a compilação da imagem. O SUSE Edge fornece uma versão conteinerizada que simplifica o processo geral com um utilitário auxiliar integrado, permitindo especificar o arquivo de controle de destino necessário. O arquivo de controle define o tipo de imagem de saída necessária, com os comuns listados abaixo:

  • "Base" - Uma imagem de disco do SUSE Linux Micro com um conjunto reduzido de pacotes (inclui podman).

  • "Base-SelfInstall" - Uma imagem SelfInstall baseada na "Base" acima.

  • "Base-RT" - O mesmo que a "Base" acima, mas usando um kernel de tempo real (rt).

  • "Base-RT-SelfInstall" - Uma imagem SelfInstall baseada na "Base-RT" acima

  • "Default" - Uma imagem de disco do SUSE Linux Micro baseada na "Base" acima, mas com algumas ferramentas adicionais, incluindo a pilha de virtualização, Cockpit e salt-minion.

  • "Default-SelfInstall" - Uma imagem SelfInstall baseada no "Default" acima

Consulte a documentação do SUSE Linux Micro 6.2 para obter mais detalhes.

Nota
Nota

Este processo funciona para ambas as arquiteturas AMD64/Intel 64 e AArch64, mas é necessário usar um host de compilação com a mesma arquitetura das imagens que estão sendo criadas. Em outras palavras, para criar uma imagem AArch64, é necessário usar um host de compilação AArch64, e vice-versa para AMD64/Intel 64 - compilações cruzadas não são suportadas no momento.

26.1 Pré-requisitos

O construtor de imagens Kiwi requer o seguinte:

  • Um host 6.2 SUSE Linux Micro (\"sistema de compilação\") com a mesma arquitetura da imagem sendo compilada.

  • O sistema de compilação precisa já estar registrado via SUSEConnect (o registro é usado para obter os pacotes mais recentes dos repositórios SUSE)

  • Uma conexão com a internet que possa ser usada para obter os pacotes necessários. Se conectado via proxy, o host de compilação precisa estar pré-configurado.

  • O SELinux precisa estar desativado no host de compilação (já que a rotulagem do SELinux ocorre no contêiner e pode entrar em conflito com a política do host)

  • Pelo menos 10 GB de espaço livre em disco para acomodar a imagem do contêiner, a raiz de compilação e a(s) imagem(ns) de saída resultante(s)

26.2 Conceitos Básicos

Devido a certas limitações, é necessário atualmente desativar o SELinux. Conecte-se ao host de compilação da imagem 6.2 SUSE Linux Micro e certifique-se de que o SELinux esteja desativado:

# setenforce 0

Crie um diretório de saída para ser compartilhado com o contêiner de compilação Kiwi para salvar as imagens resultantes:

# mkdir ~/output

Baixe a imagem mais recente do construtor Kiwi do Registro SUSE:

# podman pull registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1
(...)

26.3 Construindo a imagem Default

Este é o comportamento padrão do contêiner de imagem Kiwi se nenhum argumento for fornecido durante a execução da imagem do contêiner. O comando a seguir executa o podman com dois diretórios mapeados para o contêiner:

  • O /etc/zypp/repos.d diretório do repositório de pacotes SUSE Linux Micro do host subjacente.

  • O diretório ~/output de saída criado acima.

O contêiner de imagem Kiwi requer a execução do build-image script auxiliar como:

# 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

Espera-se que, se você estiver executando este script pela primeira vez, ele falhe logo após iniciar com \"ERRO: O teste inicial do dispositivo de loop falhou, tente executar o contêiner novamente.\", este é um sintoma de dispositivos de loop sendo criados no sistema host subjacente que não estão imediatamente visíveis dentro da imagem do contêiner. Simplesmente execute o comando novamente e ele deverá prosseguir sem problemas.

Após alguns minutos, as imagens podem ser encontradas no diretório de saída 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 Construindo imagens com outros arquivos de controle

Para construir diferentes arquivos de controle de imagem, a opção de comando "-p" no script auxiliar de imagem de contêiner Kiwi é usada. Por exemplo, para construir a imagem 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 perda de dados, o Kiwi se recusará a executar se houver imagens no output diretório. É necessário remover o conteúdo do diretório de saída antes de prosseguir com rm -f output/*.

Alternativamente, para construir uma imagem ISO SelfInstall com o kernel de tempo real ("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 Construindo imagens com tamanhos de setor grandes

Alguns hardwares exigem uma imagem com um tamanho de setor grande, ou seja, 4096 bytes em vez dos 512 bytes padrão. O construtor Kiwi conteinerizado suporta a capacidade de gerar imagens com tamanho de bloco grande especificando o parâmetro \"-b\". Por exemplo, para construir uma imagem "Default-SelfInstall" com um tamanho de setor 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 Usando um arquivo de definição de imagem Kiwi personalizado

Para casos de uso avançados, um arquivo de definição de imagem Kiwi personalizado (SL-Micro.kiwi) pode ser usado juntamente com quaisquer scripts de pós-construção necessários. Isso requer substituir as definições padrão pré-empacotadas pela equipe do SUSE Edge.

Crie um novo diretório e mapeie-o para dentro da imagem do contêiner onde o script auxiliar está procurando (/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
(...)
Atenção
Atenção

Isso é necessário apenas para casos de uso avançados e pode causar problemas de suporte. Entre em contato com seu representante SUSE para obter mais conselhos e orientações.

Para obter os arquivos de definição de imagem Kiwi padrão incluídos no contêiner, os seguintes comandos podem ser usados:

$ 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 Dicas e truques

Dicas e truques para componentes do Edge

  • 27 Edge Image Builder
  • Se você estiver em um ambiente que não seja Linux e estiver seguindo estas instruções para criar uma imagem, provavelmente está executando o Podman por meio de uma máquina virtual. Por padrão, esta máquina virtual será configurada para ter uma pequena quantidade de recursos do sistema alocados a ela…

  • 28 Elemental
  • Ao usar RKE2 ou K3s, precisamos expor serviços (Rancher neste contexto) do cluster de gerenciamento, pois eles não são expostos por padrão. Tanto no RKE2 quanto no K3s, existe um controlador Traefik Ingress. O fluxo de trabalho atual sugere o uso do MetalLB para anunciar um serviço (via L2 ou BGP Ad…

27 Edge Image Builder

27.1 Comum

  • Se você estiver em um ambiente que não seja Linux e estiver seguindo estas instruções para criar uma imagem, provavelmente está executando o Podman por meio de uma máquina virtual. Por padrão, esta máquina virtual será configurada para ter uma pequena quantidade de recursos do sistema alocados a ela, o que pode causar instabilidade para o Edge Image Builder durante operações que exigem muitos recursos, como o processo de resolução de RPM. Você precisará ajustar os recursos da máquina podman, usando o Podman Desktop (ícone de engrenagem de configurações → ícone de edição da máquina podman) ou diretamente via podman-machine-set comando

  • Neste momento, o Edge Image Builder não é capaz de criar imagens em uma configuração de arquitetura cruzada, ou seja, você precisa executá-lo em:

    • AArch64sistemas (como Apple Silicon) para criar imagens do SL Micro aarch64

    • AMD64/Intel 64sistemas para criar imagens do SL Micro x86_64.

27.2 SUSE Linux Micro

  • O carregamento de módulos do kernel na inicialização pode ser feito usando o `/etc/modprobe.d/module.conf`arquivo correspondente. Crie a `os-files`pasta correspondente usando o Edge Image Builder:

.
├── definition.yaml
└── os-files
    └── etc
        └── modprobe.d
            └── module.conf

Para mais informações, consulte a seção "Managing kernel modules" da documentação do SUSE Linux Enterprise Server

27.3 Kubernetes

  • A criação de clusters Kubernetes com vários nós requer o ajuste da `kubernetes`seção no arquivo de definição para:

    • listar todos os nós de servidor e agente em kubernetes.nodes

    • definir um endereço IP virtual que será utilizado para que todos os nós que não são inicializadores se juntem ao cluster em kubernetes.network.apiVIP

    • Opcionalmente, defina um host de API para especificar um endereço de domínio para acessar o cluster em kubernetes.network.apiHost Para saber mais sobre essa configuração, consulte a documentação da seção Kubernetes.

  • O Edge Image Builder depende dos nomes de host dos diferentes nós para determinar seu tipo de Kubernetes (server ou agent). Embora essa configuração seja gerenciada no arquivo de definição, para a configuração de rede das máquinas, podemos utilizar o DHCP conforme descrito em Capítulo 9, Rede de borda.

28 Elemental

28.1 Comum

28.1.1 Expor o serviço Rancher

Ao usar RKE2 ou K3s, precisamos expor serviços (Rancher neste contexto) do cluster de gerenciamento, pois eles não são expostos por padrão. Tanto no RKE2 quanto no K3s, existe um controlador Traefik Ingress. O fluxo de trabalho atual sugere o uso do MetalLB para anunciar um serviço (via L2 ou BGP Advertisement) e o respectivo Ingress Controller para criar um Ingress via HelmChartConfig, já que a criação de um novo objeto Ingress substituiria a configuração existente.

  1. Instale o Rancher Prime (via Helm) e configure os valores necessários

    hostname: rancher-192.168.64.101.sslip.io
    replicas: 1
    bootstrapPassword: Admin
    global.cattle.psp.enabled: "false"
    Dica
    Dica

    Siga a documentação de instalação do Rancher para mais detalhes.

  2. Crie um serviço LoadBalancer para expor o 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. Crie um pool de endereços IP para o serviço usando o endereço IP que configuramos anteriormente nos valores do 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. Crie um anúncio L2 para o pool de endereços 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. Certifique-se de que o Elemental esteja instalado corretamente

    1. Instale o Operador Elemental e a UI do Elemental nos nós de gerenciamento

    2. Adicione a configuração do Elemental no nó downstream junto com um código de registro, pois isso solicitará que o Edge Image Builder inclua a opção de registro remoto para a máquina.

Dica
Dica

Verifique Seção 1.5, “Instale o Elemental” e Seção 1.6, “Configurar Elemental” para obter informações e exemplos adicionais.

28.2 Específico de Hardware

28.2.1 Módulo de Plataforma Confiável (TPM)

É necessário lidar adequadamente com a configuração do Módulo de Plataforma Confiável (TPM). Não fazer isso resultará em erros semelhantes aos seguintes:

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

Isso pode ser mitigado por uma das seguintes abordagens:

  • Habilite o TPM nas configurações da Máquina Virtual

Exemplo com UTM no MacOS

TPM
  • Emule o TPM usando um valor negativo para a semente do TPM no recurso MachineRegistration

apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
metadata:
  name: ...
  namespace: ...
spec:
    ...
    elemental:
      ...
      registration:
        emulate-tpm: true
        emulated-tpm-seed: -1
  • Desabilite o TPM no recurso MachineRegistration

apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
metadata:
  name: ...
  namespace: ...
spec:
    ...
    elemental:
      ...
      registration:
        emulate-tpm: false

Parte V Integração com terceiros

Como integrar ferramentas de terceiros

  • 29 NATS
  • NATS é uma tecnologia de conectividade criada para o mundo cada vez mais hiperconectado. É uma tecnologia única que permite que os aplicativos se comuniquem com segurança em qualquer combinação de fornecedores de nuvem, no local, computação distribuída, Web e dispositivos móveis. O NATS consiste em …

  • 30 GPUs NVIDIA no SUSE Linux Micro
  • Este guia demonstra como implementar suporte a GPU NVIDIA em nível de host por meio dos drivers de código aberto pré-compilados no SUSE Linux Micro 6.2. Estes são drivers que são integrados ao sistema operacional em vez de carregados dinamicamente pelo Operador de GPU da NVIDIA. Esta configuração é …

29 NATS

NATS é uma tecnologia de conectividade criada para o mundo cada vez mais hiperconectado. É uma tecnologia única que permite que os aplicativos se comuniquem com segurança em qualquer combinação de fornecedores de nuvem, no local, computação distribuída, Web e dispositivos móveis. O NATS consiste em uma família de produtos de código aberto que são fortemente integrados, mas podem ser implantados de forma fácil e independente. O NATS é usado globalmente por milhares de empresas, abrangendo casos de uso que incluem microsserviços, computação distribuída, dispositivos móveis e IoT, e pode ser usado para aumentar ou substituir o sistema de mensagens tradicional.

29.1 Arquitetura

O NATS é uma infraestrutura que permite a troca de dados entre aplicativos na forma de mensagens.

29.1.1 Aplicativos clientes do NATS

As bibliotecas de cliente do NATS podem ser usadas para permitir que os aplicativos publiquem, assinem, solicitem e respondam entre diferentes instâncias. Esses aplicativos são geralmente chamados de client applications.

29.1.2 Infraestrutura de serviço NATS

Os serviços NATS são fornecidos por um ou mais processos de servidor NATS que são configurados para se interconectarem e fornecerem uma infraestrutura de serviço NATS. A infraestrutura de serviço NATS pode escalar de um único processo de servidor NATS em execução em um dispositivo final até um supercluster global público de muitos clusters abrangendo todos os principais provedores de nuvem e todas as regiões do mundo.

29.1.3 Design de mensagens simples

O NATS facilita a comunicação entre aplicativos por meio do envio e recebimento de mensagens. Essas mensagens são endereçadas e identificadas por strings de assunto e não dependem da localização na rede. Os dados são codificados e estruturados como uma mensagem e enviados por um publicador. A mensagem é recebida, decodificada e processada por um ou mais assinantes.

29.1.4 NATS JetStream

O NATS possui um sistema de persistência distribuído integrado chamado JetStream. O JetStream foi criado para resolver os problemas identificados com o streaming na tecnologia atual — complexidade, fragilidade e falta de escalabilidade. O JetStream também resolve o problema do acoplamento entre o publicador e o assinante (os assinantes precisam estar ativos e em execução para receber a mensagem quando ela é publicada). Mais informações sobre o NATS JetStream podem ser encontradas aqui.

29.2 Instalação

29.2.1 Instalando o NATS sobre o K3s

O NATS é criado para múltiplas arquiteturas, portanto, pode ser facilmente instalado no K3s. (Capítulo 11, K3s)

Vamos criar um arquivo de valores para substituir os valores padrão do 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

Agora, vamos instalar o NATS via 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

Com o arquivo values.yaml acima, os seguintes componentes estarão no namespace nats:

  1. Versão HA do Statefulset do NATS contendo três contêineres: Servidor NATS + sidecars de recarregador de configuração e métricas.

  2. Contêiner NATS box, que vem com um conjunto de utilitários NATS que podem ser usados para verificar a configuração.

  3. O JetStream também aproveita seu back end de chave-valor que vem com PVCs vinculado aos pods.

29.2.1.1 Testando a configuração

kubectl exec -n nats -it deployment/nats-box -- /bin/sh -l
  1. Crie uma assinatura para o assunto de teste:

    nats sub test &
  2. Envie uma mensagem para o assunto de teste:

    nats pub test hi

29.2.1.2 Limpando

helm -n nats uninstall nats
rm values.yaml

29.2.2 NATS como back end para o K3s

Um componente que o K3s aproveita é o KINE, que é um shim que permite a substituição do etcd por back ends de armazenamento alternativos originalmente voltados para bancos de dados relacionais. Como o JetStream fornece uma API de chave-valor, isso torna possível ter o NATS como um back end para o cluster K3s.

Existe um PR já mesclado que torna o NATS incorporado no K3s simples, mas a alteração ainda não está incluída nas versões do K3s.

Por esse motivo, o binário do K3s deve ser compilado manualmente.

29.2.2.1 Compilando o K3s

git clone --depth 1 https://github.com/k3s-io/k3s.git && cd k3s

O comando a seguir adiciona nats nas tags de compilação para habilitar o recurso incorporado do NATS no K3s:

sed -i '' 's/TAGS="ctrd/TAGS="nats ctrd/g' scripts/build
make local

Substitua <node-ip> pelo IP real do nó onde o K3s será iniciado:

export NODE_IP=<node-ip>
sudo scp dist/artifacts/k3s-arm64 ${NODE_IP}:/usr/local/bin/k3s
Nota
Nota

Compilar o K3s localmente requer o plugin buildx da CLI do Docker. Ele pode ser instalado manualmente se $ make local falhar.

29.2.2.2 Instalando a CLI do 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 Executando o NATS como back end do K3s

Vamos ssh no nó e executar o K3s com a flag --datastore-endpoint apontando para nats.

Nota
Nota

O comando abaixo inicia o K3s como um processo em primeiro plano, para que os logs possam ser facilmente acompanhados para ver se há algum problema. Para não bloquear o terminal atual, uma flag & pode ser adicionada antes do comando para iniciá-lo como um processo em segundo plano.

k3s server  --datastore-endpoint=nats://
Nota
Nota

Para tornar o servidor K3s com o back end NATS permanente na sua slemicro VM, o script abaixo pode ser executado, o qual cria um serviço systemd com as configurações necessárias.

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 Solução de problemas

Os comandos a seguir podem ser executados no nó para verificar se tudo com o stream funciona corretamente:

nats str report -a
nats str view -a

30 GPUs NVIDIA no SUSE Linux Micro

30.1 Intro

Este guia demonstra como implementar suporte a GPU NVIDIA em nível de host por meio dos drivers de código aberto pré-compilados no SUSE Linux Micro 6.2. Estes são drivers que são integrados ao sistema operacional em vez de carregados dinamicamente pelo Operador de GPU da NVIDIA. Esta configuração é altamente desejável para clientes que desejam pré-incorporar todos os artefatos necessários para a implantação na imagem e onde a seleção dinâmica da versão do driver, ou seja, o usuário selecionando a versão do driver via Kubernetes, não é um requisito. Este guia explica inicialmente como implantar os componentes adicionais em um sistema que já foi implantado previamente, mas segue com uma seção que descreve como incorporar esta configuração na implantação inicial via Edge Image Builder. Se você não quiser passar pelo básico e configurar as coisas manualmente, pule direto para essa seção.

É importante ressaltar que o suporte para esses drivers é fornecido tanto pela SUSE quanto pela NVIDIA em estreita colaboração, onde o driver é compilado e distribuído pela SUSE como parte dos repositórios de pacote. No entanto, se você tiver alguma dúvida ou preocupação sobre a combinação na qual você usa os drivers, peça mais assistência aos seus gerentes de conta da SUSE ou da NVIDIA. Se você planeja usar NVIDIA AI Enterprise (NVAIE), certifique-se de estar usando uma GPU certificada para NVAIE, o que pode exigir o uso de drivers proprietários da NVIDIA. Se você não tiver certeza, fale com seu representante da NVIDIA.

Mais informações sobre a integração do operador de GPU NVIDIA não são abordadas neste guia. Embora a integração do Operador de GPU NVIDIA para Kubernetes não seja abordada aqui, você ainda pode seguir a maioria das etapas deste guia para configurar o sistema operacional subjacente e simplesmente habilitar o operador de GPU para usar os drivers pré-instalados via flag driver.enabled=false no gráfico Helm do Operador de GPU NVIDIA, onde ele simplesmente detectará os drivers instalados no host. Instruções mais abrangentes estão disponíveis pela NVIDIA aqui.

30.2 Pré-requisitos

Se você está seguindo este guia, ele pressupõe que você já tenha o seguinte disponível:

  • Pelo menos um host com o SUSE Linux Micro 6.2 instalado; ele pode ser físico ou virtual.

  • Seus hosts estão conectados a uma assinatura, pois isso é necessário para o acesso aos pacotes — uma avaliação está disponível aqui.

  • Uma GPU NVIDIA compatível instalada (ou totalmente passada para a máquina virtual na qual o SUSE Linux Micro está sendo executado).

  • Acesso ao usuário root — estas instruções pressupõem que você é o usuário root e não está elevando seus privilégios via sudo.

30.3 Instalação manual

Nesta seção, você instalará os drivers NVIDIA diretamente no sistema operacional SUSE Linux Micro, já que o driver aberto da NVIDIA agora faz parte dos repositórios de pacotes principais do SUSE Linux Micro, o que torna o processo tão fácil quanto instalar os pacotes RPM necessários. Não é necessária a compilação ou o download de pacotes executáveis. Abaixo, percorremos a implantação da geração \"G06\" de driver, que oferece suporte às GPUs mais recentes (consulte aqui para obter mais informações), portanto, selecione uma geração de driver apropriada para a GPU NVIDIA que seu sistema possui. Para GPUs modernas, o driver \"G06\" é a escolha mais comum.

Antes de começarmos, é importante reconhecer que, além do driver aberto da NVIDIA que o SUSE fornece como parte do SUSE Linux Micro, você também pode precisar de componentes adicionais da NVIDIA para sua configuração. Isso pode incluir bibliotecas OpenGL, toolkits CUDA, utilitários de linha de comando como nvidia-smi e componentes de integração de contêineres como nvidia-container-toolkit. Muitos desses componentes não são fornecidos pelo SUSE, pois são softwares proprietários da NVIDIA, ou não faz sentido para nós fornecê-los em vez da NVIDIA. Portanto, como parte das instruções, vamos configurar repositórios adicionais que nos dão acesso a tais componentes e percorrer certos exemplos de como usar essas ferramentas, resultando em um sistema totalmente funcional. É importante distinguir entre os repositórios do SUSE e os repositórios da NVIDIA, pois ocasionalmente pode haver uma incompatibilidade entre as versões de pacotes que a NVIDIA disponibiliza e o que o SUSE compilou. Isso geralmente ocorre quando o SUSE disponibiliza uma nova versão do driver aberto, e leva alguns dias até que os pacotes equivalentes sejam disponibilizados nos repositórios da NVIDIA para corresponder.

Recomendamos que você garanta que a versão do driver que você está selecionando seja compatível com sua GPU e atenda a quaisquer requisitos de CUDA que você possa ter, verificando:

  • As notas de versão do CUDA

  • A versão do driver que você planeja implantar tem uma versão correspondente no repositório NVIDIA e garantindo que você tenha versões de pacotes equivalentes disponíveis para os componentes de suporte

Dica
Dica

Para encontrar as versões do driver aberto da NVIDIA, execute zypper se -s nvidia-open-driver na máquina de destino ou pesquise no SUSE Customer Center por \"nvidia-open-driver\" em SUSE Linux Micro 6.2 para AMD64/Intel 64.

SUSE Customer Center

Quando você tiver confirmado que uma versão equivalente está disponível nos repositórios da NVIDIA, você estará pronto para instalar os pacotes no sistema operacional host. Para isso, precisamos abrir uma sessão transactional-update, que cria um novo instantâneo leitura/gravação do sistema operacional subjacente para que possamos fazer alterações na plataforma imutável (para mais instruções sobre transactional-update, veja aqui):

transactional-update shell

Quando você estiver no seu shell transactional-update, adicione um repositório de pacotes adicional da NVIDIA. Isso nos permite obter utilitários adicionais, por exemplo, nvidia-smi:

zypper ar https://download.nvidia.com/suse/sle15sp6/ nvidia-suse-main
zypper --gpg-auto-import-keys refresh

Você pode então instalar o driver e nvidia-compute-utils para utilitários adicionais. Se você não precisar dos utilitários, pode omiti-los, mas para fins de teste, vale a pena instalá-los nesta etapa:

zypper install -y --auto-agree-with-licenses nvidia-open-driver-G06-signed-kmp nvidia-compute-utils-G06
Nota
Nota

Se a instalação falhar, isso pode indicar uma incompatibilidade de dependência entre a versão do driver selecionada e o que a NVIDIA disponibiliza em seus repositórios. Consulte a seção anterior para verificar se suas versões correspondem. Tente instalar uma versão de driver diferente. Por exemplo, se os repositórios da NVIDIA tiverem uma versão anterior, você pode tentar especificar nvidia-open-driver-G06-signed-kmp=550.54.14 no seu comando para indicar uma versão que seja compatível.

Em seguida, se você não estiver usando uma GPU compatível (lembrando que a lista pode ser encontrada aqui), você pode verificar se o driver funciona ativando o suporte no nível do módulo, mas os resultados podem variar — pule esta etapa se você estiver usando uma GPU compatível:

sed -i '/NVreg_OpenRmEnableUnsupportedGpus/s/^#//g' /etc/modprobe.d/50-nvidia-default.conf

Agora que você instalou esses pacotes, é hora de fechar a sessão transactional-update:

exit
Nota
Nota

Certifique-se de ter fechado a sessão transactional-update antes de prosseguir.

Agora que você instalou os drivers, é hora de reiniciar. Como o SUSE Linux Micro é um sistema operacional imutável, ele precisa reiniciar no novo snapshot que você criou em uma etapa anterior. Os drivers são instalados apenas neste novo snapshot, portanto, não é possível carregar os drivers sem reiniciar neste novo snapshot, o que acontece automaticamente. Execute o comando de reboot quando estiver pronto:

reboot

Assim que o sistema for reiniciado com sucesso, faça login novamente e use a ferramenta nvidia-smi para verificar se o driver foi carregado com sucesso e se ele consegue acessar e enumerar suas GPUs:

nvidia-smi

A saída deste comando deve mostrar algo semelhante à saída a seguir, observando que, no exemplo abaixo, temos duas 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                                                           |
+---------------------------------------------------------------------------------------+

Isso conclui o processo de instalação e verificação dos drivers NVIDIA no seu sistema SUSE Linux Micro.

30.4 Validação adicional da instalação manual

Nesta fase, tudo o que conseguimos verificar é que, no nível do host, o dispositivo NVIDIA pode ser acessado e que os drivers estão sendo carregados com sucesso. No entanto, se quisermos ter certeza de que ele está funcionando, um teste simples seria validar que a GPU pode receber instruções de um aplicativo de espaço do usuário, idealmente via um contêiner, e através da biblioteca CUDA, já que é isso que uma carga de trabalho real normalmente usaria. Para isso, podemos fazer uma modificação adicional no SO host instalando o nvidia-container-toolkit (NVIDIA Container Toolkit). Primeiro, abra outro shell transactional-update, observando que poderíamos ter feito isso em uma única transação na etapa anterior, e veja como fazer isso totalmente automatizado em uma seção posterior:

transactional-update shell

Em seguida, instale o pacote nvidia-container-toolkit do repositório do NVIDIA Container Toolkit:

  • O nvidia-container-toolkit.repo abaixo contém um repositório estável (nvidia-container-toolkit) e um experimental (nvidia-container-toolkit-experimental). O repositório estável é recomendado para uso em produção. O repositório experimental está desativado por padrão.

zypper ar https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo
zypper --gpg-auto-import-keys install -y nvidia-container-toolkit

Quando estiver pronto, você pode fechar o shell transactional-update:

exit

…​e reinicializar a máquina no novo instantâneo:

reboot
Nota
Nota

Como antes, você precisa garantir que fechou o transactional-shell e reinicializou a máquina para que suas alterações sejam aplicadas.

Com a máquina reinicializada, você pode verificar se o sistema consegue enumerar com sucesso os dispositivos usando o NVIDIA Container Toolkit. A saída deve ser detalhada, com mensagens INFO e WARN, mas sem mensagens ERROR:

nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml

Isso garante que qualquer contêiner iniciado na máquina possa empregar dispositivos GPU NVIDIA que foram descobertos. Quando estiver pronto, você pode então executar um contêiner baseado em podman. Fazer isso via podman nos dá uma boa maneira de validar o acesso ao dispositivo NVIDIA a partir de dentro de um contêiner, o que deve dar confiança para fazer o mesmo com o Kubernetes em um estágio posterior. Dê ao podman acesso aos dispositivos NVIDIA rotulados que foram tratados pelo comando anterior, com base no SLE BCI, e simplesmente execute o comando Bash:

podman run --rm --device nvidia.com/gpu=all --security-opt=label=disable -it registry.suse.com/bci/bci-base:latest bash

Você agora executará comandos de dentro de um contêiner podman temporário. Ele não tem acesso ao seu sistema subjacente e é efêmero, portanto, o que quer que façamos aqui não persistirá, e você não deve conseguir quebrar nada no host subjacente. Como agora estamos em um contêiner, podemos instalar as bibliotecas CUDA necessárias, verificando novamente a versão correta do CUDA para seu driver aqui, embora a saída anterior de nvidia-smi deva mostrar a versão do CUDA necessária. No exemplo abaixo, estamos instalando o CUDA 12.3 e baixando muitos exemplos, demos e kits de desenvolvimento para que você possa validar totalmente a 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

Assim que isso tiver sido instalado com sucesso, não feche o contêiner. Executaremos o exemplo deviceQuery do CUDA, que valida de forma abrangente o acesso à GPU via CUDA, e de dentro do próprio contêiner:

/usr/local/cuda-12/extras/demo_suite/deviceQuery

Se for bem-sucedido, você deverá ver uma saída semelhante à seguinte, observando a mensagem Result = PASS no final do comando, e observando que, na saída abaixo, o sistema identifica corretamente duas GPUs, enquanto seu ambiente pode ter apenas uma:

/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

A partir daqui, você pode continuar a executar qualquer outra carga de trabalho CUDA — use compiladores e qualquer outro aspecto do ecossistema CUDA para realizar mais testes. Quando terminar, você pode fechar o contêiner, observando que tudo o que você instalou nele é efêmero (portanto, será perdido!) e não impactou o sistema operacional subjacente:

exit

30.5 Implementação com Kubernetes

Agora que comprovamos a instalação e o uso do driver aberto da NVIDIA no SUSE Linux Micro, vamos explorar a configuração do Kubernetes na mesma máquina. Este guia não orienta você na implantação do Kubernetes, mas pressupõe que você tenha instalado K3s ou RKE2 e que seu kubeconfig esteja configurado adequadamente, para que comandos kubectl padrão possam ser executados como superusuário. Pressupomos que seu nó forme um cluster de nó único, embora as etapas principais devam ser semelhantes para clusters de vários nós. Primeiro, certifique-se de que seu acesso kubectl esteja funcionando:

kubectl get nodes

Isso deve mostrar algo semelhante ao seguinte:

NAME       STATUS   ROLES                       AGE   VERSION
node0001   Ready    control-plane,etcd,master   13d   v1.35.4+rke2r1

O que você deve encontrar é que sua instalação do k3s/rke2 detectou o NVIDIA Container Toolkit no host e configurou automaticamente a integração do runtime NVIDIA no containerd (a Container Runtime Interface que o k3s/rke2 usa). Confirme isso verificando o arquivo config.toml do containerd:

tail -n8 /var/lib/rancher/rke2/agent/etc/containerd/config.toml

Isso deve mostrar algo semelhante ao seguinte. O local equivalente do K3s é /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

Se essas entradas não estiverem presentes, a detecção pode ter falhado. Isso pode ser devido à máquina ou aos serviços do Kubernetes não terem sido reiniciados. Adicione-os manualmente como acima, se necessário.

Em seguida, precisamos configurar o NVIDIA RuntimeClass como um runtime adicional do Kubernetes ao padrão, garantindo que quaisquer solicitações de usuário para pods que precisem de acesso à GPU possam usar o NVIDIA Container Toolkit para isso, via nvidia-container-runtime, conforme configurado na configuração containerd:

kubectl apply -f - <<EOF
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: nvidia
handler: nvidia
EOF

O próximo passo é configurar o NVIDIA Device Plugin, que configura o Kubernetes para aproveitar as GPUs NVIDIA como recursos dentro do cluster que podem ser usados, trabalhando em combinação com o NVIDIA Container Toolkit. Esta ferramenta detecta inicialmente todos os recursos no host subjacente, incluindo GPUs, drivers e outros recursos (como GL) e, em seguida, permite que você solicite recursos de GPU e os consuma como parte de suas aplicações.

Primeiro, você precisa adicionar e atualizar o repositório Helm para o NVIDIA Device Plugin:

helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update

Agora você pode instalar o NVIDIA Device Plugin:

helm upgrade -i nvdp nvdp/nvidia-device-plugin --namespace nvidia-device-plugin --create-namespace --version 0.14.5 --set runtimeClassName=nvidia

Após alguns minutos, você verá um novo pod em execução que concluirá a detecção em seus nós disponíveis e os marcará com o número de GPUs que foram detectadas:

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"
}

Agora você está pronto para criar um pod NVIDIA que tenta usar esta GPU. Vamos tentar com o container 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

Se tudo correu bem, você pode verificar os logs e ver as informações do benchmark:

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

Finalmente, se suas aplicações exigirem OpenGL, você pode instalar as bibliotecas NVIDIA OpenGL necessárias no nível do host, e o NVIDIA Device Plugin e o NVIDIA Container Toolkit podem disponibilizá-las para os contêineres. Para fazer isso, instale o pacote da seguinte maneira:

transactional-update pkg install nvidia-gl-G06
Nota
Nota

Você precisa reiniciar para disponibilizar este pacote para suas aplicações. O NVIDIA Device Plugin deve redetectar isso automaticamente via NVIDIA Container Toolkit.

30.6 Unindo tudo via Edge Image Builder

Ok, então você demonstrou a funcionalidade completa de suas aplicações e GPUs no SUSE Linux Micro e agora deseja usar o Capítulo 8, Edge Image Builder para fornecer tudo isso junto via uma imagem de disco ISO ou RAW implantável/consumível. Este guia não explica como usar o Edge Image Builder, mas fornece a configuração necessária para gerar tal imagem. Abaixo você pode encontrar um exemplo de uma definição de imagem, juntamente com os arquivos de configuração do Kubernetes necessários, para garantir que todos os componentes necessários sejam implantados automaticamente. Aqui está a estrutura do diretório Edge Image Builder para o exemplo mostrado abaixo:

.
├── 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

Vamos explorar esses arquivos. Primeiro, aqui está uma amostra de definição de imagem para um cluster de nó único executando K3s que implanta os utilitários e pacotes OpenGL também (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

Este é apenas um exemplo. Você pode precisar personalizá-lo para atender aos seus requisitos e expectativas. Além disso, se estiver usando o SUSE Linux Micro, você precisa fornecer seu próprio sccRegistrationCode para resolver as dependências de pacotes e extrair os drivers NVIDIA.

Além disso, precisamos adicionar componentes adicionais para que sejam carregados pelo Kubernetes no momento da inicialização. O diretório EIB precisa primeiro de um diretório kubernetes, com subdiretórios para a configuração, valores do gráfico Helm e quaisquer manifestos adicionais necessários:

mkdir -p kubernetes/config kubernetes/helm/values kubernetes/manifests

Vamos agora configurar o Kubernetes de forma opcional, escolhendo um CNI (que assume Cilium como padrão se não for selecionado) e habilitando o SELinux:

cat << EOF > kubernetes/config/server.yaml
cni: cilium
ingress-controller: traefik
selinux: true
EOF

Agora garanta que a NVIDIA RuntimeClass seja criada no cluster Kubernetes:

cat << EOF > kubernetes/manifests/nvidia-runtime-class.yaml
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: nvidia
handler: nvidia
EOF

Usamos o Helm Controller incorporado para implantar o NVIDIA Device Plugin através do próprio Kubernetes. Vamos fornecer a runtime class no arquivo de valores para o gráfico:

cat << EOF > kubernetes/helm/values/nvidia-device-plugin.yaml
runtimeClassName: nvidia
EOF

Precisamos obter a chave pública RPM do NVIDIA Container Toolkit antes de prosseguir:

mkdir -p rpms/gpg-keys
curl -o rpms/gpg-keys/nvidia-container-toolkit.key https://nvidia.github.io/libnvidia-container/gpgkey

Todos os artefatos necessários, incluindo o binário do Kubernetes, imagens de contêiner, gráficos Helm (e quaisquer imagens referenciadas), serão automaticamente air-gapped, o que significa que os sistemas no momento de implantar não devem exigir conectividade com a Internet por padrão. Agora você só precisa obter a ISO do SUSE Linux Micro na Página de Downloads do SUSE (e colocá-la no diretório base-images), e você pode chamar a ferramenta Edge Image Builder para gerar a ISO para você. Para completar o exemplo, aqui está o comando que foi usado para criar a imagem:

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 mais instruções, consulte a documentação do Edge Image Builder.

30.7 Resolvendo problemas

30.7.1 nvidia-smi não encontra a GPU

Verifique as mensagens do kernel usando dmesg. Se isso indicar que não é possível alocar NvKMSKapDevice, aplique a solução alternativa para GPU não suportada:

sed -i '/NVreg_OpenRmEnableUnsupportedGpus/s/^#//g' /etc/modprobe.d/50-nvidia-default.conf

NOTA: Você precisará recarregar o módulo do kernel, ou reiniciar, se alterar a configuração do módulo do kernel na etapa acima para que ela entre em vigor.

Parte VI Operações do Dia 2

Esta seção explica como os administradores podem lidar com diferentes tarefas de operação do \"Dia Dois\", tanto no gerenciamento quanto nos clusters downstream.

  • 31 Migração Edge 3.6
  • Esta seção explica como migrar seus clusters management e downstream de SUSE Edge 3.5 para SUSE Edge 3.6.0.

  • 32 Cluster de gerenciamento
  • Atualmente, existem duas maneiras de realizar operações de \"Dia 2\" no seu cluster management:

  • 33 Downstream clusters
  • Esta seção aborda as possíveis maneiras de realizar operações de "Dia 2" para diferentes partes do seu downstream cluster.

31 Migração Edge 3.6

Esta seção explica como migrar seus clusters management e downstream de SUSE Edge 3.5 para SUSE Edge 3.6.0.

Importante
Importante

Sempre realize migrações de cluster a partir da latest Z-stream release do SUSE Edge 3.5.

Sempre migre para a SUSE Edge 3.6.0 release. Para upgrades pós-migração subsequentes, consulte as management (Capítulo 32, Cluster de gerenciamento) e cluster downstream (Capítulo 33, Downstream clusters) seções.

A tabela a seguir lista os diferentes tipos de clusters e os métodos para fazer upgrade dos clusters:

Tabela 31.1: Clusters e métodos para fazer upgrade de clusters downstream
Tipo de clusterMétodo

Clusters provisionados por EIB

Consulte Seção 31.1.3, “Fleet” para obter os detalhes.

Clusters provisionados por phone-home

Consulte Atualizando a versão do Kubernetes para fazer upgrade da versão do Kubernetes e Clusters downstream (Capítulo 33, Downstream clusters) para SUC, sistema operacional e outros componentes.

31.1 Cluster de gerenciamento

Esta seção abrange os seguintes tópicos:

Seção 31.1.1, “Pré-requisitos” - etapas de pré-requisito a serem concluídas antes de iniciar a migração.

Seção 31.1.2, “Upgrade Controller” - como fazer uma migração de cluster management usando o Capítulo 19, Upgrade Controller.

Seção 31.1.3, “Fleet” - como fazer uma migração de cluster management usando Capítulo 6, Fleet.

31.1.1 Pré-requisitos

31.1.1.1 Migrar a configuração do certificado de CA do Metal3

Nota
Nota

Aplica-se apenas a implantações do Metal3 que usam CAs confiáveis adicionais para servidores de mídia externos com TLS.

O gráfico Helm do Metal3 mudou a forma como os certificados de CA confiáveis são configurados. Anteriormente, as CAs adicionais eram fornecidas por meio de um Secret (tls-ca-additional) com o sinalizador booleano additionalTrustedCAs. A nova versão usa um ConfigMap contendo o pacote de CA completo referenciado pelo valor global.trustedCAs.

Se você configurou CAs confiáveis adicionais para o Metal3, você precisa migrar da abordagem baseada em Secret para a abordagem baseada em ConfigMap:

  1. Crie um ConfigMap contendo seu pacote de CA a partir do Secret existente:

    Extraia os certificados do Secret antigo:

    kubectl get secret tls-ca-additional -n metal3-system -o jsonpath='{.data}' | \
      jq -r 'to_entries[] | .value' | base64 -d > ca-bundle.pem

    Opcional - Inclua o pacote de CA do sistema: Se sua implantação do Metal3 também precisar confiar em CAs públicas (por exemplo, ao acessar recursos externos via HTTPS), você precisará incluir o pacote de CA do sistema além de suas CAs personalizadas. Extraia o pacote de CA do sistema de uma imagem de contêiner e adicione-o antes de suas CAs 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

    Se você incluir o pacote de CA do sistema, torna-se sua responsabilidade mantê-lo atualizado. As CAs do sistema na imagem do contêiner podem ficar obsoletas com o tempo, à medida que os certificados de CA expiram ou são revogados. Você deve atualizar periodicamente o pacote de CA do sistema extraindo-o novamente de uma imagem de contêiner atualizada.

    Crie o ConfigMap com o pacote de CA final:

    kubectl create configmap tls-ca-bundle -n metal3-system --from-file=ca-bundle.pem=ca-bundle.pem
  2. Atualize seus valores de Helm do Metal3 para usar a nova referência do ConfigMap:

    Altere de:

    global:
      additionalTrustedCAs: true

    Para:

    global:
      trustedCAs: tls-ca-bundle
  3. Após atualizar o gráfico Helm do Metal3 com a nova configuração, você pode excluir o Secret antigo:

    kubectl delete secret tls-ca-additional -n metal3-system

31.1.2 Upgrade Controller

Importante
Importante

O Upgrade Controller atualmente suporta migrações de versão SUSE Edge apenas para clusters de gerenciamento que não são air-gapped.

Os tópicos a seguir são abordados como parte desta seção:

Seção 31.1.2.1, “Pré-requisitos” - pré-requisitos específicos para o Upgrade Controller.

Seção 31.1.2.2, “Etapas de migração” - etapas para migrar um cluster management para uma nova versão SUSE Edge usando o Upgrade Controller.

31.1.2.1 Pré-requisitos

31.1.2.1.1 SUSE Edge 3.6 Upgrade Controller

Antes de usar o Upgrade Controller, você deve primeiro garantir que ele esteja executando uma versão capaz de migrar para a versão SUSE Edge desejada.

Para fazer isso:

  1. Se você já tiver o Upgrade Controller implantado a partir de uma versão SUSE Edge anterior, atualize seu 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. Se você não tiver Upgrade Controller implantado, siga Seção 19.3, “Instalando o Upgrade Controller”.

31.1.2.2 Etapas de migração

Realizar uma migração de cluster management com o Upgrade Controller é fundamentalmente semelhante à execução de um upgrade.

A única diferença é que seu UpgradePlan deve especificar a versão de lançamento 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 obter informações sobre como usar o UpgradePlan acima para realizar uma migração, consulte processo de upgrade do Upgrade Controller (Seção 32.1, “Upgrade Controller”).

31.1.3 Fleet

Nota
Nota

Sempre que possível, use o Seção 31.1.2, “Upgrade Controller” para migração.

Consulte esta seção apenas para casos de uso não cobertos pelo Upgrade Controller.

Realizar uma migração de cluster management com Fleet é fundamentalmente semelhante à execução de um upgrade.

As principais diferenças são:

  1. As frotas devem ser usadas a partir da versão release-3.6.0 do repositório suse-edge/fleet-examples.

  2. Os gráficos agendados para um upgrade devem ser atualizados para versões compatíveis com a versão SUSE Edge 3.6.0. Para obter uma lista dos componentes SUSE Edge 3.6.0, consulte Seção 41.4, “Release 3.6.0”.

Importante
Importante

Para garantir uma migração SUSE Edge 3.6.0 bem-sucedida, é importante que os usuários cumpram os pontos descritos acima.

Considerando os pontos acima, os usuários podem seguir a documentação do Fleet (Seção 32.2, “Fleet”) do cluster management para obter um guia abrangente sobre as etapas necessárias para realizar uma migração.

31.2 Clusters downstream

Seção 31.2.1, “Fleet” - como fazer uma migração de cluster downstream usando Capítulo 6, Fleet.

31.2.1 Fleet

Realizar uma migração de cluster downstream com Fleet é fundamentalmente semelhante à execução de um upgrade.

As principais diferenças são:

  1. As Fleet devem ser usadas a partir da versão release-3.6.0 do repositório suse-edge/fleet-examples.

  2. Os gráficos agendados para um upgrade devem ser atualizados para versões compatíveis com a versão SUSE Edge 3.6.0. Para obter uma lista dos componentes SUSE Edge 3.6.0, consulte Seção 41.4, “Release 3.6.0”.

Importante
Importante

Para garantir uma migração SUSE Edge 3.6.0 bem-sucedida, é importante que os usuários cumpram os pontos descritos acima.

Considerando os pontos acima, os usuários podem seguir a documentação do Fleet (Seção 33.1, “Fleet”) do cluster downstream para obter um guia abrangente sobre as etapas necessárias para realizar uma migração.

32 Cluster de gerenciamento

Atualmente, existem duas maneiras de realizar operações de \"Dia 2\" no seu cluster management:

32.1 Upgrade Controller

Importante
Importante

O Upgrade Controller atualmente suporta apenas operações Day 2 para clusters não air-gapped.

Esta seção aborda como realizar as várias operações Day 2 relacionadas a fazer upgrade do seu cluster management de uma versão de plataforma SUSE Edge para outra.

As operações Day 2 são automatizadas pelo Upgrade Controller (Capítulo 19, Upgrade Controller) e incluem:

32.1.1 Pré-requisitos

Antes de fazer upgrade do seu cluster management, os seguintes pré-requisitos devem ser atendidos:

  1. SCC registered nodes - certifique-se de que o SO dos nós do seu cluster esteja registrado com uma chave de assinatura que suporte a versão do SO especificada na SUSE Edge release (Capítulo 41, Notas de versão) para a qual você pretende fazer upgrade.

  2. Upgrade Controller - certifique-se de que o Upgrade Controller tenha sido implantado em seu cluster management. Para as etapas de instalação, consulte Seção 19.3, “Instalando o Upgrade Controller”.

32.1.2 Upgrade

  1. Determine a versão de SUSE Edge release (Capítulo 41, Notas de versão) para a qual você deseja fazer upgrade do seu cluster management.

  2. No cluster management, implante um UpgradePlan que especifique o release version desejado. O UpgradePlan deve ser implantado no namespace do 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

    Podem existir casos de uso em que você deseje fazer configurações adicionais sobre o UpgradePlan. Para todas as configurações possíveis, consulte Seção 19.6.1, “UpgradePlan”.

  3. A implantação do UpgradePlan no namespace do Upgrade Controller’s iniciará o upgrade process.

    Nota
    Nota

    Para obter mais informações sobre o upgrade process real, consulte Seção 19.5, “Como funciona o Upgrade Controller?”.

    Para obter informações sobre como rastrear o upgrade process, consulte Seção 19.7, “Acompanhando o processo de atualização”.

32.1.3 Tarefas pós-upgrade

Fazer upgrade do SUSE Edge do z-stream 3.5 mais recente para 3.6.0 pode exigir algumas etapas manuais finais a serem executadas após o Upgrade Controller ter concluído o processo de fazer upgrade. Essas estão relacionadas à substituição do Ingress-NGINX pelo Traefik como o único controlador de ingresso suportado no SUSE Edge a partir da versão 3.6.

Nota
Nota

O provedor de ingresso Traefik integrado ao RKE2/K3s é o único controlador de ingresso suportado na versão SUSE Edge 3.6, sendo ainda possível executar temporariamente o Ingress-NGINX junto com o Traefik para oferecer suporte a cenários complexos de migração de ingresso, mas apenas após os clusters de Gerenciamento e/ou Downstream SUSE Edge terem feito upgrade para a versão 3.6 e pelo tempo necessário para realizar essa migração.

O guia Migração de Ingress NGINX para Traefik fornece detalhes sobre os caminhos de migração de ingresso disponíveis assim que o controlador de ingresso Traefik substituir o Ingress-NGINX descontinuado.

Caso o cluster de Gerenciamento recém-fez upgrade não estivesse executando o controlador de ingresso Traefik (mas o padrão Ingress-NGINX) antes de iniciar o upgrade, agora é necessário implantar manualmente o Traefik.

Primeiro, vamos garantir que a instância do ingress-NGINX implantada esteja configurada corretamente (por exemplo, para evitar colisões desnecessárias de hostPort entre os pods dos dois controladores de ingresso):

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

Agora podemos prosseguir com a implantação do Traefik, por meio da instalação dos gráficos Helm rke2-traefik-crd e rke2-traefik.

Nota
Nota

Implante esses gráficos Helm por meio de manifestos HelmChart, conforme mostrado abaixo, para garantir que o Upgrade Controller também cuide de fazer upgrade desses gráficos Helm em futuros processos de fazer upgrade do cluster de Gerenciamento.

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

O {rke2-traefik-crd Helm chart version} e o {rke2-traefik-crd Helm chart version} são aqueles ditados pela versão do RKE2/k3s para a qual fizemos upgrade.

Na última etapa, finalmente criamos os objetos necessários do MetalLB para expor o serviço Traefik por meio de um serviço do 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

Agora, tanto o Traefik quanto o Ingress-NGINX estão sendo executados lado a lado, permitindo que você execute com segurança a migração necessária de seus ingresses de um para o outro.

Importante
Importante

Assim que todos os ingresses tiverem sido migrados e você não precisar mais do Ingress-NGINX, certifique-se de desinstalá-lo e limpar todos os recursos relacionados para evitar qualquer consumo desnecessário de recursos em seu cluster.

32.2 Fleet

Esta seção oferece informações sobre como realizar operações de "Dia 2" usando o componente Fleet (Capítulo 6, Fleet).

Os tópicos a seguir são abordados como parte desta seção:

  1. Seção 32.2.1, “Componentes” - componentes padrão usados para todas as operações de "Dia 2".

  2. Seção 32.2.2, “Determine seu caso de uso” - fornece uma visão geral dos recursos personalizados do Fleet que serão usados e sua adequação para diferentes casos de uso de operações de "Dia 2".

  3. Seção 32.2.3, “Fluxo de trabalho de Dia 2” - fornece um guia de fluxo de trabalho para a execução de operações de "Dia 2" com o Fleet.

  4. Seção 32.2.4, “Fazer upgrade do SO” - descreve como fazer upgrade do SO usando o Fleet.

  5. Seção 32.2.5, “Atualização da versão do Kubernetes” - descreve como fazer upgrade da versão do Kubernetes usando o Fleet.

  6. Seção 32.2.6, “Fazer upgrade do Helm chart” - descreve como fazer upgrade do Helm chart usando o Fleet.

32.2.1 Componentes

Abaixo, você pode encontrar uma descrição dos componentes padrão que devem ser configurados em seu cluster management para que você possa realizar com sucesso as operações de "Dia 2" usando o Fleet.

32.2.1.1 Rancher

Opcional; Responsável por gerenciar o downstream clusters e implantar o System Upgrade Controller em seu management cluster.

Para obter mais informações, consulte Capítulo 4, Rancher.

32.2.1.2 System Upgrade Controller (SUC)

O System Upgrade Controller é responsável por executar tarefas em nós especificados com base em dados de configuração fornecidos por meio de um recurso personalizado, chamado de Plan.

O SUC é utilizado ativamente para fazer upgrade do sistema operacional e da distribuição do Kubernetes.

Para obter mais informações sobre o componente SUC e como ele se encaixa na pilha Edge, consulte Capítulo 18, Upgrade Controller do Sistema.

32.2.2 Determine seu caso de uso

O Fleet usa dois tipos de recursos personalizados para permitir o gerenciamento de recursos do Kubernetes e do Helm.

Abaixo, você pode encontrar informações sobre o propósito desses recursos e os casos de uso para os quais eles são mais adequados no contexto de operações de "Dia 2".

32.2.2.1 GitRepo

Um GitRepo é um recurso Fleet (Capítulo 6, Fleet) que representa um repositório Git a partir do qual o Fleet pode criar Bundles. Cada Bundle é criado com base em caminhos de configuração definidos dentro do recurso GitRepo. Para obter mais informações, consulte a documentação do GitRepo.

No contexto de operações de "Dia 2", os recursos GitRepo são normalmente usados para implantar SUC ou SUC Plans em ambientes não air-gapped que utilizam uma abordagem de Fleet GitOps.

Alternativamente, os recursos GitRepo também podem ser usados para implantar SUC ou SUC Plans em ambientes air-gapped, desde que você espelhe a configuração do seu repositório por meio de um servidor git local.

32.2.2.2 Pacote

Bundles contêm recursos raw do Kubernetes que serão implantados no cluster de destino. Geralmente, eles são criados a partir de um recurso GitRepo, mas existem casos de uso em que podem ser implantados manualmente. Para obter mais informações, consulte a documentação do Bundle.

No contexto de operações de "Dia 2", os recursos Bundle são normalmente usados para implantar SUC ou SUC Plans em ambientes air-gapped que não utilizam alguma forma de procedimento de GitOps local (por exemplo, um servidor git local).

Alternativamente, se o seu caso de uso não permitir um fluxo de trabalho GitOps (por exemplo, usando um repositório Git), os recursos Bundle também podem ser usados para implantar SUC ou SUC Plans em ambientes não air-gapped.

32.2.3 Fluxo de trabalho de Dia 2

O que se segue é um fluxo de trabalho de "Dia 2" que deve ser seguido ao fazer upgrade de um cluster management para uma versão específica do Edge.

32.2.4 Fazer upgrade do SO

Esta seção descreve como fazer upgrade do sistema operacional usando Capítulo 6, Fleet e o Capítulo 18, Upgrade Controller do Sistema.

Os tópicos a seguir são abordados como parte desta seção:

  1. Seção 32.2.4.1, “Componentes” - componentes adicionais usados pelo processo de upgrade.

  2. Seção 32.2.4.2, “Visão geral” - visão geral do processo de upgrade.

  3. Seção 32.2.4.3, “Requisitos” - requisitos do processo de upgrade.

  4. Seção 32.2.4.4, “Upgrade do SO - implantação do plano SUC” - informações sobre como implantar o SUC plans, responsável por acionar o processo de upgrade.

32.2.4.1 Componentes

Esta seção aborda os componentes personalizados que o processo de OS upgrade usa em relação aos componentes (Seção 32.2.1, “Componentes”) padrão de "Day 2".

32.2.4.1.1 systemd.service

O upgrade do SO em um nó específico é gerenciado por um systemd.service.

Um serviço diferente é criado dependendo do tipo de upgrade que o SO requer de uma versão do Edge para outra:

  • Para versões do Edge que requerem a mesma versão do SO (por exemplo, 6.1), o os-pkg-update.service será criado. Ele usa transactional-update para realizar um upgrade normal de pacotes.

  • Para versões do Edge que requerem uma migração de versão do SO (por exemplo, 6.1 → 6.2), o os-migration.service será criado. Ele usa transactional-update para realizar:

    1. Um upgrade normal de pacotes que garante que todos os pacotes estejam atualizados para mitigar quaisquer falhas na migração relacionadas a versões antigas de pacotes.

    2. Uma migração de SO utilizando o comando zypper migration.

Os serviços mencionados acima são fornecidos em cada nó por meio de um SUC plan que deve estar localizado no cluster management que precisa de upgrade do SO.

32.2.4.2 Visão geral

O upgrade do sistema operacional para nós de cluster management é feito utilizando Fleet e o System Upgrade Controller (SUC).

Fleet é usado para implantar e gerenciar SUC plans no cluster desejado.

Nota
Nota

SUC plans são recursos personalizados que descrevem as etapas que o SUC precisa seguir para que uma tarefa específica seja executada em um conjunto de nós. Para um exemplo de como um SUC plan se parece, consulte o repositório upstream.

Os OS SUC plans são enviados para cada cluster implantando um recurso GitRepo ou Bundle em um workspace específico do Fleet. O Fleet recupera os GitRepo/Bundle implantados e implanta seu conteúdo (o OS SUC plans) no(s) cluster(es) desejado(s).

Nota
Nota

Os recursos GitRepo/Bundle são sempre implantados no management cluster. Se usar um recurso GitRepo ou Bundle depende do seu caso de uso, verifique Seção 32.2.2, “Determine seu caso de uso” para mais informações.

OS SUC plans descrevem o seguinte fluxo de trabalho:

  1. Sempre cordon os nós antes de upgrades do SO.

  2. Sempre faça upgrade dos nós control-plane antes dos nós worker.

  3. Sempre faça upgrade do cluster, um nó por vez.

Uma vez que os OS SUC plans são implantados, o fluxo de trabalho é o seguinte:

  1. O SUC reconcilia os OS SUC plans implantados e cria um Kubernetes Job em cada nó.

  2. O Kubernetes Job cria um systemd.service (Seção 32.2.4.1.1, “systemd.service”) para upgrade de pacote ou migração de SO.

  3. O systemd.service criado aciona o processo de upgrade do SO no nó específico.

    Importante
    Importante

    Assim que o processo de upgrade do SO terminar, o nó correspondente será rebooted para aplicar as atualizações no sistema.

Abaixo você pode encontrar um diagrama da descrição acima:

fleet day2 management os upgrade

32.2.4.3 Requisitos

Geral:

  1. Máquina registrada no SCC - Todos os management nós do cluster devem estar registrados no https://scc.suse.com/, o que é necessário para que o respectivo systemd.service possa se conectar com sucesso ao repositório RPM desejado.

    Importante
    Importante

    Para versões Edge que exigem uma migração de versão de SO (por exemplo, 6.1 → 6.2), certifique-se de que sua chave SCC suporte a migração para a nova versão.

  2. Certifique-se de que as tolerâncias do Plano SUC correspondam às tolerâncias do nó - Se os nós do seu cluster Kubernetes tiverem taints personalizados, certifique-se de adicionar tolerâncias para esses taints nos Planos SUC. Por padrão, SUC Plans possuem tolerâncias apenas para nós control-plane. As tolerâncias padrão incluem:

    • CriticalAddonsOnly=true:NoExecute

    • node-role.kubernetes.io/control-plane:NoSchedule

    • node-role.kubernetes.io/etcd:NoExecute

      Nota
      Nota

      Quaisquer tolerâncias adicionais devem ser adicionadas na seção .spec.tolerations de cada Plano. SUC Plans relacionados ao upgrade do SO podem ser encontrados no repositório suse-edge/fleet-examples em fleets/day2/system-upgrade-controller-plans/os-upgrade. Certifique-se de usar os Planos de uma tag de release de repositório válida.

      Um exemplo de definição de tolerâncias personalizadas para o plano SUC control-plane seria assim:

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

Air-gapped:

  1. Espelhar repositórios RPM da SUSE - Os repositórios RPM do SO devem ser espelhados localmente para que o systemd.service possa ter acesso a eles. Isso pode ser alcançado usando RMT ou SUMA.

32.2.4.4 Upgrade do SO - implantação do plano SUC

Importante
Importante

Para ambientes atualizados anteriormente usando este procedimento, os usuários devem garantir que uma das seguintes etapas seja concluída:

  • Remove any previously deployed SUC Plans related to older Edge release versions from the management cluster - pode ser feito removendo o cluster desejado da GitRepo/Bundle target configuration existente, ou removendo o recurso GitRepo/Bundle por completo.

  • Reuse the existing GitRepo/Bundle resource - pode ser feito apontando a revisão do recurso para uma nova tag que contenha as frotas corretas para o suse-edge/fleet-examples release desejado.

Isso é feito para evitar conflitos entre SUC Plans para versões de release do Edge mais antigas.

Se os usuários tentarem fazer upgrade enquanto houver SUC Plans existentes no cluster management, eles verão o seguinte erro do 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 mencionado em Seção 32.2.4.2, “Visão geral”, os upgrades do SO são feitos enviando SUC plans para o cluster desejado por meio de uma das seguintes maneiras:

Para determinar qual recurso você deve usar, consulte Seção 32.2.2, “Determine seu caso de uso”.

Para casos de uso em que você deseja implantar o OS SUC plans a partir de uma ferramenta GitOps de terceiros, consulte Seção 32.2.4.4.3, “Implantação do plano SUC - fluxo de trabalho GitOps de terceiros”

32.2.4.4.1 Implantação do plano SUC - recurso GitRepo

Um recurso GitRepo, que implanta o OS SUC plans necessário, pode ser implantado de uma das seguintes maneiras:

  1. Através do Rancher UI - Seção 32.2.4.4.1.1, “Criação de GitRepo - UI do Rancher” (quando Rancher estiver disponível).

  2. Ao implantar manualmente (Seção 32.2.4.4.1.2, “Criação de GitRepo - manual”) o recurso no seu management cluster.

Uma vez implantado, para monitorar o processo de upgrade do SO dos nós do seu cluster alvo, consulte Seção 18.3, “Monitoramento de Planos do Upgrade Controller do Sistema”.

32.2.4.4.1.1 Criação de GitRepo - UI do Rancher

Para criar um recurso GitRepo através da UI do Rancher, siga a documentação oficial deles.

A equipe Edge mantém um fleet pronto para uso. Dependendo do seu ambiente, este fleet pode ser usado diretamente ou como um modelo.

Importante
Importante

Sempre use este fleet a partir de uma tag de release válida do Edge.

Para casos de uso onde nenhuma alteração personalizada precisa ser incluída no SUC plans que o fleet entrega, os usuários podem referenciar diretamente o fleet os-upgrade do repositório suse-edge/fleet-examples.

Em casos onde alterações personalizadas são necessárias (por exemplo, para adicionar tolerâncias personalizadas), os usuários devem referenciar o fleet os-upgrade de um repositório separado, permitindo que adicionem as alterações aos planos SUC conforme necessário.

Um exemplo de como um GitRepo pode ser configurado para usar o fleet do repositório suse-edge/fleet-examples, pode ser visto aqui.

32.2.4.4.1.2 Criação de GitRepo - manual
  1. Puxe o 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. Edite a configuração do GitRepo:

    • Remova a seção spec.targets - necessária apenas para clusters downstream.

      # 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
    • Aponte o namespace do GitRepo para o namespace fleet-local - feito para implantar o recurso no cluster de gerenciamento.

      # 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. Aplique o recurso GitRepo ao seu management cluster:

    kubectl apply -f os-upgrade-gitrepo.yaml
  4. Visualize o recurso GitRepo criado no namespace 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 Implantação do plano SUC - Recurso de Bundle

Um recurso Bundle, que inclui os OS SUC Plans necessários, pode ser implantado de uma das seguintes maneiras:

  1. Através do Rancher UI - Seção 32.2.4.4.2.1, “Criação de Bundle - Interface do Rancher” (quando Rancher estiver disponível).

  2. Ao implantar manualmente (Seção 32.2.4.4.2.2, “Criação de Bundle - manual”) o recurso no seu management cluster.

Uma vez implantado, para monitorar o processo de fazer upgrade do SO dos nós do seu cluster alvo, consulte Seção 18.3, “Monitoramento de Planos do Upgrade Controller do Sistema”.

32.2.4.4.2.1 Criação de Bundle - Interface do Rancher

A equipe Edge mantém um bundle pronto para uso que pode ser usado nas etapas abaixo.

Importante
Importante

Sempre use este bundle a partir de uma tag de release Edge válida.

Para criar um bundle através da interface do Rancher:

  1. No canto superior esquerdo, clique em ☰ → Continuous Delivery

  2. Vá para Avançado > Bundles

  3. Selecione Criar a partir de YAML

  4. A partir daqui, você pode criar o Bundle de uma das seguintes maneiras:

    Nota
    Nota

    Pode haver casos de uso em que você precise incluir alterações personalizadas no SUC plans que o bundle inclui (por exemplo, para adicionar tolerâncias personalizadas). Certifique-se de incluir essas alterações no bundle que será gerado pelas etapas abaixo.

    1. Copiando manualmente o conteúdo do bundle de suse-edge/fleet-examples para a página Criar a partir de YAML.

    2. Clonando o repositório suse-edge/fleet-examples da release desejada e selecionando a opção Ler a partir de arquivo na página Criar a partir de YAML. A partir daí, navegue até o local do bundle (bundles/day2/system-upgrade-controller-plans/os-upgrade) e selecione o arquivo do bundle. Isso preencherá automaticamente a página Criar a partir de YAML com o conteúdo do bundle.

  5. Edite o Bundle na interface do usuário do Rancher:

    • Altere o namespace do Bundle para apontar para o namespace fleet-local.

      # Example
      kind: Bundle
      apiVersion: fleet.cattle.io/v1alpha1
      metadata:
        name: os-upgrade
        namespace: fleet-local
      ...
    • Altere os clusters target para o Bundle apontar para o seu cluster local(gerenciamento):

      spec:
        targets:
        - clusterName: local
      Nota
      Nota

      Existem alguns casos de uso em que seu cluster local pode ter um nome diferente.

      Para recuperar o nome do seu cluster local, execute o comando abaixo:

      kubectl get clusters.fleet.cattle.io -n fleet-local
  6. Selecione Criar

32.2.4.4.2.2 Criação de Bundle - manual
  1. Obtenha o 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. Edite a configuração do Bundle:

    • Altere os clusters target para o Bundle apontar para o seu cluster local(gerenciamento):

      spec:
        targets:
        - clusterName: local
      Nota
      Nota

      Existem alguns casos de uso em que seu cluster local pode ter um nome diferente.

      Para recuperar o nome do seu cluster local, execute o comando abaixo:

      kubectl get clusters.fleet.cattle.io -n fleet-local
    • Altere o namespace do Bundle para apontar para o namespace fleet-local.

      # Example
      kind: Bundle
      apiVersion: fleet.cattle.io/v1alpha1
      metadata:
        name: os-upgrade
        namespace: fleet-local
      ...
  3. Aplique o recurso Bundle ao seu management cluster:

    kubectl apply -f os-upgrade-bundle.yaml
  4. Visualize o recurso Bundle criado no namespace fleet-local:

    kubectl get bundles -n fleet-local
32.2.4.4.3 Implantação do plano SUC - fluxo de trabalho GitOps de terceiros

Pode haver casos de uso em que os usuários desejem incorporar o OS SUC plans ao seu próprio fluxo de trabalho GitOps de terceiros (por exemplo, Flux).

Para obter os recursos de fazer upgrade do SO de que você precisa, primeiro determine a tag de release do Edge do repositório suse-edge/fleet-examples que você deseja usar.

Depois disso, os recursos podem ser encontrados em fleets/day2/system-upgrade-controller-plans/os-upgrade, onde:

  • plan-control-plane.yaml é um recurso de plano SUC para nós de control-plane.

  • plan-worker.yaml é um recurso de plano SUC para nós de worker.

  • secret.yaml é um Secret que contém o script upgrade.sh, que é responsável por criar o systemd.service (Seção 32.2.4.1.1, “systemd.service”).

  • config-map.yaml é um ConfigMap que contém configurações que são consumidas pelo script upgrade.sh.

Importante
Importante

Estes recursos Plan são interpretados pelo System Upgrade Controller e devem ser implantados em cada cluster downstream que você deseja fazer upgrade. Para informações sobre a implantação do SUC, consulte Seção 18.2, “Instalando o Upgrade Controller do Sistema”.

Para entender melhor como seu fluxo de trabalho GitOps pode ser usado para implantar os SUC Plans para fazer upgrade do SO, pode ser útil dar uma olhada na visão geral (Seção 32.2.4.2, “Visão geral”).

32.2.5 Atualização da versão do Kubernetes

Esta seção descreve como realizar uma atualização do Kubernetes usando o Capítulo 6, Fleet e o Capítulo 18, Upgrade Controller do Sistema.

Os tópicos a seguir são abordados como parte desta seção:

  1. Seção 32.2.5.1, “Componentes” - componentes adicionais usados pelo processo de atualização.

  2. Seção 32.2.5.2, “Visão geral” - visão geral do processo de atualização.

  3. Seção 32.2.5.3, “Requisitos” - requisitos do processo de atualização.

  4. Seção 32.2.5.4, “Atualização do K8s - implantação do plano SUC” - informações sobre como implantar o SUC plans, responsável por acionar o processo de atualização.

32.2.5.1 Componentes

Esta seção aborda os componentes personalizados que o processo K8s upgrade usa em vez dos componentes (Seção 32.2.1, “Componentes”) padrão de "Dia 2".

32.2.5.1.1 rke2-upgrade

Imagem de contêiner responsável por atualizar a versão do RKE2 de um nó específico.

Distribuída por meio de um Pod criado pelo SUC com base em um Plano SUC. O Plano deve estar localizado em cada cluster que precise de uma atualização do RKE2.

Para obter mais informações sobre como a imagem rke2-upgrade realiza a atualização, consulte a documentação upstream.

32.2.5.1.2 k3s-upgrade

Imagem de contêiner responsável por atualizar a versão do K3s de um nó específico.

Distribuída por meio de um Pod criado pelo SUC com base em um Plano SUC. O Plano deve estar localizado em cada cluster que precise de um upgrade do K3s.

Para obter mais informações sobre como a imagem k3s-upgrade realiza a atualização, consulte a documentação upstream.

32.2.5.2 Visão geral

O upgrade da distribuição Kubernetes para nós de cluster management é feito utilizando Fleet e o System Upgrade Controller (SUC).

Fleet é usado para implantar e gerenciar SUC plans no cluster desejado.

Nota
Nota

SUC plans são recursos personalizados que descrevem as etapas que o SUC precisa seguir para que uma tarefa específica seja executada em um conjunto de nós. Para um exemplo de como um SUC plan se parece, consulte o repositório upstream.

Os K8s SUC plans são enviados em cada cluster implantando um recurso GitRepo ou Bundle em um workspace específico do Fleet. O Fleet recupera o GitRepo/Bundle implantado e implanta seu conteúdo (o K8s SUC plans) no(s) cluster(es) desejado(s).

Nota
Nota

Recursos GitRepo/Bundle são sempre implantados no management cluster. Se usar um recurso GitRepo ou Bundle depende do seu caso de uso, verifique Seção 32.2.2, “Determine seu caso de uso” para mais informações.

K8s SUC plans descrevem o seguinte fluxo de trabalho:

  1. Sempre cordon os nós antes de fazer upgrade do K8s.

  2. Sempre atualize os nós control-plane antes dos nós worker.

  3. Sempre atualize os nós control-plane um nó por vez e os nós worker dois nós por vez.

Uma vez que os K8s SUC plans são implantados, o fluxo de trabalho parece com isto:

  1. O SUC reconcilia os K8s SUC plans implantados e cria um Kubernetes Job em cada nó.

  2. Dependendo da distribuição do Kubernetes, o Job criará um Pod que executa a imagem de contêiner rke2-upgrade (Seção 32.2.5.1.1, “rke2-upgrade”) ou k3s-upgrade (Seção 32.2.5.1.2, “k3s-upgrade”).

  3. O Pod criado passará pelo seguinte fluxo de trabalho:

    1. Substitua o binário rke2/k3s existente no nó pelo da imagem rke2-upgrade/k3s-upgrade.

    2. Encerre o processo rke2/k3s em execução.

  4. Encerrar o processo rke2/k3s aciona uma reinicialização, iniciando um novo processo que executa o binário atualizado, resultando em uma versão de distribuição do Kubernetes atualizada.

Abaixo você pode encontrar um diagrama da descrição acima:

fleet day2 management k8s upgrade

32.2.5.3 Requisitos

  1. Faça backup da sua distribuição Kubernetes:

    1. Para clusters RKE2, consulte a documentação de Backup e Restauração do RKE2.

    2. Para clusters K3s, consulte a documentação de Backup e Restauração do K3s.

  2. Certifique-se de que as tolerâncias do Plano SUC correspondam às tolerâncias do nó - Se os nós do seu cluster Kubernetes tiverem taints personalizados, certifique-se de adicionar tolerâncias para esses taints nos Planos SUC. Por padrão, os Planos SUC possuem tolerâncias apenas para nós de plano de controle. As tolerâncias padrão incluem:

    • CriticalAddonsOnly=true:NoExecute

    • node-role.kubernetes.io/control-plane:NoSchedule

    • node-role.kubernetes.io/etcd:NoExecute

      Nota
      Nota

      Quaisquer tolerâncias adicionais devem ser adicionadas na seção .spec.tolerations de cada Plano. Os Planos SUC relacionados à atualização da versão do Kubernetes podem ser encontrados no repositório suse-edge/fleet-examples em:

      • Para RKE2 - fleets/day2/system-upgrade-controller-plans/rke2-upgrade

      • Para K3s - fleets/day2/system-upgrade-controller-plans/k3s-upgrade

      Certifique-se de usar os Planos de uma tag de lançamento de repositório válida.

      Um exemplo de definição de tolerâncias personalizadas para o Plano SUC do plano de controle do RKE2 seria assim:

      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 Atualização do K8s - implantação do plano SUC

Importante
Importante

Para ambientes previamente atualizados usando este procedimento, os usuários devem garantir que um das seguintes etapas seja concluído:

  • Remove any previously deployed SUC Plans related to older Edge release versions from the management cluster - pode ser feito removendo o cluster desejado da GitRepo/Bundle configuração de destino existente, ou removendo o recurso GitRepo/Bundle por completo.

  • Reuse the existing GitRepo/Bundle resource - pode ser feito apontando a revisão do recurso para uma nova tag que contenha os Fleet corretos para o suse-edge/fleet-examples lançamento desejado.

Isso é feito para evitar conflitos entre SUC Plans para versões de lançamento do Edge mais antigas.

Se os usuários tentarem fazer upgrade enquanto houver SUC Plans existentes no cluster management, eles verão o seguinte erro do 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 mencionado em Seção 32.2.5.2, “Visão geral”, as atualizações do Kubernetes são feitas enviando SUC plans para o cluster desejado através de uma das seguintes maneiras:

Para determinar qual recurso você deve usar, consulte Seção 32.2.2, “Determine seu caso de uso”.

Para casos de uso onde você deseja implantar o K8s SUC plans a partir de uma ferramenta GitOps de terceiros, consulte Seção 32.2.5.4.3, “Implantação do plano SUC - fluxo de trabalho GitOps de terceiros”

32.2.5.4.1 Implantação de plano SUC - recurso GitRepo

Um recurso GitRepo, que envia o K8s SUC plans necessário, pode ser implantado de uma das seguintes maneiras:

  1. Através do Rancher UI - Seção 32.2.5.4.1.1, “Criação de GitRepo - IU do Rancher” (quando Rancher estiver disponível).

  2. Por implantação manual (Seção 32.2.5.4.1.2, “Criação de GitRepo - manual”) do recurso no seu management cluster.

Uma vez implantado, para monitorar o processo de fazer upgrade do Kubernetes dos nós do seu cluster de destino, consulte Seção 18.3, “Monitoramento de Planos do Upgrade Controller do Sistema”.

32.2.5.4.1.1 Criação de GitRepo - IU do Rancher

Para criar um recurso GitRepo através da IU do Rancher, siga a documentação oficial deles.

A equipe Edge mantém fleets prontos para uso para as distribuições Kubernetes rke2 e k3s. Dependendo do seu ambiente, este fleet pode ser usado diretamente ou como um modelo.

Importante
Importante

Sempre use esses fleets a partir de uma tag de release válida do Edge.

Para casos de uso onde não é necessário incluir alterações personalizadas no SUC plans que esses fleets enviam, os usuários podem referenciar diretamente os fleets do repositório suse-edge/fleet-examples.

Em casos onde alterações personalizadas são necessárias (por exemplo, para adicionar tolerations personalizadas), os usuários devem referenciar os fleets de um repositório separado, permitindo-lhes adicionar as alterações aos planos SUC conforme necessário.

Exemplos de configuração para um recurso GitRepo usando os fleets do repositório suse-edge/fleet-examples:

32.2.5.4.1.2 Criação de GitRepo - manual
  1. Puxe o recurso GitRepo:

    • Para clusters 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 clusters 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. Edite a configuração do GitRepo:

    • Remova a seção spec.targets - necessária apenas para clusters downstream.

      • 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
    • Aponte o namespace do GitRepo para o namespace fleet-local - feito para implantar o recurso no cluster de gerenciamento.

      • 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. Aplique os recursos GitRepo ao seu management cluster:

    # RKE2
    kubectl apply -f rke2-upgrade-gitrepo.yaml
    
    # K3s
    kubectl apply -f k3s-upgrade-gitrepo.yaml
  4. Visualize o recurso GitRepo criado no namespace 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 Implantação do plano SUC - Recurso Bundle

Um recurso Bundle, que fornece os Kubernetes upgrade SUC Plans necessários, pode ser implantado de uma das seguintes maneiras:

  1. Através do Rancher UI - Seção 32.2.5.4.2.1, “Criação de Bundle - Interface do Rancher” (quando Rancher estiver disponível).

  2. Implantando manualmente (Seção 32.2.5.4.2.2, “Criação de Bundle - manual”) o recurso no seu management cluster.

Uma vez implantado, para monitorar o processo de atualização do Kubernetes dos nós do seu cluster de destino, consulte Seção 18.3, “Monitoramento de Planos do Upgrade Controller do Sistema”.

32.2.5.4.2.1 Criação de Bundle - Interface do Rancher

A equipe Edge mantém bundles prontos para uso para as distribuições Kubernetes rke2 e k3s. Dependendo do seu ambiente, esses bundles podem ser usados diretamente ou como um modelo.

Importante
Importante

Sempre use este bundle a partir de uma tag de release Edge válida.

Para criar um Bundle através da interface do Rancher:

  1. No canto superior esquerdo, clique em ☰ → Entrega contínua

  2. Vá para Avançado > Bundle

  3. Selecione Criar a partir de YAML

  4. A partir daqui, você pode criar o Bundle de uma das seguintes maneiras:

    Nota
    Nota

    Pode haver casos de uso em que você precise incluir alterações personalizadas no SUC plans que o Bundle fornece (por exemplo, para adicionar tolerâncias personalizadas). Certifique-se de incluir essas alterações no Bundle que será gerado pelas etapas abaixo.

    1. Copiando manualmente o conteúdo do Bundle para RKE2 ou K3s de suse-edge/fleet-examples para a página Criar a partir de YAML.

    2. Clonando o repositório suse-edge/fleet-examples da tag de release desejada e selecionando a opção Ler de Arquivo na página Criar a partir de YAML. A partir daí, navegue até o Bundle que você precisa (bundles/day2/system-upgrade-controller-plans/rke2-upgrade/plan-bundle.yaml para RKE2 e bundles/day2/system-upgrade-controller-plans/k3s-upgrade/plan-bundle.yaml para K3s). Isso preencherá automaticamente a página Criar a partir de YAML com o conteúdo do Bundle.

  5. Edite o Bundle na interface do Rancher:

    • Altere o namespace do Bundle para apontar para o namespace fleet-local.

      # Example
      kind: Bundle
      apiVersion: fleet.cattle.io/v1alpha1
      metadata:
        name: rke2-upgrade
        namespace: fleet-local
      ...
    • Altere os clusters de destino para o Bundle para apontar para o seu cluster local (gerenciamento):

      spec:
        targets:
        - clusterName: local
      Nota
      Nota

      Existem alguns casos de uso em que seu cluster local pode ter um nome diferente.

      Para recuperar o nome do seu cluster local, execute o comando abaixo:

      kubectl get clusters.fleet.cattle.io -n fleet-local
  6. Selecione Criar

32.2.5.4.2.2 Criação de Bundle - manual
  1. Puxe os recursos do Bundle:

    • Para clusters 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 clusters 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. Edite a configuração de Bundle:

    • Altere os clusters de destino para o Bundle para apontar para o seu cluster local (gerenciamento):

      spec:
        targets:
        - clusterName: local
      Nota
      Nota

      Existem alguns casos de uso em que seu cluster local pode ter um nome diferente.

      Para recuperar o nome do seu cluster local, execute o comando abaixo:

      kubectl get clusters.fleet.cattle.io -n fleet-local
    • Altere o namespace do Bundle para apontar para o namespace fleet-local.

      # Example
      kind: Bundle
      apiVersion: fleet.cattle.io/v1alpha1
      metadata:
        name: rke2-upgrade
        namespace: fleet-local
      ...
  3. Aplique os recursos do Bundle ao seu management cluster:

    # For RKE2
    kubectl apply -f rke2-plan-bundle.yaml
    
    # For K3s
    kubectl apply -f k3s-plan-bundle.yaml
  4. Visualize o recurso Bundle criado no namespace 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 Implantação do plano SUC - fluxo de trabalho GitOps de terceiros

Pode haver casos de uso em que os usuários gostariam de incorporar o Kubernetes upgrade SUC plans ao seu próprio fluxo de trabalho GitOps de terceiros (por exemplo, Flux).

Para obter os recursos de atualização do K8s de que você precisa, primeiro determine a tag de release do Edge do repositório suse-edge/fleet-examples que você deseja usar.

Depois disso, os recursos podem ser encontrados em:

  • Para uma atualização de cluster RKE2:

    • Para nós control-plane - fleets/day2/system-upgrade-controller-plans/rke2-upgrade/plan-control-plane.yaml

    • Para nós worker - fleets/day2/system-upgrade-controller-plans/rke2-upgrade/plan-worker.yaml

  • Para uma atualização de cluster K3s:

    • Para nós control-plane - fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-control-plane.yaml

    • Para nós worker - fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-worker.yaml

Importante
Importante

Esses recursos Plan são interpretados pelo System Upgrade Controller e devem ser implantados em cada cluster downstream que você deseja atualizar. Para informações sobre a implantação do SUC, consulte Seção 18.2, “Instalando o Upgrade Controller do Sistema”.

Para entender melhor como seu fluxo de trabalho GitOps pode ser usado para implantar os SUC Plans para fazer upgrade da versão do Kubernetes, pode ser benéfico dar uma olhada na visão geral (Seção 32.2.5.2, “Visão geral”) do procedimento de atualização usando Fleet.

32.2.6 Fazer upgrade do Helm chart

Esta seção abrange as seguintes partes:

  1. Seção 32.2.6.1, “Preparação para ambientes air-gapped” - contém informações sobre como enviar charts e imagens OCI relacionados ao Edge para o seu registro privado.

  2. Seção 32.2.6.2, “Procedimento de upgrade” - contém informações sobre diferentes casos de uso de upgrade do Helm chart e seu procedimento de upgrade.

32.2.6.1 Preparação para ambientes air-gapped

32.2.6.1.1 Certifique-se de ter acesso ao Fleet do seu Helm chart

Dependendo do que seu ambiente suporta, você pode escolher uma das seguintes opções:

  1. Hospede os recursos do Fleet do seu chart em um servidor Git local que seja acessível pelo seu management cluster.

  2. Use a CLI do Fleet para converter um Helm chart em um Bundle que você pode usar diretamente e que não precisará ser hospedado em algum lugar. A CLI do Fleet pode ser obtida na página de release, para usuários de Mac existe uma fleet-cli Homebrew Formulae.

32.2.6.1.2 Encontre os ativos necessários para a sua versão de release do Edge
  1. Vá para a página de release do "Day 2", encontre a release do Edge para a qual você deseja atualizar seu chart e clique em Assets.

  2. Na seção "Assets", baixe os seguintes arquivos:

    Release File

    Descrição

    edge-save-images.sh

    Extrai as imagens especificadas no arquivo edge-release-images.txt e as empacota dentro de um arquivo '.tar.gz'.

    edge-save-oci-artefacts.sh

    Extrai as imagens de chart OCI relacionadas à release específica do Edge e as empacota dentro de um arquivo '.tar.gz'.

    edge-load-images.sh

    Carrega imagens de um arquivo '.tar.gz', renomeia as tags e as envia para um registro privado.

    edge-load-oci-artefacts.sh

    Recebe um diretório contendo pacotes de chart OCI '.tgz' do Edge e os carrega em um registro privado.

    edge-release-helm-oci-artefacts.txt

    Contém uma lista de imagens de chart OCI relacionadas a uma release específica do Edge.

    edge-release-images.txt

    Contém uma lista de imagens relacionadas a uma release específica do Edge.

32.2.6.1.3 Crie o arquivo de imagens de release do Edge

Em uma máquina com acesso à internet:

  1. Torne o edge-save-images.sh executável:

    chmod +x edge-save-images.sh
  2. Gere o arquivo de imagem:

    ./edge-save-images.sh --source-registry registry.suse.com
  3. Isso criará um arquivo pronto para carregamento chamado edge-images.tar.gz.

    Nota
    Nota

    Se a opção -i|--images for especificada, o nome do arquivo pode ser diferente.

  4. Copie este arquivo para sua máquina air-gapped:

    scp edge-images.tar.gz <user>@<machine_ip>:/path
32.2.6.1.4 Crie o arquivo de imagens de chart OCI do Edge

Em uma máquina com acesso à internet:

  1. Torne o edge-save-oci-artefacts.sh executável:

    chmod +x edge-save-oci-artefacts.sh
  2. Gere o arquivo de imagem de chart OCI:

    ./edge-save-oci-artefacts.sh --source-registry registry.suse.com
  3. Isso criará um arquivo chamado oci-artefacts.tar.gz.

    Nota
    Nota

    Se a opção -a|--archive for especificada, o nome do arquivo pode ser diferente.

  4. Copie este arquivo para sua máquina air-gapped:

    scp oci-artefacts.tar.gz <user>@<machine_ip>:/path
32.2.6.1.5 Carregue as imagens de release do Edge em sua máquina air-gapped

Em sua máquina air-gapped:

  1. Faça login no seu registro privado (se necessário):

    podman login <REGISTRY.YOURDOMAIN.COM:PORT>
  2. Torne o edge-load-images.sh executável:

    chmod +x edge-load-images.sh
  3. Execute o script, passando o arquivo copiado edge-images.tar.gz anteriormente:

    ./edge-load-images.sh --source-registry registry.suse.com --registry <REGISTRY.YOURDOMAIN.COM:PORT> --images edge-images.tar.gz
    Nota
    Nota

    Isso carregará todas as imagens do edge-images.tar.gz, renomeará as tags e as enviará para o registro especificado na opção --registry.

32.2.6.1.6 Carregue as imagens de chart OCI do Edge para sua máquina air-gapped.

Em sua máquina air-gapped:

  1. Faça login no seu registro privado (se necessário):

    podman login <REGISTRY.YOURDOMAIN.COM:PORT>
  2. Torne o edge-load-oci-artefacts.sh executável:

    chmod +x edge-load-oci-artefacts.sh
  3. Descompacte o arquivo copiado oci-artefacts.tar.gz:

    tar -xvf oci-artefacts.tar.gz
  4. Isso produzirá um diretório com o modelo de nomenclatura edge-release-oci-tgz-<date>

  5. Passe este diretório para o script edge-load-oci-artefacts.sh para carregar as imagens do chart Edge OCI para seu registro privado:

    Nota
    Nota

    Este script pressupõe que a CLI helm tenha sido pré-instalada em seu ambiente. Para instruções de instalação do Helm, consulte Instalando o 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 Configure seu registro privado em sua distribuição Kubernetes

Para RKE2, consulte Configuração de Registro Privado

Para K3s, consulte Configuração de Registro Privado

32.2.6.2 Procedimento de upgrade

Esta seção foca nos seguintes casos de uso do procedimento de upgrade do Helm:

Importante
Importante

Charts do Helm implantados manualmente não podem ser atualizados de forma confiável. Sugerimos reimplantar o chart do Helm usando o método Seção 32.2.6.2.1, “Tenho um novo cluster e gostaria de implantar e gerenciar um chart Helm do Edge.”.

32.2.6.2.1 Tenho um novo cluster e gostaria de implantar e gerenciar um chart Helm do Edge.

Esta seção aborda como:

32.2.6.2.1.1 Prepare os recursos do Fleet para o seu chart.
  1. Adquira os recursos do Fleet do chart a partir da tag de release do Edge que você deseja usar.

  2. Navegue até o Fleet do chart do Helm (fleets/day2/chart-templates/<chart>).

  3. Se você pretende usar um fluxo de trabalho GitOps, copie o diretório do Fleet do chart para o repositório Git de onde você fará o GitOps.

  4. Opcionalmente, se o chart do Helm exigir configurações em seus values, edite a configuração .helm.values dentro do arquivo fleet.yaml do diretório copiado.

  5. Opcionalmente, podem existir casos de uso em que você precise adicionar recursos adicionais ao Fleet do seu chart para que ele possa se ajustar melhor ao seu ambiente. Para obter informações sobre como aprimorar seu diretório Fleet, consulte Conteúdo do Repositório Git.

Nota
Nota

Em alguns casos, o tempo limite padrão que o Fleet usa para operações do Helm pode ser insuficiente, resultando no seguinte erro:

failed pre-install: context deadline exceeded

Nesses casos, adicione a propriedade timeoutSeconds sob a configuração helm do seu arquivo fleet.yaml.

Um exemplo para o Helm chart longhorn seria assim:

  • Estrutura do repositório Git do usuário:

    <user_repository_root>
    ├── longhorn
    │   └── fleet.yaml
    └── longhorn-crd
        └── fleet.yaml
  • Conteúdo fleet.yaml preenchido com dados Longhorn do usuário:

    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

    Estes são apenas valores de exemplo que são usados para ilustrar configurações personalizadas no chart longhorn. Eles NÃO devem ser tratados como diretrizes de implantação para o chart longhorn.

32.2.6.2.1.2 Implante o Fleet para o seu chart

Você pode implantar o Fleet para o seu chart usando um GitRepo (Seção 32.2.6.2.1.2.1, “GitRepo”) ou um Bundle (Seção 32.2.6.2.1.2.2, “Pacote”).

Nota
Nota

Ao implantar o Fleet, se você receber uma mensagem Modified, certifique-se de adicionar uma entrada comparePatches correspondente à seção diff do Fleet. Para mais informações, consulte Gerando Diffs para Ignorar GitRepos Modificados.

32.2.6.2.1.2.1 GitRepo

O recurso GitRepo do Fleet contém informações sobre como acessar os recursos do Fleet do seu chart e a quais clusters ele precisa aplicar esses recursos.

O recurso GitRepo pode ser implantado através da Rancher UI, ou manualmente, implantando o recurso no management cluster.

Exemplo de recurso Longhorn GitRepo para implantação 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 Pacote

Os recursos Bundle contêm os recursos brutos do Kubernetes que precisam ser implantados pelo Fleet. Normalmente, recomenda-se usar a abordagem GitRepo, mas para casos de uso em que o ambiente é air-gapped e não pode suportar um servidor Git local, o Bundles pode ajudá-lo a propagar o Fleet do seu chart Helm para seus clusters de destino.

Um Bundle pode ser implantado através da Rancher UI (Continuous Delivery → Advanced → Bundles → Create from YAML) ou implantando manualmente o recurso Bundle no namespace correto do Fleet. Para obter informações sobre os namespaces do Fleet, consulte a documentação upstream.

Bundles para charts Helm do Edge podem ser criados utilizando a abordagem Converter um chart Helm em um Bundle do Fleet.

Abaixo você pode encontrar um exemplo de como criar um recurso Bundle a partir dos modelos de Fleet de charts Helm longhorn e longhorn-crd e implantar manualmente este bundle no seu management cluster.

Nota
Nota

Para ilustrar o fluxo de trabalho, o exemplo abaixo usa a estrutura de diretório suse-edge/fleet-examples.

  1. Navegue até o modelo de Fleet do chart longhorn:

    cd fleets/day2/chart-templates/longhorn/longhorn
  2. Crie um arquivo targets.yaml que instruirá o Fleet para quais clusters ele deve implantar o chart Helm:

    cat > targets.yaml <<EOF
    targets:
    # Match your local (management) cluster
    - clusterName: local
    EOF
    Nota
    Nota

    Existem alguns casos de uso onde seu local cluster pode ter um nome diferente.

    Para recuperar o nome do seu local cluster, execute o comando abaixo:

    kubectl get clusters.fleet.cattle.io -n fleet-local
  3. Converta o Fleet do chart Helm Longhorn em um recurso Bundle usando o fleet-cli.

    Nota
    Nota

    A CLI do Fleet pode ser obtida na página de release Assets (fleet-linux-amd64).

    Para usuários de Mac, existe uma fórmula Homebrew chamada fleet-cli.

    fleet apply --compress --targets-file=targets.yaml -n fleet-local -o - longhorn-bundle > longhorn-bundle.yaml
  4. Navegue até o template do chart Fleet longhorn-crd:

    cd fleets/day2/chart-templates/longhorn/longhorn-crd
  5. Crie um arquivo targets.yaml que instruirá o Fleet sobre a quais clusters ele deve implantar o gráfico Helm:

    cat > targets.yaml <<EOF
    targets:
    # Match your local (management) cluster
    - clusterName: local
    EOF
  6. Converta o gráfico Helm Longhorn CRD do Fleet em um recurso Bundle usando o fleet-cli.

    fleet apply --compress --targets-file=targets.yaml -n fleet-local -o - longhorn-crd-bundle > longhorn-crd-bundle.yaml
  7. Implante os arquivos longhorn-bundle.yaml e longhorn-crd-bundle.yaml no seu management cluster:

    kubectl apply -f longhorn-crd-bundle.yaml
    kubectl apply -f longhorn-bundle.yaml

Seguir estes passos garantirá que o SUSE Storage seja implantado em todos os clusters management especificados.

32.2.6.2.1.3 Gerenciar o gráfico Helm implantado

Uma vez implantado com o Fleet, para fazer upgrade de gráficos Helm, consulte Seção 32.2.6.2.2, “Eu gostaria de fazer upgrade de um gráfico Helm gerenciado pelo Fleet”.

32.2.6.2.2 Eu gostaria de fazer upgrade de um gráfico Helm gerenciado pelo Fleet
  1. Determine a versão para a qual você precisa fazer upgrade do seu gráfico para que ele seja compatível com a versão do Edge desejada. A versão do gráfico Helm por versão do Edge pode ser visualizada nas notas de lançamento (Capítulo 41, Notas de versão).

  2. No seu repositório Git monitorado pelo Fleet, edite o arquivo fleet.yaml do gráfico Helm com a versão e o repositório corretos das notas de lançamento (Capítulo 41, Notas de versão).

  3. Após confirmar e enviar as alterações para o seu repositório, isso acionará o fazer upgrade do Helm chart desejado.

32.2.6.2.3 Eu gostaria de fazer upgrade de um Helm chart implantado via EIB.

Capítulo 8, Edge Image Builder implanta Helm charts criando um recurso HelmChart e utilizando o helm-controller introduzido pelo recurso de integração Helm RKE2/K3s.

Para garantir que um Helm chart implantado via EIB seja feito upgrade com sucesso, os usuários precisam fazer upgrade dos respectivos recursos HelmChart.

Abaixo você pode encontrar informações sobre:

32.2.6.2.3.1 Visão geral

Os Helm charts implantados via EIB são feitos upgrade por meio de um fleet chamado eib-charts-upgrader.

Este fleet processa dados fornecidos pelo usuário para atualizar um conjunto específico de recursos HelmChart.

A atualização desses recursos aciona o helm-controller, que faz upgrade dos Helm charts associados aos recursos HelmChart modificados.

Espera-se que o usuário apenas:

  1. Baixe localmente os arquivos para cada Helm chart que precisa ser feito upgrade.

  2. Passe esses arquivos para o generate-chart-upgrade-data.sh generate-chart-upgrade-data.sh script, que incluirá os dados desses arquivos na frota eib-charts-upgrader.

  3. Implante a frota eib-charts-upgrader em seu management cluster. Isso é feito por meio de um recurso GitRepo ou Bundle.

Uma vez implantado, o eib-charts-upgrader, com a ajuda do Fleet, enviará seus recursos para o cluster management desejado.

Esses recursos incluem:

  1. Um conjunto de Secrets contendo os dados do Helm chart fornecidos pelo usuário.

  2. Um Kubernetes Job que implantará um Pod que montará o Secrets mencionado anteriormente e, com base neles, patch os recursos HelmChart correspondentes.

Como mencionado anteriormente, isso acionará o helm-controller que realizará a atualização real do chart Helm.

Abaixo você pode encontrar um diagrama da descrição acima:

fleet day2 management helm eib upgrade
32.2.6.2.3.2 Etapas de upgrade
  1. Clone o repositório suse-edge/fleet-examples da tag de lançamento correta tag.

  2. Crie um diretório no qual você armazenará o(s) arquivo(s) do chart Helm baixado(s).

    mkdir archives
  3. Dentro do diretório recém-criado para os arquivos, pull os arquivos dos charts Helm que você deseja fazer upgrade:

    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. De Assets da release tag desejada, baixe o script generate-chart-upgrade-data.sh.

  5. Execute o 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 arquivo de chart no diretório --archive-dir, o script gera um arquivo Kubernetes Secret YAML contendo os dados de upgrade do chart e o armazena no diretório base/secrets da frota especificada por --fleet-path.

    O script generate-chart-upgrade-data.sh também aplica modificações adicionais à frota para garantir que os arquivos Kubernetes Secret YAML gerados sejam utilizados corretamente pela carga de trabalho implantada pela frota.

    Importante
    Importante

    Os usuários não devem fazer alterações além do que o script generate-chart-upgrade-data.sh gera.

As etapas abaixo dependem do ambiente em que você está executando:

  1. Para um ambiente que suporta GitOps (por exemplo, não é air-gapped, ou é air-gapped, mas permite o suporte a um servidor Git local):

    1. Copie a fleets/day2/eib-charts-upgrader Fleet para o repositório que você usará para GitOps.

      Nota
      Nota

      Certifique-se de que a Fleet inclua as alterações que foram feitas pelo script generate-chart-upgrade-data.sh.

    2. Configure um recurso GitRepo que será usado para enviar todos os recursos da eib-charts-upgrader Fleet.

      1. Para configuração e implantação do GitRepo por meio da interface do Rancher, consulte Accessing Fleet in the Rancher UI.

      2. Para configuração e implantação manual do GitRepo, consulte Creating a Deployment.

  2. Para um ambiente que não suporta GitOps (por exemplo, é isolado da rede e não permite o uso de servidor Git local):

    1. Baixe o binário fleet-cli da página de rancher/fleet release (fleet-linux-amd64 para Linux). Para usuários de Mac, existe uma Homebrew Formulae que pode ser usada - fleet-cli.

    2. Navegue até a eib-charts-upgrader Fleet:

      cd /foo/bar/fleet-examples/fleets/day2/eib-charts-upgrader
    3. Crie um arquivo targets.yaml que instruirá o Fleet sobre onde implantar seus recursos:

      cat > targets.yaml <<EOF
      targets:
      # To map the local(management) cluster
      - clusterName: local
      EOF
      Nota
      Nota

      Existem alguns casos de uso em que seu cluster local pode ter um nome diferente.

      Para recuperar o nome do seu cluster local, execute o comando abaixo:

      kubectl get clusters.fleet.cattle.io -n fleet-local
    4. Use o fleet-cli para converter o Fleet em um recurso Bundle:

      fleet apply --compress --targets-file=targets.yaml -n fleet-local -o - eib-charts-upgrade > bundle.yaml

      Isso criará um Bundle (bundle.yaml) que conterá todos os recursos modelados do Fleet eib-charts-upgrader.

      Para mais informações sobre o comando fleet apply, consulte fleet apply.

      Para mais informações sobre a conversão de Fleets em Bundles, consulte Convert a Helm Chart into a Bundle.

    5. Implante o Bundle. Isso pode ser feito de duas maneiras:

      1. Através da interface do Rancher - Navegue até Continuous Delivery → Advanced → Bundles → Create from YAML e cole o conteúdo do bundle.yaml ou clique na opção Read from File e envie o próprio arquivo.

      2. Manualmente - Implante o arquivo bundle.yaml manualmente dentro do seu management cluster.

A execução dessas etapas resultará em um recurso GitRepo/Bundle implantado com sucesso. O recurso será captado pelo Fleet e seu conteúdo será implantado nos clusters de destino que o usuário especificou nas etapas anteriores. Para uma visão geral do processo, consulte Seção 32.2.6.2.3.1, “Visão geral”.

Para obter informações sobre como acompanhar o processo de fazer upgrade, você pode consultar Seção 32.2.6.2.3.3, “Exemplo”.

Importante
Importante

Assim que o upgrade do chart for verificado com sucesso, remova o recurso Bundle/GitRepo.

Isso removerá os recursos de upgrade que não são mais necessários do seu cluster management, garantindo que nenhum conflito de versão futuro ocorra.

32.2.6.2.3.3 Exemplo
Nota
Nota

O exemplo abaixo demonstra como fazer upgrade de um Helm chart implantado via EIB de uma versão para outra em um cluster management. Observe que as versões usadas neste exemplo não são recomendações. Para recomendações de versão específicas para uma versão Edge, consulte as notas de versão (Capítulo 41, Notas de versão).

Caso de uso:

  • Um cluster management está executando uma versão mais antiga do Longhorn.

  • O cluster foi implantado por meio do EIB, usando a seguinte definição de imagem 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/
    ...
  • O SUSE Storage precisa ser feito upgrade para uma versão compatível com a release 3.6 do Edge. Ou seja, ele precisa ser feito upgrade para 1.11.2.

  • Assume-se que o management cluster está air-gapped, sem suporte para um servidor Git local e possui uma configuração do Rancher funcional.

Siga as etapas para fazer upgrade (Seção 32.2.6.2.3.2, “Etapas de upgrade”):

  1. Clone o repositório suse-edge/fleet-example a partir da tag release-3.6.1.

    git clone -b release-3.6.1 https://github.com/suse-edge/fleet-examples.git
  2. Crie um diretório onde o arquivo de fazer upgrade do Longhorn será armazenado.

    mkdir archives
  3. Faça o pull da versão desejada do arquivo do chart Longhorn:

    # 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. Fora do diretório archives, baixe o script generate-chart-upgrade-data.sh do release suse-edge/fleet-examples tag.

  5. A configuração do diretório deve ser semelhante 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. Execute o 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

    A estrutura do diretório após a execução do script deve ser semelhante 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

    Os arquivos alterados no git devem ser semelhantes a isto:

    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. Crie um Bundle para o Fleet eib-charts-upgrader:

    1. Primeiro, navegue até o próprio Fleet:

      cd ./fleet-examples/fleets/day2/eib-charts-upgrader
    2. Em seguida, crie um arquivo targets.yaml:

      cat > targets.yaml <<EOF
      targets:
      - clusterName: local
      EOF
    3. Em seguida, use o binário fleet-cli para converter o Fleet em um Bundle:

      fleet apply --compress --targets-file=targets.yaml -n fleet-local -o - eib-charts-upgrade > bundle.yaml
  8. Implante o Bundle através da interface do Rancher:

    day2 helm chart upgrade example 1
    Figura 32.1: Implantar Bundle através da interface do Rancher

    A partir daqui, selecione Ler de Arquivo e encontre o arquivo bundle.yaml no seu sistema.

    Isso preencherá automaticamente o Bundle dentro da interface do Rancher.

    Selecione Criar.

  9. Após uma implantação bem-sucedida, seu Bundle deverá ser semelhante a:

    day2 helm chart upgrade example 2
    Figura 32.2: Bundle implantado com sucesso

Após a implantação bem-sucedida do Bundle, para monitorar o processo de fazer upgrade:

  1. Verifique os logs do Upgrade Pod:

    day2 helm chart upgrade example 3 management
  2. Agora, verifique os logs do Pod criado para fazer upgrade pelo helm-controller:

    1. O nome do Pod seguirá o seguinte modelo - helm-install-longhorn-<random-suffix>

    2. O Pod estará no namespace onde o recurso HelmChart foi implantado. No nosso caso, este é kube-system.

      day2 helm chart upgrade example 4 management
      Figura 32.3: Logs para o gráfico Longhorn que foi submetido a fazer upgrade com sucesso
  3. Verifique se a versão do HelmChart foi atualizada navegando até a seção HelmCharts do Rancher (More Resources → HelmCharts). Selecione o namespace onde o chart foi implantado; para este exemplo, seria kube-system.

  4. Por fim, verifique se os Pods do Longhorn estão em execução.

Após realizar as validações acima, é seguro presumir que o Helm chart do Longhorn foi submetido a fazer upgrade para a versão 1.11.2.

32.2.6.2.3.4 Fazer upgrade do Helm chart usando uma ferramenta GitOps de terceiros

Pode haver casos de uso em que os usuários desejem usar este procedimento de fazer upgrade com um fluxo de trabalho GitOps diferente do Fleet (por exemplo, Flux).

Para produzir os recursos necessários para o procedimento de fazer upgrade, você pode usar o script generate-chart-upgrade-data.sh para preencher o Fleet eib-charts-upgrader com os dados fornecidos pelo usuário. Para obter mais informações sobre como fazer isso, consulte Seção 32.2.6.2.3.2, “Etapas de upgrade”.

Depois de ter a configuração completa, você pode usar kustomize para gerar uma solução funcional completa que você pode implantar em seu cluster:

cd /foo/bar/fleets/day2/eib-charts-upgrader

kustomize build .

Se você quiser incluir a solução em seu fluxo de trabalho GitOps, você pode remover o arquivo fleet.yaml e usar o que restou como uma configuração Kustomize válida. Apenas não se esqueça de executar primeiro o script generate-chart-upgrade-data.sh, para que ele possa preencher a configuração Kustomize com os dados dos Helm charts que você deseja fazer upgrade.

Para entender como este fluxo de trabalho deve ser usado, pode ser útil consultar Seção 32.2.6.2.3.1, “Visão geral” e Seção 32.2.6.2.3.2, “Etapas de upgrade”.

33 Downstream clusters

Esta seção aborda as possíveis maneiras de realizar operações de "Dia 2" para diferentes partes do seu downstream cluster.

33.1 Fleet

Esta seção oferece informações sobre como realizar operações de "Dia 2" usando o componente Fleet (Capítulo 6, Fleet).

Os tópicos a seguir são abordados como parte desta seção:

  1. Seção 33.1.1, “Componentes” - componentes padrão usados para todas as operações de "Dia 2".

  2. Seção 33.1.2, “Determine seu caso de uso” - fornece uma visão geral dos recursos personalizados do Fleet que serão usados e sua adequação para diferentes casos de uso de operações de "Dia 2".

  3. Seção 33.1.3, “Fluxo de trabalho de Dia 2” - fornece um guia de fluxo de trabalho para a execução de operações de "Dia 2" com o Fleet.

  4. Seção 33.1.4, “Fazer upgrade do SO” - descreve como fazer upgrade do SO usando o Fleet.

  5. Seção 33.1.5, “Atualização da versão do Kubernetes” - descreve como fazer upgrade da versão do Kubernetes usando o Fleet.

  6. Seção 33.1.6, “Fazer upgrade do Helm chart” - descreve como fazer upgrade do Helm chart usando o Fleet.

33.1.1 Componentes

Abaixo, você pode encontrar uma descrição dos componentes padrão que devem ser configurados em seu cluster downstream para que você possa realizar com sucesso as operações de "Dia 2" usando o Fleet.

33.1.1.1 System Upgrade Controller (SUC)

Nota
Nota

Deve ser implantado em cada cluster downstream.

O System Upgrade Controller é responsável por executar tarefas em nós especificados com base em dados de configuração fornecidos por meio de um recurso personalizado, chamado de Plan.

O SUC é utilizado ativamente para fazer upgrade do sistema operacional e da distribuição do Kubernetes.

Para obter mais informações sobre o componente SUC e como ele se encaixa na pilha Edge, consulte Capítulo 18, Upgrade Controller do Sistema.

Para obter informações sobre como implantar o SUC, primeiro determine seu caso de uso (Seção 33.1.2, “Determine seu caso de uso”) e, em seguida, consulte Instalação do System Upgrade Controller - GitRepo (Seção 18.2.1.1, “Instalação do Upgrade Controller - GitRepo”) ou Instalação do System Upgrade Controller - Bundle (Seção 18.2.1.2, “Instalação do Upgrade Controller - Bundle”).

33.1.2 Determine seu caso de uso

O Fleet usa dois tipos de recursos personalizados para permitir o gerenciamento de recursos do Kubernetes e do Helm.

Abaixo, você pode encontrar informações sobre o propósito desses recursos e os casos de uso para os quais eles são mais adequados no contexto de operações de "Dia 2".

33.1.2.1 GitRepo

Um GitRepo é um recurso Fleet (Capítulo 6, Fleet) que representa um repositório Git a partir do qual o Fleet pode criar Bundles. Cada Bundle é criado com base em caminhos de configuração definidos dentro do recurso GitRepo. Para obter mais informações, consulte a documentação do GitRepo.

No contexto de operações de "Dia 2", os recursos GitRepo são normalmente usados para implantar SUC ou SUC Plans em ambientes não air-gapped que utilizam uma abordagem de Fleet GitOps.

Alternativamente, os recursos GitRepo também podem ser usados para implantar SUC ou SUC Plans em ambientes air-gapped, desde que você espelhe a configuração do seu repositório por meio de um servidor git local.

33.1.2.2 Pacote

Bundles contêm recursos raw do Kubernetes que serão implantados no cluster de destino. Geralmente, eles são criados a partir de um recurso GitRepo, mas existem casos de uso em que podem ser implantados manualmente. Para obter mais informações, consulte a documentação do Bundle.

No contexto de operações de "Dia 2", os recursos Bundle são normalmente usados para implantar SUC ou SUC Plans em ambientes air-gapped que não utilizam alguma forma de procedimento de GitOps local (por exemplo, um servidor git local).

Alternativamente, se o seu caso de uso não permitir um fluxo de trabalho GitOps (por exemplo, usando um repositório Git), os recursos Bundle também podem ser usados para implantar SUC ou SUC Plans em ambientes não air-gapped.

33.1.3 Fluxo de trabalho de Dia 2

O que se segue é um fluxo de trabalho de "Dia 2" que deve ser seguido ao fazer upgrade de um cluster downstream para uma versão específica do Edge.

33.1.4 Fazer upgrade do SO

Esta seção descreve como fazer upgrade do sistema operacional usando Capítulo 6, Fleet e o Capítulo 18, Upgrade Controller do Sistema.

Os tópicos a seguir são abordados como parte desta seção:

  1. Seção 33.1.4.1, “Componentes” - componentes adicionais usados pelo processo de upgrade.

  2. Seção 33.1.4.2, “Visão geral” - visão geral do processo de upgrade.

  3. Seção 33.1.4.3, “Requisitos” - requisitos do processo de upgrade.

  4. Seção 33.1.4.4, “Upgrade do SO - implantação do plano SUC” - informações sobre como implantar o SUC plans, responsável por acionar o processo de upgrade.

33.1.4.1 Componentes

Esta seção aborda os componentes personalizados que o processo de OS upgrade usa em relação aos componentes (Seção 33.1.1, “Componentes”) padrão de "Day 2".

33.1.4.1.1 systemd.service

O upgrade do SO em um nó específico é gerenciado por um systemd.service.

Um serviço diferente é criado dependendo do tipo de upgrade que o SO requer de uma versão do Edge para outra:

  • Para versões do Edge que requerem a mesma versão do SO (por exemplo, 6.1), o os-pkg-update.service será criado. Ele usa transactional-update para realizar um upgrade normal de pacotes.

  • Para versões do Edge que requerem uma migração de versão do SO (por exemplo, 6.1 → 6.2), o os-migration.service será criado. Ele usa transactional-update para realizar:

    1. Um upgrade normal de pacotes que garante que todos os pacotes estejam atualizados para mitigar quaisquer falhas na migração relacionadas a versões antigas de pacotes.

    2. Uma migração de SO utilizando o comando zypper migration.

Os serviços mencionados acima são fornecidos em cada nó por meio de um SUC plan que deve estar localizado no cluster downstream que precisa de upgrade do SO.

33.1.4.2 Visão geral

O upgrade do sistema operacional para nós de cluster downstream é feito utilizando Fleet e o System Upgrade Controller (SUC).

Fleet é usado para implantar e gerenciar SUC plans no cluster desejado.

Nota
Nota

SUC plans são recursos personalizados que descrevem as etapas que o SUC precisa seguir para que uma tarefa específica seja executada em um conjunto de nós. Para um exemplo de como um SUC plan se parece, consulte o repositório upstream.

Os OS SUC plans são enviados para cada cluster implantando um recurso GitRepo ou Bundle em um workspace específico do Fleet. O Fleet recupera os GitRepo/Bundle implantados e implanta seu conteúdo (o OS SUC plans) no(s) cluster(es) desejado(s).

Nota
Nota

Os recursos GitRepo/Bundle são sempre implantados no management cluster. Se usar um recurso GitRepo ou Bundle depende do seu caso de uso, verifique Seção 33.1.2, “Determine seu caso de uso” para mais informações.

OS SUC plans descrevem o seguinte fluxo de trabalho:

  1. Sempre cordon os nós antes de upgrades do SO.

  2. Sempre faça upgrade dos nós control-plane antes dos nós worker.

  3. Sempre faça upgrade do cluster, um nó por vez.

Uma vez que os OS SUC plans são implantados, o fluxo de trabalho é o seguinte:

  1. O SUC reconcilia os OS SUC plans implantados e cria um Kubernetes Job em cada nó.

  2. O Kubernetes Job cria um systemd.service (Seção 33.1.4.1.1, “systemd.service”) para upgrade de pacote ou migração de SO.

  3. O systemd.service criado aciona o processo de upgrade do SO no nó específico.

    Importante
    Importante

    Assim que o processo de upgrade do SO terminar, o nó correspondente será rebooted para aplicar as atualizações no sistema.

Abaixo você pode encontrar um diagrama da descrição acima:

fleet day2 downstream os upgrade

33.1.4.3 Requisitos

Geral:

  1. Máquina registrada no SCC - Todos os downstream nós do cluster devem estar registrados no https://scc.suse.com/, o que é necessário para que o respectivo systemd.service possa se conectar com sucesso ao repositório RPM desejado.

    Importante
    Importante

    Para versões Edge que exigem uma migração de versão de SO (por exemplo, 6.1 → 6.2), certifique-se de que sua chave SCC suporte a migração para a nova versão.

  2. Certifique-se de que as tolerâncias do Plano SUC correspondam às tolerâncias do nó - Se os nós do seu cluster Kubernetes tiverem taints personalizados, certifique-se de adicionar tolerâncias para esses taints nos Planos SUC. Por padrão, SUC Plans possuem tolerâncias apenas para nós control-plane. As tolerâncias padrão incluem:

    • CriticalAddonsOnly=true:NoExecute

    • node-role.kubernetes.io/control-plane:NoSchedule

    • node-role.kubernetes.io/etcd:NoExecute

      Nota
      Nota

      Quaisquer tolerâncias adicionais devem ser adicionadas na seção .spec.tolerations de cada Plano. SUC Plans relacionados ao upgrade do SO podem ser encontrados no repositório suse-edge/fleet-examples em fleets/day2/system-upgrade-controller-plans/os-upgrade. Certifique-se de usar os Planos de uma tag de release de repositório válida.

      Um exemplo de definição de tolerâncias personalizadas para o plano SUC control-plane seria assim:

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

Air-gapped:

  1. Espelhar repositórios RPM da SUSE - Os repositórios RPM do SO devem ser espelhados localmente para que o systemd.service possa ter acesso a eles. Isso pode ser alcançado usando RMT ou SUMA.

33.1.4.4 Upgrade do SO - implantação do plano SUC

Importante
Importante

Para ambientes atualizados anteriormente usando este procedimento, os usuários devem garantir que uma das seguintes etapas seja concluída:

  • Remove any previously deployed SUC Plans related to older Edge release versions from the downstream cluster - pode ser feito removendo o cluster desejado da GitRepo/Bundle target configuration existente, ou removendo o recurso GitRepo/Bundle por completo.

  • Reuse the existing GitRepo/Bundle resource - pode ser feito apontando a revisão do recurso para uma nova tag que contenha as frotas corretas para o suse-edge/fleet-examples release desejado.

Isso é feito para evitar conflitos entre SUC Plans para versões de release do Edge mais antigas.

Se os usuários tentarem fazer upgrade enquanto houver SUC Plans existentes no cluster downstream, eles verão o seguinte erro do 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 mencionado em Seção 33.1.4.2, “Visão geral”, os upgrades do SO são feitos enviando SUC plans para o cluster desejado por meio de uma das seguintes maneiras:

Para determinar qual recurso você deve usar, consulte Seção 33.1.2, “Determine seu caso de uso”.

Para casos de uso em que você deseja implantar o OS SUC plans a partir de uma ferramenta GitOps de terceiros, consulte Seção 33.1.4.4.3, “Implantação do plano SUC - fluxo de trabalho GitOps de terceiros”

33.1.4.4.1 Implantação do plano SUC - recurso GitRepo

Um recurso GitRepo, que implanta o OS SUC plans necessário, pode ser implantado de uma das seguintes maneiras:

  1. Através do Rancher UI - Seção 33.1.4.4.1.1, “Criação de GitRepo - UI do Rancher” (quando Rancher estiver disponível).

  2. Ao implantar manualmente (Seção 33.1.4.4.1.2, “Criação de GitRepo - manual”) o recurso no seu management cluster.

Uma vez implantado, para monitorar o processo de upgrade do SO dos nós do seu cluster alvo, consulte Seção 18.3, “Monitoramento de Planos do Upgrade Controller do Sistema”.

33.1.4.4.1.1 Criação de GitRepo - UI do Rancher

Para criar um recurso GitRepo através da UI do Rancher, siga a documentação oficial deles.

A equipe Edge mantém um fleet pronto para uso. Dependendo do seu ambiente, este fleet pode ser usado diretamente ou como um modelo.

Importante
Importante

Sempre use este fleet a partir de uma tag de release válida do Edge.

Para casos de uso onde nenhuma alteração personalizada precisa ser incluída no SUC plans que o fleet entrega, os usuários podem referenciar diretamente o fleet os-upgrade do repositório suse-edge/fleet-examples.

Em casos onde alterações personalizadas são necessárias (por exemplo, para adicionar tolerâncias personalizadas), os usuários devem referenciar o fleet os-upgrade de um repositório separado, permitindo que adicionem as alterações aos planos SUC conforme necessário.

Um exemplo de como um GitRepo pode ser configurado para usar o fleet do repositório suse-edge/fleet-examples, pode ser visto aqui.

33.1.4.4.1.2 Criação de GitRepo - manual
  1. Puxe o 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. Edite a configuração do GitRepo, em spec.targets especifique sua lista de destino desejada. Por padrão, os recursos GitRepo do suse-edge/fleet-examples NÃO são mapeados para nenhum cluster downstream.

    • Para corresponder a todos os clusters, altere o GitRepo destino padrão para:

      spec:
        targets:
        - clusterSelector: {}
    • Alternativamente, se você quiser uma seleção de cluster mais granular, veja Mapeamento para Clusters Downstream

  3. Aplique o recurso GitRepo ao seu management cluster:

    kubectl apply -f os-upgrade-gitrepo.yaml
  4. Visualize o recurso GitRepo criado no namespace 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 Implantação do plano SUC - Recurso de Bundle

Um recurso Bundle, que inclui os OS SUC Plans necessários, pode ser implantado de uma das seguintes maneiras:

  1. Através do Rancher UI - Seção 33.1.4.4.2.1, “Criação de Bundle - Interface do Rancher” (quando Rancher estiver disponível).

  2. Ao implantar manualmente (Seção 33.1.4.4.2.2, “Criação de Bundle - manual”) o recurso no seu management cluster.

Uma vez implantado, para monitorar o processo de fazer upgrade do SO dos nós do seu cluster alvo, consulte Seção 18.3, “Monitoramento de Planos do Upgrade Controller do Sistema”.

33.1.4.4.2.1 Criação de Bundle - Interface do Rancher

A equipe Edge mantém um bundle pronto para uso que pode ser usado nas etapas abaixo.

Importante
Importante

Sempre use este bundle a partir de uma tag de release Edge válida.

Para criar um bundle através da interface do Rancher:

  1. No canto superior esquerdo, clique em ☰ → Continuous Delivery

  2. Vá para Avançado > Bundles

  3. Selecione Criar a partir de YAML

  4. A partir daqui, você pode criar o Bundle de uma das seguintes maneiras:

    Nota
    Nota

    Pode haver casos de uso em que você precise incluir alterações personalizadas no SUC plans que o bundle inclui (por exemplo, para adicionar tolerâncias personalizadas). Certifique-se de incluir essas alterações no bundle que será gerado pelas etapas abaixo.

    1. Copiando manualmente o conteúdo do bundle de suse-edge/fleet-examples para a página Criar a partir de YAML.

    2. Clonando o repositório suse-edge/fleet-examples da release desejada e selecionando a opção Ler a partir de arquivo na página Criar a partir de YAML. A partir daí, navegue até o local do bundle (bundles/day2/system-upgrade-controller-plans/os-upgrade) e selecione o arquivo do bundle. Isso preencherá automaticamente a página Criar a partir de YAML com o conteúdo do bundle.

  5. Altere os clusters target para o Bundle:

    • Para corresponder a todos os clusters downstream, altere o Bundle .spec.targets padrão para:

      spec:
        targets:
        - clusterSelector: {}
    • Para mapeamentos de clusters downstream mais granulares, consulte Mapping to Downstream Clusters.

  6. Selecione Criar

33.1.4.4.2.2 Criação de Bundle - manual
  1. Obtenha o 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. Edite as configurações de Bundle target, em spec.targets forneça sua lista de target desejada. Por padrão, os recursos Bundle do suse-edge/fleet-examples NÃO são mapeados para nenhum cluster downstream.

    • Para corresponder a todos os clusters, altere o Bundle target padrão para:

      spec:
        targets:
        - clusterSelector: {}
    • Alternativamente, se você quiser uma seleção de clusters mais granular, veja Mapping to Downstream Clusters

  3. Aplique o recurso Bundle ao seu management cluster:

    kubectl apply -f os-upgrade-bundle.yaml
  4. Visualize o recurso Bundle criado no namespace fleet-default:

    kubectl get bundles -n fleet-default
33.1.4.4.3 Implantação do plano SUC - fluxo de trabalho GitOps de terceiros

Pode haver casos de uso em que os usuários desejem incorporar o OS SUC plans ao seu próprio fluxo de trabalho GitOps de terceiros (por exemplo, Flux).

Para obter os recursos de fazer upgrade do SO de que você precisa, primeiro determine a tag de release do Edge do repositório suse-edge/fleet-examples que você deseja usar.

Depois disso, os recursos podem ser encontrados em fleets/day2/system-upgrade-controller-plans/os-upgrade, onde:

  • plan-control-plane.yaml é um recurso de plano SUC para nós de control-plane.

  • plan-worker.yaml é um recurso de plano SUC para nós de worker.

  • secret.yaml é um Secret que contém o script upgrade.sh, que é responsável por criar o systemd.service (Seção 33.1.4.1.1, “systemd.service”).

  • config-map.yaml é um ConfigMap que contém configurações que são consumidas pelo script upgrade.sh.

Importante
Importante

Estes recursos Plan são interpretados pelo System Upgrade Controller e devem ser implantados em cada cluster downstream que você deseja fazer upgrade. Para informações sobre a implantação do SUC, consulte Seção 18.2, “Instalando o Upgrade Controller do Sistema”.

Para entender melhor como seu fluxo de trabalho GitOps pode ser usado para implantar os SUC Plans para fazer upgrade do SO, pode ser útil dar uma olhada na visão geral (Seção 33.1.4.2, “Visão geral”).

33.1.5 Atualização da versão do Kubernetes

Importante
Importante

Esta seção aborda atualizações do Kubernetes para clusters downstream que NÃO foram criados por meio de uma instância do Rancher (Capítulo 4, Rancher). Para obter informações sobre como atualizar a versão do Kubernetes de clusters criados pelo Rancher, consulte Atualizando e revertendo o Kubernetes.

Esta seção descreve como realizar uma atualização do Kubernetes usando o Capítulo 6, Fleet e o Capítulo 18, Upgrade Controller do Sistema.

Os tópicos a seguir são abordados como parte desta seção:

  1. Seção 33.1.5.1, “Componentes” - componentes adicionais usados pelo processo de atualização.

  2. Seção 33.1.5.2, “Visão geral” - visão geral do processo de atualização.

  3. Seção 33.1.5.3, “Requisitos” - requisitos do processo de atualização.

  4. Seção 33.1.5.4, “Atualização do K8s - implantação do plano SUC” - informações sobre como implantar o SUC plans, responsável por acionar o processo de atualização.

33.1.5.1 Componentes

Esta seção aborda os componentes personalizados que o processo K8s upgrade usa em vez dos componentes (Seção 33.1.1, “Componentes”) padrão de "Dia 2".

33.1.5.1.1 rke2-upgrade

Imagem de contêiner responsável por atualizar a versão do RKE2 de um nó específico.

Distribuída por meio de um Pod criado pelo SUC com base em um Plano SUC. O Plano deve estar localizado em cada cluster que precise de uma atualização do RKE2.

Para obter mais informações sobre como a imagem rke2-upgrade realiza a atualização, consulte a documentação upstream.

33.1.5.1.2 k3s-upgrade

Imagem de contêiner responsável por atualizar a versão do K3s de um nó específico.

Distribuída por meio de um Pod criado pelo SUC com base em um Plano SUC. O Plano deve estar localizado em cada cluster que precise de um upgrade do K3s.

Para obter mais informações sobre como a imagem k3s-upgrade realiza a atualização, consulte a documentação upstream.

33.1.5.2 Visão geral

O upgrade da distribuição Kubernetes para nós de cluster downstream é feito utilizando Fleet e o System Upgrade Controller (SUC).

Fleet é usado para implantar e gerenciar SUC plans no cluster desejado.

Nota
Nota

SUC plans são recursos personalizados que descrevem as etapas que o SUC precisa seguir para que uma tarefa específica seja executada em um conjunto de nós. Para um exemplo de como um SUC plan se parece, consulte o repositório upstream.

Os K8s SUC plans são enviados em cada cluster implantando um recurso GitRepo ou Bundle em um workspace específico do Fleet. O Fleet recupera o GitRepo/Bundle implantado e implanta seu conteúdo (o K8s SUC plans) no(s) cluster(es) desejado(s).

Nota
Nota

Recursos GitRepo/Bundle são sempre implantados no management cluster. Se usar um recurso GitRepo ou Bundle depende do seu caso de uso, verifique Seção 33.1.2, “Determine seu caso de uso” para mais informações.

K8s SUC plans descrevem o seguinte fluxo de trabalho:

  1. Sempre cordon os nós antes de fazer upgrade do K8s.

  2. Sempre atualize os nós control-plane antes dos nós worker.

  3. Sempre atualize os nós control-plane um nó por vez e os nós worker dois nós por vez.

Uma vez que os K8s SUC plans são implantados, o fluxo de trabalho parece com isto:

  1. O SUC reconcilia os K8s SUC plans implantados e cria um Kubernetes Job em cada nó.

  2. Dependendo da distribuição do Kubernetes, o Job criará um Pod que executa a imagem de contêiner rke2-upgrade (Seção 33.1.5.1.1, “rke2-upgrade”) ou k3s-upgrade (Seção 33.1.5.1.2, “k3s-upgrade”).

  3. O Pod criado passará pelo seguinte fluxo de trabalho:

    1. Substitua o binário rke2/k3s existente no nó pelo da imagem rke2-upgrade/k3s-upgrade.

    2. Encerre o processo rke2/k3s em execução.

  4. Encerrar o processo rke2/k3s aciona uma reinicialização, iniciando um novo processo que executa o binário atualizado, resultando em uma versão de distribuição do Kubernetes atualizada.

Abaixo você pode encontrar um diagrama da descrição acima:

fleet day2 downstream k8s upgrade

33.1.5.3 Requisitos

  1. Faça backup da sua distribuição Kubernetes:

    1. Para clusters RKE2, consulte a documentação de Backup e Restauração do RKE2.

    2. Para clusters K3s, consulte a documentação de Backup e Restauração do K3s.

  2. Certifique-se de que as tolerâncias do Plano SUC correspondam às tolerâncias do nó - Se os nós do seu cluster Kubernetes tiverem taints personalizados, certifique-se de adicionar tolerâncias para esses taints nos Planos SUC. Por padrão, os Planos SUC possuem tolerâncias apenas para nós de plano de controle. As tolerâncias padrão incluem:

    • CriticalAddonsOnly=true:NoExecute

    • node-role.kubernetes.io/control-plane:NoSchedule

    • node-role.kubernetes.io/etcd:NoExecute

      Nota
      Nota

      Quaisquer tolerâncias adicionais devem ser adicionadas na seção .spec.tolerations de cada Plano. Os Planos SUC relacionados à atualização da versão do Kubernetes podem ser encontrados no repositório suse-edge/fleet-examples em:

      • Para RKE2 - fleets/day2/system-upgrade-controller-plans/rke2-upgrade

      • Para K3s - fleets/day2/system-upgrade-controller-plans/k3s-upgrade

      Certifique-se de usar os Planos de uma tag de lançamento de repositório válida.

      Um exemplo de definição de tolerâncias personalizadas para o Plano SUC do plano de controle do RKE2 seria assim:

      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 Atualização do K8s - implantação do plano SUC

Importante
Importante

Para ambientes previamente atualizados usando este procedimento, os usuários devem garantir que um das seguintes etapas seja concluído:

  • Remove any previously deployed SUC Plans related to older Edge release versions from the downstream cluster - pode ser feito removendo o cluster desejado da GitRepo/Bundle configuração de destino existente, ou removendo o recurso GitRepo/Bundle por completo.

  • Reuse the existing GitRepo/Bundle resource - pode ser feito apontando a revisão do recurso para uma nova tag que contenha os Fleet corretos para o suse-edge/fleet-examples lançamento desejado.

Isso é feito para evitar conflitos entre SUC Plans para versões de lançamento do Edge mais antigas.

Se os usuários tentarem fazer upgrade enquanto houver SUC Plans existentes no cluster downstream, eles verão o seguinte erro do 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 mencionado em Seção 33.1.5.2, “Visão geral”, as atualizações do Kubernetes são feitas enviando SUC plans para o cluster desejado através de uma das seguintes maneiras:

Para determinar qual recurso você deve usar, consulte Seção 33.1.2, “Determine seu caso de uso”.

Para casos de uso onde você deseja implantar o K8s SUC plans a partir de uma ferramenta GitOps de terceiros, consulte Seção 33.1.5.4.3, “Implantação do plano SUC - fluxo de trabalho GitOps de terceiros”

33.1.5.4.1 Implantação de plano SUC - recurso GitRepo

Um recurso GitRepo, que envia o K8s SUC plans necessário, pode ser implantado de uma das seguintes maneiras:

  1. Através do Rancher UI - Seção 33.1.5.4.1.1, “Criação de GitRepo - IU do Rancher” (quando Rancher estiver disponível).

  2. Por implantação manual (Seção 33.1.5.4.1.2, “Criação de GitRepo - manual”) do recurso no seu management cluster.

Uma vez implantado, para monitorar o processo de fazer upgrade do Kubernetes dos nós do seu cluster de destino, consulte Seção 18.3, “Monitoramento de Planos do Upgrade Controller do Sistema”.

33.1.5.4.1.1 Criação de GitRepo - IU do Rancher

Para criar um recurso GitRepo através da IU do Rancher, siga a documentação oficial deles.

A equipe Edge mantém fleets prontos para uso para as distribuições Kubernetes rke2 e k3s. Dependendo do seu ambiente, este fleet pode ser usado diretamente ou como um modelo.

Importante
Importante

Sempre use esses fleets a partir de uma tag de release válida do Edge.

Para casos de uso onde não é necessário incluir alterações personalizadas no SUC plans que esses fleets enviam, os usuários podem referenciar diretamente os fleets do repositório suse-edge/fleet-examples.

Em casos onde alterações personalizadas são necessárias (por exemplo, para adicionar tolerations personalizadas), os usuários devem referenciar os fleets de um repositório separado, permitindo-lhes adicionar as alterações aos planos SUC conforme necessário.

Exemplos de configuração para um recurso GitRepo usando os fleets do repositório suse-edge/fleet-examples:

33.1.5.4.1.2 Criação de GitRepo - manual
  1. Puxe o recurso GitRepo:

    • Para clusters 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 clusters 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. Edite a configuração do GitRepo, em spec.targets especifique sua lista de destino desejada. Por padrão, os recursos GitRepo do suse-edge/fleet-examples NÃO são mapeados para nenhum cluster downstream.

    • Para corresponder a todos os clusters, altere o GitRepo target padrão para:

      spec:
        targets:
        - clusterSelector: {}
    • Alternativamente, se você quiser uma seleção de cluster mais granular, veja Mapeamento para Clusters Downstream

  3. Aplique os recursos GitRepo ao seu management cluster:

    # RKE2
    kubectl apply -f rke2-upgrade-gitrepo.yaml
    
    # K3s
    kubectl apply -f k3s-upgrade-gitrepo.yaml
  4. Visualize o recurso GitRepo criado no namespace 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 Implantação do plano SUC - Recurso Bundle

Um recurso Bundle, que fornece os Kubernetes upgrade SUC Plans necessários, pode ser implantado de uma das seguintes maneiras:

  1. Através do Rancher UI - Seção 33.1.5.4.2.1, “Criação de Bundle - Interface do Rancher” (quando Rancher estiver disponível).

  2. Implantando manualmente (Seção 33.1.5.4.2.2, “Criação de Bundle - manual”) o recurso no seu management cluster.

Uma vez implantado, para monitorar o processo de atualização do Kubernetes dos nós do seu cluster de destino, consulte Seção 18.3, “Monitoramento de Planos do Upgrade Controller do Sistema”.

33.1.5.4.2.1 Criação de Bundle - Interface do Rancher

A equipe Edge mantém bundles prontos para uso para as distribuições Kubernetes rke2 e k3s. Dependendo do seu ambiente, esses bundles podem ser usados diretamente ou como um modelo.

Importante
Importante

Sempre use este bundle a partir de uma tag de release Edge válida.

Para criar um Bundle através da interface do Rancher:

  1. No canto superior esquerdo, clique em ☰ → Entrega contínua

  2. Vá para Avançado > Bundle

  3. Selecione Criar a partir de YAML

  4. A partir daqui, você pode criar o Bundle de uma das seguintes maneiras:

    Nota
    Nota

    Pode haver casos de uso em que você precise incluir alterações personalizadas no SUC plans que o Bundle fornece (por exemplo, para adicionar tolerâncias personalizadas). Certifique-se de incluir essas alterações no Bundle que será gerado pelas etapas abaixo.

    1. Copiando manualmente o conteúdo do Bundle para RKE2 ou K3s de suse-edge/fleet-examples para a página Criar a partir de YAML.

    2. Clonando o repositório suse-edge/fleet-examples da tag de release desejada e selecionando a opção Ler de Arquivo na página Criar a partir de YAML. A partir daí, navegue até o Bundle que você precisa (bundles/day2/system-upgrade-controller-plans/rke2-upgrade/plan-bundle.yaml para RKE2 e bundles/day2/system-upgrade-controller-plans/k3s-upgrade/plan-bundle.yaml para K3s). Isso preencherá automaticamente a página Criar a partir de YAML com o conteúdo do Bundle.

  5. Altere os clusters de destino para o Bundle:

    • Para corresponder a todos os clusters downstream, altere o .spec.targets do Bundle padrão para:

      spec:
        targets:
        - clusterSelector: {}
    • Para mapeamentos de cluster downstream mais granulares, consulte Mapeamento para Clusters Downstream.

  6. Selecione Criar

33.1.5.4.2.2 Criação de Bundle - manual
  1. Puxe os recursos do Bundle:

    • Para clusters 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 clusters 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. Edite as configurações de Bundle destino, em spec.targets forneça a lista de destino desejada. Por padrão, os recursos Bundle do suse-edge/fleet-examples NÃO são mapeados para nenhum cluster downstream.

    • Para corresponder a todos os clusters, altere o Bundle target padrão para:

      spec:
        targets:
        - clusterSelector: {}
    • Alternativamente, se você quiser uma seleção de cluster mais granular, veja Mapeamento para Clusters Downstream

  3. Aplique os recursos do Bundle ao seu management cluster:

    # For RKE2
    kubectl apply -f rke2-plan-bundle.yaml
    
    # For K3s
    kubectl apply -f k3s-plan-bundle.yaml
  4. Visualize o recurso Bundle criado no namespace 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 Implantação do plano SUC - fluxo de trabalho GitOps de terceiros

Pode haver casos de uso em que os usuários gostariam de incorporar o Kubernetes upgrade SUC plans ao seu próprio fluxo de trabalho GitOps de terceiros (por exemplo, Flux).

Para obter os recursos de atualização do K8s de que você precisa, primeiro determine a tag de release do Edge do repositório suse-edge/fleet-examples que você deseja usar.

Depois disso, os recursos podem ser encontrados em:

  • Para uma atualização de cluster RKE2:

    • Para nós control-plane - fleets/day2/system-upgrade-controller-plans/rke2-upgrade/plan-control-plane.yaml

    • Para nós worker - fleets/day2/system-upgrade-controller-plans/rke2-upgrade/plan-worker.yaml

  • Para uma atualização de cluster K3s:

    • Para nós control-plane - fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-control-plane.yaml

    • Para nós worker - fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-worker.yaml

Importante
Importante

Esses recursos Plan são interpretados pelo System Upgrade Controller e devem ser implantados em cada cluster downstream que você deseja atualizar. Para informações sobre a implantação do SUC, consulte Seção 18.2, “Instalando o Upgrade Controller do Sistema”.

Para entender melhor como seu fluxo de trabalho GitOps pode ser usado para implantar os SUC Plans para fazer upgrade da versão do Kubernetes, pode ser benéfico dar uma olhada na visão geral (Seção 33.1.5.2, “Visão geral”) do procedimento de atualização usando Fleet.

33.1.6 Fazer upgrade do Helm chart

Esta seção abrange as seguintes partes:

  1. Seção 33.1.6.1, “Preparação para ambientes air-gapped” - contém informações sobre como enviar charts e imagens OCI relacionados ao Edge para o seu registro privado.

  2. Seção 33.1.6.2, “Procedimento de upgrade” - contém informações sobre diferentes casos de uso de upgrade do Helm chart e seu procedimento de upgrade.

33.1.6.1 Preparação para ambientes air-gapped

33.1.6.1.1 Certifique-se de ter acesso ao Fleet do seu Helm chart

Dependendo do que seu ambiente suporta, você pode escolher uma das seguintes opções:

  1. Hospede os recursos do Fleet do seu chart em um servidor Git local que seja acessível pelo seu management cluster.

  2. Use a CLI do Fleet para converter um Helm chart em um Bundle que você pode usar diretamente e que não precisará ser hospedado em algum lugar. A CLI do Fleet pode ser obtida na página de release, para usuários de Mac existe uma fleet-cli Homebrew Formulae.

33.1.6.1.2 Encontre os ativos necessários para a sua versão de release do Edge
  1. Vá para a página de release do "Day 2", encontre a release do Edge para a qual você deseja atualizar seu chart e clique em Assets.

  2. Na seção "Assets", baixe os seguintes arquivos:

    Release File

    Descrição

    edge-save-images.sh

    Extrai as imagens especificadas no arquivo edge-release-images.txt e as empacota dentro de um arquivo '.tar.gz'.

    edge-save-oci-artefacts.sh

    Extrai as imagens de chart OCI relacionadas à release específica do Edge e as empacota dentro de um arquivo '.tar.gz'.

    edge-load-images.sh

    Carrega imagens de um arquivo '.tar.gz', renomeia as tags e as envia para um registro privado.

    edge-load-oci-artefacts.sh

    Recebe um diretório contendo pacotes de chart OCI '.tgz' do Edge e os carrega em um registro privado.

    edge-release-helm-oci-artefacts.txt

    Contém uma lista de imagens de chart OCI relacionadas a uma release específica do Edge.

    edge-release-images.txt

    Contém uma lista de imagens relacionadas a uma release específica do Edge.

33.1.6.1.3 Crie o arquivo de imagens de release do Edge

Em uma máquina com acesso à internet:

  1. Torne o edge-save-images.sh executável:

    chmod +x edge-save-images.sh
  2. Gere o arquivo de imagem:

    ./edge-save-images.sh --source-registry registry.suse.com
  3. Isso criará um arquivo pronto para carregamento chamado edge-images.tar.gz.

    Nota
    Nota

    Se a opção -i|--images for especificada, o nome do arquivo pode ser diferente.

  4. Copie este arquivo para sua máquina air-gapped:

    scp edge-images.tar.gz <user>@<machine_ip>:/path
33.1.6.1.4 Crie o arquivo de imagens de chart OCI do Edge

Em uma máquina com acesso à internet:

  1. Torne o edge-save-oci-artefacts.sh executável:

    chmod +x edge-save-oci-artefacts.sh
  2. Gere o arquivo de imagem de chart OCI:

    ./edge-save-oci-artefacts.sh --source-registry registry.suse.com
  3. Isso criará um arquivo chamado oci-artefacts.tar.gz.

    Nota
    Nota

    Se a opção -a|--archive for especificada, o nome do arquivo pode ser diferente.

  4. Copie este arquivo para sua máquina air-gapped:

    scp oci-artefacts.tar.gz <user>@<machine_ip>:/path
33.1.6.1.5 Carregue as imagens de release do Edge em sua máquina air-gapped

Em sua máquina air-gapped:

  1. Faça login no seu registro privado (se necessário):

    podman login <REGISTRY.YOURDOMAIN.COM:PORT>
  2. Torne o edge-load-images.sh executável:

    chmod +x edge-load-images.sh
  3. Execute o script, passando o arquivo copiado edge-images.tar.gz anteriormente:

    ./edge-load-images.sh --source-registry registry.suse.com --registry <REGISTRY.YOURDOMAIN.COM:PORT> --images edge-images.tar.gz
    Nota
    Nota

    Isso carregará todas as imagens do edge-images.tar.gz, renomeará as tags e as enviará para o registro especificado na opção --registry.

33.1.6.1.6 Carregue as imagens de chart OCI do Edge para sua máquina air-gapped.

Em sua máquina air-gapped:

  1. Faça login no seu registro privado (se necessário):

    podman login <REGISTRY.YOURDOMAIN.COM:PORT>
  2. Torne o edge-load-oci-artefacts.sh executável:

    chmod +x edge-load-oci-artefacts.sh
  3. Descompacte o arquivo copiado oci-artefacts.tar.gz:

    tar -xvf oci-artefacts.tar.gz
  4. Isso produzirá um diretório com o modelo de nomenclatura edge-release-oci-tgz-<date>

  5. Passe este diretório para o script edge-load-oci-artefacts.sh para carregar as imagens do chart Edge OCI para seu registro privado:

    Nota
    Nota

    Este script pressupõe que a CLI helm tenha sido pré-instalada em seu ambiente. Para instruções de instalação do Helm, consulte Instalando o 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 Configure seu registro privado em sua distribuição Kubernetes

Para RKE2, consulte Configuração de Registro Privado

Para K3s, consulte Configuração de Registro Privado

33.1.6.2 Procedimento de upgrade

Esta seção foca nos seguintes casos de uso do procedimento de upgrade do Helm:

Importante
Importante

Charts do Helm implantados manualmente não podem ser atualizados de forma confiável. Sugerimos reimplantar o chart do Helm usando o método Seção 33.1.6.2.1, “Tenho um novo cluster e gostaria de implantar e gerenciar um chart Helm do Edge.”.

33.1.6.2.1 Tenho um novo cluster e gostaria de implantar e gerenciar um chart Helm do Edge.

Esta seção aborda como:

33.1.6.2.1.1 Prepare os recursos do Fleet para o seu chart.
  1. Adquira os recursos do Fleet do chart a partir da tag de release do Edge que você deseja usar.

  2. Navegue até o Fleet do chart do Helm (fleets/day2/chart-templates/<chart>).

  3. Se você pretende usar um fluxo de trabalho GitOps, copie o diretório do Fleet do chart para o repositório Git de onde você fará o GitOps.

  4. Opcionalmente, se o chart do Helm exigir configurações em seus values, edite a configuração .helm.values dentro do arquivo fleet.yaml do diretório copiado.

  5. Opcionalmente, podem existir casos de uso em que você precise adicionar recursos adicionais ao Fleet do seu chart para que ele possa se ajustar melhor ao seu ambiente. Para obter informações sobre como aprimorar seu diretório Fleet, consulte Conteúdo do Repositório Git.

Nota
Nota

Em alguns casos, o tempo limite padrão que o Fleet usa para operações do Helm pode ser insuficiente, resultando no seguinte erro:

failed pre-install: context deadline exceeded

Nesses casos, adicione a propriedade timeoutSeconds sob a configuração helm do seu arquivo fleet.yaml.

Um exemplo para o Helm chart longhorn seria assim:

  • Estrutura do repositório Git do usuário:

    <user_repository_root>
    ├── longhorn
    │   └── fleet.yaml
    └── longhorn-crd
        └── fleet.yaml
  • Conteúdo fleet.yaml preenchido com dados Longhorn do usuário:

    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

    Estes são apenas valores de exemplo que são usados para ilustrar configurações personalizadas no chart longhorn. Eles NÃO devem ser tratados como diretrizes de implantação para o chart longhorn.

33.1.6.2.1.2 Implante o Fleet para o seu chart

Você pode implantar o Fleet para o seu chart usando um GitRepo (Seção 33.1.6.2.1.2.1, “GitRepo”) ou um Bundle (Seção 33.1.6.2.1.2.2, “Pacote”).

Nota
Nota

Ao implantar o Fleet, se você receber uma mensagem Modified, certifique-se de adicionar uma entrada comparePatches correspondente à seção diff do Fleet. Para mais informações, consulte Gerando Diffs para Ignorar GitRepos Modificados.

33.1.6.2.1.2.1 GitRepo

O recurso GitRepo do Fleet contém informações sobre como acessar os recursos do Fleet do seu chart e a quais clusters ele precisa aplicar esses recursos.

O recurso GitRepo pode ser implantado através da Rancher UI, ou manualmente, implantando o recurso no management cluster.

Exemplo de recurso Longhorn GitRepo para implantação 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 Pacote

Os recursos Bundle contêm os recursos brutos do Kubernetes que precisam ser implantados pelo Fleet. Normalmente, recomenda-se usar a abordagem GitRepo, mas para casos de uso em que o ambiente é air-gapped e não pode suportar um servidor Git local, o Bundles pode ajudá-lo a propagar o Fleet do seu chart Helm para seus clusters de destino.

Um Bundle pode ser implantado através da Rancher UI (Continuous Delivery → Advanced → Bundles → Create from YAML) ou implantando manualmente o recurso Bundle no namespace correto do Fleet. Para obter informações sobre os namespaces do Fleet, consulte a documentação upstream.

Bundles para charts Helm do Edge podem ser criados utilizando a abordagem Converter um chart Helm em um Bundle do Fleet.

Abaixo você pode encontrar um exemplo de como criar um recurso Bundle a partir dos modelos de Fleet de charts Helm longhorn e longhorn-crd e implantar manualmente este bundle no seu management cluster.

Nota
Nota

Para ilustrar o fluxo de trabalho, o exemplo abaixo usa a estrutura de diretório suse-edge/fleet-examples.

  1. Navegue até o modelo de Fleet do chart longhorn:

    cd fleets/day2/chart-templates/longhorn/longhorn
  2. Crie um arquivo targets.yaml que instruirá o Fleet para quais clusters ele deve implantar o chart Helm:

    cat > targets.yaml <<EOF
    targets:
    # Matches all downstream clusters
    - clusterSelector: {}
    EOF

    Para uma seleção de cluster downstream mais granular, consulte Mapeamento para Clusters downstream.

  3. Converta o Fleet do chart Helm Longhorn em um recurso Bundle usando o fleet-cli.

    Nota
    Nota

    A CLI do Fleet pode ser obtida na página de release Assets (fleet-linux-amd64).

    Para usuários de Mac, existe uma fórmula Homebrew chamada fleet-cli.

    fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - longhorn-bundle > longhorn-bundle.yaml
  4. Navegue até o template do chart Fleet longhorn-crd:

    cd fleets/day2/chart-templates/longhorn/longhorn-crd
  5. Crie um arquivo targets.yaml que instruirá o Fleet sobre a quais clusters ele deve implantar o gráfico Helm:

    cat > targets.yaml <<EOF
    targets:
    # Matches all downstream clusters
    - clusterSelector: {}
    EOF
  6. Converta o gráfico Helm Longhorn CRD do Fleet em um recurso Bundle usando o fleet-cli.

    fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - longhorn-crd-bundle > longhorn-crd-bundle.yaml
  7. Implante os arquivos longhorn-bundle.yaml e longhorn-crd-bundle.yaml no seu management cluster:

    kubectl apply -f longhorn-crd-bundle.yaml
    kubectl apply -f longhorn-bundle.yaml

Seguir estes passos garantirá que o SUSE Storage seja implantado em todos os clusters downstream especificados.

33.1.6.2.1.3 Gerenciar o gráfico Helm implantado

Uma vez implantado com o Fleet, para fazer upgrade de gráficos Helm, consulte Seção 33.1.6.2.2, “Eu gostaria de fazer upgrade de um gráfico Helm gerenciado pelo Fleet”.

33.1.6.2.2 Eu gostaria de fazer upgrade de um gráfico Helm gerenciado pelo Fleet
  1. Determine a versão para a qual você precisa fazer upgrade do seu gráfico para que ele seja compatível com a versão do Edge desejada. A versão do gráfico Helm por versão do Edge pode ser visualizada nas notas de lançamento (Capítulo 41, Notas de versão).

  2. No seu repositório Git monitorado pelo Fleet, edite o arquivo fleet.yaml do gráfico Helm com a versão e o repositório corretos das notas de lançamento (Capítulo 41, Notas de versão).

  3. Após confirmar e enviar as alterações para o seu repositório, isso acionará o fazer upgrade do Helm chart desejado.

33.1.6.2.3 Eu gostaria de fazer upgrade de um Helm chart implantado via EIB.

Capítulo 8, Edge Image Builder implanta Helm charts criando um recurso HelmChart e utilizando o helm-controller introduzido pelo recurso de integração Helm RKE2/K3s.

Para garantir que um Helm chart implantado via EIB seja feito upgrade com sucesso, os usuários precisam fazer upgrade dos respectivos recursos HelmChart.

Abaixo você pode encontrar informações sobre:

33.1.6.2.3.1 Visão geral

Os Helm charts implantados via EIB são feitos upgrade por meio de um fleet chamado eib-charts-upgrader.

Este fleet processa dados fornecidos pelo usuário para atualizar um conjunto específico de recursos HelmChart.

A atualização desses recursos aciona o helm-controller, que faz upgrade dos Helm charts associados aos recursos HelmChart modificados.

Espera-se que o usuário apenas:

  1. Baixe localmente os arquivos para cada Helm chart que precisa ser feito upgrade.

  2. Passe esses arquivos para o generate-chart-upgrade-data.sh generate-chart-upgrade-data.sh script, que incluirá os dados desses arquivos na frota eib-charts-upgrader.

  3. Implante a frota eib-charts-upgrader em seu management cluster. Isso é feito por meio de um recurso GitRepo ou Bundle.

Uma vez implantado, o eib-charts-upgrader, com a ajuda do Fleet, enviará seus recursos para o cluster downstream desejado.

Esses recursos incluem:

  1. Um conjunto de Secrets contendo os dados do Helm chart fornecidos pelo usuário.

  2. Um Kubernetes Job que implantará um Pod que montará o Secrets mencionado anteriormente e, com base neles, patch os recursos HelmChart correspondentes.

Como mencionado anteriormente, isso acionará o helm-controller que realizará a atualização real do chart Helm.

Abaixo você pode encontrar um diagrama da descrição acima:

fleet day2 downstream helm eib upgrade
33.1.6.2.3.2 Etapas de upgrade
  1. Clone o repositório suse-edge/fleet-examples da tag de lançamento correta tag.

  2. Crie um diretório no qual você armazenará o(s) arquivo(s) do chart Helm baixado(s).

    mkdir archives
  3. Dentro do diretório recém-criado para os arquivos, pull os arquivos dos charts Helm que você deseja fazer upgrade:

    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. De Assets da release tag desejada, baixe o script generate-chart-upgrade-data.sh.

  5. Execute o 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 arquivo de chart no diretório --archive-dir, o script gera um arquivo Kubernetes Secret YAML contendo os dados de upgrade do chart e o armazena no diretório base/secrets da frota especificada por --fleet-path.

    O script generate-chart-upgrade-data.sh também aplica modificações adicionais à frota para garantir que os arquivos Kubernetes Secret YAML gerados sejam utilizados corretamente pela carga de trabalho implantada pela frota.

    Importante
    Importante

    Os usuários não devem fazer alterações além do que o script generate-chart-upgrade-data.sh gera.

As etapas abaixo dependem do ambiente em que você está executando:

  1. Para um ambiente que suporta GitOps (por exemplo, não é air-gapped, ou é air-gapped, mas permite o suporte a um servidor Git local):

    1. Copie a fleets/day2/eib-charts-upgrader Fleet para o repositório que você usará para GitOps.

      Nota
      Nota

      Certifique-se de que a Fleet inclua as alterações que foram feitas pelo script generate-chart-upgrade-data.sh.

    2. Configure um recurso GitRepo que será usado para enviar todos os recursos da eib-charts-upgrader Fleet.

      1. Para configuração e implantação do GitRepo por meio da interface do Rancher, consulte Accessing Fleet in the Rancher UI.

      2. Para configuração e implantação manual do GitRepo, consulte Creating a Deployment.

  2. Para um ambiente que não suporta GitOps (por exemplo, é isolado da rede e não permite o uso de servidor Git local):

    1. Baixe o binário fleet-cli da página de rancher/fleet release (fleet-linux-amd64 para Linux). Para usuários de Mac, existe uma Homebrew Formulae que pode ser usada - fleet-cli.

    2. Navegue até a eib-charts-upgrader Fleet:

      cd /foo/bar/fleet-examples/fleets/day2/eib-charts-upgrader
    3. Crie um arquivo targets.yaml que instruirá o Fleet sobre onde implantar seus recursos:

      cat > targets.yaml <<EOF
      targets:
      # To match all downstream clusters
      - clusterSelector: {}
      EOF

      Para obter informações sobre como mapear clusters de destino, consulte a documentation upstream.

    4. Use o fleet-cli para converter o Fleet em um recurso Bundle:

      fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - eib-charts-upgrade > bundle.yaml

      Isso criará um Bundle (bundle.yaml) que conterá todos os recursos modelados do Fleet eib-charts-upgrader.

      Para mais informações sobre o comando fleet apply, consulte fleet apply.

      Para mais informações sobre a conversão de Fleets em Bundles, consulte Convert a Helm Chart into a Bundle.

    5. Implante o Bundle. Isso pode ser feito de duas maneiras:

      1. Através da interface do Rancher - Navegue até Continuous Delivery → Advanced → Bundles → Create from YAML e cole o conteúdo do bundle.yaml ou clique na opção Read from File e envie o próprio arquivo.

      2. Manualmente - Implante o arquivo bundle.yaml manualmente dentro do seu management cluster.

A execução dessas etapas resultará em um recurso GitRepo/Bundle implantado com sucesso. O recurso será captado pelo Fleet e seu conteúdo será implantado nos clusters de destino que o usuário especificou nas etapas anteriores. Para uma visão geral do processo, consulte Seção 33.1.6.2.3.1, “Visão geral”.

Para obter informações sobre como acompanhar o processo de fazer upgrade, você pode consultar Seção 33.1.6.2.3.3, “Exemplo”.

Importante
Importante

Assim que o upgrade do chart for verificado com sucesso, remova o recurso Bundle/GitRepo.

Isso removerá os recursos de upgrade que não são mais necessários do seu cluster downstream, garantindo que nenhum conflito de versão futuro ocorra.

33.1.6.2.3.3 Exemplo
Nota
Nota

O exemplo abaixo demonstra como fazer upgrade de um Helm chart implantado via EIB de uma versão para outra em um cluster downstream. Observe que as versões usadas neste exemplo não são recomendações. Para recomendações de versão específicas para uma versão Edge, consulte as notas de versão (Capítulo 41, Notas de versão).

Caso de uso:

  • Um cluster chamado doc-example está executando uma versão mais antiga do Longhorn.

  • O cluster foi implantado por meio do EIB, usando a seguinte definição de imagem 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/
    ...
  • O SUSE Storage precisa ser feito upgrade para uma versão compatível com a release 3.6 do Edge. Ou seja, ele precisa ser feito upgrade para 1.11.2.

  • Assume-se que o management cluster responsável pelo gerenciamento do doc-example está air-gapped, sem suporte para um servidor Git local e possui uma configuração do Rancher funcional.

Siga as etapas para fazer upgrade (Seção 33.1.6.2.3.2, “Etapas de upgrade”):

  1. Clone o repositório suse-edge/fleet-example a partir da tag release-3.6.1.

    git clone -b release-3.6.1 https://github.com/suse-edge/fleet-examples.git
  2. Crie um diretório onde o arquivo de fazer upgrade do Longhorn será armazenado.

    mkdir archives
  3. Faça o pull da versão desejada do arquivo do chart Longhorn:

    # 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. Fora do diretório archives, baixe o script generate-chart-upgrade-data.sh do release suse-edge/fleet-examples tag.

  5. A configuração do diretório deve ser semelhante 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. Execute o 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

    A estrutura do diretório após a execução do script deve ser semelhante 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

    Os arquivos alterados no git devem ser semelhantes a isto:

    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. Crie um Bundle para o Fleet eib-charts-upgrader:

    1. Primeiro, navegue até o próprio Fleet:

      cd ./fleet-examples/fleets/day2/eib-charts-upgrader
    2. Em seguida, crie um arquivo targets.yaml:

      cat > targets.yaml <<EOF
      targets:
      - clusterName: doc-example
      EOF
    3. Em seguida, use o binário fleet-cli para converter o Fleet em um Bundle:

      fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - eib-charts-upgrade > bundle.yaml
    4. Agora, transfira o bundle.yaml para sua máquina management cluster.

  8. Implante o Bundle através da interface do Rancher:

    day2 helm chart upgrade example 1
    Figura 33.1: Implantar Bundle através da interface do Rancher

    A partir daqui, selecione Ler de Arquivo e encontre o arquivo bundle.yaml no seu sistema.

    Isso preencherá automaticamente o Bundle dentro da interface do Rancher.

    Selecione Criar.

  9. Após uma implantação bem-sucedida, seu Bundle deverá ser semelhante a:

    day2 helm chart upgrade example 2
    Figura 33.2: Bundle implantado com sucesso

Após a implantação bem-sucedida do Bundle, para monitorar o processo de fazer upgrade:

  1. Verifique os logs do Upgrade Pod:

    day2 helm chart upgrade example 3 downstream
  2. Agora, verifique os logs do Pod criado para fazer upgrade pelo helm-controller:

    1. O nome do Pod seguirá o seguinte modelo - helm-install-longhorn-<random-suffix>

    2. O Pod estará no namespace onde o recurso HelmChart foi implantado. No nosso caso, este é kube-system.

      day2 helm chart upgrade example 4 downstream
      Figura 33.3: Logs para o gráfico Longhorn que foi submetido a fazer upgrade com sucesso
  3. Verifique se a versão do HelmChart foi atualizada navegando até a seção HelmCharts do Rancher (More Resources → HelmCharts). Selecione o namespace onde o chart foi implantado; para este exemplo, seria kube-system.

  4. Por fim, verifique se os Pods do Longhorn estão em execução.

Após realizar as validações acima, é seguro presumir que o Helm chart do Longhorn foi submetido a fazer upgrade para a versão 1.11.2.

33.1.6.2.3.4 Fazer upgrade do Helm chart usando uma ferramenta GitOps de terceiros

Pode haver casos de uso em que os usuários desejem usar este procedimento de fazer upgrade com um fluxo de trabalho GitOps diferente do Fleet (por exemplo, Flux).

Para produzir os recursos necessários para o procedimento de fazer upgrade, você pode usar o script generate-chart-upgrade-data.sh para preencher o Fleet eib-charts-upgrader com os dados fornecidos pelo usuário. Para obter mais informações sobre como fazer isso, consulte Seção 33.1.6.2.3.2, “Etapas de upgrade”.

Depois de ter a configuração completa, você pode usar kustomize para gerar uma solução funcional completa que você pode implantar em seu cluster:

cd /foo/bar/fleets/day2/eib-charts-upgrader

kustomize build .

Se você quiser incluir a solução em seu fluxo de trabalho GitOps, você pode remover o arquivo fleet.yaml e usar o que restou como uma configuração Kustomize válida. Apenas não se esqueça de executar primeiro o script generate-chart-upgrade-data.sh, para que ele possa preencher a configuração Kustomize com os dados dos Helm charts que você deseja fazer upgrade.

Para entender como este fluxo de trabalho deve ser usado, pode ser útil consultar Seção 33.1.6.2.3.1, “Visão geral” e Seção 33.1.6.2.3.2, “Etapas de upgrade”.

Parte VII Solução de problemas

Esta seção fornece orientação para diagnosticar e resolver problemas comuns com SUSE Edge implantações e operações. Ela aborda vários tópicos, oferecendo etapas de solução de problemas específicas de componentes, principais ferramentas e locais de log relevantes.

34 Princípios Gerais de Solução de Problemas

Antes de mergulhar em problemas específicos de componentes, considere estes princípios gerais:

  • Verificar logs: Os logs são a principal fonte de informação. Na maioria das vezes, os erros são autoexplicativos e contêm dicas sobre o que falhou.

  • Verificar relógios: Ter diferenças de relógio entre sistemas pode levar a todos os tipos de erros diferentes. Certifique-se de que os relógios estejam sincronizados. O EIB pode ser instruído a forçar a sincronização do relógio no momento da inicialização, veja Configurando a Hora do SO (Capítulo 2, Clusters autônomos com o Edge Image Builder).

  • Problemas de Inicialização: Se o sistema travar durante a inicialização, anote as últimas mensagens exibidas. Acesse o console (físico ou via BMC) para observar as mensagens de inicialização.

  • Problemas de Rede: Verifique a configuração da interface de rede (ip a), a tabela de roteamento (ip route), teste a conectividade de/para outros nós e serviços externos (ping, nc). Certifique-se de que as regras do gateway de segurança não estejam bloqueando portas necessárias.

  • Verificar status do componente: Use kubectl get e kubectl describe para recursos do Kubernetes. Use kubectl get events --sort-by='.lastTimestamp' -n <namespace> para ver os eventos em um namespace específico do Kubernetes.

  • Verificar status dos serviços: Use systemctl status <service> para serviços do systemd.

  • Verifique a sintaxe: O software espera uma determinada estrutura e sintaxe nos arquivos de configuração. Para arquivos yaml, por exemplo, use yamllint ou ferramentas similares para verificar a sintaxe correta.

  • Isole o problema: Tente restringir o problema a um componente ou camada específica (por exemplo, rede, armazenamento, SO, Kubernetes, Metal3, Ironic,…​).

  • Documentação: Consulte sempre a SUSE Edge documentação oficial e também a documentação upstream para obter informações detalhadas.

  • Versões: SUSE Edge é uma versão opinativa e minuciosamente testada de diferentes componentes SUSE. As versões de cada componente por versão do SUSE Edge podem ser observadas na SUSE Edge matriz de suporte.

  • Problemas conhecidos: Para cada versão do SUSE Edge, há uma seção “Problemas conhecidos” nas notas de versão que contém informações sobre problemas que serão corrigidos em versões futuras, mas que podem afetar a atual.

35 Solucionando problemas do Kiwi

O Kiwi é usado para gerar imagens atualizadas do SUSE Linux Micro para serem usadas com o Edge Image Builder.

Problemas comuns
  • Incompatibilidade de versão do SL Micro: A versão do sistema operacional do host de build deve corresponder à versão do sistema operacional que está sendo compilada (host SL Micro 6.0 → imagem SL Micro 6.0).

  • SELinux em modo enforcing: Devido a certas limitações, atualmente é necessário desativar o SELinux temporariamente para conseguir gerar imagens com o Kiwi. Verifique o status do SELinux com getenforce e desative-o antes de executar o processo de build com setenforce 0.

  • Host de build não registrado: O processo de build usa as assinaturas do host de build para conseguir extrair pacotes do SUSE SCC. Se o host não estiver registrado, ele falhará.

  • Falha no teste do dispositivo de loop: Na primeira vez que o processo de build do Kiwi for executado, ele falhará logo após o início com \"ERROR: Falha no teste inicial do dispositivo de loop, por favor, tente novamente executar o contêiner.", este é um sintoma de dispositivos de loop sendo criados no sistema host subjacente que não são imediatamente visíveis dentro da imagem do contêiner. Execute o processo de build do Kiwi novamente e ele deverá prosseguir sem problemas.

  • Permissões ausentes: O processo de build espera ser executado como usuário root (ou via sudo).

  • Privilégios incorretos: O processo de build espera a flag --privileged ao executar o contêiner. Verifique novamente se ela está presente.

Registros
  • Logs do contêiner de build: Verifique os logs do contêiner de build. Os logs são gerados no diretório que foi usado para armazenar os artefatos. Verifique também os logs do docker ou os logs do podman para obter as informações necessárias.

  • Diretórios de build temporários: O Kiwi cria diretórios temporários durante o processo de build. Verifique-os em busca de logs ou artefatos intermediários se a saída principal for insuficiente.

Etapas de solução de problemas
  1. Revisar saída do build-image: A mensagem de erro na saída do console geralmente é muito indicativa.

  2. Verificar ambiente de build: Certifique-se de que todos os pré-requisitos para o próprio Kiwi (por exemplo, docker/podman, SELinux, espaço em disco suficiente) sejam atendidos na máquina que executa o Kiwi.

  3. Inspecionar logs do contêiner de build: Revise os logs do contêiner que falhou para obter erros mais detalhados (veja acima).

  4. Verificar arquivo de definição: Se você estiver usando um arquivo de definição de imagem Kiwi personalizado, verifique novamente o arquivo em busca de erros de digitação ou sintaxe.

36 Solução de problemas do Edge Image Builder (EIB)

O EIB é usado para criar SUSE Edge imagens personalizadas.

Problemas comuns
  • Código SCC incorreto: Certifique-se de que o código SCC usado no arquivo de definição do EIB corresponda à versão e arquitetura do SL Micro.

  • Dependências ausentes: Certifique-se de que não haja pacotes ou ferramentas ausentes no ambiente de compilação.

  • Tamanho de imagem incorreto: Para imagens raw, o parâmetro diskSize é obrigatório e depende muito das imagens, RPMs e outros artefatos incluídos na imagem.

  • Permissões: Se armazenar um script no diretório custom/files, certifique-se de que ele tenha permissões de execução, pois esses arquivos ficam disponíveis apenas no momento da combustão, mas nenhuma alteração é realizada pelo EIB.

  • Dependências de grupo do sistema operacional: Ao criar uma imagem com usuários e grupos personalizados, os grupos definidos como “primaryGroup” devem ser criados explicitamente.

  • As chaves SSH do usuário do sistema operacional exigem uma pasta home: Ao criar uma imagem com usuários com chaves SSH, a pasta home também precisa ser criada com createHomeDir=true.

  • Problemas de combustão: O EIB depende da combustão para a personalização do SO e a implantação de todos os outros componentes SUSE Edge. Isso também inclui scripts personalizados sendo colocados na pasta custom/scripts. Observe que o processo de combustão está sendo executado no momento initrd, portanto, o sistema não está completamente inicializado quando os scripts são executados.

  • Tamanho da máquina Podman: Conforme explicado na seção de Dicas e Truques do EIB (Parte IV, “Dicas e truques”), verifique se a máquina podman tem CPU/memória suficiente para executar o contêiner EIB em sistemas operacionais que não sejam Linux.

  • Imagem incorreta: Certifique-se de que a imagem base sendo usada esteja corretamente baixada verificando o checksum. Se você estiver criando a imagem com kiwi-builder (Capítulo 26, Criando imagens atualizadas do SUSE Linux Micro com o Kiwi), verifique também o arquivo de soma gerado pelo processo.

Registros
  • Saída do EIB: A saída do console do comando eib build é crucial.

  • Logs do contêiner de compilação: Verifique os logs do contêiner de compilação. Os logs são gerados no diretório que foi usado para armazenar os artefatos. Verifique docker logs ou podman logs para obter as informações necessárias também.

    Nota
    Nota

    Para obter mais informações, consulte Depuração.

  • Diretórios temporários de compilação: O EIB cria diretórios temporários durante o processo de compilação. Verifique-os em busca de logs intermediários ou artefatos se a saída principal for insuficiente.

  • Logs de combustão: Se a imagem sendo criada com o EIB não inicializar por qualquer motivo, um shell root estará disponível. Conecte-se ao console do host (seja fisicamente, via BMC, etc.) e verifique os logs de combustão com journalctl -u combustion e, em geral, todos os logs do sistema operacional com journalctl para encontrar a causa raiz da falha.

Etapas de solução de problemas
  1. Analise a saída de eib-build: A mensagem de erro na saída do console geralmente é muito indicativa.

  2. Verificar ambiente de compilação: Certifique-se de que todos os pré-requisitos para o próprio EIB (por exemplo, docker/podman, espaço em disco suficiente) sejam atendidos na máquina que executa o EIB.

  3. Inspecionar logs do contêiner de compilação: Analise os logs do contêiner com falha para obter erros mais detalhados (veja acima).

  4. Verificar configuração de eib: Verifique novamente o arquivo de configuração eib em busca de erros de digitação ou caminhos incorretos para arquivos de origem ou scripts de compilação.

    • Testar componentes individualmente: Se a compilação do EIB envolver scripts ou estágios personalizados, execute-os de forma independente para isolar falhas.

37 Solução de problemas de rede de borda (NMC)

O NMC é injetado em imagens SL Micro EIB para configurar a rede dos hosts de borda no momento da inicialização via combustion. Ele também está sendo executado no fluxo de trabalho Metal3 como parte do processo de inspeção. Problemas podem ocorrer quando o host está sendo inicializado pela primeira vez ou no processo de inspeção do Metal3.

Problemas comuns
  • Host não consegue inicializar corretamente na primeira vez: Arquivos de definição de rede malformados podem levar a falha na fase de combustion e, então, o host abre um shell root.

  • Os arquivos não são gerados corretamente: Certifique-se de que os arquivos de rede correspondam ao formato NMState.

  • As interfaces de rede não estão configuradas corretamente: Certifique-se de que os endereços MAC correspondam às interfaces sendo usadas no host.

  • Incompatibilidade entre os nomes das interfaces: O SL Micro habilita o Esquema de Nomenclatura Previsível para Interfaces de Rede por padrão, portanto, não existe mais eth0, mas outros esquemas de nomenclatura, como enp2s0.

Registros
  • Logs do combustion: Como o NMC é usado no momento do combustion, verifique os logs do combustion com journalctl -u combustion no host que está sendo provisionado.

Etapas de solução de problemas
  1. Verifique a sintaxe yaml: os arquivos de configuração do NMC são arquivos yaml, verifique a sintaxe correta com yamllint ou ferramentas similares.

  2. Execute o NMC manualmente: Como o NMC faz parte do contêiner EIB, para depurar quaisquer problemas, um comando podman local pode ser usado.

    1. Crie uma pasta temporária para armazenar os arquivos do NMC.

      mkdir -p ${HOME}/tmp/foo
    2. Salve os arquivos do NMC nesse local.

      ❯ tree --noreport ${HOME}/tmp/foo
      /Users/johndoe/tmp/foo
      ├── host1.example.com.yaml
      └── host2.example.com.yaml
    3. Execute o contêiner EIB com o NMC como o ponto de entrada e o comando generate para realizar as mesmas tarefas que o NMC faria no momento do combustion:

      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. Observe os logs e os arquivos sendo gerados na pasta temporária.

38 Resolução de problemas em cenários de Phone-Home

Cenários de Phone-Home envolvem o uso do Elemental para conectar de volta ao cluster de Gerenciamento e o uso do EIB para criar uma imagem de SO, incluindo os bits de elemental-registration. Problemas podem ocorrer quando o host está sendo inicializado pela primeira vez, durante o processo de criação do EIB ou ao tentar registrar no cluster de Gerenciamento.

Problemas comuns
  • O sistema falha ao se registrar: O nó não está sendo registrado na interface do usuário. Certifique-se de que o host esteja inicializado corretamente e seja capaz de se comunicar de volta com o Rancher, que o relógio esteja sincronizado e que os serviços do Elemental estejam ok.

  • O sistema falha ao ser provisionado: O nó está registrado, mas falha ao ser provisionado. Certifique-se de que o host seja capaz de se comunicar de volta com o Rancher, que o relógio esteja sincronizado e que os serviços do Elemental estejam ok.

Registros
  • Logs do sistema: journalctl

  • Logs do Elemental-system-agent: journalctl -u elemental-system-agent

  • Logs do K3s/RKE2: journalctl -u k3s or journalctl -u rke2-server (ou rke2-agent)

  • Pod do operador Elemental: kubectl logs -n cattle-elemental-system -l app=elemental-operator

Etapas de solução de problemas
  1. Revisar logs: Verifique os logs do pod do Operador Elemental para ver se há algum problema. Verifique os logs do host se o nó estiver inicializado.

  2. Verificar MachineRegistration e TPM: Por padrão, o TPM é usado para autenticação, mas existem alternativas para hosts sem TPM.

39 Solucionando problemas de outros componentes

Guias de solução de problemas de outros SUSE Edge componentes podem ser consultados em sua documentação oficial:

Você também pode consultar a Base de Conhecimento SUSE.

40 Coleta de diagnósticos para suporte

Ao entrar em contato com o Suporte da SUSE, fornecer informações de diagnóstico abrangentes é crucial.

Informações essenciais a serem coletadas
  • Descrição detalhada do problema: O que aconteceu, quando aconteceu, o que você estava fazendo, qual é o comportamento esperado e qual é o comportamento real?

  • Passos para reproduzir: Você consegue reproduzir o problema de forma confiável? Se sim, liste os passos exatos.

  • Versões dos componentes: SUSE Edge versão, versões dos componentes (RKE2/K3, EIB, Metal3, Elemental,..).

  • Logs relevantes:

    • journalctl saída (filtrada por serviço, se possível, ou logs de inicialização completos).

    • Logs de pod do Kubernetes (kubectl logs).

    • Logs de componentes Metal³/Elemental.

    • Logs de compilação do EIB e outros logs

  • Informações sobre o sistema:

    • uname -a

    • df -h

    • ip a

    • /etc/os-release

  • Arquivos de configuração: Arquivos de configuração relevantes para Elemental, Metal3, EIB, como valores de helm chart, configmaps, etc.

  • Informações do Kubernetes: Nós, Serviços, Implantações, etc.

  • Objetos do Kubernetes afetados: BMH, MachineRegistration, etc.

Como coletar
  • Para logs: Redirecione a saída do comando para arquivos (por exemplo, journalctl -u k3s > k3s_logs.txt).

  • Para recursos do Kubernetes: Use kubectl get <resource> -o yaml > <resource_name>.yaml para obter definições YAML detalhadas.

  • Para informações do sistema: Colete a saída dos comandos listados acima.

  • Para SL Micro: Consulte a documentação SUSE Linux Micro Troubleshooting Guide sobre como coletar informações do sistema para suporte com supportconfig.

  • Para RKE2/Rancher: Consulte o artigo The Rancher v2.x Linux log collector script para executar o script de coleta de logs do Rancher v2.x Linux.

  • Para Edge (Nessie): O Nessie 1.1.0 é uma ferramenta de diagnóstico poderosa projetada para coletar logs e dados de configuração de ambientes SUSE Edge. Ele reúne informações abrangentes tanto do sistema host quanto dos clusters Kubernetes, tornando-o inestimável para solução de problemas e suporte.

    • O Nessie possui dois "modos": um modo kubernetes e um modo de sistema.

      • Para coletar logs de um cluster SUSE Edge, execute (desde que você tenha acesso ao arquivo 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 os caminhos do arquivo k3s.yaml/rke2.yaml, se necessário. Consulte Nessie para obter mais informações. Você deve conseguir executar este contêiner em modo não privilegiado se tiver as permissões adequadas (normalmente os arquivos k3s.yaml / rke2-server.yaml pertencem ao [root]).

      • Para coletar logs no modo de sistema a partir do sistema operacional real, execute:

        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

        Certifique-se de verificar Nessie para obter mais detalhes e informações sobre como executar o Nessie em seu ambiente. Da mesma forma, você deve conseguir executar este contêiner em modo não privilegiado, desde que tenha as permissões adequadas.

Contatar Suporte. Verifique o artigo disponível em Procedimentos para trabalhar efetivamente com o Suporte Técnico da SUSE e o manual de suporte localizado em SUSE Technical Support Handbook para obter mais detalhes sobre como entrar em contato com o suporte da SUSE.

Parte VIII Apęndice

  • 41 Notas de versão
  • SUSE Edge 3.6 é uma solução de ponta a ponta fortemente integrada e abrangentemente validada para abordar os desafios únicos da implantação de infraestrutura e aplicativos nativos de nuvem na borda. Seu foco principal é fornecer uma plataforma opinativa, porém altamente flexível, altamente escalável…

41 Notas de versão

41.1 Abstrato

SUSE Edge 3.6 é uma solução de ponta a ponta fortemente integrada e abrangentemente validada para abordar os desafios únicos da implantação de infraestrutura e aplicativos nativos de nuvem na borda. Seu foco principal é fornecer uma plataforma opinativa, porém altamente flexível, altamente escalável e segura que abrange a construção de imagem de implantação inicial, provisionamento e integração de nós, implantação de aplicativos, observabilidade e gerenciamento de ciclo de vida.

A solução foi projetada com a noção de que não existe uma plataforma de borda de "tamanho único" devido aos requisitos e expectativas amplamente variados de nossos clientes. As implantações de borda nos levam a resolver, e evoluir continuamente, alguns dos problemas mais desafiadores, incluindo escalabilidade massiva, disponibilidade de rede restrita, restrições de espaço físico, novas ameaças de segurança e vetores de ataque, variações na arquitetura de hardware e recursos do sistema, o requisito de implantar e interagir com infraestrutura e aplicativos legados, e soluções de clientes que possuem vida útil estendida.

O SUSE Edge é construído sobre o melhor software de código aberto desde o início, consistente com nossa história de 30 anos na entrega de plataformas SUSE Linux seguras, estáveis e certificadas e nossa experiência no fornecimento de gerenciamento de Kubernetes altamente escalável e rico em recursos com nosso portfólio Rancher. O SUSE Edge baseia-se nessas capacidades para fornecer funcionalidade que pode atender a um grande número de segmentos de mercado, incluindo varejo, médico, transporte, logística, telecomunicações, manufatura inteligente e IoT Industrial.

Para obter mais informações sobre atualizações do ciclo de vida de suporte do produto para SUSE Edge, consulte Product Support Lifecycle.

Nota
Nota

O SUSE Telco Cloud é um derivado do SUSE Edge, com otimizações e componentes adicionais que permitem que a plataforma atenda aos requisitos encontrados em casos de uso de telecomunicações.

41.2 Sobre

Estas Notas de Lançamento são, a menos que explicitamente especificado e explicado, idênticas em todas as arquiteturas, e a versão mais recente, juntamente com as notas de lançamento de todos os outros produtos SUSE, estão sempre disponíveis online em https://www.suse.com/releasenotes.

As entradas são listadas apenas uma vez, mas podem ser referenciadas em vários lugares se forem importantes e pertencerem a mais de uma seção. As notas de lançamento geralmente listam apenas as alterações que ocorreram entre dois lançamentos subsequentes. Algumas entradas importantes das notas de lançamento de versões anteriores do produto podem ser repetidas. Para tornar essas entradas mais fáceis de identificar, elas contêm uma nota para esse efeito.

No entanto, as entradas repetidas são fornecidas apenas como uma cortesia. Portanto, se você estiver pulando um ou mais lançamentos, verifique também as notas de lançamento dos lançamentos ignorados. Se você estiver lendo apenas as notas de lançamento da versão atual, poderá perder alterações importantes que podem afetar o comportamento do sistema. As versões SUSE Edge são definidas como x.y.z, onde 'x' denota a versão principal, 'y' denota a versão secundária e 'z' denota a versão de patch, também conhecida como "z-stream". Os ciclos de vida do produto SUSE Edge são definidos com base em um determinado lançamento secundário, por exemplo. "3.6", mas são fornecidos com atualizações de patch subsequentes ao longo de seu ciclo de vida, por exemplo. "3.6.1".

Nota
Nota

Os lançamentos z-stream do SUSE Edge são fortemente integrados e completamente testados como uma pilha versionada. Fazer upgrade de quaisquer componentes individuais para versões diferentes daquelas listadas acima provavelmente resultará em tempo de inatividade do sistema. Embora seja possível executar clusters Edge em configurações não testadas, isso não é recomendado e pode levar mais tempo para fornecer uma resolução por meio dos canais de suporte.

41.3 Release 3.6.1

Data de disponibilidade: 26 de junho de 2026

Data de término do suporte completo: 27 de novembro de 2026

Data de término do suporte de manutenção: 27 de maio de 2028

EOL: 28 de maio de 2028

Resumo: SUSE Edge 3.6.1 é a primeira versão z-stream no fluxo de versão SUSE Edge 3.6.

41.3.1 Novos recursos

41.3.2 Correções de bug e atualizações de segurança

41.3.3 Problemas conhecidos

Atenção
Atenção

Se estiver implantando novos clusters, siga Capítulo 26, Criando imagens atualizadas do SUSE Linux Micro com o Kiwi para criar imagens novas primeiro. Isso é sugerido para clusters de gerenciamento e downstream para garantir que as imagens contenham as correções de segurança e bugs mais recentes.

  • Ao implantar via Edge Image Builder, os manifestos HelmChartConfigs podem falhar se forem colocados no diretório de configuração kubernetes/manifests. Em vez disso, recomenda-se colocar qualquer HelmChartConfigs em /var/lib/rancher/{rke2/k3s}/server/manifests/ usando a interface os-files do EIB. A falha em fazer isso pode fazer com que os nós permaneçam no estado NotReady na inicialização inicial, conforme discutido em #8357 problema do RKE2.

  • Nas versões RKE2/K3s 1.34 e 1.35, o diretório /etc/cni usado para armazenar configurações de CNI pode não disparar uma notificação dos arquivos sendo gravados lá para containerd devido a certas condições relacionadas ao overlayfs (consulte o #8356 problema do RKE2). Isso, por sua vez, faz com que a implantação do RKE2/K3s fique travada aguardando a inicialização do CNI, e os nós do RKE2/K3s permaneçam no estado NotReady. Isso pode ser visto no nível do nó com 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 solução alternativa, um volume tmpfs pode ser montado no diretório /etc/cni antes que o RKE2 seja iniciado. Isso evita o uso de overlayfs, o que faz com que o containerd perca notificações, e as configurações devem ser reescritas toda vez que o nó for reiniciado e os initcontainers dos pods forem executados novamente. Se estiver usando o EIB, isso pode ser um script 04-tmpfs-cni.sh no diretório custom/scripts (conforme explicado aqui) que se parece com:

#!/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
  • Não há documentação ou exemplos oficiais para configurar o SyncE via synce4l e GNSS via gpsd disponíveis neste estágio. Esses tópicos serão abordados em versões futuras.

  • Alguns repositórios de contêineres estão acessíveis atualmente apenas via IPv4; por esse motivo, um repositório local no Cluster de Gerenciamento é necessário para um cluster downstream apenas com IPv6.

41.3.4 Versões dos componentes

A tabela a seguir descreve os componentes individuais que compõem a versão 3.6.1, incluindo a versão, a versão do gráfico Helm (se aplicável) e de onde o artefato lançado pode ser extraído no formato binário. Siga a documentação associada para exemplos de uso e implantação.

Nome

Versão

Versão do gráfico Helm

Local do artefato (URL/Imagem)

SUSE Linux Micro

6.2 (mais recente)

N/A

Página de download do SUSE Linux Micro

SUSE Linux Micro

6.2 (mais recente)

N/A

Checksums e assinaturas estão disponíveis para download na Página de download do 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/A

Página de download do SUSE Multi-Linux Manager

K3s

1.35.4

N/A

Versão upstream do K3s

RKE2

1.35.4

N/A

Versão upstream do RKE2

SUSE Rancher Prime

2.14.2

2.14.2

Repositório Helm do 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

Repositório Helm do SUSE Storage
https://apps.rancher.io/applications/suse-storage/components[Imagens de contêiner do SUSE Storage]

SUSE Security (NeuVector)

5.5.2

109.0.2+up2.10.2

Repositório Helm de Charts do Rancher
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

Provedores do 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

Extensão do Painel Elemental

3.0.1

3.0.1

Helm Chart da Extensão Elemental

Edge Image Builder

1.3.3.1

N/A

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

Extensão do Painel 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

Containerized Data Importer (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 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 Rede 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 Atualização do Sistema

0.19.1

109.0.1

Repositório Helm de Charts do Rancher
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[Repositório Helm do 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/A

registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1

Cert-Manager

1.20.1

1.20.1

Repositório Helm 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 Release 3.6.0

Data de disponibilidade: 27 de maio de 2026

Data de término do suporte completo: 27 de novembro de 2026

Data de término do suporte de manutenção: 27 de maio de 2028

EOL: 28 de maio de 2028

Resumo: SUSE Edge 3.6.0 é a primeira versão no fluxo de lançamentos 3.6.

41.4.1 Novos recursos

  • Atualizado para Kubernetes 1.35.3 e Rancher Prime 2.14.1

  • Atualizado para SUSE Security (NeuVector) 5.5.1 Notas de Lançamento do NeuVector

  • Atualizado para SUSE Storage (Longhorn) 1.11.1 Notas de Lançamento do Longhorn Upstream

  • Atualizado para Rancher Turtles (CAPI) 0.26.1 Documentação do Rancher Turtles

  • Atualizado para MetalLB 0.15.3 Notas de Lançamento Upstream

  • Atualizado para KubeVirt 1.7.0 e CDI (Containerized Data Importer) 1.64.0

  • Atualizado para Elemental 1.9.0 Notas de Lançamento do Elemental

  • Atualizado para Cert-Manager 1.20.1 Notas de Lançamento Upstream

  • Atualizado Metal3/Ironic para 0.15.0 com Ironic 35.0.0

  • O modo BGP para MetalLB era uma Prévia Tecnológica no SUSE Edge 3.5 e agora é totalmente suportado

  • O Precision Time Protocol (PTP) em implantações downstream era uma Prévia Tecnológica no SUSE Edge 3.5 e agora é totalmente suportado, juntamente com o suporte a SyncE e GNSS

  • Implantações de cluster downstream IPv6 de pilha única agora são suportadas, no entanto, observe que isso requer um cluster de gerenciamento de pilha dupla (clusters de gerenciamento de pilha única permanecem como uma Prévia Tecnológica)

41.4.2 Correções de bug e segurança

41.4.3 Problemas conhecidos

Atenção
Atenção

Se estiver implantando novos clusters, siga Capítulo 26, Criando imagens atualizadas do SUSE Linux Micro com o Kiwi para criar novas imagens primeiro. Isso é sugerido para clusters de gerenciamento e downstream para garantir que as imagens contenham as correções de segurança e de bug mais recentes.

  • Ao implantar via Edge Image Builder, os manifestos HelmChartConfigs podem falhar se forem colocados no diretório de configuração kubernetes/manifests. Em vez disso, recomenda-se colocar qualquer HelmChartConfigs em /var/lib/rancher/{rke2/k3s}/server/manifests/ usando a interface os-files do EIB. Falhar em fazer isso pode fazer com que os nós permaneçam no estado NotReady na inicialização inicial, conforme discutido em #8357 problema do RKE2.

  • Nas versões RKE2/K3s 1.34 e 1.35, o diretório /etc/cni usado para armazenar configurações de CNI pode não disparar uma notificação dos arquivos gravados para containerd devido a certas condições relacionadas ao overlayfs (consulte o #8356 problema do RKE2). Isso, por sua vez, faz com que a implantação do RKE2/K3s fique travada aguardando a inicialização do CNI, e os nós do RKE2/K3s permaneçam no estado NotReady. Isso pode ser visto no nível do nó com 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 solução alternativa, um volume tmpfs pode ser montado no diretório /etc/cni antes que o RKE2 seja iniciado. Isso evita o uso de overlayfs, o que faz com que o containerd perca notificações, e as configurações devem ser reescritas toda vez que o nó for reiniciado e os initcontainers dos pods forem executados novamente. Se estiver usando o EIB, isso pode ser um script 04-tmpfs-cni.sh no diretório custom/scripts (conforme explicado aqui) que se parece com:

#!/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
  • Não há documentação ou exemplos oficiais para configurar o SyncE via synce4l e GNSS via gpsd disponíveis neste estágio; esses tópicos serão abordados em versões futuras.

  • Alguns repositórios de contêiner estão acessíveis atualmente apenas via IPv4; por esse motivo, um repositório local no Cluster de Gerenciamento é necessário para um cluster downstream somente com IPv6.

41.4.4 Versões dos Componentes

A tabela a seguir descreve os componentes individuais que compõem a versão 3.6.0, incluindo a versão, a versão do gráfico Helm (se aplicável) e de onde o artefato lançado pode ser extraído no formato binário. Siga a documentação associada para exemplos de uso e implantação.

Nome

Versão

Versão do Gráfico Helm

Local do artefato (URL/Imagem)

SUSE Linux Micro

6.2 (mais recente)

N/A

Página de download do SUSE Linux Micro

SUSE Linux Micro

6.2 (mais recente)

N/A

Checksums e assinaturas estão disponíveis para download na Página de download do 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/A

Página de download do SUSE Multi-Linux Manager

K3s

1.35.3

N/A

Versão upstream do K3s

RKE2

1.35.3

N/A

Versão upstream do RKE2

SUSE Rancher Prime

2.14.1

2.14.1

Repositório Helm do 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

Repositório Helm do SUSE Storage
https://apps.rancher.io/applications/suse-storage/components[Imagens de Contêiner do SUSE Storage]

SUSE Security (NeuVector)

5.5.1

109.0.1+up2.8.13

Repositório Helm de Charts do Rancher
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

Provedores do 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

Extensão do Painel Elemental

3.0.1

3.0.1

Helm Chart da Extensão Elemental

Edge Image Builder

1.3.3.1

N/A

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

Extensão do Painel 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

Containerized Data Importer (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 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 Rede 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

Repositório Helm de Charts do Rancher
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[Repositório Helm do 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/A

registry.suse.com/edge/3.6/kiwi-builder:10.2.29.1

Cert-Manager

1.20.1

1.20.1

Repositório Helm 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 Recursos removidos

Salvo indicação em contrário, estes se aplicam à versão 3.6.0 e a todas as versões z-stream subsequentes.

  • O Akri era uma oferta de Technology Preview em versões anteriores do Edge e foi descontinuado a partir da 3.4.0. Ele foi completamente removido da oferta.

41.6 Prévias de tecnologia

Salvo indicação em contrário, estes se aplicam à versão 3.6.0 e a todas as versões z-stream subsequentes.

  • Implantações de cluster de gerenciamento IPv6 de pilha única são uma oferta de Technology Preview e não estão sujeitas ao escopo padrão de suporte.

41.7 Verificação de componentes

Os componentes mencionados acima podem ser verificados usando os dados da Lista de Materiais de Software (SBOM) - por exemplo, usando cosign conforme descrito abaixo:

Baixe a chave pública do contêiner SUSE Edge da fonte de chaves de assinatura da 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 o hash da imagem do contêiner, por exemplo, usando 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 imagens multi-arquitetura, também é necessário especificar uma plataforma ao obter o digest, por exemplo, --platform linux/amd64 ou --platform linux/arm64. A falha em fazer isso resultará em um erro na etapa a seguir (Error: no matching attestations).

Verifique com 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

Extraia os dados da SBOM conforme descrito na documentação da SBOM da 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 Etapas de Atualização

Consulte o Parte VI, “Operações do Dia 2” para obter detalhes sobre como fazer upgrade para uma nova versão.

41.9 Ciclo de vida de suporte de produtos

O SUSE Edge conta com o suporte premiado da SUSE, uma líder tecnológica estabelecida com um histórico comprovado de entrega de serviços de suporte com qualidade empresarial. Para mais informações, consulte https://www.suse.com/lifecycle e a página da Política de Suporte em https://www.suse.com/support/policy.html. Se você tiver alguma dúvida sobre como abrir um caso de suporte, como a SUSE classifica os níveis de severidade ou o escopo do suporte, consulte o Manual de Suporte Técnico em https://www.suse.com/support/handbook/.

O SUSE Edge \"3.6\" é suportado por 24 meses de suporte de produção, com 6 meses iniciais de \"suporte completo\", seguidos por 18 meses de \"suporte de manutenção\". Após essas fases de suporte, o produto atinge o "fim do serviço" (EOL) e não é mais suportado. Mais informações sobre as fases do ciclo de vida podem ser encontradas na tabela abaixo:

Suporte Completo (6 meses)

Correções de bugs urgentes e de alta prioridade selecionadas serão lançadas durante a janela de suporte completo, e todos os outros patches (não urgentes, melhorias, novos recursos) serão lançados por meio do cronograma de lançamento regular.

Suporte de Manutenção (18 meses)

Durante este período, apenas correções críticas serão lançadas por meio de patches. Outras correções de bugs podem ser lançadas a critério da SUSE, mas não devem ser esperadas.

Fim do Serviço (EOL)

Assim que uma versão de produto atinge sua data de Fim do Serviço (EOL), o cliente pode continuar a usar o produto dentro dos termos do contrato de licenciamento do produto. Os Planos de Suporte da SUSE não se aplicam a versões de produtos após sua data de EOL.

A menos que explicitamente declarado, todos os componentes listados são considerados Geralmente Disponíveis (GA) e são cobertos pelo escopo padrão de suporte da SUSE. Alguns componentes podem ser listados como "Technology Preview", onde a SUSE fornece aos clientes acesso a recursos e funcionalidades pré-GA iniciais para avaliação, mas não estão sujeitos às políticas de suporte padrão e não são recomendados para casos de uso em produção. A SUSE aceita muito bem comentários e sugestões sobre as melhorias que podem ser feitas nos componentes de Technology Preview, mas a SUSE reserva-se o direito de descontinuar um recurso de Technology Preview antes que ele se torne Geralmente Disponível se ele não atender às necessidades de nossos clientes ou não atingir um estado de maturidade que exigimos.

Observe que a SUSE deve ocasionalmente descontinuar recursos ou alterar especificações de API. Os motivos para a descontinuação de recursos ou alteração de API podem incluir um recurso sendo atualizado ou substituído por uma nova implementação, um novo conjunto de recursos, a tecnologia upstream não estar mais disponível ou a comunidade upstream ter introduzido alterações incompatíveis. Não se pretende que isso aconteça dentro de uma determinada versão secundária (x.z), portanto, todas as versões z-stream manterão a compatibilidade de API e a funcionalidade de recursos. A SUSE se esforçará para fornecer avisos de descontinuação com bastante antecedência nas notas de versão, juntamente com soluções alternativas, sugestões e mitigações para minimizar a interrupção do serviço.

A equipe SUSE Edge também aceita comentários da comunidade, onde problemas podem ser levantados no respectivo repositório de código dentro de https://www.github.com/suse-edge.

41.10 Obtenção de código-fonte

Este produto SUSE inclui materiais licenciados para a SUSE sob a GNU General Public License (GPL) e várias outras licenças de código aberto. A GPL exige que a SUSE forneça o código-fonte que corresponde ao material licenciado pela GPL e que a SUSE esteja em conformidade com todos os outros requisitos de licença de código aberto. Como tal, a SUSE disponibiliza todo o código-fonte, que geralmente pode ser encontrado no repositório GitHub SUSE Edge (https://www.github.com/suse-edge), no repositório GitHub do SUSE Rancher (https://www.github.com/rancher) para componentes dependentes e, especificamente, para o SUSE Linux Micro, o código-fonte está disponível para download em https://www.suse.com/download/sle-micro na "Medium 2".

41.11 Informações legais

A SUSE não faz representações ou garantias quanto ao conteúdo ou à utilização desta documentação e, especificamente, isenta-se de quaisquer garantias explícitas ou implícitas de comerciabilidade ou adequação a qualquer propósito específico. Além disso, a SUSE reserva-se o direito de revisar esta publicação e de fazer mudanças em seu conteúdo a qualquer momento, sem a obrigação de notificar qualquer pessoa ou entidade sobre essas revisões ou mudanças.

Além disso, a SUSE não faz representações ou garantias quanto a qualquer software e, especificamente, isenta-se de quaisquer garantias explícitas ou implícitas de comerciabilidade ou adequação a qualquer propósito específico. Além disso, a SUSE reserva-se o direito de fazer mudanças em qualquer parte do software SUSE, a qualquer momento, sem a obrigação de notificar qualquer pessoa ou entidade sobre essas mudanças.

Todos os produtos ou as informaçőes técnicas fornecidas neste Contrato podem estar sujeitas aos controles de exportação dos Estados Unidos e ŕs leis de comércio de outros países. Você concorda em obedecer a todos os regulamentos de controle de exportação e em obter quaisquer licenças ou classificações necessárias para exportar, reexportar ou importar produtos. Você concorda em não exportar ou reexportar para entidades nas listas de exclusão de exportação atuais dos Estados Unidos ou para países sob embargo ou considerados terroristas, conforme especificado nas leis de exportação dos Estados Unidos. Você concorda em não usar entregáveis para fins proibidos relacionados a armas nucleares, mísseis ou armamentos químicos/biológicos. Consulte https://www.suse.com/company/legal/ para obter mais informações sobre a exportação do software SUSE. A SUSE não assume qualquer responsabilidade caso você não obtenha as aprovações necessárias para exportação.

Copyright © 2024 SUSE LLC.

Este documento de notas de versão está licenciado sob uma Licença Creative Commons Atribuição-SemDerivações 4.0 Internacional (CC-BY-ND-4.0). Você deve ter recebido uma cópia da licença juntamente com este documento. Caso não tenha recebido, consulte https://creativecommons.org/licenses/by-nd/4.0/.

A SUSE possui direitos de propriedade intelectual relacionados à tecnologia incorporada ao produto descrito neste documento. Em particular, e sem limitações, esses direitos de propriedade intelectual podem incluir uma ou mais patentes dos EUA listadas em https://www.suse.com/company/legal/ e uma ou mais patentes adicionais ou pedidos de patentes pendentes nos EUA e em outros países.

Para marcas registradas da SUSE, consulte a lista de Marcas Registradas e Marcas de Serviço da SUSE (https://www.suse.com/company/legal/). Todas as marcas registradas de terceiros pertencem aos seus respectivos proprietários. Para obter informações sobre a marca SUSE e requisitos de uso, consulte as diretrizes publicadas em https://brand.suse.com/.