Personalize uma Aplicação com Kustomize

KubernetesBeginner
Pratique Agora

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.