2 Integração remota de host com o Elemental #
Esta seção apresenta a solução de "provisionamento de rede 'phone home'" como parte do SUSE Edge, em que 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 de sistema operacional nativo de nuvem e totalmente centralizado com o Kubernetes. Na pilha do SUSE Edge, usamos o recurso de registro do Elemental para fazer a integração remota de hosts no Rancher, o que permite integrar os hosts a uma plataforma de gerenciamento centralizada e, nela, implantar e gerenciar os clusters Kubernetes junto com os componentes em camadas, os aplicativos e o ciclo de vida deles, tudo de um único local.
Essa abordagem pode ser útil em cenários em que os dispositivos que você deseja controlar não estão na mesma rede que o cluster de gerenciamento, ou não têm uma integração por controlador de gerenciamento fora da banda que permita um controle mais direto, e quando você inicializa vários sistemas "desconhecidos" na borda e precisa integrá-los e gerenciá-los com segurança e em escala. Esse cenário é comum nos casos de uso de varejo, IoT industrial ou em outros ambientes de baixo controle da rede em que os dispositivos são instalados.
2.1 Arquitetura de alto nível #
2.2 Recursos necessários #
Veja a seguir uma descrição dos requisitos mínimos de sistema e de ambiente para execução por meio desta inicilização rápida:
Um host para o cluster de gerenciamento centralizado (o mesmo que hospeda o Rancher e o Elemental):
Espaço em disco mínimo de 8 GB RAM e 20 GB para desenvolvimento ou teste (consulte aqui para uso em produção)
O provisionamento de um nó de destino, ou seja, o dispositivo de borda (é possível usar uma máquina virtual para fins de demonstração ou teste)
Mínimo de 4GB de RAM, 2 núcleos de CPU e disco de 20 GB
Um nome de host "resolvable" para o cluster de gerenciamento ou um endereço IP estático para usar com um serviço do tipo sslip.io
Um host para montar a mídia de instalação usando o Edge Image Builder
Uma unidade flash USB de origem para inicialização (em caso de hardware físico)
Uma cópia baixada da imagem ISO mais recente do SelfInstall do SUSE Linux Micro 6.1 disponível aqui.
Os dados existentes nas máquinas de destino serão substituídos como parte do processo. Faça um backup dos dados em dispositivos de armazenamento USB e discos conectados aos nós de implantação de destino.
Este guia foi criado com um droplet da DigitalOcean para hospedar o cluster upstream e com um Intel NUC como dispositivo downstream. Para montar a mídia de instalação, o SUSE Linux Enterprise Server foi usado.
2.3 Criar o cluster de inicialização #
Para começar, crie um cluster capaz de hospedar o Rancher e o Elemental. Esse cluster precisa ser roteável na rede à qual os nós downstream estão conectados.
2.3.1 Criar o cluster Kubernetes #
Se você usa um hiperescalador (como Azure, AWS ou Google Cloud), a maneira mais fácil de configurar um cluster é usar as ferramentas incorporadas dele. Para manter este guia conciso, não detalhamos o processo de cada uma dessas opções.
Se você está instalando em um serviço de hospedagem bare metal, ou algum outro, e precisa também providenciar a própria distribuição Kubernetes, recomendamos usar o RKE2.
2.3.2 Configurar o DNS #
Antes de continuar, você precisa configurar o acesso ao cluster. Assim como na configuração do próprio cluster, a configuração do DNS será diferente dependendo do local onde ele está hospedado.
Se você não deseja configurar registros DNS (por exemplo, quando se trata
apenas de um servidor de teste efêmero), uma alternativa é usar um serviço
como o sslip.io. Com ele, você
resolve qualquer endereço IP com
<endereço>.sslip.io
.
2.4 Instalar o Rancher #
Para instalar o Rancher, você precisa acessar a API Kubernetes do cluster que acabou de criar. Esse procedimento muda dependendo da distribuição Kubernetes que é usada.
Para o RKE2, o arquivo kubeconfig será gravado em
/etc/rancher/rke2/rke2.yaml
. Salve-o como
~/.kube/config
no sistema local. Talvez você tenha que
editar o arquivo para incluir o endereço IP ou o nome de host roteável
externamente correto.
Instale o Rancher facilmente com os comandos apresentados na documentação do Rancher:
Instale o cert-manager:
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=true
Em seguida, instale o próprio Rancher:
helm repo add rancher-prime https://charts.rancher.com/server-charts/prime
helm repo update
helm install rancher rancher-prime/rancher \
--namespace cattle-system \
--create-namespace \
--set hostname=<DNS or sslip from above> \
--set replicas=1 \
--set bootstrapPassword=<PASSWORD_FOR_RANCHER_ADMIN> \
--version 2.11.2
Se a finalidade do sistema é de produção, use o cert-manager para configurar um certificado real (como aquele da Let’s Encrypt).
Procure o nome de host que você configurou e faça login no Rancher com a
bootstrapPassword
usada. Você será guiado por um curto
processo de configuração.
2.5 Instalar o Elemental #
Com o Rancher instalado, agora você pode instalar o operador Elemental e as CRDs necessárias. O gráfico Helm do Elemental foi publicado como um artefato OCI, portanto, a instalação é um pouco mais simples do que a dos outros gráficos. É possível instalá-lo do mesmo shell usado 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.6.8
helm install -n cattle-elemental-system \
elemental-operator \
oci://registry.suse.com/rancher/elemental-operator-chart \
--version 1.6.8
2.5.1 Instalar a extensão de IU do Elemental (opcional) #
Para usar a IU do Elemental, faça login na instância do Rancher e clique no menu de três linhas na parte superior esquerda:
Na guia "Available" (Disponível) nesta página, clique em "Install" (Instalar) no cartão Elemental:
Confirme que você deseja instalar a extensão:
Após a instalação, será solicitado que você recarregue a página.
Após o recarregamento, acesse a extensão do Elemental pelo app global "OS Management".
2.6 Configurar o Elemental #
Para simplificar, recomendamos definir a variável $ELEM
como o caminho completo do local desejado para o diretório de configuração:
export ELEM=$HOME/elemental
mkdir -p $ELEM
Para que as máquinas sejam registradas no Elemental, precisamos criar um
objeto MachineRegistration
no namespace
fleet-default
.
Vamos criar uma versão básica desse objeto:
cat << EOF > $ELEM/registration.yaml
apiVersion: elemental.cattle.io/v1beta1
kind: MachineRegistration
metadata:
name: ele-quickstart-nodes
namespace: fleet-default
spec:
machineName: "\${System Information/Manufacturer}-\${System Information/UUID}"
machineInventoryLabels:
manufacturer: "\${System Information/Manufacturer}"
productName: "\${System Information/Product Name}"
EOF
kubectl apply -f $ELEM/registration.yaml
O comando cat
insere um caractere de escape de barra
(\
) para cada $
para que o Bash não os
utilize como gabarito. Remova as barras se estiver copiando manualmente.
Depois que o objeto é criado, encontre e observe o endpoint que foi atribuído:
REGISURL=$(kubectl get machineregistration ele-quickstart-nodes -n fleet-default -o jsonpath='{.status.registrationURL}')
Você também pode fazer isso pela IU.
- Extensão de IU
Na extensão OS Management, clique em "Create Registration Endpoint" (Criar endpoint de registro):
Dê um nome para esta configuração.
NotaVocê pode ignorar o campo Cloud Configuration (Configuração de nuvem) já que os dados nele serão substituídos ao executar as etapas a seguir com o Edge Image Builder.
Em seguida, role para baixo e clique em "Add Label" (Adicionar rótulo) para cada rótulo que deseja incluir no recurso criado quando a máquina é registrada. Isso é útil para distinguir as máquinas.
Clique em "Create" (Criar) para salvar a configuração.
Após a criação do registro, você deverá ver o URL dele listado e poderá clicar em "Copy" (Copiar) para copiar o endereço:
DicaSe você clicou fora dessa tela, pode clicar em "Registration Endpoints" (Endpoints de registro) no menu esquerdo e, depois, no nome do endpoint que acabou de criar.
Esse URL será usado na próxima etapa.
2.7 Criar a imagem #
A versão atual do Elemental conta com um método para criar a própria mídia de instalação. No SUSE Edge 3.3.1, fazemos isso com o Kiwi e o Edge Image Builder, portanto, o sistema resultante é desenvolvido com o SUSE Linux Micro como o sistema operacional de base.
Para saber mais detalhes sobre o Kiwi, siga o processo do construtor de imagens do Kiwi (Capítulo 28, Criando imagens atualizadas do SUSE Linux Micro com o Kiwi) para primeiro criar novas imagens e, para o Edge Image Builder, consulte o Guia de Introdução do Edge Image Builder (Capítulo 3, Clusters independentes com o Edge Image Builder) e também a documentação do componente (Capítulo 11, Edge Image Builder).
Em um sistema Linux com o Podman instalado, crie os diretórios e insira a imagem base criada pelo Kiwi:
mkdir -p $ELEM/eib_quickstart/base-images
cp /path/to/{micro-base-image-iso} $ELEM/eib_quickstart/base-images/
mkdir -p $ELEM/eib_quickstart/elemental
curl $REGISURL -o $ELEM/eib_quickstart/elemental/elemental_config.yaml
cat << EOF > $ELEM/eib_quickstart/eib-config.yaml
apiVersion: 1.2
image:
imageType: iso
arch: x86_64
baseImage: SL-Micro.x86_64-6.1-Base-SelfInstall-GM.install.iso
outputImageName: elemental-image.iso
operatingSystem:
time:
timezone: Europe/London
ntp:
forceWait: true
pools:
- 2.suse.pool.ntp.org
servers:
- 10.0.0.1
- 10.0.0.2
isoConfiguration:
installDevice: /dev/vda
users:
- username: root
encryptedPassword: \$6\$jHugJNNd3HElGsUZ\$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
packages:
sccRegistrationCode: XXX
EOF
A seção
time
é opcional, mas sua configuração é altamente recomendada para evitar possíveis problemas com certificados e divergência de relógio. O valor usado neste exemplo é somente para fins ilustrativos. Ajuste-o de acordo com seus requisitos específicos.A senha não codificada é
eib
.O
sccRegistrationCode
é necessário para fazer download e instalar os RPMs exigidos das fontes oficiais (se preferir, faça sideload manual dos RPMselemental-register
e oelemental-system-agent
).O comando
cat
insere um caractere de escape de barra (\
) para cada$
para que o Bash não os utilize como gabarito. Remova as barras 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.3/edge-image-builder:1.2.1 \
build --definition-file eib-config.yaml
Se você está inicializando um dispositivo físico, precisa gravar a imagem em uma unidade flash USB, o que pode ser feito com o comando:
sudo dd if=/eib_quickstart/elemental-image.iso of=/dev/<PATH_TO_DISK_DEVICE> status=progress
2.8 Inicializar os nós downstream #
Agora que já criamos a mídia de instalação, podemos inicializar os nós downstream com ela.
Para cada um dos sistemas que você quer controlar usando o Elemental, adicione a mídia de instalação e inicialize o dispositivo. Após a instalação, ele será reinicializado e se registrará.
Se você usa a extensão de IU, deve ver o nó listado em "Inventory of Machines" (Inventário de máquinas).
Não remova o meio de instalação antes de ver o prompt de login. Durante a primeira inicialização, os arquivos ainda são acessados no dispositivo USB.
2.9 Criar clusters downstream #
Precisamos criar dois objetos ao provisionar um novo cluster usando o Elemental.
- Linux
- Extensão de IU
O primeiro é o MachineInventorySelectorTemplate
. Esse
objeto permite especificar um mapeamento entre os clusters e as máquinas no
inventário.
Crie um seletor que corresponda qualquer máquina no inventário com um rótulo:
cat << EOF > $ELEM/selector.yaml apiVersion: elemental.cattle.io/v1beta1 kind: MachineInventorySelectorTemplate metadata: name: location-123-selector namespace: fleet-default spec: template: spec: selector: matchLabels: locationID: '123' EOF
Aplique o recurso ao cluster:
kubectl apply -f $ELEM/selector.yaml
Obtenha o nome da máquina e adicione o rótulo correspondente:
MACHINENAME=$(kubectl get MachineInventory -n fleet-default | awk 'NR>1 {print $1}') kubectl label MachineInventory -n fleet-default \ $MACHINENAME locationID=123
Crie um recurso de cluster K3s simples de nó único 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.32.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 a criação dos objetos, você deverá ver um novo cluster Kubernetes dar arranque (partida) usando o nó com o qual você acabou de instalar.
2.10 Redefinição de nó (opcional) #
O SUSE Rancher Elemental permite executar uma "redefinição de nó", que pode ser acionada quando um cluster inteiro é excluído do Rancher, um único nó é excluído do cluster ou um nó é excluído manualmente do inventário de máquinas. Esse recurso é útil para redefinir e limpar recursos órfãos e recuperar automaticamente o nó limpo no inventário de máquinas para que possa ser reutilizado. Isso não está habilitado por padrão e, portanto, um sistema que foi removido não será limpo (ou seja, os dados não serão removidos, e os recursos do cluster Kubernetes continuarão operando nos clusters downstream), será necessária uma intervenção manual para limpar os dados e registrar a máquina novamente no Rancher pelo Elemental.
Para habilitar essa funcionalidade por padrão, você precisa garantir que o
MachineRegistration
a habilite explicitamente adicionando
config.elemental.reset.enabled: true
, por exemplo:
config:
elemental:
registration:
auth: tpm
reset:
enabled: true
Na sequência, todos os sistemas registrados com esse
MachineRegistration
receberão automaticamente a anotação
elemental.cattle.io/resettable: 'true'
na respectiva
configuração. Para fazer isso manualmente em nós individuais, por exemplo,
porque obteve um MachineInventory
existente que não tem
essa anotação ou já implantou os 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 insere um marcador no sistema
operacional que aciona o processo de limpeza automaticamente; ele interrompe
todos os serviços do Kubernetes, remove todos os dados persistentes,
desinstala todos os serviços do Kubernetes, limpa os diretórios restantes do
Kubernetes/Rancher e força o novo registro no Rancher por meio da
configuração original MachineRegistration
do
Elemental. Isso é feito automaticamente, não há necessidade de intervenção
manual. O script chamado está disponível em
/opt/edge/elemental_node_cleanup.sh
e é acionado pelo
systemd.path
depois de inserir o marcador, portanto, sua
execução é imediata.
Com o uso do resettable
, a funcionalidade assume que o
comportamento desejado ao remover um nó/cluster do Rancher é limpar os dados
e forçar um novo registro. A perda de dados é certa nessa situação,
portanto, use essa funcionalidade apenas se tiver certeza de que deseja
executar a redefinição automática.
2.11 Próximas etapas #
Veja alguns recursos recomendados para pesquisa depois de usar este guia:
Automação de ponta a ponta no Capítulo 8, Fleet
Mais opções de configuração de rede no Capítulo 12, Rede de borda