Implementando um Cluster Kubernetes do Zero com Rocky Linux

A implementação de um cluster Kubernetes representa um marco fundamental para profissionais de infraestrutura que buscam modernizar seus ambientes de TI. Neste guia completo do PortalDoLinux.com.br, você aprenderá a construir um cluster Kubernetes do zero utilizando Rocky Linux, uma distribuição enterprise robusta e confiável que se tornou referência após as mudanças no ecossistema CentOS.

O Kubernetes consolidou-se como a plataforma de orquestração de contêineres mais utilizada no mercado, oferecendo automação, escalabilidade e gerenciamento eficiente de aplicações containerizadas. Quando combinado com Rocky Linux, uma distribuição enterprise mantida pela comunidade e 100% compatível com Red Hat Enterprise Linux, obtemos uma base sólida e confiável para ambientes de produção.

A escolha do Rocky Linux para implementar um cluster Kubernetes traz vantagens significativas: estabilidade comprovada, ciclo de vida estendido, suporte comunitário ativo e compatibilidade com ferramentas corporativas. Este tutorial aborda desde a preparação inicial dos servidores até a configuração completa de um cluster funcional, pronto para receber cargas de trabalho em produção.

Pré-requisitos e Planejamento da Infraestrutura

Antes de iniciar a implementação do cluster Kubernetes, é essencial realizar um planejamento adequado da infraestrutura. Para este guia, consideraremos uma arquitetura mínima composta por três nós: um control plane (master) e dois worker nodes.

Requisitos de Hardware

Cada nó do cluster deve atender aos seguintes requisitos mínimos:

Control Plane:

  • 2 CPUs ou mais
  • 4 GB de RAM (recomendado 8 GB)
  • 50 GB de armazenamento
  • Conexão de rede estável

Worker Nodes:

  • 2 CPUs ou mais
  • 4 GB de RAM (recomendado 8 GB ou mais)
  • 50 GB de armazenamento
  • Conexão de rede estável

Requisitos de Software

  • Rocky Linux 9.x instalado em todos os nós
  • Acesso root ou privilégios sudo
  • Conectividade de rede entre todos os nós
  • Portas específicas liberadas no firewall

Arquitetura de Rede

Para este tutorial, utilizaremos a seguinte configuração de rede:

  • Control Plane: 192.168.1.10 (k8s-master)
  • Worker Node 1: 192.168.1.11 (k8s-worker1)
  • Worker Node 2: 192.168.1.12 (k8s-worker2)

Preparação do Ambiente Rocky Linux

A preparação adequada do sistema operacional é crucial para garantir o funcionamento correto do cluster Kubernetes. Execute os seguintes passos em todos os nós do cluster.

Atualização do Sistema

Primeiro, atualize todos os pacotes do sistema para as versões mais recentes:

sudo dnf update -y
sudo dnf upgrade -y

Configuração de Hostname e Hosts

Configure o hostname de cada nó de forma apropriada:

# No Control Plane
sudo hostnamectl set-hostname k8s-master

# No Worker Node 1
sudo hostnamectl set-hostname k8s-worker1

# No Worker Node 2
sudo hostnamectl set-hostname k8s-worker2

Adicione as entradas no arquivo /etc/hosts em todos os nós:

sudo tee -a /etc/hosts <<EOF
192.168.1.10 k8s-master
192.168.1.11 k8s-worker1
192.168.1.12 k8s-worker2
EOF

Desabilitação do SELinux

Embora o SELinux seja uma camada importante de segurança, para simplificar a configuração inicial, vamos configurá-lo para modo permissivo:

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

Desabilitação do Swap

O Kubernetes requer que o swap esteja desabilitado para funcionar corretamente:

sudo swapoff -a
sudo sed -i '/ swap / s/^|$.*$|$/#\1/g' /etc/fstab

Configuração de Módulos do Kernel

Carregue os módulos necessários para o funcionamento do Kubernetes:

sudo tee /etc/modules-load.d/kubernetes.conf <<EOF
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

Configuração de Parâmetros do Sistema

Configure os parâmetros sysctl necessários:

sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sudo sysctl --system

Configuração do Firewall

Configure as regras de firewall necessárias. No Control Plane:

sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10251/tcp
sudo firewall-cmd --permanent --add-port=10252/tcp
sudo firewall-cmd --permanent --add-port=10255/tcp
sudo firewall-cmd --reload

Nos Worker Nodes:

sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=30000-32767/tcp
sudo firewall-cmd --reload

Instalação e Configuração do Container Runtime

O Kubernetes necessita de um container runtime para executar os contêineres. Utilizaremos o containerd, que é amplamente adotado e recomendado pela comunidade.

