Post

Guia Completo de Kubernetes com Containerd e CRI-O: Configuração, Redes Dual-Stack e Otimização

Este tutorial detalhado explora a configuração e gerenciamento de clusters Kubernetes com os runtimes Containerd e CRI-O, abordando desde a instalação e configuração inicial até práticas avançadas de redes dual-stack (IPv4 e IPv6), segurança, otimização de recursos e monitoramento. Ideal para engenheiros de DevOps e administradores de sistemas que buscam implementar Kubernetes com alta performance, segurança e observabilidade.

Guia Completo de Kubernetes com Containerd e CRI-O: Configuração, Redes Dual-Stack e Otimização

Introdução

A orquestração de containers com Kubernetes é uma prática essencial para arquiteturas modernas de microsserviços e para ambientes de alta disponibilidade. Entre as escolhas cruciais para uma implementação eficiente de Kubernetes estão os runtimes de container, como Containerd e CRI-O, que oferecem alta performance e integração com a infraestrutura Kubernetes. Este tutorial visa guiar você através das configurações detalhadas de Kubernetes com esses runtimes, incluindo a configuração de redes dual-stack (IPv4 e IPv6), monitoramento avançado, otimização de recursos, e práticas recomendadas de segurança.

Além das configurações essenciais, este guia cobre a implementação de plugins de rede, como Calico e Cilium, que garantem suporte a redes dual-stack e oferecem funcionalidades avançadas de políticas de segurança e observabilidade. Este tutorial é ideal para administradores de sistemas e engenheiros de DevOps que buscam uma base sólida para implementar e gerenciar Kubernetes com alta performance, segurança e flexibilidade.


Sumário


1. Introdução ao Kubernetes e Runtimes de Containers

Objetivo:
Apresentar o Kubernetes e a importância dos runtimes de containers, especialmente o Containerd e o CRI-O, na orquestração de containers. Nesta seção, você entenderá o papel do Kubernetes, o conceito de runtimes de containers e por que Containerd e CRI-O são amplamente recomendados para ambientes Kubernetes modernos.


1.1 O que é Kubernetes?

O Kubernetes é uma plataforma de código aberto criada pelo Google para automação de implantação, escala e gerenciamento de aplicações em containers. Ele permite administrar clusters de máquinas virtuais ou físicas que executam containers, abstraindo complexidades da infraestrutura e simplificando o gerenciamento de aplicações em larga escala.

  • Principais Funções:
    • Orquestração de Containers: Gerencia a implantação e escala de containers, controlando o ciclo de vida das aplicações.
    • Resiliência: Monitora o estado das aplicações, reiniciando containers falhos e redistribuindo cargas conforme necessário.
    • Escalabilidade: Ajusta a quantidade de réplicas de uma aplicação automaticamente, conforme a demanda.
    • Atualização Contínua: Facilita a atualização e o rollback de aplicações em produção.

O Kubernetes é ideal para empresas que precisam executar e manter aplicações distribuídas, oferecendo uma maneira flexível de gerenciar complexos sistemas de microserviços.


1.2 Runtimes de Containers: Conceito e Importância

O runtime de container é o software responsável por iniciar, gerenciar e parar containers em um sistema. Ele se comunica diretamente com o sistema operacional para executar o isolamento e a execução do container. No Kubernetes, o runtime é fundamental para a criação de containers e gerenciamento dos recursos necessários para que os containers possam rodar de maneira eficiente e segura.

  • Por que é Importante?
    O runtime é a ponte entre o Kubernetes e o sistema operacional. Ele permite que o Kubernetes execute comandos para iniciar, parar e gerenciar containers de forma padronizada, usando a Interface de Runtime de Containers (CRI).

  • Exemplos de Runtimes:

    • Docker: Amplamente utilizado, mas inclui ferramentas extras além do runtime.
    • Containerd: Um runtime mais leve e eficiente, recomendado pela CNCF para Kubernetes.
    • CRI-O: Um runtime leve, projetado para executar containers seguindo o padrão CRI, ideal para Kubernetes.

1.3 Diferença entre Docker, Containerd e CRI-O

A evolução dos runtimes levou ao uso de ferramentas mais especializadas, como Containerd e CRI-O, em vez do Docker. Cada um desses runtimes possui características específicas que os tornam mais ou menos indicados para Kubernetes:

Runtime Descrição Ideal para
Docker Inclui um conjunto completo de ferramentas para criação, distribuição e execução de containers, mas é um pacote maior do que o necessário para Kubernetes. Desenvolvimento local, CI/CD.
Containerd Uma versão mais leve e modular do Docker, foca apenas no runtime e gerenciamento de containers. Recomendado pela CNCF para Kubernetes. Clusters Kubernetes de produção.
CRI-O Um runtime desenvolvido especificamente para Kubernetes, focado na compatibilidade com a Interface de Runtime de Contêiner (CRI). Kubernetes com performance otimizada.
  • Por que Containerd e CRI-O?
    • Leves e Otimizados: Ambos são leves e especializados, integrando-se ao Kubernetes sem os componentes extras do Docker.
    • Compatibilidade com CRI: Tanto o Containerd quanto o CRI-O foram projetados para serem compatíveis com a CRI, o que significa que eles funcionam diretamente com o Kubernetes sem a necessidade de camadas intermediárias.
    • Performance e Estabilidade: Devido à sua simplicidade, Containerd e CRI-O oferecem melhor performance e menos sobrecarga, sendo mais eficientes em clusters de produção.

1.4 Por que Containerd e CRI-O são Mais Recomendados para Kubernetes?

Com a transição do Kubernetes para runtimes que seguem a CRI, como o Containerd e CRI-O, há várias vantagens:

  1. Simplicidade e Modularidade:
    • Diferente do Docker, que vem com ferramentas extras, Containerd e CRI-O são focados apenas no runtime, simplificando o gerenciamento de containers e reduzindo o risco de falhas.
  2. Integração Direta com Kubernetes:
    • Como ambos os runtimes são compatíveis com CRI, eles podem se integrar diretamente ao Kubernetes, facilitando a manutenção e evitando sobrecarga de componentes intermediários.
  3. Segurança e Controle:
    • Containerd e CRI-O oferecem configurações avançadas de segurança que permitem melhor controle sobre o ambiente de execução dos containers, atendendo às necessidades de ambientes de produção.
  4. Comunidade e Suporte:
    • Tanto Containerd quanto CRI-O são suportados pela CNCF e têm comunidades ativas, com atualizações regulares e práticas de segurança revisadas.

2. Configuração do Ambiente: Instalação do Kubernetes, Containerd e CRI-O


Objetivo:
Ensinar como preparar o ambiente, instalando e configurando o Kubernetes com os runtimes Containerd e CRI-O. Esta seção aborda o processo de instalação e verificação do ambiente em distribuições Linux Debian 12.


2.1 Instalação do Kubernetes em Distribuições Linux Debian 12

Para iniciar, é preciso configurar o ambiente com o Kubernetes, que será responsável por gerenciar os containers usando Containerd ou CRI-O como runtime.

Passo 1: Configurar Dependências do Kubernetes

  1. Atualizar o sistema e instalar pacotes básicos:

    1
    2
    
    sudo apt update && sudo apt upgrade -y
    sudo apt install -y apt-transport-https curl
    
  2. Adicionar a chave GPG do repositório Kubernetes:

    1
    
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    
  3. Adicionar o repositório Kubernetes:

    1
    
    echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
    

Passo 2: Instalar o Kubernetes (kubeadm, kubelet, kubectl)

  1. Atualizar os repositórios e instalar os pacotes:

    1
    2
    
    sudo apt update
    sudo apt install -y kubelet kubeadm kubectl
    
  2. Marcar as versões para evitar atualizações automáticas (mantendo a consistência do cluster):

    1
    
    sudo apt-mark hold kubelet kubeadm kubectl
    
  3. Ativar e iniciar o kubelet:

    1
    
    sudo systemctl enable kubelet && sudo systemctl start kubelet
    

2.2 Instalação e Configuração do Containerd

Containerd é um runtime leve para Kubernetes, amplamente recomendado pela CNCF.

Passo 1: Instalar o Containerd

  1. Instalar o Containerd:

    1
    
    sudo apt install -y containerd
    
  2. Configurar o arquivo config.toml para ajustes básicos:

    1
    2
    
    sudo mkdir -p /etc/containerd
    sudo containerd config default | sudo tee /etc/containerd/config.toml
    
  3. Ajuste de Configurações no config.toml
    Para garantir que o Containerd funcione de forma ideal com o Kubernetes, edite o arquivo /etc/containerd/config.toml:

    • Habilite o modo Systemd para o cgroup:
      1
      2
      3
      
      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
          SystemdCgroup = true
      
  4. Iniciar e habilitar o Containerd:

    1
    2
    
    sudo systemctl restart containerd
    sudo systemctl enable containerd
    

2.3 Instalação e Configuração do CRI-O

O CRI-O é outro runtime leve, desenvolvido especialmente para rodar containers no Kubernetes com base no padrão CRI.

Passo 1: Configurar o Repositório CRI-O

  1. Adicionar o repositório para a versão estável do CRI-O:

    Primeiro, defina a variável de versão compatível com o Kubernetes. Exemplo para a versão 1.24:

    1
    
    VERSION=1.24
    
  2. Adicionar o repositório e instalar o CRI-O:

    1
    2
    3
    4
    5
    
    echo "deb [signed-by=/usr/share/keyrings/libcontainers-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_20.04/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
    curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_20.04/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-archive-keyring.gpg
    
    sudo apt update
    sudo apt install -y cri-o cri-o-runc
    
  3. Habilitar e Iniciar o CRI-O:

    1
    2
    3
    
    sudo systemctl daemon-reload
    sudo systemctl enable crio
    sudo systemctl start crio
    

2.4 Configuração para Comunicação do Kubernetes com os Runtimes

Para garantir que o Kubernetes utilize o runtime correto (Containerd ou CRI-O), precisamos configurar o kubelet para especificar o runtime de container.

Passo 1: Configurar o kubelet para Usar Containerd ou CRI-O

  1. Editar o arquivo de configuração do kubelet (/var/lib/kubelet/config.yaml):

    1
    2
    3
    4
    5
    6
    7
    
    # Configuração para Containerd
    kind: KubeletConfiguration
    apiVersion: kubelet.config.k8s.io/v1beta1
    containerRuntimeEndpoint: "unix:///run/containerd/containerd.sock"
    
    # Configuração para CRI-O
    # containerRuntimeEndpoint: "unix:///var/run/crio/crio.sock"
    
  2. Reiniciar o kubelet para aplicar as alterações:

    1
    
    sudo systemctl restart kubelet
    

Verificar a Conexão entre Kubernetes e o Runtime

