- SUSE Edge 3.6 Documentação
- I Inicializações rápidas
- II Componentes
- 4 Rancher
- 5 Extensões do Dashboard do Rancher
- 6 Fleet
- 7 SUSE Linux Micro
- 8 Edge Image Builder
- 9 Rede de borda
- 10 Elemental
- 11 K3s
- 12 RKE2
- 13 SUSE Storage
- 14 SUSE Security
- 15 MetalLB
- 16 Operador Endpoint Copier
- 17 virtualização de borda
- 18 Upgrade Controller do Sistema
- 19 Upgrade Controller
- 19.1 Como o SUSE Edge usa o Upgrade Controller?
- 19.2 Upgrade Controller vs System Upgrade Controller
- 19.3 Instalando o Upgrade Controller
- 19.4 Instalando o Upgrade Controller via Edge Image Builder
- 19.5 Como funciona o Upgrade Controller?
- 19.6 Extensões da API do Kubernetes
- 19.7 Acompanhando o processo de atualização
- 19.8 Limitações conhecidas
- 20 SUSE Multi-Linux Manager
- III Guias de procedimentos
- 21 MetalLB no K3s (usando o modo camada 2)
- 22 MetalLB no K3s (usando modo de camada 3)
- 23 MetalLB no K3s (usando o modo FRR-K8s)
- 24 MetalLB na frente do servidor de API do Kubernetes
- 25 Implantações air-gapped com o Edge Image Builder
- 25.1 Intro
- 25.2 Pré-requisitos
- 25.3 Configuração de rede Libvirt
- 25.4 Configuração do diretório de base
- 25.5 Arquivo de definição de base
- 25.6 Instalação do Rancher
- 25.7 Instalação do SUSE Security
- 25.8 Instalação do SUSE Storage
- 25.9 Instalação do KubeVirt e CDI
- 25.10 Instalação do SUSE Private Registry
- 25.11 Solução de problemas
- 26 Criando imagens atualizadas do SUSE Linux Micro com o Kiwi
- IV Dicas e truques
- V Integração com terceiros
- VI Operações do Dia 2
- VII Solução de problemas
- 34 Princípios Gerais de Solução de Problemas
- 35 Solucionando problemas do Kiwi
- 36 Solução de problemas do Edge Image Builder (EIB)
- 37 Solução de problemas de rede de borda (NMC)
- 38 Resolução de problemas em cenários de Phone-Home
- 39 Solucionando problemas de outros componentes
- 40 Coleta de diagnósticos para suporte
- VIII Apęndice
- 32.1 Implantar Bundle através da interface do Rancher
- 32.2 Bundle implantado com sucesso
- 32.3 Logs para o gráfico Longhorn que foi submetido a fazer upgrade com sucesso
- 33.1 Implantar Bundle através da interface do Rancher
- 33.2 Bundle implantado com sucesso
- 33.3 Logs para o gráfico Longhorn que foi submetido a fazer upgrade com sucesso
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 #
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 #
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 Kernelpara 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 #
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":
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.
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.
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).
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:
Rancher (Capítulo 4, Rancher)
Extensões do Painel do Rancher (Capítulo 5, Extensões do Dashboard do Rancher)
SUSE Multi-Linux Manager
Fleet (Capítulo 6, Fleet)
SUSE Linux Micro (Capítulo 7, SUSE Linux Micro)
Edge Image Builder (Capítulo 8, Edge Image Builder)
NetworkManager Configurator (Capítulo 9, Rede de borda)
Elemental (Capítulo 10, Elemental)
K3s (Capítulo 11, K3s)
RKE2 (Capítulo 12, RKE2)
SUSE Storage (Capítulo 13, SUSE Storage)
SUSE Security (Capítulo 14, SUSE Security)
MetalLB (Capítulo 15, MetalLB)
KubeVirt (Capítulo 17, virtualização de borda)
Controlador de Atualização do Sistema (Capítulo 18, Upgrade Controller do Sistema)
Upgrade Controller (Capítulo 19, Upgrade Controller)
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 #
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
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.
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.
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=trueEm 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.2Se 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.01.5.1 (Opcional) Instale a extensão da GUI do Elemental #
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:
Na guia "Disponível" nesta página, clique em "Instalar" no cartão do Elemental:
Confirme que você deseja instalar a extensão:
Após a instalação, você será solicitado a recarregar a página.
Após recarregar, você pode acessar a extensão Elemental através do app global "Gerenciamento de SO".
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 $ELEMPara 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.yamlO 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
Na extensão de Gerenciamento de SO, clique em "Criar Endpoint de Registro":
Dê um nome a esta configuração.
NotaVocê 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.
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.
Clique em "Criar" para salvar a configuração.
Assim que o registro for criado, você deverá ver a URL de Registro listada e poderá clicar em "Copiar" para copiar o endereço:
DicaSe 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.
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/elementalcurl $REGISURL -o $ELEM/eib_quickstart/elemental/elemental_config.yamlcat << 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
EOFA 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 RPMselemental-registereelemental-system-agentpodem ser carregados manualmente)O comando
catescapa 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.yamlSe 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=progress1.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".
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.
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' EOFAplique o recurso ao cluster:
kubectl apply -f $ELEM/selector.yamlObtenha 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=123Crie 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: trueEntã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.
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:
Automação de ponta a ponta no Capítulo 6, Fleet
Opções adicionais de configuração de rede no Capítulo 9, Rede de borda
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.
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).
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 #
Uma máquina host de compilação AMD64/Intel 64 (física ou virtual) executando o SLES 15 SP6.
O mecanismo de contêiner Podman
Uma imagem ISO SelfInstall do SUSE Linux Micro 6.2 criada usando o procedimento do Kiwi Builder (Capítulo 26, Criando imagens atualizadas do SUSE Linux Micro com o Kiwi)
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.12.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-imagesNa 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.isoDurante 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.iso2.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
EOFEsta 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.isoNas 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 diskConfiguraçã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.NotaO dispositivo sendo usado na seção
installDevicepode ser especificado como/dev/sdaou usando a nomenclatura/dev/disk/by-id,/dev/disk/by-pathpara garantir que o dispositivo correto esteja sendo usado. Se estiver usando VMs libvirt, o valor do atributoserialpode ser especificado ao criar um disco para a VM (por exemplo,serial=111-disk1) para que possa ser usado no valorinstallDevicecom a nomenclaturaby-id, como por exemplo/dev/disk/by-id/ata-QEMU_HARDDISK_111-disk1se estiver usando dispositivos ATA (libvirtprefixa automaticamente o ID comata-QEMU_HARDDISK_para dispositivos ATA, ouvirtio-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, sediskSizefor25Ge este campo fortrue, o EIB expandirá a partição criptografada para25Gdurante 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 SecurePasswordIsso gerará algo semelhante a:
$6$G392FCbxVgn[...]Y7zTXnC1Podemos 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[...]Y7zTXnC1També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.2O
timezoneespecifica o fuso horário no formato "Região/Localidade" (por exemplo, "Europe/London"). A lista completa pode ser encontrada executandotimedatectl list-timezonesem 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
iburstpara 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
iburstpara melhorar o tempo necessário para a sincronização inicial).
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.crtConsulte 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.
Se o diretório os-files existir, ele não pode estar vazio.
.
├── definition.yaml
└── os-files
└── etc
└── ssh
└── sshd_config2.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 redePor 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_64O 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_64O 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.gpgAdicionar 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.
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/chartsO 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/chartsOutros 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
EOFO 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.yamlA 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.
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.yamlA 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.isoA 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.yamlCada 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á:
Implantar o SUSE Linux Micro 6.2
Configurar a senha de root
Instale o pacote
nvidia-container-toolkitConfigure um registro de contêiner incorporado para servir conteúdo localmente
Instale o RKE2 de nó único
Configure a rede estática
Instale o KubeVirt
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 #
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-updateA 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ê.
É 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/vdbImplantar 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.1Crie o diretório /opt/eib e um subdiretório base-images:
mkdir -p /opt/eib/base-imagesNeste 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_64O 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.
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.rpmO 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-CERTVocê 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.yamlSe 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 #
Clique em Extensions na seção Configuração da barra lateral de navegação.
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.
Na página de repositórios, clique em
Create.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/chartsVocê pode ver que o repositório de extensão foi adicionado à lista e está no estado
Active.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.
No cartão da extensão, clique em
Installe 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-systemAs extensões precisam ser instaladas no namespace cattle-ui-plugin-system.
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"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/
EOFPara 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.
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.
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 #
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: trueNo painel do Rancher, navegue até ☰ > Entrega contínua > Repositórios Git e clique em
Add Repository.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.
Clique em
Next.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.
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.
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.
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
embeddedArtifactRegistrydo 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.19.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-imagesAgora, 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/NotaO 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.raw9.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/
EOFA 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.
NotaSinta-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.raw9.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/networkComo 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
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.
NotaO seguinte pressupõe uma rede
libvirtpadrão com um intervalo de endereços IP192.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
EOFNeste exemplo, definimos um estado desejado de duas interfaces Ethernet (eth0 e eth3), seus endereços IP solicitados, roteamento e resolução de DNS.
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
EOFNeste 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
EOFO 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.rawNotaOs 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.yamlA 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.
NotaUm arquivo de log (
network-config.log) e os respectivos arquivos de conexão do NetworkManager podem ser inspecionados no diretório_buildresultante, 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; doneVocê 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.
NotaEste 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 --importNotaÉ 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 100Verifique 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 msVerifique 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.nmconnectionVocê 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 configProvisionaremos 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 --importAssim 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 foreverConfirme 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 300Garanta 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.nmconnection9.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 --importAssim 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 foreverConfirme 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 425Garanta 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.nmconnection9.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 --importAssim 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 foreverVerifique 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 NICsVerifique 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.nmconnection9.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
EOFVamos 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.yamlAssim 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 --importO 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 100Verifique 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 msVerifique 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=disabled9.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.
NotaRecomenda-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
EOFAgora 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.shNotaO 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.
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.rawVamos 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.yamlAssim 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 --importO 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 100Verifique 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 msVerifique 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=disabled10 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-registere ele recebe umplanpara configurar orancher-system-agentrancher-system-agent - Uma vez que o nó de borda tenha sido totalmente registrado, este assume o lugar do
elemental-system-agente aguarda por maisplansdo 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.
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).
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:
rebootPara 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.
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_TOKENInstale o SUSE Storage no namespace
longhorn-systeme 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-collectionConfirme se a implantação foi bem-sucedida:
kubectl -n longhorn-system get podslocalhost:~ # 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"
EOFAgora 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
EOFO 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 26s13.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).
Obtenha o endereço IP do serviço externo do Longhorn:
kubectl -n longhorn-system get svcDepois 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/
EOFA 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.yamlApó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) 2m28sEsta instalação não funcionará para ambientes totalmente air-gapped. Nesses casos, consulte Seção 25.8, “Instalação do SUSE Storage”.
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.
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
Scannerdeve 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
Enforcerrequer 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 aoEnforcerpode 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.
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, oKlipperdeve 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:
Implantar as máquinas virtuais manualmente via libvirt+qemu-kvm no nível do host (onde o Kubernetes não está envolvido)
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
kubeconfigapropriado 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 nodesIsso 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+rke2r1Agora 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-namespaceEm 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-systemIsso 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 DeployedVerifique os recursos do CDI:
$ kubectl get all -n cdi-systemIsso 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 2m22sPara verificar se as definições de recursos personalizados (CRDs) VirtualMachine estão implantadas, você pode validar com:
$ kubectl explain virtualmachineIsso 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
EOFIsso deve exibir que um VirtualMachine foi criado:
virtualmachine.kubevirt.io/tumbleweed createdEsta 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).
NotaEsta 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 vmiIsso 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 TrueAo 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 podsIsso 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 10mSe 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 -- bashAssim 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
exitFinalmente, vamos excluir esta máquina virtual para limpar:
$ kubectl delete vm/tumbleweed
virtualmachine.kubevirt.io "tumbleweed" deleted17.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-amd64Se 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/virtctlVocê 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 TrueAgora 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 pauseVocê 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 FalseVocê 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 pausedVamos retomar a máquina virtual e tentar novamente:
$ virtctl unpause vm virtctl-example
VMI virtctl-example was scheduled to unpauseAgora devemos ser capazes de restabelecer uma conexão:
$ virtctl ssh suse@virtctl-example
suse@vmi/virtctl-example.default's password:
suse@virtctl-example:~> exit
logoutFinalmente, vamos remover a máquina virtual:
$ kubectl delete vm/virtctl-example
virtualmachine.kubevirt.io "virtctl-example" deleted17.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.
NotaEm 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
EOFQuando 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-exampleTeremos 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 9sEm 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:8080Com 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" deleted17.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 #
Navegue até Cluster Explorer clicando em um cluster gerenciado habilitado para KubeVirt na navegação à esquerda.
Navegue até a página KubeVirt > Virtual Machines e clique em
Create from YAMLno canto superior direito da tela.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.
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.
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 #
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.
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:
Instalação do Fleet (Seção 18.2.1, “Instalação do Upgrade Controller do Sistema via Fleet”)
Instalação do Helm (Seção 18.2.2, “Instalação do Helm do Upgrade Controller do Sistema”)
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:
Recurso GitRepo - para casos de uso onde um servidor Git externo/local está disponível. Para instruções de instalação, consulte Instalação do Upgrade Controller - GitRepo (Seção 18.2.1.1, “Instalação do Upgrade Controller - GitRepo”).
Recurso Bundle - para casos de uso air-gapped que não suportam uma opção de servidor Git local. Para instruções de instalação, consulte Instalação do Upgrade Controller - Bundle (Seção 18.2.1.2, “Instalação do Upgrade Controller - Bundle”).
18.2.1.1 Instalação do Upgrade Controller - GitRepo #
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:
Determine em quais clusters você deseja implantar o SUC. Isso é feito implantando um recurso
GitRepodo 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.
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 EOFPara implantar o SUC em seus clusters downstream:
NotaAntes de implantar o recurso abaixo, você deve fornecer uma configuração
targetsvá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
Valide se o recurso
GitRepoestá 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/1Valide 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.
Em uma máquina com acesso à rede, baixe o
fleet-cli:NotaCertifique-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-amd64Linux ARM:
curl -L -o fleet-cli https://github.com/rancher/fleet/releases/download/vv0.15.2/fleet-linux-arm64
Torne o
fleet-cliexecutável:chmod +x fleet-cliClone a
suse-edge/fleet-examplesrelease que você deseja usar:git clone -b release-3.6.1 https://github.com/suse-edge/fleet-examples.gitNavegue até o fleet do SUC, localizado no repositório
fleet-examples:cd fleet-examples/fleets/day2/system-upgrade-controllerDetermine 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.
Se você pretende implantar o SUC apenas em clusters downstream, crie um arquivo
targets.yamlque corresponda aos clusters específicos:cat > targets.yaml <<EOF targets: - clusterSelector: CHANGEME EOFPara obter informações sobre como mapear para clusters downstream, consulte Mapping to Downstream Clusters
Prossiga para a construção do Bundle:
NotaCertifique-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.yamlPara 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.yamlPara 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.
Transfira o Bundle
system-upgrade-controller-bundle.yamlpara a máquina do seu cluster de gerenciamento:scp system-upgrade-controller-bundle.yaml <machine-address>:<filesystem-path>No seu cluster de gerenciamento, implante o Bundle
system-upgrade-controller-bundle.yaml:kubectl apply -f system-upgrade-controller-bundle.yamlNo 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/1Com base no workspace do Fleet no qual você implantou seu Bundle, navegue até o cluster e valide a implantação do SUC:
NotaO 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 #
Adicione o repositório de charts do Rancher:
helm repo add rancher-charts https://charts.rancher.io/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-namespaceIsso instalará a versão v0.19.1 do SUC, que é necessária pela plataforma Edge 3.6.
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:
Através da Rancher UI (Seção 18.3.1, “Monitoramento de Planos do Upgrade Controller do Sistema - Rancher UI”).
Através de monitoramento manual (Seção 18.3.2, “Monitoramento de Planos do Upgrade Controller do Sistema - Manual”) dentro do cluster.
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:
No canto superior esquerdo, ☰ → <your-cluster-name>
Selecione Workloads → Pods
Selecione o menu suspenso
Only User Namespacese adicione o namespacecattle-systemNa 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>NotaPodem existir Pods
CompletedeUnknownpara um Plano SUC específico. Isso é esperado e acontece devido à natureza de algumas das atualizações.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 #
As etapas abaixo pressupõem que kubectl foi configurado para se conectar ao cluster onde os Planos SUC foram implantados.
Liste os Planos SUC implantados:
kubectl get plans -n cattle-systemObtenha o Pod para o plano SUC:
kubectl get pods -l upgrade.cattle.io/plan=<plan_name> -n cattle-systemNotaPodem existir tanto
CompletedPods quantoUnknownpara um Plano SUC específico. Isso é esperado e acontece devido à natureza de alguns dos upgrades.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.
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 #
System Upgrade Controller (Seção 18.2, “Instalando o Upgrade Controller do Sistema”)
Um cluster Kubernetes; K3s ou RKE2
19.3.2 Etapas #
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-systemValide a implantação do Upgrade Controller:
kubectl get deployment -n upgrade-controller-systemValide o pod do Upgrade Controller:
kubectl get pods -n upgrade-controller-systemValide 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-system19.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:
Sistema operacional (SO) (Seção 19.5.1, “Atualização do Sistema operacional”).
Kubernetes (Seção 19.5.2, “Fazer upgrade do Kubernetes”).
Componentes adicionais (Seção 19.5.3, “Atualizações de Componentes Adicionais”).
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.
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.
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: trueExemplo 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É 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.
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:
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 yamlapiVersion: 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: 90315a2b6dAqui 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íveisreasonsincluem: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 atualtype, uma dasTrue,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:
Não há condições de componente
PendingouInProgress.A propriedade
lastSuccessfulReleaseVersionaponta para oreleaseVersionque é 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.
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: 90315a2b6d19.7.2 Helm Controller #
Esta seção aborda como rastrear recursos criados pelo helm-controller.
As etapas abaixo pressupõem que o kubectl foi configurado para se conectar ao cluster onde o Upgrade Controller foi implantado.
Localize o recurso
HelmChartpara o componente específico:kubectl get helmcharts -n kube-systemUsando o nome do recurso
HelmChart, localize o Pod de fazer upgrade que foi criado pelohelm-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 16mVisualize 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 propriedadeinstallationNamespaceno 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:
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.
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.
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.
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.
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.
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
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
done21.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
EOFcat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: ip-pool-l2-adv
namespace: metallb-system
spec:
ipAddressPools:
- ip-pool
EOFAgora, 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 3m10sIsso 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"
EOFE, 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
EOFVamos 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
EOFE 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 msecNo exemplo acima, o tráfego flui da seguinte forma:
hellok3s.${IP}.sslip.ioé resolvido para o IP real.Em seguida, o tráfego é tratado pelo pod
metallb-speaker.metallb-speakerredireciona o tráfego para o controladortraefik.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:
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.
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.
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.
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.
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
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
done22.6 Configuração #
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
EOFConfigure um
BGPPeer.
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
EOFCrie 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
EOF22.7 Uso #
Crie um aplicativo de exemplo com um serviço. Neste caso, o endereço IP do
IPAddressPoolé192.168.10.100para 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
EOFPara 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 8sSe este roteador for o gateway padrão da sua rede, você pode executar o comando
curla 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) #
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.
NotaO 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
doneVerifique 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 46sNeste ponto, a instalação do MetalLB e do FRR-K8s está concluída.
23.5 Configuração #
Crie um
FRRConfigurationpara 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 EOFO roteador BGP externo tem ASN 64512, enquanto nosso
BGPPeerterá 64513. Também podemos ver que o roteador BGP externo tem um endereço IP que é 192.168.20.154.Verifique se o FRRConfiguration foi implantado:
k get FRRConfiguration -A NAMESPACE NAME AGE metallb-system frrdemo 4sNotaAs configurações de
toReceiveacima 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:
Uma vez que o Deployment e o Service tenham sido aplicados no cluster descrito em Capítulo 22, MetalLB no K3s (usando modo de camada 3), a rota para o Service estará visível no roteador FRR externo.
A rota será adicionada a todos os nós no cluster FRR-K8s.
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 #
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 -Certifique-se de que a flag --disable=servicelb seja fornecida no comando k3s server.
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/config24.3 Configurando um cluster existente #
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
EOFcat <<-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
EOF24.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-namespaceO 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
EOFPara 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
EOFVerifique 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 kubernetesSe 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/configA 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 nodesSegundo terminal:
watch kubectl get endpointslicesAgora 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:
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 #
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>
EOFAgora, a única coisa que resta é criar a rede e iniciá-la:
virsh net-define isolatednetwork.xml
virsh net-start isolatednetwork25.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/valuesCertifique-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.isoO 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
EOFEsta 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.yaml25.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.
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 #
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.7Em 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
EOFDefinir 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.yamlA 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.isoUma 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.yamlA 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 104sE 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:
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
EOFVamos 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.yamlA 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.isoUma 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.yamlA 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 3m39s25.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.4Você 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.yamlA 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.isoUma 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.yamlA 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 3m28s25.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.2Vamos 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.yamlA 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.isoUma 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.yamlA 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 DeployedVerificar CDI:
/var/lib/rancher/rke2/bin/kubectl get all -n cdi-system --kubeconfig /etc/rancher/rke2/rke2.yamlA 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 3m44s25.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.24Você 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:
kubernetes/manifests/metallb-registry.yamlapiVersion: 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-registrykubernetes/helm/values/privateregistry.yamlcore: 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>"}}}' | base64Onde 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 0Verificar SUSE Private Registry:
/var/lib/rancher/rke2/bin/kubectl get pods -n suse-private-registry --kubeconfig /etc/rancher/rke2/rke2.yamlA 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 4m30s25.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.
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 0Crie um diretório de saída para ser compartilhado com o contêiner de compilação Kiwi para salvar as imagens resultantes:
# mkdir ~/outputBaixe 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.ddiretório do repositório de pacotes SUSE Linux Micro do host subjacente.O diretório
~/outputde 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
(...)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.json26.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
(...)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
(...)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
Podmanpor 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 oEdge Image Builderdurante 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 viapodman-machine-setcomandoNeste momento, o
Edge Image Buildernã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
aarch64AMD64/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.confPara 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.nodesdefinir 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.apiVIPOpcionalmente, defina um host de API para especificar um endereço de domínio para acessar o cluster em
kubernetes.network.apiHostPara saber mais sobre essa configuração, consulte a documentação da seção Kubernetes.
O
Edge Image Builderdepende dos nomes de host dos diferentes nós para determinar seu tipo de Kubernetes (serverouagent). 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.
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"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 EOFCrie 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]} EOFCrie 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 EOFCertifique-se de que o Elemental esteja instalado corretamente
Instale o Operador Elemental e a UI do Elemental nos nós de gerenciamento
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.
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 availableIsso pode ser mitigado por uma das seguintes abordagens:
Habilite o TPM nas configurações da Máquina Virtual
Exemplo com UTM no MacOS
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: -1Desabilite o TPM no recurso
MachineRegistration
apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
metadata:
name: ...
namespace: ...
spec:
...
elemental:
...
registration:
emulate-tpm: falseParte 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/
EOFAgora, 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-namespaceCom o arquivo values.yaml acima, os seguintes componentes estarão no namespace nats:
Versão HA do Statefulset do NATS contendo três contêineres: Servidor NATS + sidecars de recarregador de configuração e métricas.
Contêiner NATS box, que vem com um conjunto de utilitários
NATSque podem ser usados para verificar a configuração.O JetStream também aproveita seu back end de chave-valor que vem com
PVCsvinculado aos pods.
29.2.1.1 Testando a configuração #
kubectl exec -n nats -it deployment/nats-box -- /bin/sh -lCrie uma assinatura para o assunto de teste:
nats sub test &Envie uma mensagem para o assunto de teste:
nats pub test hi
29.2.1.2 Limpando #
helm -n nats uninstall nats
rm values.yaml29.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 k3sO 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 localSubstitua <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/k3sCompilar 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.
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://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 -a30 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:
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
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.
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 shellQuando 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 refreshVocê 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-G06Se 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.confAgora que você instalou esses pacotes, é hora de fechar a sessão transactional-update:
exitCertifique-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:
rebootAssim 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-smiA 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 shellEm seguida, instale o pacote nvidia-container-toolkit do repositório do NVIDIA Container Toolkit:
O
nvidia-container-toolkit.repoabaixo 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-toolkitQuando estiver pronto, você pode fechar o shell transactional-update:
exit…e reinicializar a máquina no novo instantâneo:
rebootComo 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.yamlIsso 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 bashVocê 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-3Assim 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/deviceQuerySe 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 = PASSA 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:
exit30.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 nodesIsso deve mostrar algo semelhante ao seguinte:
NAME STATUS ROLES AGE VERSION
node0001 Ready control-plane,etcd,master 13d v1.35.4+rke2r1O 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.tomlIsso 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"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
EOFO 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 updateAgora 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=nvidiaApó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
EOFSe 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 interactionFinalmente, 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-G06Você 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.keyVamos 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-pluginEste é 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/manifestsVamos 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
EOFAgora 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
EOFUsamos 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
EOFPrecisamos 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/gpgkeyTodos 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.yamlPara 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.confNOTA: 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
managementedownstreamdeSUSE Edge 3.5paraSUSE 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
downstreamcluster.
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.
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:
| Tipo de cluster | Mé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 #
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:
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.pemOpcional - 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.pemImportanteSe 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.pemAtualize seus valores de Helm do Metal3 para usar a nova referência do ConfigMap:
Altere de:
global: additionalTrustedCAs: truePara:
global: trustedCAs: tls-ca-bundleApó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 #
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:
Se você já tiver o
Upgrade Controllerimplantado a partir de uma versãoSUSE Edgeanterior, 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.3Se você não tiver
Upgrade Controllerimplantado, 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.0Para 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 #
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:
As frotas devem ser usadas a partir da versão release-3.6.0 do repositório
suse-edge/fleet-examples.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 componentesSUSE Edge 3.6.0, consulte Seção 41.4, “Release 3.6.0”.
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:
As Fleet devem ser usadas a partir da versão release-3.6.0 do repositório
suse-edge/fleet-examples.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 componentesSUSE Edge 3.6.0, consulte Seção 41.4, “Release 3.6.0”.
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:
Por meio do Capítulo 19, Upgrade Controller - Seção 32.1, “Upgrade Controller”
Por meio do Capítulo 6, Fleet - Seção 32.2, “Fleet”
32.1 Upgrade Controller #
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:
Fazer upgrade do SO SUSE Linux Micro (Capítulo 7, SUSE Linux Micro)
Capítulo 12, RKE2Fazer upgrade do Kubernetes ou Capítulo 11, K3s
Fazer upgrade de componentes adicionais do SUSE (SUSE Rancher Prime, SUSE Security, etc.)
32.1.1 Pré-requisitos #
Antes de fazer upgrade do seu cluster management, os seguintes pré-requisitos devem ser atendidos:
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 naSUSE Edgerelease (Capítulo 41, Notas de versão) para a qual você pretende fazer upgrade.Upgrade Controller- certifique-se de que oUpgrade Controllertenha sido implantado em seu clustermanagement. Para as etapas de instalação, consulte Seção 19.3, “Instalando o Upgrade Controller”.
32.1.2 Upgrade #
Determine a versão de
SUSE Edgerelease (Capítulo 41, Notas de versão) para a qual você deseja fazer upgrade do seu clustermanagement.No cluster
management, implante umUpgradePlanque especifique orelease versiondesejado. OUpgradePlandeve ser implantado no namespace doUpgrade 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 EOFNotaPodem 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”.A implantação do
UpgradePlanno namespace doUpgrade Controller’siniciará oupgrade process.NotaPara obter mais informações sobre o
upgrade processreal, 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.
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
EOFAgora podemos prosseguir com a implantação do Traefik, por meio da instalação dos gráficos Helm rke2-traefik-crd e rke2-traefik.
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"
EOFO {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
EOFAgora, 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.
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:
Seção 32.2.1, “Componentes” - componentes padrão usados para todas as operações de "Dia 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".
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.
Seção 32.2.4, “Fazer upgrade do SO” - descreve como fazer upgrade do SO usando o Fleet.
Seção 32.2.5, “Atualização da versão do Kubernetes” - descreve como fazer upgrade da versão do Kubernetes usando o Fleet.
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.
Fazer upgrade do SO (Seção 32.2.4, “Fazer upgrade do SO”)
Kubernetes version upgrade (Seção 32.2.5, “Atualização da versão do Kubernetes”)
Fazer upgrade do Helm chart (Seção 32.2.6, “Fazer upgrade do Helm chart”)
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:
Seção 32.2.4.1, “Componentes” - componentes adicionais usados pelo processo de upgrade.
Seção 32.2.4.2, “Visão geral” - visão geral do processo de upgrade.
Seção 32.2.4.3, “Requisitos” - requisitos do processo de upgrade.
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), oos-pkg-update.serviceserá 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), oos-migration.serviceserá criado. Ele usa transactional-update para realizar: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.
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.
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).
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:
Sempre cordon os nós antes de upgrades do SO.
Sempre faça upgrade dos nós
control-planeantes dos nósworker.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:
O SUC reconcilia os
OS SUC plansimplantados e cria umKubernetes Jobem cada nó.O
Kubernetes Jobcria um systemd.service (Seção 32.2.4.1.1, “systemd.service”) para upgrade de pacote ou migração de SO.O
systemd.servicecriado aciona o processo de upgrade do SO no nó específico.ImportanteAssim que o processo de upgrade do SO terminar, o nó correspondente será
rebootedpara aplicar as atualizações no sistema.
Abaixo você pode encontrar um diagrama da descrição acima:
32.2.4.3 Requisitos #
Geral:
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 respectivosystemd.servicepossa se conectar com sucesso ao repositório RPM desejado.ImportantePara 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.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
NotaQuaisquer tolerâncias adicionais devem ser adicionadas na seção
.spec.tolerationsde cada Plano. SUC Plans relacionados ao upgrade do SO podem ser encontrados no repositório suse-edge/fleet-examples emfleets/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:
32.2.4.4 Upgrade do SO - implantação do plano SUC #
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 daGitRepo/Bundletarget configuration existente, ou removendo o recursoGitRepo/Bundlepor 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 osuse-edge/fleet-examplesrelease 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:
Recurso
GitRepodo Fleet - Seção 32.2.4.4.1, “Implantação do plano SUC - recurso GitRepo”.Recurso
Bundledo Fleet - Seção 32.2.4.4.2, “Implantação do plano SUC - Recurso de Bundle”.
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:
Através do
Rancher UI- Seção 32.2.4.4.1.1, “Criação de GitRepo - UI do Rancher” (quandoRancherestiver disponível).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.
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 #
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.yamlEdite 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.yamlAponte o namespace do
GitRepopara o namespacefleet-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
Aplique o recurso GitRepo ao seu
management cluster:kubectl apply -f os-upgrade-gitrepo.yamlVisualize 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:
Através do
Rancher UI- Seção 32.2.4.4.2.1, “Criação de Bundle - Interface do Rancher” (quandoRancherestiver disponível).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.
Para criar um bundle através da interface do Rancher:
No canto superior esquerdo, clique em ☰ → Continuous Delivery
Vá para Avançado > Bundles
Selecione Criar a partir de YAML
A partir daqui, você pode criar o Bundle de uma das seguintes maneiras:
NotaPode haver casos de uso em que você precise incluir alterações personalizadas no
SUC plansque 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.Copiando manualmente o conteúdo do bundle de
suse-edge/fleet-examplespara a página Criar a partir de YAML.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.
Edite o Bundle na interface do usuário do Rancher:
Altere o namespace do
Bundlepara apontar para o namespacefleet-local.# Example kind: Bundle apiVersion: fleet.cattle.io/v1alpha1 metadata: name: os-upgrade namespace: fleet-local ...Altere os clusters target para o
Bundleapontar para o seu clusterlocal(gerenciamento):spec: targets: - clusterName: localNotaExistem alguns casos de uso em que seu cluster
localpode 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
Selecione Criar
32.2.4.4.2.2 Criação de Bundle - manual #
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.yamlEdite a configuração do
Bundle:Altere os clusters target para o
Bundleapontar para o seu clusterlocal(gerenciamento):spec: targets: - clusterName: localNotaExistem alguns casos de uso em que seu cluster
localpode ter um nome diferente.Para recuperar o nome do seu cluster
local, execute o comando abaixo:kubectl get clusters.fleet.cattle.io -n fleet-localAltere o namespace do
Bundlepara apontar para o namespacefleet-local.# Example kind: Bundle apiVersion: fleet.cattle.io/v1alpha1 metadata: name: os-upgrade namespace: fleet-local ...
Aplique o recurso Bundle ao seu
management cluster:kubectl apply -f os-upgrade-bundle.yamlVisualize 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 scriptupgrade.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 scriptupgrade.sh.
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:
Seção 32.2.5.1, “Componentes” - componentes adicionais usados pelo processo de atualização.
Seção 32.2.5.2, “Visão geral” - visão geral do processo de atualização.
Seção 32.2.5.3, “Requisitos” - requisitos do processo de atualização.
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.
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).
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:
Sempre cordon os nós antes de fazer upgrade do K8s.
Sempre atualize os nós
control-planeantes dos nósworker.Sempre atualize os nós
control-planeum nó por vez e os nósworkerdois nós por vez.
Uma vez que os K8s SUC plans são implantados, o fluxo de trabalho parece com isto:
O SUC reconcilia os
K8s SUC plansimplantados e cria umKubernetes Jobem cada nó.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”).
O Pod criado passará pelo seguinte fluxo de trabalho:
Substitua o binário
rke2/k3sexistente no nó pelo da imagemrke2-upgrade/k3s-upgrade.Encerre o processo
rke2/k3sem execução.
Encerrar o processo
rke2/k3saciona 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:
32.2.5.3 Requisitos #
Faça backup da sua distribuição Kubernetes:
Para clusters RKE2, consulte a documentação de Backup e Restauração do RKE2.
Para clusters K3s, consulte a documentação de Backup e Restauração do K3s.
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
NotaQuaisquer tolerâncias adicionais devem ser adicionadas na seção
.spec.tolerationsde 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-upgradePara 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 #
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 daGitRepo/Bundleconfiguração de destino existente, ou removendo o recursoGitRepo/Bundlepor 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 osuse-edge/fleet-exampleslanç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:
Recurso GitRepo do Fleet (Seção 32.2.5.4.1, “Implantação de plano SUC - recurso GitRepo”)
Recurso Bundle do Fleet (Seção 32.2.5.4.2, “Implantação do plano SUC - Recurso Bundle”)
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:
Através do
Rancher UI- Seção 32.2.5.4.1.1, “Criação de GitRepo - IU do Rancher” (quandoRancherestiver disponível).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.
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 #
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.yamlPara 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
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.yamlPara 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
GitRepopara o namespacefleet-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.yamlPara 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
Aplique os recursos GitRepo ao seu
management cluster:# RKE2 kubectl apply -f rke2-upgrade-gitrepo.yaml # K3s kubectl apply -f k3s-upgrade-gitrepo.yamlVisualize 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:
Através do
Rancher UI- Seção 32.2.5.4.2.1, “Criação de Bundle - Interface do Rancher” (quandoRancherestiver disponível).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.
Para criar um Bundle através da interface do Rancher:
No canto superior esquerdo, clique em ☰ → Entrega contínua
Vá para Avançado > Bundle
Selecione Criar a partir de YAML
A partir daqui, você pode criar o Bundle de uma das seguintes maneiras:
NotaPode haver casos de uso em que você precise incluir alterações personalizadas no
SUC plansque 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.Copiando manualmente o conteúdo do Bundle para RKE2 ou K3s de
suse-edge/fleet-examplespara a página Criar a partir de YAML.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.yamlpara RKE2 ebundles/day2/system-upgrade-controller-plans/k3s-upgrade/plan-bundle.yamlpara K3s). Isso preencherá automaticamente a página Criar a partir de YAML com o conteúdo do Bundle.
Edite o Bundle na interface do Rancher:
Altere o namespace do
Bundlepara apontar para o namespacefleet-local.# Example kind: Bundle apiVersion: fleet.cattle.io/v1alpha1 metadata: name: rke2-upgrade namespace: fleet-local ...Altere os clusters de destino para o
Bundlepara apontar para o seu clusterlocal(gerenciamento):spec: targets: - clusterName: localNotaExistem alguns casos de uso em que seu cluster
localpode 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
Selecione Criar
32.2.5.4.2.2 Criação de Bundle - manual #
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.yamlPara 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
Edite a configuração de
Bundle:Altere os clusters de destino para o
Bundlepara apontar para o seu clusterlocal(gerenciamento):spec: targets: - clusterName: localNotaExistem alguns casos de uso em que seu cluster
localpode ter um nome diferente.Para recuperar o nome do seu cluster
local, execute o comando abaixo:kubectl get clusters.fleet.cattle.io -n fleet-localAltere o namespace do
Bundlepara apontar para o namespacefleet-local.# Example kind: Bundle apiVersion: fleet.cattle.io/v1alpha1 metadata: name: rke2-upgrade namespace: fleet-local ...
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.yamlVisualize 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.yamlPara 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.yamlPara nós
worker-fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-worker.yaml
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:
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.
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:
Hospede os recursos do Fleet do seu chart em um servidor Git local que seja acessível pelo seu
management cluster.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 #
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.
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.txte 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:
Torne o
edge-save-images.shexecutável:chmod +x edge-save-images.shGere o arquivo de imagem:
./edge-save-images.sh --source-registry registry.suse.comIsso criará um arquivo pronto para carregamento chamado
edge-images.tar.gz.NotaSe a opção
-i|--imagesfor especificada, o nome do arquivo pode ser diferente.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:
Torne o
edge-save-oci-artefacts.shexecutável:chmod +x edge-save-oci-artefacts.shGere o arquivo de imagem de chart OCI:
./edge-save-oci-artefacts.sh --source-registry registry.suse.comIsso criará um arquivo chamado
oci-artefacts.tar.gz.NotaSe a opção
-a|--archivefor especificada, o nome do arquivo pode ser diferente.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:
Faça login no seu registro privado (se necessário):
podman login <REGISTRY.YOURDOMAIN.COM:PORT>Torne o
edge-load-images.shexecutável:chmod +x edge-load-images.shExecute o script, passando o arquivo copiado
edge-images.tar.gzanteriormente:./edge-load-images.sh --source-registry registry.suse.com --registry <REGISTRY.YOURDOMAIN.COM:PORT> --images edge-images.tar.gzNotaIsso 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:
Faça login no seu registro privado (se necessário):
podman login <REGISTRY.YOURDOMAIN.COM:PORT>Torne o
edge-load-oci-artefacts.shexecutável:chmod +x edge-load-oci-artefacts.shDescompacte o arquivo copiado
oci-artefacts.tar.gz:tar -xvf oci-artefacts.tar.gzIsso produzirá um diretório com o modelo de nomenclatura
edge-release-oci-tgz-<date>Passe este diretório para o script
edge-load-oci-artefacts.shpara carregar as imagens do chart Edge OCI para seu registro privado:NotaEste script pressupõe que a CLI
helmtenha 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:
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. #
Adquira os recursos do Fleet do chart a partir da tag de release do Edge que você deseja usar.
Navegue até o Fleet do chart do Helm (
fleets/day2/chart-templates/<chart>).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.
Opcionalmente, se o chart do Helm exigir configurações em seus values, edite a configuração
.helm.valuesdentro do arquivofleet.yamldo diretório copiado.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.
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 exceededNesses 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.yamlConteúdo
fleet.yamlpreenchido com dadosLonghorndo 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"}NotaEstes 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 chartlonghorn.
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”).
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_url32.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.
Para ilustrar o fluxo de trabalho, o exemplo abaixo usa a estrutura de diretório suse-edge/fleet-examples.
Navegue até o modelo de Fleet do chart longhorn:
cd fleets/day2/chart-templates/longhorn/longhornCrie um arquivo
targets.yamlque instruirá o Fleet para quais clusters ele deve implantar o chart Helm:cat > targets.yaml <<EOF targets: # Match your local (management) cluster - clusterName: local EOFNotaExistem 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-localConverta o Fleet do chart Helm
Longhornem um recurso Bundle usando o fleet-cli.NotaA 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.yamlNavegue até o template do chart Fleet longhorn-crd:
cd fleets/day2/chart-templates/longhorn/longhorn-crdCrie um arquivo
targets.yamlque 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 EOFConverta o gráfico Helm
Longhorn CRDdo 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.yamlImplante os arquivos
longhorn-bundle.yamlelonghorn-crd-bundle.yamlno seumanagement 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 #
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).
No seu repositório Git monitorado pelo Fleet, edite o arquivo
fleet.yamldo gráfico Helm com a versão e o repositório corretos das notas de lançamento (Capítulo 41, Notas de versão).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:
A visão geral (Seção 32.2.6.2.3.1, “Visão geral”) do processo de upgrade.
As etapas de upgrade (Seção 32.2.6.2.3.2, “Etapas de upgrade”) necessárias.
Um exemplo (Seção 32.2.6.2.3.3, “Exemplo”) que demonstra o upgrade do chart Longhorn usando o método explicado.
Como usar o processo de upgrade com uma ferramenta GitOps diferente (Seção 32.2.6.2.3.4, “Fazer upgrade do Helm chart usando uma ferramenta GitOps de terceiros”).
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:
Baixe localmente os arquivos para cada Helm chart que precisa ser feito upgrade.
Passe esses arquivos para o generate-chart-upgrade-data.sh
generate-chart-upgrade-data.shscript, que incluirá os dados desses arquivos na frotaeib-charts-upgrader.Implante a frota
eib-charts-upgraderem seumanagement cluster. Isso é feito por meio de um recursoGitRepoouBundle.
Uma vez implantado, o eib-charts-upgrader, com a ajuda do Fleet, enviará seus recursos para o cluster management desejado.
Esses recursos incluem:
Um conjunto de
Secretscontendo os dados do Helm chart fornecidos pelo usuário.Um
Kubernetes Jobque implantará umPodque montará oSecretsmencionado 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:
32.2.6.2.3.2 Etapas de upgrade #
Clone o repositório
suse-edge/fleet-examplesda tag de lançamento correta tag.Crie um diretório no qual você armazenará o(s) arquivo(s) do chart Helm baixado(s).
mkdir archivesDentro 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.0De Assets da release tag desejada, baixe o script
generate-chart-upgrade-data.sh.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-upgraderPara cada arquivo de chart no diretório
--archive-dir, o script gera um arquivoKubernetes Secret YAMLcontendo os dados de upgrade do chart e o armazena no diretóriobase/secretsda frota especificada por--fleet-path.O script
generate-chart-upgrade-data.shtambém aplica modificações adicionais à frota para garantir que os arquivosKubernetes Secret YAMLgerados sejam utilizados corretamente pela carga de trabalho implantada pela frota.ImportanteOs usuários não devem fazer alterações além do que o script
generate-chart-upgrade-data.shgera.
As etapas abaixo dependem do ambiente em que você está executando:
Para um ambiente que suporta GitOps (por exemplo, não é air-gapped, ou é air-gapped, mas permite o suporte a um servidor Git local):
Copie a
fleets/day2/eib-charts-upgraderFleet para o repositório que você usará para GitOps.NotaCertifique-se de que a Fleet inclua as alterações que foram feitas pelo script
generate-chart-upgrade-data.sh.Configure um recurso
GitRepoque será usado para enviar todos os recursos daeib-charts-upgraderFleet.Para configuração e implantação do
GitRepopor meio da interface do Rancher, consulte Accessing Fleet in the Rancher UI.Para configuração e implantação manual do
GitRepo, consulte Creating a Deployment.
Para um ambiente que não suporta GitOps (por exemplo, é isolado da rede e não permite o uso de servidor Git local):
Baixe o binário
fleet-clida página derancher/fleetrelease (fleet-linux-amd64para Linux). Para usuários de Mac, existe uma Homebrew Formulae que pode ser usada - fleet-cli.Navegue até a
eib-charts-upgraderFleet:cd /foo/bar/fleet-examples/fleets/day2/eib-charts-upgraderCrie um arquivo
targets.yamlque instruirá o Fleet sobre onde implantar seus recursos:cat > targets.yaml <<EOF targets: # To map the local(management) cluster - clusterName: local EOFNotaExistem alguns casos de uso em que seu cluster
localpode ter um nome diferente.Para recuperar o nome do seu cluster
local, execute o comando abaixo:kubectl get clusters.fleet.cattle.io -n fleet-localUse o
fleet-clipara converter o Fleet em um recursoBundle:fleet apply --compress --targets-file=targets.yaml -n fleet-local -o - eib-charts-upgrade > bundle.yamlIsso criará um Bundle (
bundle.yaml) que conterá todos os recursos modelados do Fleeteib-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.
Implante o
Bundle. Isso pode ser feito de duas maneiras:Através da interface do Rancher - Navegue até Continuous Delivery → Advanced → Bundles → Create from YAML e cole o conteúdo do
bundle.yamlou clique na opçãoRead from Filee envie o próprio arquivo.Manualmente - Implante o arquivo
bundle.yamlmanualmente dentro do seumanagement 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”.
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 #
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
managementestá 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 Storageprecisa ser feito upgrade para uma versão compatível com a release 3.6 do Edge. Ou seja, ele precisa ser feito upgrade para1.11.2.Assume-se que o
management clusterestá 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”):
Clone o repositório
suse-edge/fleet-examplea partir da tagrelease-3.6.1.git clone -b release-3.6.1 https://github.com/suse-edge/fleet-examples.gitCrie um diretório onde o arquivo de fazer upgrade do
Longhornserá armazenado.mkdir archivesFaç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.2Fora do diretório
archives, baixe o scriptgenerate-chart-upgrade-data.shdo releasesuse-edge/fleet-examplestag.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.shExecute 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-upgraderA 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.shOs 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.yamlCrie um
Bundlepara o Fleeteib-charts-upgrader:Primeiro, navegue até o próprio Fleet:
cd ./fleet-examples/fleets/day2/eib-charts-upgraderEm seguida, crie um arquivo
targets.yaml:cat > targets.yaml <<EOF targets: - clusterName: local EOFEm seguida, use o binário
fleet-clipara converter o Fleet em um Bundle:fleet apply --compress --targets-file=targets.yaml -n fleet-local -o - eib-charts-upgrade > bundle.yaml
Implante o Bundle através da interface do Rancher:
Figura 32.1: Implantar Bundle através da interface do Rancher #A partir daqui, selecione Ler de Arquivo e encontre o arquivo
bundle.yamlno seu sistema.Isso preencherá automaticamente o
Bundledentro da interface do Rancher.Selecione Criar.
Após uma implantação bem-sucedida, seu Bundle deverá ser semelhante a:
Figura 32.2: Bundle implantado com sucesso #
Após a implantação bem-sucedida do Bundle, para monitorar o processo de fazer upgrade:
Verifique os logs do
Upgrade Pod:Agora, verifique os logs do Pod criado para fazer upgrade pelo helm-controller:
O nome do Pod seguirá o seguinte modelo -
helm-install-longhorn-<random-suffix>O Pod estará no namespace onde o recurso
HelmChartfoi implantado. No nosso caso, este ékube-system.Figura 32.3: Logs para o gráfico Longhorn que foi submetido a fazer upgrade com sucesso #
Verifique se a versão do
HelmChartfoi atualizada navegando até a seçãoHelmChartsdo Rancher (More Resources → HelmCharts). Selecione o namespace onde o chart foi implantado; para este exemplo, seriakube-system.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:
Seção 33.1.1, “Componentes” - componentes padrão usados para todas as operações de "Dia 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".
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.
Seção 33.1.4, “Fazer upgrade do SO” - descreve como fazer upgrade do SO usando o Fleet.
Seção 33.1.5, “Atualização da versão do Kubernetes” - descreve como fazer upgrade da versão do Kubernetes usando o Fleet.
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) #
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.
Fazer upgrade do SO (Seção 33.1.4, “Fazer upgrade do SO”)
Kubernetes version upgrade (Seção 33.1.5, “Atualização da versão do Kubernetes”)
Fazer upgrade do Helm chart (Seção 33.1.6, “Fazer upgrade do Helm chart”)
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:
Seção 33.1.4.1, “Componentes” - componentes adicionais usados pelo processo de upgrade.
Seção 33.1.4.2, “Visão geral” - visão geral do processo de upgrade.
Seção 33.1.4.3, “Requisitos” - requisitos do processo de upgrade.
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), oos-pkg-update.serviceserá 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), oos-migration.serviceserá criado. Ele usa transactional-update para realizar: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.
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.
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).
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:
Sempre cordon os nós antes de upgrades do SO.
Sempre faça upgrade dos nós
control-planeantes dos nósworker.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:
O SUC reconcilia os
OS SUC plansimplantados e cria umKubernetes Jobem cada nó.O
Kubernetes Jobcria um systemd.service (Seção 33.1.4.1.1, “systemd.service”) para upgrade de pacote ou migração de SO.O
systemd.servicecriado aciona o processo de upgrade do SO no nó específico.ImportanteAssim que o processo de upgrade do SO terminar, o nó correspondente será
rebootedpara aplicar as atualizações no sistema.
Abaixo você pode encontrar um diagrama da descrição acima:
33.1.4.3 Requisitos #
Geral:
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 respectivosystemd.servicepossa se conectar com sucesso ao repositório RPM desejado.ImportantePara 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.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
NotaQuaisquer tolerâncias adicionais devem ser adicionadas na seção
.spec.tolerationsde cada Plano. SUC Plans relacionados ao upgrade do SO podem ser encontrados no repositório suse-edge/fleet-examples emfleets/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:
33.1.4.4 Upgrade do SO - implantação do plano SUC #
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 daGitRepo/Bundletarget configuration existente, ou removendo o recursoGitRepo/Bundlepor 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 osuse-edge/fleet-examplesrelease 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:
Recurso
GitRepodo Fleet - Seção 33.1.4.4.1, “Implantação do plano SUC - recurso GitRepo”.Recurso
Bundledo Fleet - Seção 33.1.4.4.2, “Implantação do plano SUC - Recurso de Bundle”.
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:
Através do
Rancher UI- Seção 33.1.4.4.1.1, “Criação de GitRepo - UI do Rancher” (quandoRancherestiver disponível).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.
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 #
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.yamlEdite a configuração do GitRepo, em
spec.targetsespecifique sua lista de destino desejada. Por padrão, os recursosGitRepodosuse-edge/fleet-examplesNÃO são mapeados para nenhum cluster downstream.Para corresponder a todos os clusters, altere o
GitRepodestino padrão para:spec: targets: - clusterSelector: {}Alternativamente, se você quiser uma seleção de cluster mais granular, veja Mapeamento para Clusters Downstream
Aplique o recurso GitRepo ao seu
management cluster:kubectl apply -f os-upgrade-gitrepo.yamlVisualize 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:
Através do
Rancher UI- Seção 33.1.4.4.2.1, “Criação de Bundle - Interface do Rancher” (quandoRancherestiver disponível).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.
Para criar um bundle através da interface do Rancher:
No canto superior esquerdo, clique em ☰ → Continuous Delivery
Vá para Avançado > Bundles
Selecione Criar a partir de YAML
A partir daqui, você pode criar o Bundle de uma das seguintes maneiras:
NotaPode haver casos de uso em que você precise incluir alterações personalizadas no
SUC plansque 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.Copiando manualmente o conteúdo do bundle de
suse-edge/fleet-examplespara a página Criar a partir de YAML.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.
Altere os clusters target para o
Bundle:Para corresponder a todos os clusters downstream, altere o Bundle
.spec.targetspadrão para:spec: targets: - clusterSelector: {}Para mapeamentos de clusters downstream mais granulares, consulte Mapping to Downstream Clusters.
Selecione Criar
33.1.4.4.2.2 Criação de Bundle - manual #
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.yamlEdite as configurações de
Bundletarget, emspec.targetsforneça sua lista de target desejada. Por padrão, os recursosBundledosuse-edge/fleet-examplesNÃO são mapeados para nenhum cluster downstream.Para corresponder a todos os clusters, altere o
Bundletarget padrão para:spec: targets: - clusterSelector: {}Alternativamente, se você quiser uma seleção de clusters mais granular, veja Mapping to Downstream Clusters
Aplique o recurso Bundle ao seu
management cluster:kubectl apply -f os-upgrade-bundle.yamlVisualize 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 scriptupgrade.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 scriptupgrade.sh.
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 #
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:
Seção 33.1.5.1, “Componentes” - componentes adicionais usados pelo processo de atualização.
Seção 33.1.5.2, “Visão geral” - visão geral do processo de atualização.
Seção 33.1.5.3, “Requisitos” - requisitos do processo de atualização.
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.
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).
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:
Sempre cordon os nós antes de fazer upgrade do K8s.
Sempre atualize os nós
control-planeantes dos nósworker.Sempre atualize os nós
control-planeum nó por vez e os nósworkerdois nós por vez.
Uma vez que os K8s SUC plans são implantados, o fluxo de trabalho parece com isto:
O SUC reconcilia os
K8s SUC plansimplantados e cria umKubernetes Jobem cada nó.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”).
O Pod criado passará pelo seguinte fluxo de trabalho:
Substitua o binário
rke2/k3sexistente no nó pelo da imagemrke2-upgrade/k3s-upgrade.Encerre o processo
rke2/k3sem execução.
Encerrar o processo
rke2/k3saciona 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:
33.1.5.3 Requisitos #
Faça backup da sua distribuição Kubernetes:
Para clusters RKE2, consulte a documentação de Backup e Restauração do RKE2.
Para clusters K3s, consulte a documentação de Backup e Restauração do K3s.
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
NotaQuaisquer tolerâncias adicionais devem ser adicionadas na seção
.spec.tolerationsde 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-upgradePara 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 #
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 daGitRepo/Bundleconfiguração de destino existente, ou removendo o recursoGitRepo/Bundlepor 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 osuse-edge/fleet-exampleslanç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:
Recurso GitRepo do Fleet (Seção 33.1.5.4.1, “Implantação de plano SUC - recurso GitRepo”)
Recurso Bundle do Fleet (Seção 33.1.5.4.2, “Implantação do plano SUC - Recurso Bundle”)
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:
Através do
Rancher UI- Seção 33.1.5.4.1.1, “Criação de GitRepo - IU do Rancher” (quandoRancherestiver disponível).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.
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 #
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.yamlPara 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
Edite a configuração do GitRepo, em
spec.targetsespecifique sua lista de destino desejada. Por padrão, os recursosGitRepodosuse-edge/fleet-examplesNÃO são mapeados para nenhum cluster downstream.Para corresponder a todos os clusters, altere o
GitRepotarget padrão para:spec: targets: - clusterSelector: {}Alternativamente, se você quiser uma seleção de cluster mais granular, veja Mapeamento para Clusters Downstream
Aplique os recursos GitRepo ao seu
management cluster:# RKE2 kubectl apply -f rke2-upgrade-gitrepo.yaml # K3s kubectl apply -f k3s-upgrade-gitrepo.yamlVisualize 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:
Através do
Rancher UI- Seção 33.1.5.4.2.1, “Criação de Bundle - Interface do Rancher” (quandoRancherestiver disponível).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.
Para criar um Bundle através da interface do Rancher:
No canto superior esquerdo, clique em ☰ → Entrega contínua
Vá para Avançado > Bundle
Selecione Criar a partir de YAML
A partir daqui, você pode criar o Bundle de uma das seguintes maneiras:
NotaPode haver casos de uso em que você precise incluir alterações personalizadas no
SUC plansque 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.Copiando manualmente o conteúdo do Bundle para RKE2 ou K3s de
suse-edge/fleet-examplespara a página Criar a partir de YAML.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.yamlpara RKE2 ebundles/day2/system-upgrade-controller-plans/k3s-upgrade/plan-bundle.yamlpara K3s). Isso preencherá automaticamente a página Criar a partir de YAML com o conteúdo do Bundle.
Altere os clusters de destino para o
Bundle:Para corresponder a todos os clusters downstream, altere o
.spec.targetsdo Bundle padrão para:spec: targets: - clusterSelector: {}Para mapeamentos de cluster downstream mais granulares, consulte Mapeamento para Clusters Downstream.
Selecione Criar
33.1.5.4.2.2 Criação de Bundle - manual #
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.yamlPara 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
Edite as configurações de
Bundledestino, emspec.targetsforneça a lista de destino desejada. Por padrão, os recursosBundledosuse-edge/fleet-examplesNÃO são mapeados para nenhum cluster downstream.Para corresponder a todos os clusters, altere o
Bundletarget padrão para:spec: targets: - clusterSelector: {}Alternativamente, se você quiser uma seleção de cluster mais granular, veja Mapeamento para Clusters Downstream
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.yamlVisualize 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.yamlPara 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.yamlPara nós
worker-fleets/day2/system-upgrade-controller-plans/k3s-upgrade/plan-worker.yaml
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:
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.
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:
Hospede os recursos do Fleet do seu chart em um servidor Git local que seja acessível pelo seu
management cluster.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 #
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.
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.txte 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:
Torne o
edge-save-images.shexecutável:chmod +x edge-save-images.shGere o arquivo de imagem:
./edge-save-images.sh --source-registry registry.suse.comIsso criará um arquivo pronto para carregamento chamado
edge-images.tar.gz.NotaSe a opção
-i|--imagesfor especificada, o nome do arquivo pode ser diferente.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:
Torne o
edge-save-oci-artefacts.shexecutável:chmod +x edge-save-oci-artefacts.shGere o arquivo de imagem de chart OCI:
./edge-save-oci-artefacts.sh --source-registry registry.suse.comIsso criará um arquivo chamado
oci-artefacts.tar.gz.NotaSe a opção
-a|--archivefor especificada, o nome do arquivo pode ser diferente.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:
Faça login no seu registro privado (se necessário):
podman login <REGISTRY.YOURDOMAIN.COM:PORT>Torne o
edge-load-images.shexecutável:chmod +x edge-load-images.shExecute o script, passando o arquivo copiado
edge-images.tar.gzanteriormente:./edge-load-images.sh --source-registry registry.suse.com --registry <REGISTRY.YOURDOMAIN.COM:PORT> --images edge-images.tar.gzNotaIsso 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:
Faça login no seu registro privado (se necessário):
podman login <REGISTRY.YOURDOMAIN.COM:PORT>Torne o
edge-load-oci-artefacts.shexecutável:chmod +x edge-load-oci-artefacts.shDescompacte o arquivo copiado
oci-artefacts.tar.gz:tar -xvf oci-artefacts.tar.gzIsso produzirá um diretório com o modelo de nomenclatura
edge-release-oci-tgz-<date>Passe este diretório para o script
edge-load-oci-artefacts.shpara carregar as imagens do chart Edge OCI para seu registro privado:NotaEste script pressupõe que a CLI
helmtenha 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:
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. #
Adquira os recursos do Fleet do chart a partir da tag de release do Edge que você deseja usar.
Navegue até o Fleet do chart do Helm (
fleets/day2/chart-templates/<chart>).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.
Opcionalmente, se o chart do Helm exigir configurações em seus values, edite a configuração
.helm.valuesdentro do arquivofleet.yamldo diretório copiado.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.
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 exceededNesses 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.yamlConteúdo
fleet.yamlpreenchido com dadosLonghorndo 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"}NotaEstes 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 chartlonghorn.
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”).
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.
Para ilustrar o fluxo de trabalho, o exemplo abaixo usa a estrutura de diretório suse-edge/fleet-examples.
Navegue até o modelo de Fleet do chart longhorn:
cd fleets/day2/chart-templates/longhorn/longhornCrie um arquivo
targets.yamlque instruirá o Fleet para quais clusters ele deve implantar o chart Helm:cat > targets.yaml <<EOF targets: # Matches all downstream clusters - clusterSelector: {} EOFPara uma seleção de cluster downstream mais granular, consulte Mapeamento para Clusters downstream.
Converta o Fleet do chart Helm
Longhornem um recurso Bundle usando o fleet-cli.NotaA 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.yamlNavegue até o template do chart Fleet longhorn-crd:
cd fleets/day2/chart-templates/longhorn/longhorn-crdCrie um arquivo
targets.yamlque instruirá o Fleet sobre a quais clusters ele deve implantar o gráfico Helm:cat > targets.yaml <<EOF targets: # Matches all downstream clusters - clusterSelector: {} EOFConverta o gráfico Helm
Longhorn CRDdo 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.yamlImplante os arquivos
longhorn-bundle.yamlelonghorn-crd-bundle.yamlno seumanagement 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 #
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).
No seu repositório Git monitorado pelo Fleet, edite o arquivo
fleet.yamldo gráfico Helm com a versão e o repositório corretos das notas de lançamento (Capítulo 41, Notas de versão).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:
A visão geral (Seção 33.1.6.2.3.1, “Visão geral”) do processo de upgrade.
As etapas de upgrade (Seção 33.1.6.2.3.2, “Etapas de upgrade”) necessárias.
Um exemplo (Seção 33.1.6.2.3.3, “Exemplo”) que demonstra o upgrade do chart Longhorn usando o método explicado.
Como usar o processo de upgrade com uma ferramenta GitOps diferente (Seção 33.1.6.2.3.4, “Fazer upgrade do Helm chart usando uma ferramenta GitOps de terceiros”).
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:
Baixe localmente os arquivos para cada Helm chart que precisa ser feito upgrade.
Passe esses arquivos para o generate-chart-upgrade-data.sh
generate-chart-upgrade-data.shscript, que incluirá os dados desses arquivos na frotaeib-charts-upgrader.Implante a frota
eib-charts-upgraderem seumanagement cluster. Isso é feito por meio de um recursoGitRepoouBundle.
Uma vez implantado, o eib-charts-upgrader, com a ajuda do Fleet, enviará seus recursos para o cluster downstream desejado.
Esses recursos incluem:
Um conjunto de
Secretscontendo os dados do Helm chart fornecidos pelo usuário.Um
Kubernetes Jobque implantará umPodque montará oSecretsmencionado 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:
33.1.6.2.3.2 Etapas de upgrade #
Clone o repositório
suse-edge/fleet-examplesda tag de lançamento correta tag.Crie um diretório no qual você armazenará o(s) arquivo(s) do chart Helm baixado(s).
mkdir archivesDentro 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.0De Assets da release tag desejada, baixe o script
generate-chart-upgrade-data.sh.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-upgraderPara cada arquivo de chart no diretório
--archive-dir, o script gera um arquivoKubernetes Secret YAMLcontendo os dados de upgrade do chart e o armazena no diretóriobase/secretsda frota especificada por--fleet-path.O script
generate-chart-upgrade-data.shtambém aplica modificações adicionais à frota para garantir que os arquivosKubernetes Secret YAMLgerados sejam utilizados corretamente pela carga de trabalho implantada pela frota.ImportanteOs usuários não devem fazer alterações além do que o script
generate-chart-upgrade-data.shgera.
As etapas abaixo dependem do ambiente em que você está executando:
Para um ambiente que suporta GitOps (por exemplo, não é air-gapped, ou é air-gapped, mas permite o suporte a um servidor Git local):
Copie a
fleets/day2/eib-charts-upgraderFleet para o repositório que você usará para GitOps.NotaCertifique-se de que a Fleet inclua as alterações que foram feitas pelo script
generate-chart-upgrade-data.sh.Configure um recurso
GitRepoque será usado para enviar todos os recursos daeib-charts-upgraderFleet.Para configuração e implantação do
GitRepopor meio da interface do Rancher, consulte Accessing Fleet in the Rancher UI.Para configuração e implantação manual do
GitRepo, consulte Creating a Deployment.
Para um ambiente que não suporta GitOps (por exemplo, é isolado da rede e não permite o uso de servidor Git local):
Baixe o binário
fleet-clida página derancher/fleetrelease (fleet-linux-amd64para Linux). Para usuários de Mac, existe uma Homebrew Formulae que pode ser usada - fleet-cli.Navegue até a
eib-charts-upgraderFleet:cd /foo/bar/fleet-examples/fleets/day2/eib-charts-upgraderCrie um arquivo
targets.yamlque instruirá o Fleet sobre onde implantar seus recursos:cat > targets.yaml <<EOF targets: # To match all downstream clusters - clusterSelector: {} EOFPara obter informações sobre como mapear clusters de destino, consulte a documentation upstream.
Use o
fleet-clipara converter o Fleet em um recursoBundle:fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - eib-charts-upgrade > bundle.yamlIsso criará um Bundle (
bundle.yaml) que conterá todos os recursos modelados do Fleeteib-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.
Implante o
Bundle. Isso pode ser feito de duas maneiras:Através da interface do Rancher - Navegue até Continuous Delivery → Advanced → Bundles → Create from YAML e cole o conteúdo do
bundle.yamlou clique na opçãoRead from Filee envie o próprio arquivo.Manualmente - Implante o arquivo
bundle.yamlmanualmente dentro do seumanagement 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”.
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 #
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-exampleestá 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 Storageprecisa ser feito upgrade para uma versão compatível com a release 3.6 do Edge. Ou seja, ele precisa ser feito upgrade para1.11.2.Assume-se que o
management clusterresponsável pelo gerenciamento dodoc-exampleestá 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”):
Clone o repositório
suse-edge/fleet-examplea partir da tagrelease-3.6.1.git clone -b release-3.6.1 https://github.com/suse-edge/fleet-examples.gitCrie um diretório onde o arquivo de fazer upgrade do
Longhornserá armazenado.mkdir archivesFaç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.2Fora do diretório
archives, baixe o scriptgenerate-chart-upgrade-data.shdo releasesuse-edge/fleet-examplestag.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.shExecute 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-upgraderA 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.shOs 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.yamlCrie um
Bundlepara o Fleeteib-charts-upgrader:Primeiro, navegue até o próprio Fleet:
cd ./fleet-examples/fleets/day2/eib-charts-upgraderEm seguida, crie um arquivo
targets.yaml:cat > targets.yaml <<EOF targets: - clusterName: doc-example EOFEm seguida, use o binário
fleet-clipara converter o Fleet em um Bundle:fleet apply --compress --targets-file=targets.yaml -n fleet-default -o - eib-charts-upgrade > bundle.yamlAgora, transfira o
bundle.yamlpara sua máquinamanagement cluster.
Implante o Bundle através da interface do Rancher:
Figura 33.1: Implantar Bundle através da interface do Rancher #A partir daqui, selecione Ler de Arquivo e encontre o arquivo
bundle.yamlno seu sistema.Isso preencherá automaticamente o
Bundledentro da interface do Rancher.Selecione Criar.
Após uma implantação bem-sucedida, seu Bundle deverá ser semelhante a:
Figura 33.2: Bundle implantado com sucesso #
Após a implantação bem-sucedida do Bundle, para monitorar o processo de fazer upgrade:
Verifique os logs do
Upgrade Pod:Agora, verifique os logs do Pod criado para fazer upgrade pelo helm-controller:
O nome do Pod seguirá o seguinte modelo -
helm-install-longhorn-<random-suffix>O Pod estará no namespace onde o recurso
HelmChartfoi implantado. No nosso caso, este ékube-system.Figura 33.3: Logs para o gráfico Longhorn que foi submetido a fazer upgrade com sucesso #
Verifique se a versão do
HelmChartfoi atualizada navegando até a seçãoHelmChartsdo Rancher (More Resources → HelmCharts). Selecione o namespace onde o chart foi implantado; para este exemplo, seriakube-system.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:
- 35 Solucionando problemas do Kiwi
O Kiwi é usado para gerar imagens atualizadas do SUSE Linux Micro para serem usadas com o Edge Image Builder.
- 36 Solução de problemas do Edge Image Builder (EIB)
O EIB é usado para criar SUSE Edge imagens personalizadas.
- 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 v…
- 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çã…
- 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:
- 40 Coleta de diagnósticos para suporte
Ao entrar em contato com o Suporte da SUSE, fornecer informações de diagnóstico abrangentes é crucial.
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 getekubectl describepara recursos do Kubernetes. Usekubectl 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
yamllintou 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.
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
getenforcee desative-o antes de executar o processo de build comsetenforce 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
--privilegedao executar o contêiner. Verifique novamente se ela está presente.
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.
Revisar saída do
build-image: A mensagem de erro na saída do console geralmente é muito indicativa.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.
Inspecionar logs do contêiner de build: Revise os logs do contêiner que falhou para obter erros mais detalhados (veja acima).
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.
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.
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 logsoupodman logspara obter as informações necessárias também.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 combustione, em geral, todos os logs do sistema operacional comjournalctlpara encontrar a causa raiz da falha.
Analise a saída de
eib-build: A mensagem de erro na saída do console geralmente é muito indicativa.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.
Inspecionar logs do contêiner de compilação: Analise os logs do contêiner com falha para obter erros mais detalhados (veja acima).
Verificar configuração de
eib: Verifique novamente o arquivo de configuraçãoeibem 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.
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, comoenp2s0.
Logs do combustion: Como o NMC é usado no momento do combustion, verifique os logs do combustion com
journalctl -u combustionno host que está sendo provisionado.
Verifique a sintaxe yaml: os arquivos de configuração do NMC são arquivos yaml, verifique a sintaxe correta com
yamllintou ferramentas similares.Execute o NMC manualmente: Como o NMC faz parte do contêiner EIB, para depurar quaisquer problemas, um comando podman local pode ser usado.
Crie uma pasta temporária para armazenar os arquivos do NMC.
mkdir -p ${HOME}/tmp/fooSalve os arquivos do NMC nesse local.
❯ tree --noreport ${HOME}/tmp/foo /Users/johndoe/tmp/foo ├── host1.example.com.yaml └── host2.example.com.yamlExecute 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 configObserve 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.
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.
Logs do sistema:
journalctlLogs do Elemental-system-agent:
journalctl -u elemental-system-agentLogs do K3s/RKE2:
journalctl -u k3s or journalctl -u rke2-server(ourke2-agent)Pod do operador Elemental:
kubectl logs -n cattle-elemental-system -l app=elemental-operator
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.
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.
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:
journalctlsaí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 -adf -hip 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.
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>.yamlpara 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.0NotaAjuste 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 arquivosk3s.yaml/rke2-server.yamlpertencem 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.0NotaCertifique-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.
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".
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 #
Atualizado para Kubernetes 1.35.4 e Rancher Prime 2.14.2
Atualizado para SUSE Security (NeuVector) 5.5.2 Notas de versão do NeuVector
Atualizado para SUSE Storage (Longhorn) 1.11.2 Notas de versão do Longhorn upstream
Atualizado para Rancher Turtles (CAPI) 0.26.2 Documentação do Rancher Turtles
Atualizado Metal3/Ironic para 0.15.0 com Ironic 35.0.0.2
41.3.2 Correções de bug e atualizações de segurança #
O Kubernetes 1.35.4 contém várias correções de bugs e atualizações de segurança Registro de alterações do Kubernetes
O Rancher Prime 2.14.2 contém várias correções de bugs Notas de versão do Rancher upstream
O SUSE Storage (Longhorn) 1.11.2 contém várias correções de bugs Correções de bugs do Longhorn upstream
O NeuVector 5.5.2 contém novos recursos e várias correções de bugs Notas de versão do NeuVector
As atualizações do Metal3/Ironic corrigem vários bugs e problemas de segurança, incluindo os seguintes:
41.3.3 Problemas conhecidos #
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
HelmChartConfigspodem falhar se forem colocados no diretório de configuraçãokubernetes/manifests. Em vez disso, recomenda-se colocar qualquerHelmChartConfigsem/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 estadoNotReadyna inicialização inicial, conforme discutido em #8357 problema do RKE2.Nas versões RKE2/K3s 1.34 e 1.35, o diretório
/etc/cniusado para armazenar configurações de CNI pode não disparar uma notificação dos arquivos sendo gravados lá paracontainerddevido a certas condições relacionadas aooverlayfs(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 estadoNotReady. Isso pode ser visto no nível do nó comkubectl 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 initializedComo 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/fstabNã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 | |
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 |
SUSE Multi-Linux Manager | 5.1 | N/A | |
K3s | 1.35.4 | N/A | |
RKE2 | 1.35.4 | N/A | |
SUSE Rancher Prime | 2.14.2 | 2.14.2 | Repositório Helm do Rancher Prime |
SUSE Storage (Longhorn) | 1.11.2 | 1.11.2 | Repositório Helm do SUSE Storage |
SUSE Security (NeuVector) | 5.5.2 | 109.0.2+up2.10.2 | Repositório Helm de Charts do Rancher |
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 |
Metal3 | 0.15.0 | 306.0.29+up0.15.0 | registry.suse.com/edge/3.6/metal3-chart:306.0.29+up0.15.0 |
MetalLB | 0.15.3 | 306.0.2+up0.15.3 | registry.suse.com/edge/3.6/metallb-chart:306.0.2+up0.15.3 |
Elemental | 1.9.0 | 1.9.0 | registry.suse.com/rancher/elemental-operator-chart:1.9.0 |
Extensão do Painel Elemental | 3.0.1 | 3.0.1 | |
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 |
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 |
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 |
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 |
Controlador de Atualização do Sistema | 0.19.1 | 109.0.1 | Repositório Helm de Charts do Rancher |
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 |
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] |
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 |
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 #
O Kubernetes 1.35.3 contém várias correções de bug e atualizações de segurança Registro de alterações do Kubernetes
O Rancher Prime 2.14.1 contém várias correções de bug Notas de Lançamento do Rancher Upstream
O SUSE Storage (Longhorn) 1.11.1 contém várias correções de bug Correções de bug do Longhorn Upstream
O NeuVector 5.5.1 contém novos recursos e várias correções de bug Notas de Lançamento do NeuVector
41.4.3 Problemas conhecidos #
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
HelmChartConfigspodem falhar se forem colocados no diretório de configuraçãokubernetes/manifests. Em vez disso, recomenda-se colocar qualquerHelmChartConfigsem/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 estadoNotReadyna inicialização inicial, conforme discutido em #8357 problema do RKE2.Nas versões RKE2/K3s 1.34 e 1.35, o diretório
/etc/cniusado para armazenar configurações de CNI pode não disparar uma notificação dos arquivos gravados paracontainerddevido a certas condições relacionadas aooverlayfs(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 estadoNotReady. Isso pode ser visto no nível do nó comkubectl 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 initializedComo 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/fstabNã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 | |
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 |
SUSE Multi-Linux Manager | 5.1 | N/A | |
K3s | 1.35.3 | N/A | |
RKE2 | 1.35.3 | N/A | |
SUSE Rancher Prime | 2.14.1 | 2.14.1 | Repositório Helm do Rancher Prime |
SUSE Storage (Longhorn) | 1.11.1 | 1.11.1 | Repositório Helm do SUSE Storage |
SUSE Security (NeuVector) | 5.5.1 | 109.0.1+up2.8.13 | Repositório Helm de Charts do Rancher |
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 |
Metal3 | 0.15.0 | 306.0.26+up0.15.0 | registry.suse.com/edge/3.6/metal3-chart:306.0.26+up0.15.0 |
MetalLB | 0.15.3 | 306.0.2+up0.15.3 | registry.suse.com/edge/3.6/metallb-chart:306.0.2+up0.15.3 |
Elemental | 1.9.0 | 1.9.0 | registry.suse.com/rancher/elemental-operator-chart:1.9.0 |
Extensão do Painel Elemental | 3.0.1 | 3.0.1 | |
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 |
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 |
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 |
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 |
Upgrade Controller | 0.19.1 | 109.0.1 | Repositório Helm de Charts do Rancher |
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 |
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] |
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 |
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-placeholderPara 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 keyExtraia 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/.






