Instalação do Containerd

Instale o containerd e suas dependências:

sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y containerd.io

Configuração do Containerd

Gere a configuração padrão do containerd:

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

Configure o containerd para usar systemd como cgroup driver:

sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

Inicie e habilite o serviço containerd:

sudo systemctl enable --now containerd
sudo systemctl status containerd

Instalação dos Componentes Kubernetes

Com o ambiente preparado e o container runtime configurado, podemos proceder com a instalação dos componentes do Kubernetes.

Adição do Repositório Kubernetes

Adicione o repositório oficial do Kubernetes:

sudo tee /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

Instalação dos Pacotes Kubernetes

Instale kubelet, kubeadm e kubectl em todos os nós:

sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

Habilite o serviço kubelet:

sudo systemctl enable --now kubelet

Inicialização do Cluster Control Plane

Agora vamos inicializar o control plane do cluster Kubernetes. Execute os comandos a seguir apenas no nó master.

Inicialização com Kubeadm

Execute o comando de inicialização do cluster:

sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=192.168.1.10 \
  --control-plane-endpoint=k8s-master

Este comando pode levar alguns minutos para ser concluído. Ao final, você receberá instruções importantes, incluindo o comando para adicionar worker nodes ao cluster. Salve essas informações em local seguro.

Configuração do Kubectl

Configure o kubectl para o usuário atual:

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

Verifique o status do cluster:

kubectl cluster-info
kubectl get nodes

Neste momento, o nó master aparecerá com status “NotReady” porque ainda não configuramos a rede pod.

Configuração da Rede Pod com CNI

O Kubernetes requer um plugin CNI (Container Network Interface) para gerenciar a comunicação entre pods. Utilizaremos o Flannel, uma solução simples e eficiente.

Instalação do Flannel

Aplique o manifesto do Flannel:

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

Aguarde alguns minutos e verifique se os pods do sistema estão executando:

kubectl get pods -n kube-system

Verifique novamente o status do nó:

kubectl get nodes

O nó master agora deve aparecer com status “Ready”.

Verificação da Rede

Confirme que a rede está funcionando corretamente:

kubectl get pods -n kube-system -o wide

Todos os pods do sistema devem estar no estado “Running”.

Adição de Nós Worker ao Cluster

Com o control plane configurado e funcionando, podemos adicionar os worker nodes ao cluster.

Obtenção do Token de Join

Se você não salvou o comando de join fornecido durante a inicialização, pode gerar um novo:

kubeadm token create --print-join-command

Adição dos Worker Nodes

Execute o comando de join em cada worker node. O comando terá um formato similar a este:

sudo kubeadm join k8s-master:6443 --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

Verificação dos Nós

No control plane, verifique se os worker nodes foram adicionados com sucesso:

kubectl get nodes

Todos os nós devem aparecer com status “Ready” após alguns minutos.

Verificação e Testes do Cluster

Com o cluster completamente configurado, vamos realizar testes para garantir que tudo está funcionando corretamente.

Deploy de Aplicação de Teste

Crie um deployment de teste com nginx:

kubectl create deployment nginx-test --image=nginx:latest --replicas=3

Verifique o status do deployment:

kubectl get deployments
kubectl get pods -o wide

Exposição do Serviço

Exponha o deployment como um serviço:

kubectl expose deployment nginx-test --type=NodePort --port=80

Obtenha informações sobre o serviço:

kubectl get services

Teste de Conectividade

Teste o acesso ao serviço usando o NodePort:

curl http://192.168.1.11:<NodePort>

Verificação de Logs

Verifique os logs de um pod específico:

kubectl logs <nome-do-pod>

Teste de Escalabilidade

Teste a escalabilidade do deployment:

kubectl scale deployment nginx-test --replicas=5
kubectl get pods -o wide

Configurações Avançadas e Otimizações

Após a configuração básica do cluster Kubernetes, existem diversas otimizações e configurações avançadas que podem melhorar o desempenho e a segurança.

Configuração de Resource Limits

Defina limites de recursos para evitar que pods consumam todos os recursos do nó:

apiVersion: v1
kind: LimitRange
metadata:
  name: resource-limits
  namespace: default
spec:
  limits:
  - max:
      cpu: "2"
      memory: 2Gi
    min:
      cpu: 100m
      memory: 128Mi
    type: Container

Aplique a configuração:

kubectl apply -f resource-limits.yaml

Configuração de Network Policies

Implemente políticas de rede para controlar o tráfego entre pods:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress

Configuração de Storage Classes

Configure classes de armazenamento para provisionamento dinâmico de volumes:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

