Introdução
O Helm empacota modelos (templates) do Kubernetes como releases. O Kustomize adota uma abordagem diferente: ele parte de arquivos YAML comuns do Kubernetes e aplica camadas de alterações sem utilizar expressões de template. Isso é útil quando você deseja uma base compartilhada com pequenas diferenças específicas de ambiente, como nomes, namespaces, contagem de réplicas ou patches.
Neste laboratório, você criará um Deployment e um Service base, renderizará essa base com o Kustomize e, em seguida, criará um overlay de produção que altera o nome, o namespace, a contagem de réplicas e a mensagem da aplicação. Por fim, você implantará o overlay com kubectl apply -k e testará o Service resultante.
Preparar um Workspace para o Kustomize
Nesta etapa, você preparará um namespace e confirmará que o suporte ao Kustomize está disponível através do kubectl.
Comece em /home/labex/project. Este laboratório mantém os manifestos base e os arquivos de overlay neste workspace.
mkdir -p /home/labex/project
cd /home/labex/project
Verifique se o servidor da API do Kubernetes está acessível. Se a VM acabou de iniciar e o nó ainda não está pronto, aguarde alguns segundos e execute o comando novamente.
kubectl get nodes --request-timeout=5s
A saída esperada inclui:
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
Aguarde até que o Pod de rede do cluster esteja pronto (Ready). Você testará um Service ao final do laboratório, portanto, a rede do cluster precisa estar saudável.
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
Saída esperada:
pod/calico-node-... condition met
Crie um namespace chamado ckad-prep-kustomize e defina-o como o namespace atual:
kubectl create namespace ckad-prep-kustomize
kubectl config set-context --current --namespace=ckad-prep-kustomize
Confirme o namespace e verifique se o kubectl kustomize está disponível. O kubectl kustomize renderiza diretórios do Kustomize sem aplicá-los.
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
kubectl kustomize --help | sed -n '1,3p'
A saída esperada inclui:
ckad-prep-kustomize
Build a set of KRM resources...
Criar uma Base Reutilizável
Nesta etapa, você criará uma base do Kustomize a partir de arquivos YAML comuns do Kubernetes.
Uma base é o ponto de partida compartilhado. Ela deve conter objetos Kubernetes completos e válidos antes que qualquer personalização específica de ambiente seja adicionada. Aqui, a base contém um Deployment e um Service. A aplicação escreve o valor da variável de ambiente MESSAGE em uma pequena página web.
Crie o diretório base:
mkdir -p kustomize-demo/base
Escreva o Deployment base:
cat > kustomize-demo/base/deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: kustomize-web
labels:
app: kustomize-web
spec:
replicas: 1
selector:
matchLabels:
app: kustomize-web
template:
metadata:
labels:
app: kustomize-web
spec:
terminationGracePeriodSeconds: 0
containers:
- name: web
image: busybox:1.36
env:
- name: MESSAGE
value: base-v1
command:
- /bin/sh
- -c
- |
mkdir -p /www
echo "$MESSAGE" > /www/index.html
httpd -f -p 8080 -h /www
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 1
periodSeconds: 2
EOF
Escreva o Service base. Seu seletor corresponde ao rótulo (label) do Pod definido no Deployment.
cat > kustomize-demo/base/service.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
name: kustomize-web
spec:
selector:
app: kustomize-web
ports:
- port: 80
targetPort: 8080
EOF
Crie o arquivo kustomization.yaml da base. Este arquivo informa ao Kustomize quais recursos pertencem à base.
cat > kustomize-demo/base/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
EOF
Renderize a base sem aplicá-la:
kubectl kustomize kustomize-demo/base | sed -n '1,120p'
A saída esperada inclui um Service chamado kustomize-web, um Deployment chamado kustomize-web, replicas: 1 e value: base-v1.
Adicionar um Overlay de Produção
Nesta etapa, você criará um overlay que personaliza a base para uma implantação em estilo de produção.
Um overlay aponta para uma base e adiciona alterações. Este overlay colocará os objetos no namespace ckad-prep-kustomize, adicionará o prefixo prod- aos nomes, escalará o Deployment para três réplicas e aplicará um patch no valor de MESSAGE para prod-v2.
Crie o diretório do overlay:
mkdir -p kustomize-demo/overlays/prod
Escreva um patch para o Deployment. O patch nomeia o objeto base original, kustomize-web. O Kustomize corresponde ao patch antes de adicionar o prefixo prod-.
cat > kustomize-demo/overlays/prod/deployment-patch.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: kustomize-web
spec:
replicas: 3
template:
spec:
containers:
- name: web
env:
- name: MESSAGE
value: prod-v2
EOF
Crie o kustomization.yaml do overlay. A entrada resources aponta de volta para a base, enquanto namespace, namePrefix e patches descrevem a personalização.
cat > kustomize-demo/overlays/prod/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ckad-prep-kustomize
namePrefix: prod-
resources:
- ../../base
patches:
- path: deployment-patch.yaml
EOF
Renderize o overlay de produção:
kubectl kustomize kustomize-demo/overlays/prod | sed -n '1,160p'
A saída esperada inclui:
name: prod-kustomize-web
namespace: ckad-prep-kustomize
replicas: 3
value: prod-v2
Implantar e Testar a Aplicação Personalizada
Nesta etapa, você aplicará o overlay de produção e testará o Service que ele cria.
O comando kubectl apply -k renderiza um diretório do Kustomize e envia os objetos renderizados para o servidor da API do Kubernetes. Você não precisa criar um arquivo YAML temporário.
Aplique o overlay de produção:
kubectl apply -k kustomize-demo/overlays/prod
A saída esperada inclui:
service/prod-kustomize-web created
deployment.apps/prod-kustomize-web created
Aguarde o Deployment personalizado:
kubectl rollout status deployment/prod-kustomize-web --timeout=120s
Saída esperada:
deployment "prod-kustomize-web" successfully rolled out
Inspecione os objetos criados a partir do overlay:
kubectl get deployment,service prod-kustomize-web
A saída esperada inclui:
deployment.apps/prod-kustomize-web 3/3
service/prod-kustomize-web
Crie um Pod cliente e teste o Service. A resposta deve ser prod-v2, o que prova que o patch do overlay alterou a configuração da aplicação em execução.
kubectl run kustomize-client --image=busybox:1.36 --restart=Never --command -- sleep 3600
kubectl wait --for=condition=Ready pod/kustomize-client --timeout=120s
kubectl exec kustomize-client -- wget -qO- http://prod-kustomize-web
Saída esperada:
prod-v2
Resumo
Você construiu uma base do Kustomize a partir de arquivos YAML comuns de Deployment e Service, criou um overlay de produção que alterou o namespace, os nomes dos objetos, a contagem de réplicas e a mensagem da aplicação. Você renderizou tanto a base quanto o overlay antes de aplicar o overlay com kubectl apply -k e, em seguida, verificou a aplicação personalizada através do seu Service.


