Introdução ao Kustomize
O Kustomize é uma ferramenta nativa do Kubernetes projetada para facilitar a customização de objetos declarativos YAML sem modificar diretamente os arquivos originais. Essa abordagem torna as implantações mais flexíveis e reutilizáveis, permitindo a aplicação de configurações específicas para diferentes ambientes como desenvolvimento, homologação e produção.
O Kustomize foi incorporado ao cliente kubectl
, o que significa que você pode usá-lo sem a necessidade de instalar ferramentas adicionais.
Principais Benefícios do Kustomize
- Sem alterações diretas: Mantém os manifestos base intactos.
- Customização para ambientes: Permite sobreposição de configurações para atender às necessidades de diferentes ambientes.
- Reutilização de recursos: Facilita a reutilização de configurações comuns entre projetos.
- Organização estruturada: Permite que os manifestos sejam organizados de maneira modular.
Componentes Principais
Bases
Os arquivos YAML originais, mencionados como bases no contexto do Kustomize, são fundamentais em um ambiente Kubernetes, pois contêm as definições de recursos básicos que descrevem como os objetos no cluster devem ser criados e configurados. Esses arquivos funcionam como ponto de partida para customizações e geralmente incluem elementos como:
- Pods:
- Descrevem uma ou mais aplicações que compartilham o mesmo ambiente de execução (containers).
- São o menor e mais básico recurso do Kubernetes.
Exemplo:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: nginx image: nginx:latest
- Services:
- Proporcionam um ponto de acesso estável para os Pods.
- São usados para expor aplicações para comunicação interna ou externa.
Exemplo:
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080
- Deployments:
- Gerenciam a criação e a atualização de Pods de maneira declarativa.
- Permitem especificar o número de réplicas, atualização contínua (rolling updates), entre outras configurações.
Exemplo:
apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-app:1.0.0
Esses arquivos são imutáveis por princípio no Kustomize. Isso significa que, ao usar essa ferramenta, você nunca altera diretamente os arquivos base, garantindo que eles permaneçam reutilizáveis e consistentes. Qualquer alteração ou ajuste necessário é feito por meio de patches ou sobreposições (overlays), permitindo uma abordagem modular e organizada na gestão de configurações.
Essa separação entre bases e overlays facilita a manutenção de múltiplos ambientes, como desenvolvimento e produção, sem o risco de sobrescrever configurações críticas.
Overlays
As customizações aplicadas sobre as bases, conhecidas como overlays no Kustomize, são modificações que ajustam os manifestos YAML básicos (bases) para atender a requisitos específicos de diferentes contextos. Isso permite que você adapte configurações de forma organizada e reutilizável para diferentes ambientes, como desenvolvimento, produção, testes, entre outros.
Como funcionam os Overlays?
Os overlays utilizam arquivos YAML adicionais, chamados de patches, e um arquivo de configuração kustomization.yaml
para definir como os arquivos base devem ser ajustados. Essas customizações são aplicadas em cima dos recursos originais sem alterar os arquivos base diretamente.
Principais Características:
- Modularidade: As customizações são mantidas separadas das definições originais.
- Flexibilidade: Permite que diferentes configurações, como réplicas, imagens de container ou rótulos, sejam aplicadas dependendo do ambiente.
- Centralização: Todas as alterações são definidas de maneira declarativa e centralizada em arquivos de sobreposição.
Exemplo de Situações para Overlays
Ambiente de Desenvolvimento
No ambiente de desenvolvimento, você pode precisar de configurações como:
- Menor número de réplicas para economizar recursos.
- Uso de imagens de container mais recentes ou instáveis.
- Rótulos que identificam o ambiente como “dev”.
Exemplo de Patch (overlay):
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 2
template:
spec:
containers:
- name: my-app
image: my-app:latest
Ambiente de Produção
No ambiente de produção, as necessidades são diferentes:
- Maior número de réplicas para garantir alta disponibilidade.
- Uso de imagens estáveis e versionadas.
- Inclusão de configurações de segurança, como liveness e readiness probes.
Exemplo de Patch (overlay):
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 10
template:
spec:
containers:
- name: my-app
image: my-app:1.0.0
readinessProbe:
httpGet:
path: /
port: 8080
Arquivo kustomization.yaml
no Overlay
O arquivo kustomization.yaml
em cada overlay define as bases que ele deve usar e os patches que devem ser aplicados.
Exemplo de kustomization.yaml
para desenvolvimento:
resources:
- ../../base
patches:
- patch-dev.yaml
commonLabels:
environment: dev
Exemplo de kustomization.yaml
para produção:
resources:
- ../../base
patches:
- patch-prod.yaml
commonLabels:
environment: prod
Benefícios dos Overlays
- Facilidade de Gerenciamento: Cada ambiente tem suas configurações organizadas em diretórios próprios.
- Prevenção de Erros: Como os arquivos base não são alterados diretamente, há menos risco de sobrescrever configurações críticas.
- Eficiência no CI/CD: No pipeline de CI/CD, os overlays podem ser usados para aplicar as configurações corretas automaticamente, dependendo do ambiente.
Fluxo de Uso em um Pipeline
- Use
kubectl apply -k overlays/dev
para aplicar a configuração de desenvolvimento. - Use
kubectl apply -k overlays/prod
para aplicar a configuração de produção.
Os overlays são uma ferramenta essencial para ambientes Kubernetes, permitindo gerenciar a complexidade de múltiplos ambientes de forma modular, segura e eficiente.
kustomization.yaml
Este é o arquivo principal que define quais bases usar, quais customizações aplicar e como os recursos serão combinados. Alguns dos campos principais incluem:
resources
: Lista de arquivos base a serem usados.patches
: Customizações que serão aplicadas aos recursos.commonLabels
: Etiquetas adicionadas a todos os recursos gerados.configMapGenerator
esecretGenerator
: Ferramentas para criar ConfigMaps e Secrets diretamente.
Exemplo de Implantação com Kustomize
Vamos explorar como configurar e implantar aplicações usando o Kustomize em um ambiente Kubernetes.
Estrutura do Diretório
project/
├── base/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── kustomization.yaml
├── overlays/
├── dev/
│ ├── kustomization.yaml
│ └── patch-dev.yaml
├── prod/
├── kustomization.yaml
└── patch-prod.yaml
Arquivos Base
base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:latest
base/service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
base/kustomization.yaml
resources:
- deployment.yaml
- service.yaml
Overlay para Desenvolvimento
overlays/dev/patch-dev.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 2
overlays/dev/kustomization.yaml
resources:
- ../../base
patches:
- path: patch-dev.yaml
labels:
environment: dev
Overlay para Produção
overlays/prod/patch-prod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 5
overlays/prod/kustomization.yaml
resources:
- ../../base
patches:
- path: patch-prod.yaml
labels:
environment: prod
Implantando com Kustomize
Desenvolvimento
Para aplicar a configuração de desenvolvimento:
kubectl apply -k overlays/dev
Produção
Para aplicar a configuração de produção:
kubectl apply -k overlays/prod
Conclusão
O Kustomize é uma ferramenta poderosa e flexível para gerenciar configurações em ambientes Kubernetes. Ele simplifica a customização e aumenta a produtividade, permitindo que equipes gerenciem manifestações de maneira modular e eficiente.
Seja para aplicações simples ou arquiteturas complexas, o Kustomize se torna uma peça essencial no ciclo de vida de implantação.