Habilitação de Métricas

Instale o Metrics Server para monitoramento de recursos:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Edite o deployment do metrics-server para adicionar a flag –kubelet-insecure-tls:

kubectl edit deployment metrics-server -n kube-system

Verifique as métricas:

kubectl top nodes
kubectl top pods

Configuração de Autoscaling

Configure o Horizontal Pod Autoscaler:

kubectl autoscale deployment nginx-test --cpu-percent=50 --min=3 --max=10

Verifique o status do HPA:

kubectl get hpa

Troubleshooting e Resolução de Problemas

Durante a implementação e operação do cluster Kubernetes, você pode encontrar diversos desafios. Aqui estão soluções para problemas comuns.

Nós com Status NotReady

Se um nó aparecer como “NotReady”, verifique os logs do kubelet:

sudo journalctl -u kubelet -f

Verifique também o status do containerd:

sudo systemctl status containerd

Pods em Estado Pending

Se pods permanecerem em estado “Pending”, verifique os eventos:

kubectl describe pod <nome-do-pod>

Verifique se há recursos suficientes:

kubectl describe nodes

Problemas de Rede

Para diagnosticar problemas de rede, verifique os pods do CNI:

kubectl get pods -n kube-system | grep flannel
kubectl logs -n kube-system <flannel-pod>

Teste a conectividade entre pods:

kubectl run test-pod --image=busybox --rm -it -- /bin/sh
# Dentro do pod
ping <ip-de-outro-pod>

Problemas com DNS

Verifique o status do CoreDNS:

kubectl get pods -n kube-system | grep coredns
kubectl logs -n kube-system <coredns-pod>

Teste a resolução de nomes:

kubectl run test-dns --image=busybox --rm -it -- nslookup kubernetes.default

Comandos Úteis de Diagnóstico

Colete informações detalhadas sobre o cluster:

kubectl get all --all-namespaces
kubectl get events --all-namespaces --sort-by='.lastTimestamp'
kubectl cluster-info dump

Verifique certificados:

sudo kubeadm certs check-expiration

Considerações de Segurança

A segurança é fundamental em qualquer implementação de cluster Kubernetes. Aqui estão práticas recomendadas para fortalecer seu ambiente.

RBAC (Role-Based Access Control)

Configure permissões granulares usando RBAC:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: developer
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

Pod Security Standards

Implemente políticas de segurança para pods:

apiVersion: v1
kind: Namespace
metadata:
  name: restricted-namespace
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/warn: restricted

Secrets Management

Utilize Secrets para armazenar informações sensíveis:

kubectl create secret generic db-credentials \
  --from-literal=username=admin \
  --from-literal=password=senhasegura

Auditoria

Habilite logs de auditoria editando o manifesto do API server:

sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml

Adicione as flags de auditoria:

- --audit-log-path=/var/log/kubernetes/audit.log
- --audit-log-maxage=30
- --audit-log-maxbackup=10
- --audit-log-maxsize=100

Atualizações de Segurança

Mantenha o cluster atualizado regularmente:

sudo dnf update -y
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.29.x

Backup e Recuperação

Configure backups regulares do etcd:

ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

A implementação de um cluster Kubernetes do zero com Rocky Linux representa uma conquista significativa para qualquer profissional de infraestrutura. Ao longo deste guia completo do PortalDoLinux.com.br, você aprendeu desde a preparação inicial do ambiente até configurações avançadas de segurança e otimização.

O cluster Kubernetes que você construiu oferece uma base sólida para orquestração de contêineres em ambientes de produção. A combinação de Kubernetes com Rocky Linux proporciona estabilidade, confiabilidade e compatibilidade com padrões enterprise, tornando-se uma escolha excelente para organizações que buscam modernizar sua infraestrutura.

Lembre-se de que a jornada não termina aqui. O ecossistema Kubernetes está em constante evolução, com novas funcionalidades e melhorias sendo lançadas regularmente. Continue aprimorando seus conhecimentos, explorando ferramentas complementares como Helm, Prometheus, Grafana e outras soluções que podem enriquecer ainda mais seu ambiente.

Mantenha seu cluster atualizado, monitore constantemente seu desempenho, implemente práticas robustas de segurança e realize backups regulares. Com dedicação e prática contínua, você estará preparado para enfrentar os desafios mais complexos da orquestração de contêineres em ambientes corporativos.

O portaldoLinux.com.br continuará trazendo conteúdos técnicos aprofundados para apoiar sua evolução profissional no universo Linux e DevOps. Compartilhe suas experiências, dúvidas e sugestões nos comentários, contribuindo para o crescimento da comunidade técnica brasileira.