Para verificar se o Kubernetes reconhece o runtime de container configurado:

1
kubectl get nodes

Esse comando deve retornar o estado dos nós, indicando que eles estão ativos e reconhecem o runtime de container configurado.


Resumo da Seção

Nesta seção, configuramos o ambiente Kubernetes com os runtimes de containers Containerd e CRI-O. Instalar e configurar esses componentes é essencial para garantir que o cluster Kubernetes possa gerenciar containers de forma eficiente e com alta compatibilidade com o CRI. Na próxima seção, veremos como integrar o Kubernetes com Containerd, ajustando os parâmetros e verificando o funcionamento inicial do runtime no cluster.


3. Integração do Kubernetes com Containerd


Objetivo:
Demonstrar como integrar o Kubernetes ao runtime Containerd, configurando-o como o runtime padrão para execução de containers. Nesta seção, faremos os ajustes necessários no arquivo de configuração do Containerd e iniciaremos o Kubernetes com o runtime configurado.


3.1 Configuração do Containerd como Runtime Padrão no Kubernetes

O Containerd precisa estar configurado corretamente para servir como runtime do Kubernetes. Isso inclui ajustar o arquivo config.toml para garantir que o Containerd esteja integrado ao Kubernetes de forma otimizada.

Passo 1: Configurar o config.toml do Containerd

  1. Verificar se o Containerd já possui uma configuração. Caso contrário, gerar a configuração padrão:

    1
    2
    
    sudo mkdir -p /etc/containerd
    sudo containerd config default | sudo tee /etc/containerd/config.toml
    
  2. Configurar o uso do Systemd para Cgroups

    O Kubernetes recomenda o uso de Systemd como driver de cgroup para ambientes de produção, o que garante um gerenciamento de recursos mais consistente e seguro.

    • Abra o arquivo /etc/containerd/config.toml e ajuste o seguinte trecho para configurar o Systemd:

      1
      2
      3
      
      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
          SystemdCgroup = true
      
    • Salve e feche o arquivo após a edição.

  3. Reiniciar o Containerd para aplicar as alterações

    1
    
    sudo systemctl restart containerd
    

3.2 Configuração do Kubelet para Usar o Containerd

Agora, precisamos ajustar o kubelet para especificar o Containerd como runtime. Esse ajuste permite que o Kubernetes interaja diretamente com o Containerd.

Passo 1: Editar a Configuração do kubelet

  1. Configurar o endpoint do runtime no arquivo do kubelet:

    Edite o arquivo de configuração do kubelet, que geralmente está localizado em /var/lib/kubelet/config.yaml.

    • Certifique-se de que o containerRuntimeEndpoint aponte para o Containerd:

      1
      2
      3
      
      kind: KubeletConfiguration
      apiVersion: kubelet.config.k8s.io/v1beta1
      containerRuntimeEndpoint: "unix:///run/containerd/containerd.sock"
      
  2. Reiniciar o kubelet para que ele passe a usar o runtime configurado:

    1
    
    sudo systemctl restart kubelet
    

Passo 2: Verificar a Integração entre Kubernetes e Containerd

Depois de reiniciar o kubelet, podemos verificar se o Kubernetes está reconhecendo o Containerd como runtime ativo.

  1. Verificar o estado dos nós do Kubernetes:

    1
    
    kubectl get nodes
    
    • Esse comando deve mostrar os nós como Ready, indicando que o kubelet está integrado ao Containerd e que o cluster está funcionando corretamente.
  2. Verificar o Runtime do Containerd em um Pod:

    Podemos criar um pod de teste para verificar o runtime em uso. Crie um arquivo YAML para o pod:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # pod-containerd-test.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: containerd-test
    spec:
      containers:
        - name: nginx
          image: nginx
    

    Aplique o YAML com o comando:

    1
    
    kubectl apply -f pod-containerd-test.yaml
    
  3. Verificar o Runtime Usado pelo Pod:

    Após a criação do pod, use o comando abaixo para verificar qual runtime foi utilizado:

    1
    
    kubectl get pod containerd-test -o=jsonpath='{.status.containerStatuses[0].containerID}'
    
    • O resultado deve incluir containerd://, confirmando que o Containerd está sendo usado para gerenciar o container.

3.3 Exemplo Prático: Iniciar um Nó Kubernetes com Containerd

Neste exemplo, criaremos e gerenciaremos um nó Kubernetes com o runtime Containerd configurado.

Passo 1: Iniciar um Cluster com kubeadm

Utilize o kubeadm para iniciar um cluster com o Containerd como runtime:

  1. Criar o Cluster:

    1
    
    sudo kubeadm init --pod-network-cidr=10.244.0.0/16
    
    • Nota: Certifique-se de ajustar o --pod-network-cidr de acordo com o plugin de rede CNI que será usado. Neste exemplo, usamos 10.244.0.0/16, que é compatível com Flannel.
  2. Configurar o kubectl para o Usuário Local:

    1
    2
    3
    
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  3. Verificar o Cluster e o Runtime do Nó:

    Para verificar o runtime de cada nó, use o seguinte comando:

    1
    
    kubectl get nodes -o wide
    
  4. Aplicar um Plugin de Rede CNI (exemplo com Flannel):

    Após a inicialização do cluster, aplique um plugin de rede. Neste exemplo, usaremos Flannel:

    1
    
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    

    Isso completa a configuração de um nó Kubernetes que utiliza o Containerd como runtime.


3.4 Checklist para Verificação da Integração

  • Verificar se o kubelet está configurado para usar o Containerd com o endpoint correto no arquivo /var/lib/kubelet/config.yaml.
  • Verificar o status do kubelet e do Containerd usando systemctl status kubelet e systemctl status containerd.
  • Verificar a criação de pods e o runtime do container, confirmando que os containers estão sendo executados com containerd://.

Resumo da Seção

Nesta seção, configuramos o Containerd como runtime padrão para o Kubernetes, ajustando o kubelet e verificando a integração entre os componentes. Agora, o Kubernetes utiliza o Containerd para iniciar e gerenciar containers, com uma configuração otimizada para ambientes de produção. A próxima seção será dedicada à integração com o CRI-O, outro runtime leve e eficiente para Kubernetes.


4. Integração do Kubernetes com CRI-O


Objetivo:
Demonstrar como configurar o Kubernetes para usar o CRI-O como runtime de containers. Nesta seção, vamos ajustar o kubelet para trabalhar com o CRI-O e verificar a integração entre o Kubernetes e o CRI-O.


4.1 Configuração do CRI-O como Runtime Padrão no Kubernetes

O CRI-O foi projetado especificamente para Kubernetes, tornando-o uma escolha natural para quem busca um runtime leve e eficiente.

Passo 1: Ajustar a Configuração do kubelet para Usar o CRI-O

Para integrar o Kubernetes ao CRI-O, o kubelet deve ser configurado para reconhecer o CRI-O como runtime de container.

  1. Editar o arquivo de configuração do kubelet
    Abra o arquivo de configuração do kubelet, normalmente localizado em /var/lib/kubelet/config.yaml, e defina o endpoint do CRI-O:

    1
    2
    3
    
    kind: KubeletConfiguration
    apiVersion: kubelet.config.k8s.io/v1beta1
    containerRuntimeEndpoint: "unix:///var/run/crio/crio.sock"
    
  2. Reiniciar o kubelet para que ele reconheça o CRI-O como runtime:

    1
    
    sudo systemctl restart kubelet
    

Passo 2: Verificar o Funcionamento do CRI-O com Kubernetes

Depois de reiniciar o kubelet, use o kubectl para verificar se o Kubernetes está reconhecendo o CRI-O como runtime ativo.

  1. Verificar o Status dos Nós Kubernetes:

    1
    
    kubectl get nodes
    
    • Esse comando deve retornar os nós como Ready, indicando que o Kubernetes reconhece o CRI-O como runtime.
  2. Verificar o Runtime do Container em um Pod de Teste

    Para garantir que o CRI-O está funcionando, crie um pod de teste usando o YAML abaixo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # pod-crio-test.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: crio-test
    spec:
      containers:
        - name: nginx
          image: nginx
    

    Aplique o YAML:

    1
    
    kubectl apply -f pod-crio-test.yaml
    
  3. Confirmar o Runtime Utilizado pelo Pod

    Após criar o pod, use o comando a seguir para verificar o runtime:

    1
    
    kubectl get pod crio-test -o=jsonpath='{.status.containerStatuses[0].containerID}'
    
    • O resultado deve incluir cri-o://, confirmando que o CRI-O está gerenciando o container.

4.2 Exemplo Prático: Inicialização de um Nó Kubernetes com CRI-O

Vamos inicializar um cluster Kubernetes usando o kubeadm, com o CRI-O como runtime.

Passo 1: Inicializar o Cluster com kubeadm

Para iniciar o cluster com kubeadm, execute:

1
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  • Nota: Ajuste o --pod-network-cidr conforme o plugin de rede que será utilizado. Neste exemplo, estamos utilizando a faixa 10.244.0.0/16, que é compatível com o Flannel.

Passo 2: Configurar o kubectl para o Usuário Local

Após a inicialização, configure o kubectl para o usuário local:

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Passo 3: Aplicar um Plugin de Rede CNI (Exemplo com Flannel)

Para que os pods possam se comunicar, é necessário aplicar um plugin de rede. Neste exemplo, usaremos o Flannel:

1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Isso completa a configuração inicial do nó Kubernetes com o CRI-O.


4.3 Checklist para Verificação da Integração com CRI-O

  • Verificar o arquivo config.yaml do kubelet para garantir que o containerRuntimeEndpoint está apontando para o CRI-O (/var/run/crio/crio.sock).
  • Confirmar o status do kubelet e do CRI-O usando systemctl status kubelet e systemctl status crio.
  • Criar pods de teste para verificar o funcionamento do CRI-O, confirmando que o runtime usado é cri-o://.

Resumo da Seção

Nesta seção, configuramos o Kubernetes para usar o CRI-O como runtime de containers, realizando os ajustes necessários no kubelet e verificando a integração por meio de pods de teste. Com isso, o Kubernetes está preparado para gerenciar containers de maneira eficiente usando o CRI-O, um runtime projetado especificamente para ambientes Kubernetes. Na próxima seção, abordaremos a configuração do kubelet para uso de múltiplos runtimes, o que permite alternar entre Containerd e CRI-O conforme as necessidades do ambiente.


5. Configuração do Kubelet para Uso de Múltiplos Runtimes


Objetivo:
Demonstrar como configurar o kubelet para suportar múltiplos runtimes, como Containerd e CRI-O. Nesta seção, faremos os ajustes necessários para alternar entre os runtimes conforme as necessidades do ambiente Kubernetes, garantindo flexibilidade e facilidade de administração.


