EmersonLabs: Infra com Kind, NFS, MetalLB e Nginx ingress

Conteúdos

Salve salve pessoal!!!

Tudo bem com vocês? Espero que sim!

Hoje aqui no blog vou detalhar um pouco a construção de uma Infra Local Kind,NFS,MetalLB e Nginx ingress.

Bora lá?

Então galera, bem-vindos ao seu playground Kubernetes local, onde o Kind encontra o MetalLB, o NGINX dá as ordens e o NFS guarda tudo com carinho

A ideia é ter um combo de ferramentas distribuída e como pouco uso de recursos computacionais para quem está estudando K8s e também ter uma ambiente local de desenvolvimento bem robusto e prático. Esse é um dos meus labs.

Com esse combo, você terá:

Um cluster Kubernetes local via KIND 🧱

Um LoadBalancer funcional com MetalLB 📦

Um Ingress Controller top com NGINX 🚦

Um servidor NFS containerizado pronto pro compartilhamento 🔁

E um provisionador automático de PVCs pra facilitar sua vida 📂

Ideal pra devs, SREs, entusiastas de Kubernetes ou qualquer pessoa que só quer ver a mágica acontecer localmente sem depender de nuvem.

A ideia da infra é ficar assim:

/posts/emersonlabs-kind-nfs-metallb-nginx/desenho-infra.png

Bora colocar esse cluster pra rodar?

Realize o clone do repositório abaixo e não se esqueça de me seguir no GitHub também:

git clone https://github.com/silvemerson/kind-infra-lab.git

Crie seu cluster local com KIND usando o arquivo de configuração customizado cluster.yaml. Este arquivo define a rede e recursos do cluster.

kind create cluster –config cluster.yaml

Se ainda não sabe utilizar o Kind, segue um post bem legal sobre ele aqui

Para quem não conhece, o MetalLB é uma excelente ferramenta para quem não está na nuvem e tem acesso dinâmico a um serviço de LoadBalancer.

MetalLB permitirá que seu cluster KIND tenha IPs de LoadBalancer, já que KIND não tem isso nativamente.

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml

Criei um arquivo loadbalancer/metallb-config.yaml no repositório com o seguinte conteúdo, ajustando o range IP para sua rede KIND:

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: kind-pool
  namespace: metallb-system
spec:
  addresses:
  - 172.18.0.240-172.18.0.250  # intervalo seguro fora dos IPs dos nodes
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2
  namespace: metallb-system

Altere de acordo com o range de IP do Kind. Consulte com o Docker inspect. Aplique:

kubectl apply -f loadbalancer/metallb-config.yaml

Crie o namespace dedicado e instale o ingress NGINX, expondo o serviço como LoadBalancer para receber tráfego externo:

kubectl create namespace ingress-nginx
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.service.type=LoadBalancer

Use o arquivo nfs-server-compose.yaml para criar um container Docker com servidor NFS, que será usado para armazenamento compartilhado.

Inicie o container:

docker compose -f nfs/nfs-server-compose.yaml up -d

Após criar o NFS, verifique qual IP ele recebeu ao ser criado, em seguida, execute a instação do client no Kind:

helm repo add nfs https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner
helm repo update
kubectl create ns nfs-provisioner
helm upgrade --install nfs-provisioner nfs/nfs-subdir-external-provisioner \
    --namespace nfs-provisioner \
    --set nfs.server=172.18.0.5 \
    --set nfs.path="/" \
    --set storageClass.name=nfs-client \
    --set storageClass.defaultClass=true

Crie um namespace de teste e aplique um PVC para validar se o provisionador está funcionando:

kubectl create ns test-nfs
kubectl apply -f nfs/pvc-nfs-test.yaml
kubectl get pvc -n test-nfs

Resultado:

NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-test-pvc   Bound    pvc-ceca3596-4409-421c-89c7-a504fd1cb44d   1Gi        RWX            nfs-client     13s

E assim teremos uma infra pronta para uso localmente e leve pessoal. Faça o fork e melhorem essa infra!!!

até a próxima

TMJ

https://github.com/silvemerson/kind-infra-lab#

https://metallb.io/installation/

https://emerson-silva.blog.br/posts/construindo-um-cluster-k8s-kind/