Mise à jour de manifestes d'API obsolètes

KubernetesBeginner
Pratiquer maintenant

Introduction

Les API Kubernetes évoluent. Un manifeste qui fonctionnait sur un cluster plus ancien peut échouer sur un cluster récent, soit parce qu'une version d'API a été supprimée, soit parce que les champs ont été restructurés. Dans le cadre de la certification CKAD, cela se traduit généralement par une tâche de maintenance concrète : lire l'erreur, identifier l'API actuelle, mettre à jour le manifeste et vérifier que la nouvelle version est acceptée.

Dans ce laboratoire, vous allez migrer un ancien manifeste Ingress de networking.k8s.io/v1beta1 vers networking.k8s.io/v1. Vous créerez d'abord un Service auquel l'Ingress pourra faire référence, puis vous observerez l'échec de l'ancien manifeste, utiliserez les commandes de découverte kubectl pour inspecter l'API actuelle, réécrirez le manifeste et appliquerez l'Ingress corrigé.

Préparer une référence de Service

Dans cette étape, vous allez préparer un espace de noms (namespace) propre et un Service simple. Les anciens et nouveaux manifestes Ingress pointeront tous deux vers ce Service, afin que la migration se concentre sur la structure de l'API plutôt que sur la disponibilité des Pods ou le routage du trafic.

Commencez dans /home/labex/project :

mkdir -p /home/labex/project
cd /home/labex/project

Vérifiez que le serveur d'API Kubernetes est accessible. Si la machine virtuelle vient de démarrer et que le nœud n'est pas encore prêt, attendez quelques secondes et relancez la commande.

kubectl get nodes --request-timeout=5s

La sortie attendue inclut :

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

Créez un espace de noms nommé ckad-prep-api-migration et définissez-le comme espace de noms actuel :

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

Créez un Service de type ClusterIP nommé app-web. L'option --tcp=80:80 signifie que le Service écoute sur le port 80 et redirigerait vers le port cible 80 si des Pods correspondants existaient. Pour ce laboratoire de migration, l'objet Service lui-même suffit car vous validez les champs de l'API Ingress, et non le trafic HTTP.

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

Confirmez que le Service existe :

kubectl get service app-web

La sortie attendue inclut :

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

Observer l'échec d'un manifeste obsolète

Dans cette étape, vous allez créer un ancien manifeste Ingress et laisser le cluster actuel le rejeter. C'est un exercice utile, car le premier indice dans une tâche de migration est souvent le message d'erreur du serveur d'API.

Créez 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

Lisez le début du fichier. Le champ apiVersion indique à Kubernetes quel groupe d'API et quelle version doivent traiter cet objet.

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

La sortie attendue inclut :

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

Demandez au serveur d'API de valider le manifeste sans le créer. --dry-run=server envoie l'objet au serveur d'API pour validation, tandis que || true permet au tutoriel de continuer car cet échec est attendu.

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

La sortie attendue inclut une erreur similaire à :

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"

L'élément important est no matches for kind "Ingress" in version "networking.k8s.io/v1beta1". Cela signifie que le cluster actuel ne prend plus en charge cette version d'API.

Découvrir la structure actuelle de l'API Ingress

Dans cette étape, vous allez inspecter l'API Ingress actuelle avant de réécrire le fichier. C'est ce qui permet de garder une approche rigoureuse : ne devinez pas les nouveaux champs quand le cluster peut vous montrer la structure acceptée.

Listez la ressource Ingress disponible :

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

La sortie attendue inclut :

ingresses   ing   networking.k8s.io/v1   true   Ingress

Utilisez kubectl explain pour inspecter le champ du service backend actuel. Le chemin est long car le backend du Service est imbriqué sous spec.rules[].http.paths[].backend.service.

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

La sortie attendue inclut :

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

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

Créez maintenant le fichier current-ingress.yaml migré. Le nouveau manifeste utilise networking.k8s.io/v1, ajoute pathType, et remplace serviceName et servicePort par les champs imbriqués service.name et 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

Validez le manifeste migré avec un test à sec côté serveur :

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

Sortie attendue :

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

Appliquer et inspecter l'Ingress migré

Dans cette étape, vous allez créer l'Ingress migré et inspecter les champs stockés par Kubernetes. L'application de la ressource est la preuve finale que le manifeste correspond désormais au serveur d'API actuel.

Appliquez le manifeste migré :

kubectl apply -f current-ingress.yaml

Sortie attendue :

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

Listez l'Ingress :

kubectl get ingress app-web

La sortie attendue inclut :

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

Inspectez directement les champs du backend migré à partir de l'objet stocké :

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"}'

Sortie attendue :

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

Ce résultat prouve trois choses : l'objet utilise la version d'API actuelle, le chemin possède un pathType explicite, et le backend utilise la référence de Service imbriquée requise par networking.k8s.io/v1.

Résumé

Vous avez pratiqué un flux de travail concret de migration d'API. Vous avez créé un ancien manifeste Ingress networking.k8s.io/v1beta1, utilisé un test à sec côté serveur pour confirmer que le cluster actuel le rejetait, inspecté l'API networking.k8s.io/v1 disponible, réécrit les champs du backend avec pathType et la référence de Service imbriquée, puis appliqué et inspecté l'Ingress migré.