5.1 Por que Usar Múltiplos Runtimes no Kubernetes?

A capacidade de alternar entre diferentes runtimes permite que os administradores ajustem o ambiente Kubernetes de acordo com necessidades específicas, como requisitos de compatibilidade, desempenho ou características de segurança.

Cenários Comuns:

  • Desempenho Diferenciado: Permite escolher o runtime mais adequado para cargas de trabalho intensivas.
  • Compatibilidade e Teste: Ideal para ambientes de teste, onde você pode avaliar a compatibilidade de diferentes runtimes.
  • Flexibilidade em Clusters Híbridos: Pode ser útil em clusters que atendem múltiplos tipos de cargas de trabalho.

5.2 Configuração do Kubelet para Suporte a Múltiplos Runtimes

O Kubernetes permite a configuração do kubelet para alternar entre runtimes, definindo endpoints de runtime que apontam para o socket do Containerd ou do CRI-O.

Passo 1: Editar o Arquivo de Configuração do kubelet

  1. Localizar e Abrir o Arquivo de Configuração
    O arquivo de configuração do kubelet está localizado em /var/lib/kubelet/config.yaml.

  2. Configurar o Endpoint do Runtime
    No arquivo de configuração do kubelet, o parâmetro containerRuntimeEndpoint define o runtime a ser usado:

    • Para Containerd:

      1
      
      containerRuntimeEndpoint: "unix:///run/containerd/containerd.sock"
      
    • Para CRI-O:

      1
      
      containerRuntimeEndpoint: "unix:///var/run/crio/crio.sock"
      
  3. Configuração Dinâmica
    Infelizmente, o Kubernetes não suporta a configuração simultânea de múltiplos runtimes em um único nó. A escolha do runtime é feita ao editar e definir um único endpoint no config.yaml. Para alternar entre os runtimes, é necessário alterar o valor do containerRuntimeEndpoint e reiniciar o kubelet.


5.3 Exemplo Prático de Alteração Dinâmica entre Containerd e CRI-O

Aqui está um exemplo prático de como alternar entre os runtimes Containerd e CRI-O em um nó Kubernetes.

Passo 1: Configurar o Kubelet para Usar o Containerd

  1. Editar o Arquivo config.yaml do kubelet para Apontar para o Socket do Containerd:

    1
    
    containerRuntimeEndpoint: "unix:///run/containerd/containerd.sock"
    
  2. Reiniciar o kubelet para aplicar as mudanças:

    1
    
    sudo systemctl restart kubelet
    
  3. Verificar o Runtime do Container
    Crie um pod de teste e verifique o runtime, que deve retornar containerd://:

    1
    2
    
    kubectl run test-containerd --image=nginx
    kubectl get pod test-containerd -o=jsonpath='{.status.containerStatuses[0].containerID}'
    

Passo 2: Alterar o Kubelet para Usar o CRI-O

  1. Editar o Arquivo config.yaml para Apontar para o Socket do CRI-O:

    1
    
    containerRuntimeEndpoint: "unix:///var/run/crio/crio.sock"
    
  2. Reiniciar o kubelet:

    1
    
    sudo systemctl restart kubelet
    
  3. Verificar o Novo Runtime do Container
    Crie um pod de teste e verifique o runtime, que agora deve retornar cri-o://:

    1
    2
    
    kubectl run test-crio --image=nginx
    kubectl get pod test-crio -o=jsonpath='{.status.containerStatuses[0].containerID}'
    

5.4 Checklist para Alternar Entre Containerd e CRI-O

  • Verificar e Editar o Endpoint do Runtime no arquivo /var/lib/kubelet/config.yaml para garantir que o containerRuntimeEndpoint aponte para o runtime desejado.
  • Reiniciar o kubelet após qualquer alteração no arquivo config.yaml.
  • Verificar o Runtime Utilizado por Pods de Teste usando o comando kubectl get pod <pod-name> -o=jsonpath='{.status.containerStatuses[0].containerID}'.

Resumo da Seção

Nesta seção, configuramos o kubelet para alternar entre os runtimes Containerd e CRI-O, proporcionando flexibilidade para adaptar o ambiente conforme necessário. Esse processo permite configurar o Kubernetes com o runtime que melhor atende aos requisitos específicos de cada aplicação ou ambiente de teste. A próxima seção abordará como criar e gerenciar pods e deployments no Kubernetes com os runtimes Containerd e CRI-O.


6. Criação e Gerenciamento de Pods e Deployments com Kubernetes


Objetivo:
Explicar como criar e gerenciar pods e deployments no Kubernetes, utilizando os runtimes Containerd e CRI-O. A seção inclui exemplos práticos para deployment de aplicações, visualização de logs e verificação do runtime em uso.


6.1 Criação de Pods com Kubernetes e Verificação do Runtime

Para garantir que o Kubernetes está utilizando o runtime desejado (Containerd ou CRI-O), vamos criar um pod e verificar o runtime usado para gerenciar o container.

Passo 1: Criação de um Pod com o Kubernetes

  1. Criar um arquivo YAML para o Pod

    Salve o seguinte conteúdo em um arquivo chamado pod-example.yaml:

    1
    2
    3
    4
    5
    6
    7
    8
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: example-pod
    spec:
      containers:
        - name: nginx
          image: nginx
    
  2. Aplicar o YAML para criar o Pod:

    1
    
    kubectl apply -f pod-example.yaml
    
  3. Verificar o Status do Pod:

    Use o comando abaixo para verificar se o pod foi criado e está em execução:

    1
    
    kubectl get pods
    
  4. Verificar o Runtime em Uso:

    Confirme qual runtime está em uso pelo Kubernetes para o pod criado:

    1
    
    kubectl get pod example-pod -o=jsonpath='{.status.containerStatuses[0].containerID}'
    
    • A saída indicará o runtime em uso, exibindo containerd:// ou cri-o:// conforme a configuração.

6.2 Criação de Deployments no Kubernetes

O Kubernetes permite a criação de Deployments, uma abstração que simplifica a gerência de múltiplas réplicas de um aplicativo e facilita operações como escalonamento e atualizações contínuas.

Passo 1: Criar um Deployment com Kubernetes

  1. Criar o arquivo YAML para o Deployment

    Salve o seguinte conteúdo em um arquivo chamado deployment-example.yaml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx
              ports:
                - containerPort: 80
    
  2. Aplicar o YAML para criar o Deployment:

    1
    
    kubectl apply -f deployment-example.yaml
    
  3. Verificar o Status do Deployment:

    Use o comando abaixo para verificar se o deployment e suas réplicas estão ativas:

    1
    2
    
    kubectl get deployments
    kubectl get pods -l app=nginx
    

Passo 2: Escalonar o Deployment

Para aumentar o número de réplicas, use o comando scale:

1
kubectl scale deployment nginx-deployment --replicas=5
  • Verificação: Após o escalonamento, verifique o número de pods em execução:

    1
    
    kubectl get pods -l app=nginx
    

Passo 3: Atualizar o Deployment

Para atualizar o nginx para uma versão mais recente, como nginx:1.19, modifique o arquivo deployment-example.yaml:

1
2
3
containers:
  - name: nginx
    image: nginx:1.19

Aplique a atualização:

1
kubectl apply -f deployment-example.yaml
  • Verificação: Acompanhe o status da atualização com:

    1
    
    kubectl rollout status deployment nginx-deployment
    

6.3 Verificação de Logs e Status dos Pods e Deployments

O Kubernetes permite verificar os logs dos containers e o status dos pods em detalhes, o que facilita o monitoramento de aplicações e a detecção de problemas.

Passo 1: Verificar Logs de um Pod

Para verificar os logs de um pod específico:

1
kubectl logs <pod-name>
  • Exemplo:

    1
    
    kubectl logs example-pod
    

Passo 2: Descrever um Pod ou Deployment

Para visualizar detalhes e o histórico de eventos de um pod ou deployment, use o comando describe:

1
2
kubectl describe pod <pod-name>
kubectl describe deployment <deployment-name>
  • Exemplo:

    1
    
    kubectl describe pod example-pod
    

    Esse comando exibe informações detalhadas sobre o status do pod, eventos e problemas encontrados durante a inicialização.


6.4 Exemplo Prático: Verificando o Runtime e Gerenciando Pods com Containerd/CRI-O

Vamos recapitular o uso do runtime de container (Containerd ou CRI-O) no Kubernetes com alguns passos práticos.

  1. Confirmar o Runtime com um pod de teste:
    • Ao criar um novo pod, confirme o runtime utilizado para o container com kubectl get pod example-pod -o=jsonpath='{.status.containerStatuses[0].containerID}'.
  2. Escalonar e atualizar o Deployment:
    • Crie réplicas adicionais e aplique uma atualização de imagem ao nginx-deployment para simular uma mudança em ambiente de produção.
  3. Monitorar Logs e Status:
    • Utilize kubectl logs e kubectl describe para obter informações de logs e status, ajudando a identificar e resolver possíveis problemas no cluster.

Resumo da Seção

Nesta seção, criamos e gerenciamos pods e deployments no Kubernetes com os runtimes Containerd e CRI-O, incluindo exemplos práticos de verificação do runtime, escalonamento e atualização de deployments. Com isso, você pode gerenciar aplicações de maneira eficiente, aproveitando a flexibilidade dos runtimes suportados pelo Kubernetes. Na próxima seção, abordaremos o monitoramento e o acesso a logs para Containerd e CRI-O, essencial para manter o ambiente em funcionamento e identificar problemas rapidamente.


7. Monitoramento e Logs com Containerd e CRI-O


Objetivo:
Ensinar como monitorar e acessar logs dos runtimes Containerd e CRI-O no Kubernetes, utilizando ferramentas como crictl para inspeção e monitoramento de containers. Monitorar os runtimes permite identificar e resolver problemas rapidamente, mantendo o ambiente Kubernetes estável e eficiente.


7.1 Ferramenta crictl para Inspeção e Monitoramento de Containers

A ferramenta crictl foi desenvolvida para interagir diretamente com runtimes que seguem a CRI (Container Runtime Interface), como Containerd e CRI-O. Ela fornece comandos para gerenciar containers, visualizar logs, inspecionar status e muito mais.

Instalação do crictl

  1. Baixar a Versão mais Recente do crictl:

    1
    2
    
    VERSION="v1.24.0"  # Substitua pela versão desejada
    curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz | sudo tar -C /usr/local/bin -xz
    
  2. Configurar o crictl para Usar o Runtime Certo
    Para que o crictl se comunique corretamente com o runtime desejado, é preciso ajustar o arquivo de configuração. Crie o arquivo /etc/crictl.yaml:

    • Configuração para Containerd:

      1
      
      runtime-endpoint: "unix:///run/containerd/containerd.sock"
      
    • Configuração para CRI-O:

      1
      
      runtime-endpoint: "unix:///var/run/crio/crio.sock"
      
  3. Verificar a Instalação
    Execute um comando básico para garantir que o crictl está funcionando:

    1
    
    sudo crictl info
    
    • Esse comando deve retornar informações sobre o runtime e sua configuração.

