Explorar conceitos base de Kubernetes, através da criação de cluster kind multinode Kubernetes para hospedagem de aplicação NGINX. Kubernetes (K8s) é software para gerenciar containers em clusters.
O curso será desenvolvido em Ubuntu CLI via WSL2 em Windows 10.
sudo apt update && sudo apt full-upgrade -y && sudo apt install -y curl wget ca-certificates gnupg
sudo install -m 0755 -d /etc/apt/keyrings && sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc && sudo chmod a+r /etc/apt/keyrings/docker.asc && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y && sudo usermod -aG docker $USER
docker --version
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && sudo chmod +x kubectl && sudo mv kubectl /usr/local/bin/kubectl
kubectl version --client
curl -Lo ./kind https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64 && sudo chmod +x ./kind && sudo mv ./kind /usr/local/bin/kind
kind version
Cluster é grupo de máquinas (nós/nodes) trabalhando juntas como 1 só. Pode ser single-node (única máquina node - Master Node Control Plane) ou multi-node (várias máquinas, Master Node Control Plane controla/gerencia os Workers Nodes que executam as aplicações).
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
Cluster K8s multi-node contendo 3 nodes, sendo 1 master node (control-plane) e 2 worker nodes (workers 1 e 2).
Cluster Kind
├── Control Plane
├── Worker 1
└── Worker 2
Namespaces são locais de trabalho para separar diferentes ambientes ou projetos dentro do mesmo cluster K8s. Exemplo: namespace financeiro possui todos recursos k8s relacionados a finanças, namespace vendas possui todos recursos k8s relacionados a vendas. Os recursos k8s de financeiro não interagem com os recursos k8s de vendas. Quando não são criados namespaces, todos os recursos são criados no namespace default.
Cluster Kind
├── Control Plane
├── Worker 1
└── Worker 2
│
▼
Namespace: projeto
Deployment é recurso k8s ideal para criar Pods permanentes e replicáveis. Pod é unidade gerenciável do K8s. Kubernetes não gerencia containers, mas sim Pods. Enquanto container é único, Pod é composto por 1 ou mais containers simultaneamente, além de características específicas (recursos (CPU, memória), volumes (pastas para armazenar dados permanentemente), rede (IP, portas, protocolos), etc).
ReplicaSet é recurso k8s ideal para replicar/multiplicar Pods e manter a quantidade desejada deles. Se um Pod morrer/falhar, ReplicaSet criará novo Pod automaticamente com mesmas características ao anterior para manter a quantidade desejada (self-healing).
Cluster Kind
├── Control Plane
├── Worker 1
└── Worker 2
│
▼
Namespace: projeto
├── Deployment
│ └── ReplicaSet
│ ├── Pod Nginx
│ ├── Pod Nginx
│ └── Pod Nginx
Cada Pod possui IP único no cluster. Se Pod for substituído, seu IP também será alterado, impossibilitando acesso. Service é camada ideal de rede que cria IP único e fixo no Deployment para todos seus Pods, garantindo acesso consistente, independentemente das alterações nos IPs dos Pods internos no Deployment. Ao invés de acessar diretamente IPs de cada Pod no Deployment, acessamos via IP único e fixo do Service todos Pods do Deployment, independentemente das alterações nos IPs dos Pods internos no Deployment.
Cluster Kind
├── Control Plane
├── Worker 1
└── Worker 2
│
▼
Namespace: projeto
├── Deployment
│ └── ReplicaSet
│ ├── Pod Nginx
│ ├── Pod Nginx
│ └── Pod Nginx
│
├── Service
kubectl create configmap app-config \
--from-literal=APP_NAME=UBSocial-Kubernetes \
--from-literal=APP_ENV=producao \
--from-literal=APP_VERSION=1.0 \
-n projeto
ConfigMap armazena dados gerais do Pod em variáveis de ambiente (nome da aplicação, ambiente, porta, URL de serviços, outras configurações gerais).
kubectl create secret generic app-secret \
--from-literal=DB_USER=admin \
--from-literal=DB_PASSWORD=123456 \
--from-literal=API_KEY=minha-chave \
-n projeto
Secret armazena dados sensíveis no mesmo padrão de ConfigMap (senhas, tokens, chaves de API, certificados).
containers:
- image: nginx
name: nginx
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secret
Cluster Kind
├── Control Plane
├── Worker 1
└── Worker 2
│
▼
Namespace: projeto
├── Deployment
│ └── ReplicaSet
│ ├── Pod Nginx
│ ├── Pod Nginx
│ └── Pod Nginx
│
├── Service
│
├── ConfigMap
└── Secret
APP_VERSION=2.0
Elaborado por Mateus Schwede
ubsocial.github.io