À medida que as organizações utilizam microserviços e arquiteturas nativas da nuvem, o Kubernetes está se tornando a norma para orquestração de contêineres. Por mais que o Kubernetes simplifique a implantação e o gerenciamento de contêineres, as cargas de trabalho em grande escala tornam a vida complexa, e práticas robustas são necessárias.
Neste artigo, abordarei estratégias técnicas e melhores práticas para o gerenciamento de cargas de trabalho em grande escala no Kubernetes.
Conhecendo os Desafios na Escala do Kubernetes
A escalabilidade no Kubernetes envolve superar obstáculos como:
- Agendamento de recursos do cluster. Uso otimizado de CPU, memória e disco entre os nós.
- Complexidade de rede. Comunicações consistentes entre serviços em ambientes grandes e distribuídos.
- Falhas e escalabilidade. Gerenciamento da disponibilidade durante falhas e em cenários de expansão/redução.
- Custos operacionais. Eliminação de operações repetitivas, como escalabilidade, monitoramento e balanceamento de cargas.
- Segurança em escala. Controles de acesso baseados em função (RBAC), segredos e políticas de rede em grandes clusters.
Neste artigo, irei apresentar exemplos de como superar tais obstáculos com uma combinação de capacidades nativas do Kubernetes e ferramentas complementares.
Capacidades e Ferramentas
1. Agendamento Eficiente de Recursos do Cluster
O desempenho em escala é determinado diretamente pela distribuição de recursos em escala. Existem uma variedade de capacidades no Kubernetes para uso otimizado de recursos:
Solicitações e Limites
A declaração de solicitações e limites de CPU e memória causará distribuição justa de recursos e não permitirá que vizinhos barulhentos consumam todos os recursos.
apiVersion v1
kind Pod
metadata
name resource-demo
spec
containers
name app
image nginx
resources
requests
memory"128Mi"
cpu"500m"
limits
memory"256Mi"
cpu"1"
Práticas recomendadas:
- Use cota para fazer cumprir no nível do namespace.
- Analise periodicamente o uso com
kubectl top
e faça ajustes necessários nos limites.
Cluster Autoscaler
O escalonador ajusta dinamicamente a contagem de nós do seu cluster de acordo com a demanda de carga de trabalho.
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/cluster-autoscaler-<version>/cluster-autoscaler.yaml
Práticas recomendadas:
- Rotule suas operações de escalonamento apropriadamente para seus nós.
- Monitore o comportamento de escalonamento para evitar superprovisionamento.
2. Escalonamento Automático de Pod Horizontal e Vertical
O Horizontal Pod Autoscaler (HPA) e o Vertical Pod Autoscaler (VPA) possuem capacidades de escalonamento automático nativas no Kubernetes, mas os service meshes como Istio e Linkerd tornam e simplificam as comunicações entre serviços mais fáceis e eficientes.
Horizontal Pod Autoscaler (HPA)
O HPA dimensiona réplicas de pods de acordo com CPU, memória ou métricas personalizadas.
Exemplo: Uso de CPU para escalonamento automático
apiVersion autoscaling/v2
kind HorizontalPodAutoscaler
metadata
name hpa-example
spec
scaleTargetRef
apiVersion apps/v1
kind Deployment
name web-app
minReplicas2
maxReplicas10
metrics
type Resource
resource
name cpu
target
type Utilization
averageUtilization50
Vertical Pod Autoscaler (VPA)
O Vertical Pod Autoscaler ajusta a solicitação e o limite em tempo de execução de um pod.
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/vertical-pod-autoscaler-<version>/vpa.yaml
3. Otimizando Redes em Escala
Service Mesh
Service meshes como Istio e Linkerd tornam as comunicações entre serviços mais fáceis e eficientes através da abstração de cargas de serviço, tentativas e preocupações de criptografia.
Exemplo: Istio VirtualService para roteamento de tráfego
apiVersion networking.istio.io/v1beta1
kind VirtualService
metadata
name example-route
spec
hosts
example.com
http
route
destination
host service-v1
weight80
destination
host service-v2
weight20
Políticas de Rede
Use políticas de rede para restringir o tráfego entre pods para aumentar a segurança.
apiVersion networking.k8s.io/v1
kind NetworkPolicy
metadata
name restrict-traffic
spec
podSelector
matchLabels
app web-app
policyTypes
Ingress
ingress
from
podSelector
matchLabels
role backend
4. Aumento da Observabilidade
A observabilidade é crítica para o controle do Kubernetes em um nível maior. Use ferramentas como Prometheus, Grafana e Jaeger para métricas, logs e rastreamento.
Métricas do Prometheus
Use anotações do Prometheus para coletar métricas de pods.
apiVersion v1
kind Pod
metadata
annotations
prometheus.io/scrape"true"
prometheus.io/port"8080"
labels
app monitored-app
spec
containers
name app
image monitored-app latest
ports
containerPort8080
5. Construindo Resiliência
Orçamentos de Disrupção de Pod (PDB)
Use PDBs para manter uma disponibilidade mínima de pods durante manutenção e atualizações.
apiVersion policy/v1
kind PodDisruptionBudget
metadata
name pdb-example
spec
minAvailable2
selector
matchLabels
app web-app
Atualizações Rolling
Realize atualizações em fases de maneira que não cause tempo de inatividade.
kubectl set image deployment/web-app web-app=web-app:v2 --record
kubectl rollout status deployment/web-app
6. Garantindo Segurança no Kubernetes em Escala
Configuração RBAC
Use RBAC para restringir os privilégios do usuário e do aplicativo.
apiVersion rbac.authorization.k8s.io/v1
kind Role
metadata
namespace default
name pod-reader
rules
apiGroups""
resources"pods"
verbs"get" "list" "watch"
Gerenciamento de Segredos
Utilize Secrets do Kubernetes para o gerenciamento seguro de informações sensíveis. Use Secrets do Kubernetes para gerenciar informações sensíveis de forma segura.
apiVersion v1
kind Secret
metadata
name db-credentials
type Opaque
data
username dXNlcg==
password cGFzc3dvcmQ=
7. GitOps para Automação
Utilize GitOps com ferramentas como ArgoCD e Flux. Versione e armazene manifests do Kubernetes em repositórios Git e faça com que os clusters sejam sincronizados automaticamente com eles.
8. Testes em Grande Escala
Simule cargas de trabalho em alta escala com ferramentas como K6 e Locust. Verifique a configuração, atribuições de recursos e escalonamento em ambientes de teste.
9. Gerenciamento de Armazenamento em Grande Escala
Provisionamento Dinâmico de Volume Persistente
O armazenamento para aplicações é provisionado dinamicamente com automação.
apiVersion storage.k8s.io/v1
kind StorageClass
metadata
name fast-storage
provisioner kubernetes.io/aws-ebs
parameters
type gp2
fsType ext4
10. Otimizando Pipelines de CI/CD para Kubernetes
Crie e Publique uma Imagem Docker
Simplifique a criação e publicação de imagens de contêiner com ferramentas de CI/CD como Jenkins, GitHub Actions e GitLab CI.
Conclusão
Para escalar o Kubernetes, é necessário ter uma combinação de uso eficiente de recursos, automação, observabilidade e processos de segurança robustos em vigor. Ao aproveitar ao máximo as capacidades nativas do Kubernetes e combiná-las com ferramentas complementares, suas cargas de trabalho podem ser de alto desempenho, seguras e resilientes em qualquer escala.
Source:
https://dzone.com/articles/best-practices-managing-kubernetes-at-scale