7.2 Monitoramento de Containers com crictl

O crictl fornece vários comandos para monitoramento e gerenciamento de containers em execução. Abaixo estão alguns dos comandos mais úteis:

Listar Containers em Execução

Para ver todos os containers que estão sendo gerenciados pelo runtime configurado, use:

1
sudo crictl ps
  • Parâmetros Úteis:
    • -a: Exibe todos os containers, incluindo os parados.
    • --name <container_name>: Filtra por nome do container.

Inspecionar Detalhes de um Container

Para inspecionar um container específico e obter detalhes como o runtime, status e recursos alocados:

1
sudo crictl inspect <container_id>
  • Dica: O container_id pode ser obtido com o comando crictl ps.

Ver Logs de um Container

Para acessar os logs de um container específico:

1
sudo crictl logs <container_id>

Esse comando é útil para identificar problemas específicos dentro do container e verificar logs de aplicações.

Parar e Remover Containers

  • Parar um Container:

    1
    
    sudo crictl stop <container_id>
    
  • Remover um Container:

    1
    
    sudo crictl rm <container_id>
    

Esses comandos são úteis para gerenciamento e manutenção de containers em clusters de desenvolvimento ou teste.


7.3 Logs do Runtime de Container no Kubernetes

Além do crictl, é importante configurar os logs do runtime para serem capturados e acessíveis no sistema.

Configuração de Logs no Containerd

  1. Editar o Arquivo config.toml do Containerd:

    Abra o arquivo /etc/containerd/config.toml e configure o nível de log conforme necessário:

    1
    2
    
    [plugins."io.containerd.grpc.v1.cri".containerd]
      log_level = "info"  # Altere para "debug" para log detalhado
    
  2. Reiniciar o Containerd para Aplicar as Alterações:

    1
    
    sudo systemctl restart containerd
    
  3. Visualizar Logs do Containerd

    Os logs do Containerd podem ser visualizados usando o comando journalctl:

    1
    
    sudo journalctl -u containerd -f
    

Configuração de Logs no CRI-O

  1. Editar o Arquivo de Configuração do CRI-O
    O arquivo de configuração do CRI-O geralmente está em /etc/crio/crio.conf. Ajuste o nível de log conforme necessário:

    1
    2
    
    [crio]
    log_level = "info"  # Altere para "debug" para log detalhado
    
  2. Reiniciar o CRI-O para Aplicar as Alterações:

    1
    
    sudo systemctl restart crio
    
  3. Visualizar Logs do CRI-O

    Para visualizar logs em tempo real do CRI-O:

    1
    
    sudo journalctl -u crio -f
    

7.4 Exemplos Práticos de Monitoramento e Troubleshooting com crictl

Vamos recapitular os comandos do crictl com alguns exemplos práticos para monitoramento e troubleshooting.

  1. Listar Todos os Containers:

    1
    
    sudo crictl ps -a
    
  2. Ver Logs de um Container Específico:

    1
    
    sudo crictl logs <container_id>
    
  3. Diagnosticar Problemas com inspect:

    Se um container está em estado de erro, use inspect para verificar detalhes:

    1
    
    sudo crictl inspect <container_id>
    
  4. Verificar o Runtime Utilizado:

    Confirme o runtime de um container específico para assegurar que o ambiente está funcionando como esperado:

    1
    
    kubectl get pod <pod-name> -o=jsonpath='{.status.containerStatuses[0].containerID}'
    

Resumo da Seção

Nesta seção, exploramos o uso do crictl para monitoramento e logs de containers no Kubernetes com runtimes Containerd e CRI-O. Com esses comandos e configurações, você poderá monitorar o desempenho e resolver problemas de containers de forma eficiente, usando ferramentas específicas para inspeção e diagnóstico. Na próxima seção, abordaremos práticas de segurança em Kubernetes, com foco em containers gerenciados pelo Containerd e CRI-O.


8. Segurança em Kubernetes com Containerd e CRI-O


Objetivo:
Explorar as práticas de segurança para Kubernetes usando os runtimes Containerd e CRI-O, incluindo políticas de segurança, uso de SELinux e AppArmor, e exemplos de aplicação de segurança para proteger containers e pods.


8.1 Configuração de Políticas de Segurança para Execução de Containers

No Kubernetes, a segurança pode ser reforçada com Policies que restringem ações de pods e containers. A Pod Security Policy (PSP) (descontinuada em versões recentes) ou políticas personalizadas permitem controlar o acesso a recursos e definir parâmetros de execução.

Alternativa Atual: Políticas de Segurança com Admission Controllers

Com o fim das PSPs, recomendamos o uso de ferramentas como OPA/Gatekeeper para definir regras de segurança avançadas.

  1. Instalar o Gatekeeper (OPA):

    1
    
    kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/release-3.7/deploy/gatekeeper.yaml
    
  2. Configurar Políticas de Segurança com Gatekeeper
    Com o Gatekeeper, você pode definir políticas de segurança que controlam o acesso e o comportamento dos pods, assegurando que padrões seguros sejam seguidos.

  3. Exemplo de Política Básica:

    Este exemplo impede que contêineres sejam executados com privilégios elevados.

    1
    2
    3
    4
    5
    6
    
    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: K8sPSPPrivilegedContainer
    metadata:
      name: disallow-privileged-containers
    spec:
      enforcementAction: deny
    

8.2 Uso de SELinux e AppArmor para Proteção de Containers

SELinux e AppArmor são mecanismos de segurança em nível de kernel que controlam o acesso aos recursos do sistema pelos containers. Ambos podem ser configurados para restringir o comportamento dos pods e impedir acesso indevido a recursos do host.

Configuração de SELinux

  1. Ativar o SELinux no Host:

    No sistema host, verifique se o SELinux está ativo:

    1
    
    sudo setenforce 1  # Ativa o modo Enforcing
    
  2. Configurar o Containerd e CRI-O para Trabalhar com SELinux

    No arquivo de configuração do Containerd (/etc/containerd/config.toml), habilite o uso de SELinux:

    1
    2
    
    [plugins."io.containerd.grpc.v1.cri".containerd]
      selinux = true
    

    No CRI-O (/etc/crio/crio.conf), habilite o SELinux:

    1
    2
    
    [crio.runtime]
    selinux = true
    
  3. Aplicar Contextos de Segurança:
    Ao configurar SELinux, certifique-se de aplicar os contextos de segurança necessários para restringir o acesso dos containers aos recursos do host.

Configuração de AppArmor

O AppArmor permite definir perfis de segurança que limitam as ações de processos em execução.

  1. Ativar o AppArmor no Host:

    Verifique se o AppArmor está ativo no sistema:

    1
    
    sudo systemctl status apparmor
    
  2. Criar um Perfil AppArmor para o Container
    Salve o perfil no diretório /etc/apparmor.d/. Exemplo de um perfil AppArmor restritivo:

    1
    
    sudo apparmor_parser -r /etc/apparmor.d/my-container-profile
    
  3. Aplicar o Perfil AppArmor ao Pod
    No manifesto do pod, aplique o perfil:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: secure-pod
    spec:
      containers:
        - name: nginx
          image: nginx
          securityContext:
            apparmorProfile: "my-container-profile"
    

8.3 Configuração de SecurityContext no Kubernetes

O securityContext é usado para definir configurações de segurança específicas para pods e containers, restringindo o acesso a recursos e controlando permissões.

Exemplo de Configuração de SecurityContext para um Container

O securityContext pode ser usado para definir se um container roda com privilégios e quais são as permissões.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
kind: Pod
metadata:
  name: secure-pod
spec:
  containers:
    - name: nginx
      image: nginx
      securityContext:
        runAsUser: 1000
        runAsGroup: 3000
        privileged: false
        allowPrivilegeEscalation: false
        capabilities:
          drop: ["ALL"]
  • Parâmetros Importantes:
    • runAsUser: Especifica o ID do usuário que o container usará, evitando o uso do root.
    • privileged: Impede a execução do container em modo privilegiado.
    • allowPrivilegeEscalation: Bloqueia a elevação de privilégios no container.
    • capabilities: Remove todas as capacidades de root do container para minimizar os riscos.

8.4 Exemplo Prático de Política de Segurança em Containers com Containerd/CRI-O

Criar um Pod Restrito com SecurityContext

  1. Definir o Manifesto do Pod

    Salve o seguinte conteúdo em secure-pod.yaml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: secure-nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          securityContext:
            runAsUser: 1000
            allowPrivilegeEscalation: false
            capabilities:
              drop: ["ALL"]
    
  2. Aplicar a Configuração do Pod:

    1
    
    kubectl apply -f secure-pod.yaml
    
  3. Verificar o Pod e o SecurityContext:

    Verifique se o pod está rodando com as configurações de segurança aplicadas:

    1
    
    kubectl describe pod secure-nginx
    

    Esse comando mostrará os detalhes do securityContext aplicado ao pod, confirmando que as políticas de segurança estão em vigor.


8.5 Checklist de Segurança para Clusters Kubernetes com Containerd e CRI-O

  1. Aplicar SecurityContexts Consistentes em todos os pods para garantir que apenas as permissões necessárias estejam habilitadas.
  2. Utilizar Admission Controllers como Gatekeeper para reforçar políticas de segurança em nível de cluster.
  3. Configurar SELinux ou AppArmor para adicionar camadas de segurança em nível de sistema.
  4. Desativar Containers Privilegiados e evitar o uso de privilégios elevados sempre que possível.
  5. Monitorar e Auditar Atividades regularmente para identificar e mitigar atividades suspeitas.

Resumo da Seção

Nesta seção, configuramos práticas de segurança para o Kubernetes com os runtimes Containerd e CRI-O, usando políticas de segurança, SELinux, AppArmor e configurações de securityContext. Esses elementos aumentam a segurança do ambiente de containers, limitando permissões e reduzindo o risco de acessos não autorizados. Na próxima seção, vamos abordar a configuração de redes e plugins CNI para Containerd e CRI-O, essenciais para a comunicação e segurança de redes no Kubernetes.


9. Configuração de Redes e Plugins CNI com Containerd e CRI-O


Objetivo:
Ensinar como configurar redes no Kubernetes usando plugins CNI com os runtimes Containerd e CRI-O, proporcionando conectividade e segurança na comunicação entre pods e nodes. Veremos como integrar plugins populares, como Calico e Flannel, para gerenciar redes de forma eficiente.


9.1 Introdução aos Plugins CNI no Kubernetes

