À medida que as organizações utilizam microserviços e arquiteturas nativas da nuvem, o Kubernetes está se tornando a norma para a orquestração de contêineres. Embora o Kubernetes simplifique o gerenciamento e a implantação 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 escala no Kubernetes.
Conhecendo os Desafios na Escala do Kubernetes
Escalar 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 de serviço para serviço em grandes ambientes distribuídos.
- Falhas e escalabilidade. Gerenciamento da disponibilidade durante falhas e em cenários de aumento/redução de escala.
- Sobrecargas operacionais. Remoção de operações repetitivas, como escalonamento, 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 várias 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á uma distribuição justa de recursos e não permitirá que vizinhos ruidosos 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 autoscaler dimensiona 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 adequadamente suas operações de autoscaler para seus nós.
- Monitore o comportamento de dimensionamento para evitar superprovisionamento.
2. Dimensionamento Automático de Pods Horizontal e Vertical
O Dimensionamento Automático de Pods Horizontal (HPA) e o Dimensionamento Automático de Pods Vertical (VPA) capacidades de dimensionamento automático são 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.
Dimensionamento Automático de Pods Horizontal (HPA)
O HPA dimensiona réplicas de pods de acordo com CPU, memória ou métricas personalizadas.
Exemplo: Uso de CPU para dimensionamento 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
Dimensionador Automático de Pods Vertical (VPA)
O Dimensionador Automático de Pods Vertical dimensiona uma solicitação em tempo de execução e um limite de um pod.
kubectl apply -f https://github.com/kubernetes/autoscaler/releases/download/vertical-pod-autoscaler-<version>/vpa.yaml
3. Otimizando a Rede em Escala
Malha de Serviço
Malhas de serviço como Istio e Linkerd tornam e simplificam 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 com criptografia.
Exemplo: Istio VirtualService para rotear 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 uma segurança aprimorada.
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. Aprimoramento da Observabilidade
A observabilidade é crucial no controle do Kubernetes em um nível mais amplo. 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 do pod.
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 Interrupção de Pods (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 Graduais
Implemente atualizações em fases de maneira que não cause nenhum tempo de inatividade.
kubectl set image deployment/web-app web-app=web-app:v2 --record
kubectl rollout status deployment/web-app
6. Segurança do Kubernetes em Escala
Configuração do 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 Segredos do Kubernetes para gerenciamento seguro de informações sensíveis. Use Segredos 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 os manifests do Kubernetes em repositórios Git e mantenha os clusters sincronizados automaticamente com eles.
8. Testes em Grande Escala
Simule cargas de trabalho de alta escala com ferramentas como K6 e Locust. Verifique a configuração, atribuições de recursos e escalabilidade em ambientes de teste.
9. Gerenciamento de Armazenamento em Grande Escala
Provisionamento Dinâmico de Volumes Persistentes
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 Envie uma Imagem Docker
Agilize 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 prática. 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