Linux.com Editorial Staff

Talos Linux é um sistema operacional especializado projetado para executar Kubernetes. Em primeiro lugar, ele lida com o gerenciamento completo do ciclo de vida dos componentes do plano de controle do Kubernetes. Por outro lado, o Talos Linux foca na segurança, minimizando a capacidade do usuário de influenciar o sistema. Uma característica distintiva deste sistema operacional é a quase completa ausência de executáveis, incluindo a ausência de um shell e a incapacidade de fazer login via SSH. Toda a configuração do Talos Linux é feita através de uma API semelhante ao Kubernetes.

O Talos Linux é fornecido como um conjunto de imagens pré-construídas para vários ambientes.

O método de instalação padrão pressupõe que você pegará uma imagem preparada para seu provedor de nuvem ou hipervisor específico e criará uma máquina virtual a partir dela. Ou siga o caminho bare metal e carregue a imagem do Talos Linux usando métodos ISO ou PXE.

Infelizmente, isso não funciona quando se trata de provedores que oferecem um servidor ou máquina virtual pré-configurado sem permitir o upload de uma imagem customizada ou mesmo usar um ISO para instalação via KVM. Nesse caso, suas escolhas estão limitadas às distribuições que o provedor de nuvem disponibiliza.

Normalmente, durante o processo de instalação do Talos Linux, duas perguntas precisam ser respondidas: (1) Como carregar e inicializar a imagem do Talos Linux e (2) Como preparar e aplicar o machine-config (o arquivo de configuração principal do Talos Linux) a essa imagem inicializada. Vamos falar sobre cada uma dessas etapas.

Inicializando no Talos Linux

Um dos métodos mais universais é usar um mecanismo de kernel Linux chamado kexec.

kexec é um utilitário e uma chamada de sistema com o mesmo nome. Ele permite inicializar um novo kernel a partir do sistema existente sem realizar uma reinicialização física da máquina. Isso significa que você pode baixar o vmlinuz e o initramfs necessários para o Talos Linux e, em seguida, especificar a linha de comando do kernel necessária e mudar imediatamente para o novo sistema. É como se o kernel fosse carregado pelo bootloader padrão na inicialização, só que neste caso o seu sistema operacional Linux existente atua como o bootloader.

Essencialmente, tudo que você precisa é de qualquer distribuição Linux. Pode ser um servidor físico rodando em modo de recuperação ou até mesmo uma máquina virtual com sistema operacional pré-instalado. Vamos dar uma olhada em um caso usando o Ubuntu, mas pode ser literalmente qualquer outra distribuição Linux.

Faça login via SSH e instale o pacote kexec-tools, ele contém o utilitário kexec, que você precisará mais tarde:

apt install kexec-tools -y

Em seguida, você precisa baixar o Talos Linux, que é o kernel e o initramfs. Eles podem ser baixados do repositório oficial:

wget -O /tmp/vmlinuz https://github.com/siderolabs/talos/releases/latest/download/vmlinuz-amd64
wget -O /tmp/initramfs.xz https://github.com/siderolabs/talos/releases/latest/download/initramfs-amd64.xz

Se você tiver um servidor físico em vez de virtual, precisará construir sua própria imagem com todo o firmware necessário usando Fábrica de Talos serviço. Alternativamente, você pode usar as imagens pré-construídas do projeto Cozystack (uma solução para construção de nuvens que criamos na Ænix e transferimos para o CNCF Sandbox) – essas imagens já incluem todos os módulos e firmware necessários:

wget -O /tmp/vmlinuz https://github.com/cozystack/cozystack/releases/latest/download/kernel-amd64
wget -O /tmp/initramfs.xz https://github.com/cozystack/cozystack/releases/latest/download/initramfs-metal-amd64.xz

Agora você precisa das informações de rede que serão passadas ao Talos Linux no momento da inicialização. Abaixo está um pequeno script que reúne tudo que você precisa e define variáveis ​​de ambiente:

IP=$(ip -o -4 route get 8.8.8.8 | awk -F"src " '{sub(" .*", "", $2); print $2}')
GATEWAY=$(ip -o -4 route get 8.8.8.8 | awk -F"via " '{sub(" .*", "", $2); print $2}')
ETH=$(ip -o -4 route get 8.8.8.8 | awk -F"dev " '{sub(" .*", "", $2); print $2}')
CIDR=$(ip -o -4 addr show "$ETH" | awk -F"inet $IP/" '{sub(" .*", "", $2); print $2; exit}')
NETMASK=$(echo "$CIDR" | awk '{p=$1;for(i=1;i<=4;i++){if(p>=8){o=255;p-=8}else{o=256-2^(8-p);p=0}printf(i<4?o".":o"n")}}')
DEV=$(udevadm info -q property "/sys/class/net/$ETH" | awk -F= '$1~/ID_NET_NAME_ONBOARD/{print $2; exit} $1~/ID_NET_NAME_PATH/{v=$2} END{if(v) print v}')