O Container Network Interface (CNI) é um padrão que define como configurar redes para containers. Kubernetes utiliza plugins CNI para oferecer conectividade entre pods e gerenciar políticas de rede, incluindo isolamento e roteamento.

Principais Plugins CNI:

  • Calico: Focado em segurança de rede e políticas avançadas, permitindo criação de redes seguras e controle granular.
  • Flannel: Simples e leve, ideal para clusters menores ou onde políticas de segurança detalhadas não são necessárias.
  • Weave: Oferece funcionalidades de descoberta de rede e roteamento dinâmico entre pods.

9.2 Configuração de Containerd e CRI-O para Suporte a CNI

Antes de instalar e configurar um plugin CNI, é necessário garantir que o Containerd e o CRI-O estejam configurados para suportar redes CNI.

Verificar Diretório de Configuração do CNI

Os runtimes geralmente utilizam /etc/cni/net.d para armazenar as configurações de plugins CNI.

  1. Criar o Diretório CNI (caso não exista):

    1
    
    sudo mkdir -p /etc/cni/net.d
    
  2. Verificar Diretório de Plugins CNI
    O diretório /opt/cni/bin armazena os binários dos plugins CNI.

    1
    
    sudo mkdir -p /opt/cni/bin
    

9.3 Instalação e Configuração de Plugins CNI

Abaixo estão os passos para instalar e configurar os plugins Calico e Flannel, dois dos plugins CNI mais utilizados no Kubernetes.

Instalação e Configuração do Calico

O Calico fornece funcionalidades avançadas de políticas de segurança, tornando-o ideal para clusters que necessitam de controles granulares de rede.

  1. Aplicar a Configuração do Calico:

    1
    
    kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
    
  2. Verificar a Instalação do Calico:

    Após aplicar o YAML do Calico, confirme que os pods de rede foram criados e estão em execução:

    1
    
    kubectl get pods -n kube-system
    
    • Dica: Verifique se os pods calico-kube-controllers e calico-node estão em estado Running.
  3. Configurar Políticas de Rede com o Calico

    Com o Calico instalado, você pode definir políticas de rede para controlar o tráfego entre pods e namespaces.

    • Exemplo de Política de Rede: Restringir o acesso ao nginx apenas para pods dentro do mesmo namespace.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      apiVersion: projectcalico.org/v3
      kind: NetworkPolicy
      metadata:
        name: allow-same-namespace
        namespace: default
      spec:
        selector: app == "nginx"
        ingress:
          - action: Allow
            source:
              namespaceSelector: name == "default"
      
  4. Aplicar a Política:

    1
    
    kubectl apply -f policy.yaml
    

Instalação e Configuração do Flannel

O Flannel é um plugin de rede simples e eficiente, ideal para clusters que não necessitam de políticas de segurança complexas.

  1. Aplicar a Configuração do Flannel:

    1
    
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
  2. Verificar a Instalação do Flannel:

    Assim como no Calico, verifique se os pods kube-flannel-ds estão em execução:

    1
    
    kubectl get pods -n kube-system -l app=flannel
    
  3. Configuração de Rede com Flannel

    O Flannel cria uma rede plana para todos os pods, sem a necessidade de configurações adicionais de políticas de rede.


9.4 Verificação da Conectividade de Rede entre Pods

Após configurar o plugin CNI, é importante verificar se os pods podem se comunicar entre si.

  1. Criar Pods de Teste:

    Crie dois pods simples para testar a conectividade de rede:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    # pod1.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod1
    spec:
      containers:
        - name: busybox
          image: busybox
          command: ["sleep", "3600"]
    
    # pod2.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod2
    spec:
      containers:
        - name: busybox
          image: busybox
          command: ["sleep", "3600"]
    
    1
    2
    
    kubectl apply -f pod1.yaml
    kubectl apply -f pod2.yaml
    
  2. Testar Conectividade entre Pods:

    Para verificar se os pods conseguem se comunicar, conecte-se ao pod1 e faça um ping para pod2:

    1
    
    kubectl exec -it pod1 -- ping <POD2_IP>
    
    • Nota: Obtenha o IP de pod2 com o comando kubectl get pod pod2 -o wide.
  3. Diagnosticar Problemas de Rede (se necessário)

    Caso não haja conectividade, verifique os logs do plugin CNI no namespace kube-system para identificar possíveis erros.


9.5 Checklist para Configuração de Redes com Plugins CNI

  1. Verificar o Diretório CNI: Assegure-se de que o diretório /etc/cni/net.d está configurado.
  2. Instalar Plugins CNI: Confirme a instalação e o funcionamento dos pods do plugin CNI escolhido (Calico, Flannel).
  3. Configurar Políticas de Rede: Caso utilize o Calico, defina políticas para controlar o acesso entre namespaces e pods.
  4. Testar Conectividade entre Pods: Verifique se os pods conseguem se comunicar conforme esperado.

Resumo da Seção

Nesta seção, configuramos redes para Kubernetes com plugins CNI suportados por Containerd e CRI-O. Exploramos as funcionalidades dos plugins Calico e Flannel, além de testar a conectividade entre pods. Configurações de rede são essenciais para a comunicação segura entre aplicações em um cluster Kubernetes. Na próxima seção, veremos práticas de otimização de performance para Kubernetes usando Containerd e CRI-O.


10. Otimização de Performance e Gerenciamento de Recursos


Objetivo:
Explorar práticas de otimização de performance para clusters Kubernetes com runtimes Containerd e CRI-O, incluindo configuração de limites de CPU e memória, ajustes de parâmetros de rede e gerenciamento de recursos em tempo real. Essas práticas ajudam a manter o cluster responsivo, eficiente e adaptado às necessidades das cargas de trabalho.


10.1 Limitação de Recursos e Configuração de Parâmetros no Kubernetes

O Kubernetes permite configurar limites de CPU e memória em pods e containers, o que garante que os recursos do sistema sejam distribuídos de maneira eficiente.

Definir Requests e Limits para CPU e Memória

O uso de requests e limits permite que cada container receba uma quantidade mínima de recursos (requests) e define o máximo que ele pode utilizar (limits).

  1. Exemplo de Configuração de Requests e Limits para CPU e Memória

    Salve o seguinte conteúdo em um arquivo chamado resource-limits.yaml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: resource-pod
    spec:
      containers:
        - name: nginx
          image: nginx
          resources:
            requests:
              memory: "256Mi"
              cpu: "500m"
            limits:
              memory: "512Mi"
              cpu: "1000m"
    
    • requests: Define o valor mínimo de memória e CPU que o container terá garantido.
    • limits: Define o valor máximo de memória e CPU que o container poderá consumir.
  2. Aplicar a Configuração:

    1
    
    kubectl apply -f resource-limits.yaml
    
  3. Verificar o Consumo de Recursos:

    Use o comando kubectl describe pod para verificar os limites e as solicitações definidas:

    1
    
    kubectl describe pod resource-pod
    

Monitoramento de Utilização de Recursos em Tempo Real

Para monitorar o consumo de recursos em tempo real, você pode usar o kubectl top (necessita que o Metric Server esteja instalado).

  1. Instalar o Metric Server (se não estiver instalado):

    1
    
    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
    
  2. Monitorar o Consumo de Recursos:

    1
    
    kubectl top pod resource-pod
    

10.2 Ajuste de Parâmetros de Network e Disk I/O no Containerd e CRI-O

Além de CPU e memória, ajustar os parâmetros de rede e I/O é essencial para garantir a performance em ambientes de alta demanda.

Ajustes no Containerd

  1. Modificar Parâmetros de Network e Disk I/O no config.toml:

    O arquivo de configuração do Containerd (/etc/containerd/config.toml) permite ajustes detalhados. Por exemplo, você pode ajustar o tempo de timeout e a largura de banda:

    1
    2
    
    [plugins."io.containerd.grpc.v1.cri".containerd]
      snapshotter = "overlayfs"
    
  2. Configurar o Systemd para Prioridade de Rede e I/O:

    Para otimizar o Containerd, edite o serviço do containerd.service para ajustar as prioridades de CPU e I/O no Systemd:

    1
    2
    3
    
    [Service]
    CPUAccounting=true
    IOAccounting=true
    

    Após a configuração, reinicie o serviço:

    1
    2
    
    sudo systemctl daemon-reload
    sudo systemctl restart containerd
    

Ajustes no CRI-O

  1. Ajustar Parâmetros de I/O no Arquivo crio.conf

    No CRI-O, o arquivo de configuração (/etc/crio/crio.conf) também permite ajustes. Por exemplo, é possível definir o overlayfs como snapshotter para melhorar o desempenho de I/O:

    1
    2
    
    [storage.options]
    storage_driver = "overlay"
    
  2. Habilitar Systemd para Gerenciamento de Recursos

    No CRI-O, você pode configurar o Systemd para gerenciar CPU e I/O:

    1
    2
    3
    
    [Service]
    CPUAccounting=true
    IOAccounting=true
    

    Reinicie o serviço para aplicar as alterações:

    1
    2
    
    sudo systemctl daemon-reload
    sudo systemctl restart crio
    

10.3 Configurações Avançadas para Otimização de Pods e Containers

Configuração de Affinity e Anti-Affinity

Configurar affinity e anti-affinity ajuda a gerenciar onde os pods serão alocados, o que pode otimizar o uso de recursos e minimizar a latência.

  • Affinity: Força pods a serem executados próximos de outros pods.
  • Anti-Affinity: Impede que certos pods sejam alocados no mesmo nó, evitando sobrecarga de recursos.
  1. Exemplo de Anti-Affinity para Distribuir Carga

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-affinity
    spec:
      replicas: 3
      template:
        metadata:
          labels:
            app: nginx
        spec:
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchLabels:
                      app: nginx
                  topologyKey: "kubernetes.io/hostname"
    
  2. Aplicar a Configuração de Affinity/Anti-Affinity:

    1
    
    kubectl apply -f nginx-affinity.yaml
    

Configuração de Autoscaling

Para otimizar o uso de recursos, configure o autoscaling para que o Kubernetes ajuste automaticamente a quantidade de pods conforme a demanda.

  1. Configurar o Horizontal Pod Autoscaler (HPA):

    1
    
    kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10
    
  2. Verificar o Status do Autoscaler:

    1
    
    kubectl get hpa
    

10.4 Monitoramento e Análise de Performance com Ferramentas de Observabilidade

Ferramentas de monitoramento e observabilidade são fundamentais para garantir que o cluster opere de forma otimizada.

  1. Prometheus e Grafana

    • Prometheus coleta métricas do cluster e exibe gráficos em tempo real.
    • Grafana complementa o Prometheus oferecendo dashboards customizáveis.
  2. Configuração Básica de Prometheus e Grafana

    1
    2
    
    kubectl apply -f https://raw.githubusercontent.com/coreos/kube-prometheus/main/manifests/setup/prometheus-operator.yaml
    kubectl apply -f https://raw.githubusercontent.com/coreos/kube-prometheus/main/manifests/
    
  3. Acessar o Dashboard do Grafana para verificar os gráficos de utilização e desempenho.

    1
    
    kubectl port-forward svc/grafana 3000:3000 -n monitoring
    

