Atualizar Manifestos de API Descontinuados

KubernetesBeginner
Pratique Agora

Introdução

As APIs do Kubernetes evoluem. Um manifesto que funcionava em um cluster antigo pode falhar em um cluster mais recente porque uma versão da API foi removida ou porque os campos foram alterados para uma estrutura diferente. No trabalho para o CKAD, isso geralmente aparece como uma tarefa prática de manutenção: ler o erro, identificar a API atual, atualizar o manifesto e provar que a nova versão é aceita.

Neste laboratório, você migrará um manifesto de Ingress antigo de networking.k8s.io/v1beta1 para networking.k8s.io/v1. Primeiro, você criará um Service para o Ingress referenciar, depois observará o manifesto antigo falhando, usará comandos de descoberta do kubectl para inspecionar a API atual, reescreverá o manifesto e aplicará o Ingress corrigido.

Preparar uma Referência de Service

Nesta etapa, você preparará um namespace limpo e um Service simples. Tanto o manifesto de Ingress antigo quanto o novo apontarão para este Service, para que a migração permaneça focada na estrutura da API em vez da prontidão dos Pods ou do roteamento de tráfego.

Comece em /home/labex/project:

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...

Crie um namespace chamado ckad-prep-api-migration e defina-o como o namespace atual:

kubectl create namespace ckad-prep-api-migration
kubectl config set-context --current --namespace=ckad-prep-api-migration

Crie um Service do tipo ClusterIP chamado app-web. A opção --tcp=80:80 significa que o Service escuta na porta 80 e encaminharia para a porta de destino 80 se houvesse Pods correspondentes. Para este laboratório de migração, o objeto Service em si é suficiente, pois você está validando os campos da API de Ingress, não o tráfego HTTP.

kubectl create service clusterip app-web --tcp=80:80

Confirme se o Service existe:

kubectl get service app-web

A saída esperada inclui:

NAME      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
app-web   ClusterIP   ...          <none>        80/TCP    ...

Observar a Falha de um Manifesto Descontinuado

Nesta etapa, você criará um manifesto de Ingress antigo e deixará o cluster atual rejeitá-lo. Esta é uma prática útil, pois a primeira pista em uma tarefa de migração geralmente é a mensagem de erro do servidor da API.

Crie o arquivo old-ingress.yaml:

cat > old-ingress.yaml <<'EOF'
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: app-web
spec:
  rules:
  - host: app.example.local
    http:
      paths:
      - path: /
        backend:
          serviceName: app-web
          servicePort: 80
EOF

Leia o início do arquivo. O campo apiVersion informa ao Kubernetes qual grupo e versão da API devem processar este objeto.

sed -n '1,20p' old-ingress.yaml

A saída esperada inclui:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
...
          serviceName: app-web
          servicePort: 80

Peça ao servidor da API para validar o manifesto sem criá-lo. O parâmetro --dry-run=server envia o objeto ao servidor da API para validação, enquanto || true mantém o tutorial em execução, já que essa falha é esperada.

kubectl apply --dry-run=server -f old-ingress.yaml || true

A saída esperada inclui um erro semelhante a:

error: resource mapping not found for name: "app-web" namespace: "" from "old-ingress.yaml": no matches for kind "Ingress" in version "networking.k8s.io/v1beta1"

A evidência importante é no matches for kind "Ingress" in version "networking.k8s.io/v1beta1". Isso significa que o cluster atual não oferece mais suporte a essa versão da API.

Descobrir a Estrutura Atual da API de Ingress

Nesta etapa, você inspecionará a API de Ingress atual antes de reescrever o arquivo. Esta é a parte que mantém o trabalho de migração disciplinado: não tente adivinhar os novos campos quando o cluster pode mostrar a estrutura aceita.

Liste o recurso Ingress disponível:

kubectl api-resources | grep -i '^ingresses'

A saída esperada inclui:

ingresses   ing   networking.k8s.io/v1   true   Ingress

Use o kubectl explain para inspecionar o campo do serviço de backend atual. O caminho é longo porque o backend do Service está aninhado em spec.rules[].http.paths[].backend.service.

kubectl explain ingress.spec.rules.http.paths.backend.service --recursive | sed -n '1,80p'

A saída esperada inclui:

GROUP:      networking.k8s.io
KIND:       Ingress
VERSION:    v1

FIELD: service <IngressServiceBackend>
...
  name        <string> -required-
  port        <ServiceBackendPort> -required-

Agora, crie o arquivo current-ingress.yaml migrado. O novo manifesto usa networking.k8s.io/v1, adiciona pathType e substitui serviceName e servicePort pelos campos aninhados service.name e service.port.number.

cat > current-ingress.yaml <<'EOF'
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-web
spec:
  rules:
  - host: app.example.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: app-web
            port:
              number: 80
EOF

Valide o manifesto migrado com um dry run no lado do servidor:

kubectl apply --dry-run=server -f current-ingress.yaml

Saída esperada:

ingress.networking.k8s.io/app-web created (server dry run)

Aplicar e Inspecionar o Ingress Migrado

Nesta etapa, você criará o Ingress migrado e inspecionará os campos armazenados pelo Kubernetes. Aplicar o recurso é a prova final de que o manifesto agora corresponde ao servidor da API atual.

Aplique o manifesto migrado:

kubectl apply -f current-ingress.yaml

Saída esperada:

ingress.networking.k8s.io/app-web created

Liste o Ingress:

kubectl get ingress app-web

A saída esperada inclui:

NAME      CLASS   HOSTS               ADDRESS   PORTS   AGE
app-web   ...     app.example.local    ...       80      ...

Inspecione os campos do backend migrado diretamente do objeto armazenado:

kubectl get ingress app-web -o jsonpath='{.apiVersion}{" "}{.spec.rules[0].http.paths[0].pathType}{" "}{.spec.rules[0].http.paths[0].backend.service.name}{":"}{.spec.rules[0].http.paths[0].backend.service.port.number}{"\n"}'

Saída esperada:

networking.k8s.io/v1 Prefix app-web:80

Esta saída prova três coisas ao mesmo tempo: o objeto usa a versão atual da API, o caminho possui um pathType explícito e o backend usa a referência de Service aninhada exigida pelo networking.k8s.io/v1.

Resumo

Você praticou um fluxo de trabalho prático de migração de API. Você criou um manifesto de Ingress antigo networking.k8s.io/v1beta1, usou o dry run no lado do servidor para confirmar que o cluster atual o rejeita, inspecionou a API networking.k8s.io/v1 disponível, reescreveu os campos de backend com pathType e a referência de Service aninhada, e então aplicou e inspecionou o Ingress migrado.