Você pode passar esses parâmetros através do cmdline do kernel. Use o parâmetro ip= para configurar a rede usando o Configuração de IP em nível de kernel mecanismo para isso. Este método permite que o kernel configure interfaces automaticamente e atribua endereços IP durante a inicialização, com base nas informações passadas pelo cmdline do kernel. É um recurso interno do kernel habilitado pela opção CONFIG_IP_PNP. No Talos Linux, esse recurso está habilitado por padrão. Tudo o que você precisa fazer é fornecer configurações de rede formatadas corretamente no cmdline do kernel.

Defina a variável CMDLINE com a opção ip que contém as configurações atuais do sistema e imprima-a:

CMDLINE="init_on_alloc=1 slab_nomerge pti=on console=tty0 console=ttyS0 printk.devkmsg=on talos.platform=metal ip=${IP}::${GATEWAY}:${NETMASK}::${DEV}:::::"
echo $CMDLINE

A saída deve ser algo como:

init_on_alloc=1 slab_nomerge pti=on console=tty0 console=ttyS0 printk.devkmsg=on talos.platform=metal ip=10.0.0.131::10.0.0.1:255.255.255.0::eno2np0:::::

Verifique se tudo parece correto e carregue nosso novo kernel:

kexec -l /tmp/vmlinuz --initrd=/tmp/initramfs.xz --command-line="$CMDLINE"
kexec -e

O primeiro comando carrega o kernel Talos na RAM, o segundo comando muda o sistema atual para este novo kernel.

Como resultado, você obterá uma instância do Talos Linux em execução com a rede configurada. No entanto, atualmente ele está sendo executado inteiramente em RAM, portanto, se o servidor for reinicializado, o sistema retornará ao seu estado original (carregando o sistema operacional do disco rígido, por exemplo, Ubuntu).

Aplicando configuração de máquina e instalando Talos Linux em disco

Para instalar o Talos Linux persistentemente no disco e substituir o sistema operacional atual, você precisa aplicar uma configuração de máquina especificando o disco a ser instalado. Para configurar a máquina, você pode usar o oficial talosctl utilitário ou o Persistenteutilitário mantido pelo projeto Cozystack (Talm também funciona com Vanilla Talos Linux).

Primeiro, vamos considerar a configuração usando talosctl. Antes de aplicar a configuração, certifique-se de que ela inclua configurações de rede para o seu nó; caso contrário, após a reinicialização, o nó não configurará a rede. Durante a instalação, o bootloader é gravado no disco e não contém a opção ip para configuração automática do kernel.

Aqui está um exemplo de patch de configuração contendo os valores necessários:

# node1.yaml
machine:
  install:
    disk: /dev/sda
  network:
    hostname: node1
    nameservers:
    - 1.1.1.1
    - 8.8.8.8
    interfaces:
    - interface: eno2np0
      addresses:
      - 10.0.0.131/24
      routes:
      - network: 0.0.0.0/0
        gateway: 10.0.0.1

Você pode usá-lo para gerar uma configuração completa da máquina:

talosctl gen secrets
talosctl gen config --with-secrets=secrets.yaml --config-patch-control-plane=@node1.yaml

Revise a configuração resultante e aplique-a ao nó:

talosctl apply -f controlplane.yaml -e 10.0.0.131 -n 10.0.0.131 -i 

Depois de aplicar controlplane.yaml, o nó instalará o Talos no disco /dev/sda, sobrescrevendo o sistema operacional existente e, em seguida, reinicializará.

Tudo que você precisa agora é executar o comando bootstrap para inicializar o cluster etcd:

talosctl --talosconfig=talosconfig bootstrap -e 10.0.0.131 -n 10.0.0.131

Você pode visualizar o status do nó a qualquer momento usando o comando do painel:

talosctl --talosconfig=talosconfig dashboard -e 10.0.0.131 -n 10.0.0.131

Assim que todos os serviços atingirem o estado Pronto, recupere o kubeconfig e você poderá usar seu Kubernetes recém-instalado:

talosctl --talosconfig=talosconfig kubeconfig kubeconfig
export KUBECONFIG=${PWD}/kubeconfig

Use o Talm para gerenciamento de configuração

Quando você tem muitas configurações, deseja uma maneira conveniente de gerenciá-las. Isso é especialmente útil com nós bare-metal, onde cada nó pode ter diferentes discos, interfaces e configurações de rede específicas. Como resultado, talvez seja necessário manter um patch para cada nó.