10.5 Checklist para Otimização de Performance e Gerenciamento de Recursos

  1. Definir Requests e Limits para CPU e Memória: Evita sobrecarga de recursos e melhora a previsibilidade de performance.
  2. Configurar Affinity e Anti-Affinity: Distribui carga e otimiza o uso de recursos entre nós.
  3. Implementar Autoscaling: Ajusta o número de pods conforme a demanda para otimizar o uso de recursos.
  4. Usar Ferramentas de Monitoramento: Prometheus e Grafana oferecem visibilidade em tempo real do cluster.
  5. Ajustar Parâmetros de Rede e I/O: Configurações detalhadas em Containerd e CRI-O podem melhorar a latência e o desempenho.

Resumo da Seção

Nesta seção, configuramos práticas de otimização de performance no Kubernetes com Containerd e CRI-O, incluindo ajustes de recursos, autoscaling, e ferramentas de monitoramento. Essas práticas garantem que o cluster Kubernetes funcione de maneira eficiente e responsiva. Na próxima seção, abordaremos a atualização e manutenção de clusters Kubernetes com esses runtimes, abordando boas práticas para ambientes de produção.


11. Atualização e Manutenção de Cluster Kubernetes com Containerd e CRI-O


Objetivo:
Explicar como manter e atualizar clusters Kubernetes com os runtimes Containerd e CRI-O, abordando a atualização segura do Kubernetes e dos runtimes de container. Nesta seção, veremos práticas recomendadas para manutenção programada e como garantir a continuidade do cluster durante as atualizações.


11.1 Planejamento de Manutenção e Atualizações

Antes de iniciar uma atualização, é importante planejar para minimizar impactos no cluster e nas aplicações em execução.

Passos para Planejar uma Atualização Segura

  1. Verificar a Compatibilidade de Versão
    Consulte a documentação oficial do Kubernetes para assegurar compatibilidade entre as versões do Kubernetes e dos runtimes (Containerd/CRI-O). Isso ajuda a evitar problemas de incompatibilidade durante o processo.

  2. Planejar um Período de Manutenção
    Se possível, execute atualizações durante períodos de baixa demanda para reduzir o impacto em aplicações críticas.

  3. Realizar Backups do Cluster
    Certifique-se de ter backups atualizados do cluster e dos volumes persistentes, utilizando ferramentas como Velero para realizar backups e facilitar a recuperação em caso de problemas.


11.2 Atualização do Kubernetes com Kubeadm

A ferramenta kubeadm facilita o processo de atualização do Kubernetes, começando pelo controle principal (master) e depois atualizando os nós de trabalho.

Passo 1: Atualizar o Nó Master

  1. Atualizar Pacotes do Kubernetes:

    1
    2
    
    sudo apt update
    sudo apt install -y kubeadm=<nova_versão>
    
  2. Executar a Atualização com o Kubeadm:

    1
    2
    
    sudo kubeadm upgrade plan
    sudo kubeadm upgrade apply v<nova_versão>
    
  3. Atualizar o kubelet e o kubectl para a nova versão:

    1
    2
    
    sudo apt install -y kubelet=<nova_versão> kubectl=<nova_versão>
    sudo systemctl restart kubelet
    

Passo 2: Atualizar os Nós de Trabalho

Nos nós de trabalho, o processo é semelhante ao do nó master, mas focado na atualização do kubelet.

  1. Atualizar Pacotes do Kubernetes nos nós de trabalho:

    1
    2
    
    sudo apt update
    sudo apt install -y kubeadm=<nova_versão>
    
  2. Executar a Atualização de Cada Nó:

    1
    
    sudo kubeadm upgrade node
    
  3. Atualizar o kubelet e o kubectl:

    1
    2
    
    sudo apt install -y kubelet=<nova_versão> kubectl=<nova_versão>
    sudo systemctl restart kubelet
    
  4. Verificar o Status dos Nós:

    Após a atualização, confirme que todos os nós estão em status Ready:

    1
    
    kubectl get nodes
    

11.3 Atualização do Containerd e CRI-O

Manter os runtimes atualizados é essencial para segurança e compatibilidade com as versões mais recentes do Kubernetes.

Atualização do Containerd

  1. Verificar a Versão Atual e Disponível:

    1
    
    containerd --version
    
  2. Atualizar o Containerd:

    Dependendo da distribuição, utilize o gerenciador de pacotes:

    1
    2
    
    sudo apt update
    sudo apt install -y containerd
    
  3. Reiniciar o Containerd para Aplicar as Alterações:

    1
    
    sudo systemctl restart containerd
    

Atualização do CRI-O

  1. Verificar a Versão Atual:

    1
    
    crio --version
    
  2. Atualizar o CRI-O:

    No Debian ou Ubuntu, utilize o gerenciador de pacotes:

    1
    2
    
    sudo apt update
    sudo apt install -y cri-o
    
  3. Reiniciar o CRI-O:

    1
    
    sudo systemctl restart crio
    

11.4 Práticas de Manutenção para Ambientes de Produção

A manutenção preventiva ajuda a manter o cluster estável e seguro. Algumas práticas recomendadas incluem:

  1. Monitorar Logs e Alertas Regularmente
    Configure sistemas de monitoramento e alertas para identificar possíveis problemas de performance ou segurança.

  2. Realizar Testes de Carga Periódicos
    Execute testes de carga para avaliar como o cluster responde sob alta demanda. Isso permite ajustar a configuração antes que ocorra um pico de tráfego inesperado.

  3. Automatizar Tarefas de Manutenção
    Automatize tarefas de manutenção com scripts ou ferramentas como Ansible, para simplificar processos de atualização e monitoramento.

  4. Utilizar Ferramentas de Gestão de Versão
    Use ferramentas como Flux ou ArgoCD para gerenciar configurações e versões de aplicações e serviços no cluster.


11.5 Checklist de Atualização e Manutenção

  1. Verificar a Compatibilidade de Versão antes de iniciar a atualização.
  2. Planejar um Período de Manutenção para minimizar o impacto.
  3. Fazer Backup do Cluster e Volumes Persistentes.
  4. Atualizar o Nó Master com kubeadm upgrade apply.
  5. Atualizar os Nós de Trabalho individualmente com kubeadm upgrade node.
  6. Atualizar Runtimes de Containers (Containerd e CRI-O) usando o gerenciador de pacotes do sistema.
  7. Reiniciar e Verificar o Status dos Serviços para garantir que todos os componentes estão em execução.

Resumo da Seção

Nesta seção, exploramos o processo de atualização e manutenção de clusters Kubernetes com os runtimes Containerd e CRI-O, cobrindo desde a atualização segura do Kubernetes com kubeadm até a manutenção de ambientes de produção. Essas práticas ajudam a garantir a continuidade das operações, mantendo o cluster atualizado e protegido. Na próxima seção, abordaremos troubleshooting e técnicas para resolver problemas comuns com os runtimes no Kubernetes.


12. Troubleshooting e Solução de Problemas com Runtimes no Kubernetes


Objetivo:
Explicar técnicas de troubleshooting para resolver problemas em clusters Kubernetes que utilizam Containerd e CRI-O como runtimes de container. Esta seção aborda o uso de ferramentas como crictl, kubectl logs, e kubectl describe, além de apresentar diagnósticos comuns e métodos de correção para problemas frequentes.


12.1 Ferramentas Essenciais para Troubleshooting em Kubernetes

Para diagnosticar e resolver problemas no Kubernetes com os runtimes Containerd e CRI-O, é importante conhecer algumas ferramentas essenciais.

  1. kubectl describe: Exibe detalhes sobre objetos do Kubernetes, incluindo eventos e mensagens de erro.

    1
    
    kubectl describe pod <pod-name>
    
  2. kubectl logs: Visualiza os logs de um container em execução.

    1
    
    kubectl logs <pod-name> -c <container-name>
    
  3. crictl: Uma ferramenta CLI para gerenciamento de containers, que permite inspecionar containers, logs e informações do runtime.

    1
    2
    3
    
    sudo crictl ps        # Listar containers
    sudo crictl logs <container-id>  # Verificar logs do container
    sudo crictl inspect <container-id>  # Inspecionar detalhes do container
    
  4. journalctl: Usado para verificar logs do sistema, incluindo logs do kubelet, containerd, e crio.

    1
    2
    3
    
    sudo journalctl -u kubelet -f
    sudo journalctl -u containerd -f
    sudo journalctl -u crio -f
    

12.2 Diagnóstico de Problemas Comuns

Problema 1: Pod em Estado de CrashLoopBackOff

O status CrashLoopBackOff indica que o pod está falhando repetidamente ao iniciar.

Solução:

  1. Verificar os Logs do Pod:

    1
    
    kubectl logs <pod-name> -c <container-name>
    
  2. Descrever o Pod para ver eventos específicos que podem estar causando falhas:

    1
    
    kubectl describe pod <pod-name>
    
  3. Verificar Recursos de CPU e Memória: O pod pode estar falhando devido à falta de recursos.

    1
    
    kubectl top pod <pod-name>
    
  4. Configurar RestartPolicy: Ajustar o restartPolicy para Never pode ajudar a inspecionar o pod sem que ele reinicie constantemente.


Problema 2: Containers Presos em Estado de “ContainerCreating”

Esse problema geralmente ocorre quando o container não consegue se conectar ao runtime, ou há problemas de rede.

Solução:

  1. Verificar o Status do Runtime (Containerd ou CRI-O):

    1
    2
    
    sudo systemctl status containerd
    sudo systemctl status crio
    
  2. Verificar Logs do Kubelet para mensagens relacionadas ao runtime:

    1
    
    sudo journalctl -u kubelet -f
    
  3. Inspecionar o Pod:

    1
    
    kubectl describe pod <pod-name>
    
  4. Verificar Problemas de Volume: Às vezes, problemas de PersistentVolume podem causar esse erro. Verifique o status dos volumes utilizados pelo pod.


Problema 3: Falha ao Iniciar o Container devido a Configuração de Segurança (SecurityContext)

Problemas de configuração de segurança podem ocorrer, especialmente ao usar SELinux ou AppArmor.

Solução:

  1. Descrever o Pod para verificar se há mensagens sobre SecurityContext ou permissões:

    1
    
    kubectl describe pod <pod-name>
    
  2. Verificar Perfis de Segurança (AppArmor, SELinux):

    • No caso de AppArmor, verifique o perfil associado ao pod e, se necessário, desative-o para identificar se é a causa.
    • No SELinux, ajuste as permissões no host ou desative-o temporariamente para testar.

12.3 Solução de Problemas Específicos para Containerd e CRI-O

Problema 1: Containerd Não Inicia

Se o Containerd não estiver funcionando, o kubelet não conseguirá criar containers.

Solução:

  1. Verificar o Status e Reiniciar:

    1
    2
    
    sudo systemctl status containerd
    sudo systemctl restart containerd
    
  2. Verificar Logs do Containerd:

    1
    
    sudo journalctl -u containerd -f
    
  3. Revisar Configurações no config.toml para garantir que não há erros de configuração.

Problema 2: Falhas no CRI-O ao Tentar Iniciar Containers

Erros ao iniciar containers com CRI-O podem ser causados por falhas no arquivo crio.conf ou incompatibilidades com o kubelet.

Solução:

  1. Verificar o Status do CRI-O:

    1
    2
    
    sudo systemctl status crio
    sudo systemctl restart crio
    
  2. Revisar Logs do CRI-O:

    1
    
    sudo journalctl -u crio -f
    
  3. Conferir Configurações no crio.conf: Verifique se há configurações incorretas ou se o arquivo foi alterado recentemente.


12.4 Diagnóstico de Problemas de Rede

Problemas de rede em um cluster Kubernetes podem impedir a comunicação entre pods ou entre os nós e o plano de controle (control plane).

Verificação de Problemas de Rede no CNI

  1. Verificar o Status dos Plugins CNI:

    1
    2
    
    kubectl get pods -n kube-system -l k8s-app=flannel  # Exemplo com Flannel
    kubectl get pods -n kube-system -l k8s-app=calico   # Exemplo com Calico
    
  2. Inspecionar Logs dos Plugins de Rede:

    1
    
    kubectl logs -n kube-system <cni-pod-name>
    

Testar Conectividade Entre Pods

  1. Verificar Conectividade com um Pod: Execute um ping de um pod para outro para verificar a conectividade.

    1
    
    kubectl exec -it <pod1> -- ping <pod2-ip>
    
  2. Utilizar o traceroute: Pode ser útil para identificar onde a conexão está falhando.


12.5 Checklist de Troubleshooting

  1. Utilizar kubectl describe e kubectl logs para inspecionar problemas em pods e containers.
  2. Verificar o Status e Logs dos Runtimes (Containerd e CRI-O) com systemctl status e journalctl.
  3. Inspecionar Configurações de Segurança como SecurityContext, SELinux e AppArmor para identificar restrições que podem afetar containers.
  4. Testar Conectividade de Rede entre pods para garantir que o plugin CNI está funcionando corretamente.
  5. Revisar Logs do Kubelet para problemas relacionados ao runtime e rede.

Resumo da Seção

Nesta seção, cobrimos técnicas de troubleshooting e solução de problemas para Kubernetes com os runtimes Containerd e CRI-O, incluindo diagnóstico de problemas comuns e inspeção de logs de pods, containers e do sistema. Com essas técnicas, você estará preparado para identificar e resolver rapidamente problemas em clusters Kubernetes. Na próxima e última seção, vamos explorar práticas recomendadas para gerenciar clusters Kubernetes usando esses runtimes de forma eficiente e segura.


13. Práticas Recomendadas para Clusters Kubernetes com Containerd e CRI-O


Objetivo:
Apresentar práticas recomendadas para gerenciar clusters Kubernetes de forma segura e eficiente utilizando Containerd e CRI-O como runtimes de container. Abordaremos segurança, otimização, automação e dicas de manutenção para ambientes de produção.


13.1 Práticas de Segurança para Clusters Kubernetes

Manter a segurança de clusters Kubernetes é essencial para proteger dados, serviços e aplicações contra acessos não autorizados e ataques.

Segurança de Containers com SecurityContext

  1. Definir SecurityContext para Pods e Containers:
    Configure o SecurityContext para limitar privilégios dos containers, bloqueando a execução em modo privilegiado e definindo permissões mínimas.

  2. Usar Perfis SELinux e AppArmor:
    Aplicar perfis de segurança com SELinux e AppArmor em ambientes Linux oferece uma camada extra de controle de acesso, prevenindo que processos de containers acessem recursos do host sem permissão.

  3. Políticas de Segurança com Gatekeeper:
    Ferramentas como OPA/Gatekeeper permitem aplicar políticas de segurança avançadas, como impedir que pods sejam executados com privilégios elevados.


13.2 Otimização e Escalabilidade de Recursos

Para garantir que os recursos estejam sendo utilizados de forma otimizada, siga estas práticas:

  1. Configurar Requests e Limits de CPU e Memória:
    Defina requests e limits adequados para todos os containers. Isso ajuda o Kubernetes a alocar e distribuir recursos de forma eficiente, evitando sobrecarga.

  2. Implementar Autoscaling:
    Utilize o Horizontal Pod Autoscaler (HPA) para ajustar a quantidade de réplicas de pods com base no uso de CPU ou outras métricas de performance, permitindo que o cluster responda a variações na demanda.

  3. Gerenciar Afinidade e Anti-Afinidade:
    Configure políticas de afinidade e anti-afinidade para distribuir pods entre nós e evitar sobrecarga de recursos em nodes específicos.


13.3 Monitoramento e Observabilidade do Cluster

Monitorar o ambiente é fundamental para garantir disponibilidade e performance.

  1. Implementar Prometheus e Grafana:
    Configure o Prometheus para coleta de métricas e o Grafana para visualização. Essas ferramentas são essenciais para observar o uso de recursos, identificar gargalos e monitorar a saúde do cluster.

  2. Usar Logs de Runtimes e Kubelet:
    Monitore os logs dos runtimes (Containerd ou CRI-O) e do kubelet com journalctl para diagnosticar rapidamente falhas e resolver problemas de containers.

  3. Definir Alertas para Eventos Críticos:
    Configure alertas para eventos críticos, como pods em estado de CrashLoopBackOff, alto consumo de CPU/memória ou falhas de rede. Isso permite a intervenção rápida em problemas críticos.


13.4 Automação de Tarefas de Manutenção e Atualização

Automatizar tarefas ajuda a manter o cluster seguro e atualizado, além de reduzir o tempo de administração.

  1. Automatizar Backups com Velero:
    Use o Velero para automatizar backups de recursos e volumes persistentes do Kubernetes, garantindo que dados possam ser restaurados em caso de falhas.

  2. Automatizar Atualizações com Ansible:
    Ferramentas de automação como Ansible podem ser configuradas para realizar atualizações periódicas dos nós e dos componentes do Kubernetes, incluindo os runtimes Containerd e CRI-O.

  3. Implementar GitOps para Gerenciamento de Configurações:
    Com GitOps, você pode versionar e automatizar a aplicação de configurações no cluster Kubernetes. Ferramentas como ArgoCD e Flux sincronizam as configurações do Git com o cluster, garantindo consistência e facilitando o rollback em caso de problemas.


13.5 Checklist de Práticas Recomendadas para Kubernetes com Containerd e CRI-O

  • Configurar SecurityContext em todos os Pods para limitar privilégios e definir permissões mínimas.
  • Habilitar SELinux ou AppArmor para adicionar uma camada extra de segurança ao ambiente de containers.
  • Definir Requests e Limits de Recursos para garantir a distribuição eficiente de CPU e memória.
  • Implementar Autoscaling com Horizontal Pod Autoscaler para adaptar a quantidade de réplicas à demanda.
  • Configurar Prometheus e Grafana para monitoramento contínuo e visibilidade em tempo real.
  • Automatizar Backups e Atualizações com ferramentas como Velero e Ansible para facilitar a recuperação e manutenção.
  • Utilizar GitOps para Gerenciamento de Configurações e versionamento de alterações.

Resumo da Seção

Nesta seção, exploramos práticas recomendadas para gerenciamento de clusters Kubernetes com os runtimes Containerd e CRI-O, abordando segurança, otimização, monitoramento e automação. Seguir essas práticas ajuda a manter o cluster seguro, eficiente e bem gerenciado, garantindo alta disponibilidade e performance em ambientes de produção.


Configuração de Suporte IPv6 e Dual-Stack no Kubernetes com Calico

Objetivo:
Demonstrar como habilitar suporte a IPv6 e configurar uma rede dual-stack (IPv4 e IPv6) em um cluster Kubernetes. Este exemplo utiliza o kubeadm para configuração do cluster e o Calico como plugin CNI para gerenciar a rede dual-stack.


Passo 1: Configurar o Arquivo kubeadm-config.yaml para IPv6 e Dual-Stack

O arquivo de configuração do kubeadm permite definir sub-redes dual-stack para pods e serviços. Configuraremos o cluster para que ele utilize IPv4 e IPv6.

  1. Criar o arquivo de configuração kubeadm-config.yaml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    # Arquivo kubeadm-config.yaml
    ---
    apiVersion: kubeadm.k8s.io/v1beta3
    kind: ClusterConfiguration
    networking:
      podSubnet: 10.244.0.0/14,fd02::/48
      serviceSubnet: 10.96.0.0/16,fd04::/112
    ---
    apiVersion: kubeadm.k8s.io/v1beta3
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: "192.168.200.50"
      bindPort: 6443
    nodeRegistration:
      kubeletExtraArgs:
        node-ip: 192.168.200.50,fd00::50
    
  2. Inicializar o Cluster com o arquivo de configuração:

    1
    
    sudo kubeadm init --config=kubeadm-config.yaml
    
  3. Configurar o kubectl para Acessar o Cluster:

    Após a inicialização, execute os comandos para configurar o kubectl:

    1
    2
    3
    
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    

Passo 2: Configuração dos Nós de Trabalho para Suporte Dual-Stack

Cada nó de trabalho precisa ser configurado para suportar tanto IPv4 quanto IPv6, especificando ambos os IPs no arquivo kubeadm-config.yaml.

Exemplo de Configuração para k-node-01

  1. Configurar o kubeadm-config.yaml para o Nó de Trabalho:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    # Arquivo kubeadm-config.yaml para k-node-01
    ---
    apiVersion: kubeadm.k8s.io/v1beta3
    kind: JoinConfiguration
    discovery:
      bootstrapToken:
        apiServerEndpoint: 192.168.200.50:6443
        token: "cv5m0b.aehl2kux0tai4mga"
        caCertHashes:
        - "sha256:9ac25b5e2fffee49faaa4288316fbf208454574c3ab411a9bfaf9afb71a2ab3d"
    nodeRegistration:
      kubeletExtraArgs:
        node-ip: 192.168.200.100,fd00::100
    
  2. Conectar o Nó ao Cluster:

    1
    
    sudo kubeadm join --config=kubeadm-config.yaml
    