Para resolver isso, desenvolvemos Persistente — um gerenciador de configuração para Talos Linux que funciona de forma semelhante ao Helm.

O conceito é simples: você tem um modelo de configuração comum com funções de pesquisa e, ao gerar uma configuração para um nó específico, o Talm consulta dinamicamente a API do Talos e substitui valores na configuração final.

Talm inclui quase todos os recursos do talosctl, adicionando alguns extras. Ele pode gerar configurações a partir de modelos semelhantes ao Helm e lembrar os parâmetros do nó e do terminal para cada nó no arquivo resultante, para que você não precise especificar esses parâmetros sempre que trabalhar com um nó.

Deixe-me mostrar como executar as mesmas etapas para instalar o Talos Linux usando Talm:

Primeiro, inicialize uma configuração para um novo cluster:

mkdir talos
cd talos
talm init

Ajuste os valores do seu cluster emvalues.yaml:

endpoint: "https://10.0.0.131:6443"
podSubnets:
- 10.244.0.0/16
serviceSubnets:
- 10.96.0.0/16
advertisedSubnets:
- 10.0.0.0/24

Gere uma configuração para seu nó:

talm template -t templates/controlplane.yaml -e 10.0.0.131 -n 10.0.0.131 > nodes/node1.yaml

A saída resultante será semelhante a:

# talm: nodes=("10.0.0.131"), endpoints=("10.0.0.131"), templates=("templates/controlplane.yaml")
# THIS FILE IS AUTOGENERATED. PREFER TEMPLATE EDITS OVER MANUAL ONES.
machine:
  type: controlplane
  kubelet:
    nodeIP:
      validSubnets:
        - 10.0.0.0/24
  network:
    hostname: node1
    # -- Discovered interfaces:
    # eno2np0:
    #   hardwareAddr:a0:36:bc:cb:eb:98
    #   busPath: 0000:05:00.0
    #   driver: igc
    #   vendor: Intel Corporation
    #   product: Ethernet Controller I225-LM)
    interfaces:
      - interface: eno2np0
        addresses:
          - 10.0.0.131/24
        routes:
          - network: 0.0.0.0/0
            gateway: 10.0.0.1
    nameservers:
      - 1.1.1.1
      - 8.8.8.8
  install:
    # -- Discovered disks:
    # /dev/sda:
    #    model: SAMSUNG MZQL21T9HCJR-00A07
    #    serial: S64GNG0X444695
    #    wwid: eui.36344730584446950025384700000001
    #    size: 1.9 TB
    disk: /dev/sda
cluster:
  controlPlane:
    endpoint: https://10.0.0.131:6443
  clusterName: talos
  network:
    serviceSubnets:
      - 10.96.0.0/16
  etcd:
    advertisedSubnets:
      - 10.0.0.0/24

Resta apenas aplicá-lo ao seu nó:

talm apply -f nodes/node1.yaml -i 

Talm detecta automaticamente o endereço do nó e o endpoint da “modelina” (um comentário condicional no topo do arquivo) e aplica a configuração.

Você também pode executar outros comandos da mesma maneira, sem especificar o endereço do nó e as opções do terminal. Aqui estão alguns exemplos:

Visualize o status do nó usando o comando integrado do painel:

talm dashboard -f nodes/node1.yaml

Cluster de bootstrap etcd no node1:

talm bootstrap -f nodes/node1.yaml

Salve o kubeconfig em seu diretório atual:

talm kubeconfig kubeconfig -f nodes/node1.yaml

Ao contrário do utilitário oficial talosctl, as configurações geradas não contêm segredos, permitindo que sejam armazenadas no git sem criptografia adicional. Os segredos são armazenados na raiz do seu projeto e somente nestes arquivos: secrets.yaml, talosconfig e kubeconfig.

Resumo

Esse é o nosso esquema completo para instalar o Talos Linux em praticamente qualquer situação. Aqui está uma rápida recapitulação:

  1. Use kexec para executar o Talos Linux em qualquer sistema existente.
  2. Certifique-se de que o novo kernel tenha as configurações de rede corretas, coletando-as do sistema atual e passando pelo parâmetro ip no cmdline. Isso permite que você se conecte ao sistema recém-inicializado por meio da API.
  3. Quando o kernel é inicializado via kexec, o Talos Linux roda inteiramente em RAM. Para instalar o Talos no disco, aplique sua configuração usando talosctl ou Talm.
  4. Ao aplicar a configuração, não se esqueça de especificar as configurações de rede para o seu nó, porque a configuração do bootloader no disco não as possui automaticamente.
  5. Aproveite o seu Talos Linux recém-instalado e totalmente operacional.

Materiais adicionais:

Deseja saber mais sobre Software Livre Clique Aqui!

Deixe um comentário

Translate »