Exemplo de Configuração para k-node-02

Repita o processo de configuração e edição do kubeadm-config.yaml para cada nó, substituindo os IPs conforme necessário.

1
2
3
4
5
6
7
8
9
10
11
12
13
# Arquivo kubeadm-config.yaml para k-node-02
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
discovery:
  bootstrapToken:
    apiServerEndpoint: 192.168.200.50:6443
    token: "cv5m0b.aehl2kux0tai4mga"
    caCertHashes:
    - "sha256:9ac25b5e2fffee49faaa4288316fbf208454574c3ab411a9bfaf9afb71a2ab3d"
nodeRegistration:
  kubeletExtraArgs:
    node-ip: 192.168.200.101,fd00::101

Para conectar o nó:

1
sudo kubeadm join --config=kubeadm-config.yaml

Passo 3: Configurar o Calico para Suporte IPv6 Dual-Stack

O Calico permite configurar sub-redes IPv4 e IPv6, possibilitando a comunicação em redes dual-stack.

  1. Criar o Arquivo custom-resources.yaml para Configuração do Calico:

    Este arquivo define as sub-redes dual-stack para pods e serviços:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    ---
    apiVersion: operator.tigera.io/v1
    kind: Installation
    metadata:
      name: default
    spec:
      # Configuração da rede Calico.
      calicoNetwork:
        ipPools:
        - blockSize: 26
          cidr: 10.244.0.0/14
          encapsulation: VXLANCrossSubnet
          natOutgoing: Enabled
          nodeSelector: all()
        - blockSize: 122
          cidr: fd02::/48
          encapsulation: None
          natOutgoing: Enabled
          nodeSelector: all()
    ---
    apiVersion: operator.tigera.io/v1
    kind: APIServer
    metadata:
      name: default
    spec: {}
    
  2. Aplicar a Configuração do Calico:

    1
    
    kubectl apply -f custom-resources.yaml
    

Passo 4: Verificar a Configuração Dual-Stack

  1. Verificar a Configuração dos Pods e dos Serviços:

    Para verificar se o cluster está usando dual-stack, crie um pod de teste e um serviço exposto com IPs IPv4 e IPv6.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    # Arquivo dual-stack-test.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: dual-stack-test
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: dual-stack-service
    spec:
      selector:
        app: nginx
      ipFamilies:
        - IPv4
        - IPv6
      ipFamilyPolicy: RequireDualStack
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    

    Aplique o arquivo de configuração:

    1
    
    kubectl apply -f dual-stack-test.yaml
    
  2. Verificar IPs do Serviço Dual-Stack:

    Use o comando kubectl get svc dual-stack-service para verificar os IPs atribuídos ao serviço:

    1
    
    kubectl get svc dual-stack-service -o wide
    

    Esse comando deve retornar endereços IPv4 e IPv6, confirmando a configuração dual-stack.


Resumo

Nesta seção, configuramos suporte a IPv6 e redes dual-stack em um cluster Kubernetes usando o kubeadm e o Calico como plugin de rede CNI. A configuração dual-stack permite comunicação IPv4 e IPv6, aumentando a flexibilidade e a compatibilidade do cluster com infraestruturas modernas de rede.


Configuração de Rede Dual-Stack IPv6 com Cilium em Kubernetes


Objetivo:
Configurar uma rede dual-stack (IPv4 e IPv6) em Kubernetes utilizando o plugin Cilium, que oferece suporte avançado para políticas de segurança e observabilidade aprimorada com eBPF. Cilium se destaca em redes de alto desempenho, proporcionando baixa latência e monitoramento detalhado do tráfego.


Por Que Usar o Cilium?

O Cilium utiliza eBPF (Extended Berkeley Packet Filter) para manipulação de pacotes diretamente no kernel Linux, o que oferece:

  • Alto desempenho: eBPF permite filtragem e roteamento de pacotes com latência mínima e maior eficiência.
  • Observabilidade avançada: com Cilium, é possível monitorar o tráfego em tempo real e inspecionar fluxos detalhados usando o Hubble, sua ferramenta de visualização e observabilidade.
  • Suporte robusto para IPv6 e dual-stack: Cilium permite configurar redes com suporte simultâneo a IPv4 e IPv6, ideal para ambientes de produção modernos.

Pré-requisitos

  • Cluster Kubernetes com kubeadm configurado para dual-stack.
  • Kernel Linux que suporte eBPF (preferencialmente Linux 4.9 ou superior).
  • CLI do Kubernetes (kubectl) configurado para acessar o cluster.

Passo 1: Configurar o Cluster para Suporte Dual-Stack

Antes de instalar o Cilium, vamos configurar o cluster Kubernetes para dual-stack usando o kubeadm.

  1. Criar o Arquivo de Configuração do kubeadm (kubeadm-config.yaml):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    # Arquivo kubeadm-config.yaml para inicialização do cluster com dual-stack
    ---
    apiVersion: kubeadm.k8s.io/v1beta3
    kind: ClusterConfiguration
    networking:
      podSubnet: 10.244.0.0/14,fd02::/48
      serviceSubnet: 10.96.0.0/16,fd04::/112
    ---
    apiVersion: kubeadm.k8s.io/v1beta3
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: "192.168.200.50"
      bindPort: 6443
    nodeRegistration:
      kubeletExtraArgs:
        node-ip: 192.168.200.50,fd00::50
    
  2. Inicializar o Cluster com o kubeadm:

    1
    
    sudo kubeadm init --config=kubeadm-config.yaml
    
  3. Configurar o kubectl para Acessar o Cluster:

    1
    2
    3
    
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    

Passo 2: Instalar o Cilium com Suporte Dual-Stack

  1. Baixar o CLI do Cilium

    Baixe o Cilium CLI, que simplifica o processo de instalação e configuração:

    1
    2
    3
    
    curl -L --remote-name https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
    tar xzvf cilium-linux-amd64.tar.gz
    sudo mv cilium /usr/local/bin/
    
  2. Instalar o Cilium com Configuração Dual-Stack

    Execute o comando de instalação do Cilium com suporte a dual-stack IPv4/IPv6:

    1
    
    cilium install --config enable-ipv4=true --config enable-ipv6=true
    
    • Parâmetros importantes:
      • enable-ipv4=true: habilita suporte a IPv4.
      • enable-ipv6=true: habilita suporte a IPv6.
    • Nota: Cilium detectará automaticamente as sub-redes configuradas no cluster.
  3. Verificar a Instalação do Cilium

    Confirme se todos os componentes do Cilium foram instalados corretamente:

    1
    
    cilium status
    

Passo 3: Configuração de Políticas de Segurança com Cilium

Uma das vantagens do Cilium é o suporte avançado a políticas de segurança, permitindo o controle detalhado de tráfego entre pods. A seguir, um exemplo de política que permite tráfego entre pods de um mesmo namespace.

Exemplo de Política de Segurança

  1. Criar o Arquivo de Política de Segurança cilium-policy.yaml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    apiVersion: "cilium.io/v2"
    kind: CiliumNetworkPolicy
    metadata:
      name: allow-same-namespace
    spec:
      endpointSelector:
        matchLabels:
          app: nginx
      ingress:
        - fromEndpoints:
            - matchLabels:
                namespace: default
    
  2. Aplicar a Política de Segurança:

    1
    
    kubectl apply -f cilium-policy.yaml
    

Essa política permite o tráfego apenas entre pods que estão no namespace default e possuem o rótulo app: nginx.


Passo 4: Observabilidade com Hubble

Cilium inclui o Hubble, uma ferramenta de monitoramento e observabilidade para rastreamento em tempo real do tráfego de rede.

  1. Habilitar o Hubble:

    1
    
    cilium hubble enable
    
  2. Verificar o Status do Hubble:

    1
    
    cilium hubble status
    
  3. Instalar o CLI do Hubble para Visualização de Logs

    Baixe o CLI do Hubble:

    1
    2
    3
    
    curl -L --remote-name https://github.com/cilium/hubble/releases/latest/download/hubble-linux-amd64.tar.gz
    tar xzvf hubble-linux-amd64.tar.gz
    sudo mv hubble /usr/local/bin/
    
  4. Visualizar o Tráfego com Hubble

    Com o Hubble, você pode visualizar logs detalhados de tráfego em tempo real:

    1
    
    hubble observe
    

    Esse comando exibirá o tráfego de rede entre os pods, incluindo informações de origem, destino, protocolo e status de conexão.


Passo 5: Verificação de Conectividade Dual-Stack

Para garantir que a configuração dual-stack está funcionando, crie um pod de teste e um serviço dual-stack.

Criar Pod e Serviço Dual-Stack

  1. Arquivo dual-stack-test.yaml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: dual-stack-test
      labels:
        app: dual-stack-test
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: dual-stack-service
    spec:
      selector:
        app: dual-stack-test
      ipFamilies:
        - IPv4
        - IPv6
      ipFamilyPolicy: RequireDualStack
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    
  2. Aplicar o Pod e o Serviço:

    1
    
    kubectl apply -f dual-stack-test.yaml
    
  3. Verificar os IPs do Serviço Dual-Stack

    Use o comando abaixo para verificar os endereços IPv4 e IPv6 atribuídos ao serviço:

    1
    
    kubectl get svc dual-stack-service -o wide
    

Resumo

Nesta seção, configuramos o Cilium para habilitar uma rede dual-stack com suporte IPv4/IPv6 no Kubernetes. Cilium fornece recursos de alta performance com eBPF, além de observabilidade avançada com o Hubble, o que torna o Cilium uma excelente escolha para ambientes de produção que exigem desempenho e visibilidade detalhada do tráfego de rede.


Conclusão

A configuração e gerenciamento de clusters Kubernetes com Containerd e CRI-O oferecem grandes vantagens em ambientes de produção, garantindo estabilidade e integração nativa com a infraestrutura Kubernetes. Neste tutorial, percorremos desde a configuração inicial até práticas avançadas de otimização e segurança, incluindo monitoramento detalhado com o Cilium e o Hubble. A escolha entre plugins de rede, como Calico e Cilium, fornece um leque de possibilidades para ambientes que exigem escalabilidade e controle de tráfego entre containers.

Ao seguir este guia, você estará equipado para implementar um ambiente Kubernetes robusto, seguro e altamente escalável. Com o uso de técnicas avançadas de observabilidade, políticas de segurança detalhadas e uma configuração sólida de rede dual-stack, o cluster estará preparado para atender às demandas das aplicações modernas. Lembre-se de seguir as práticas recomendadas e de revisar regularmente as configurações de segurança e recursos para garantir a continuidade e eficiência do cluster. Aproveite as possibilidades que Kubernetes com Containerd e CRI-O oferecem e boa implementação!


This post is licensed under CC BY 4.0 by the author.