Utilisation d'Envoy Gateway pour implémenter l'API Kubernetes Gateway

Découvrez comment configurer Envoy Gateway pour prendre en charge l'API Kubernetes Gateway dans les clusters que vous créez à l'aide de Kubernetes Engine (OKE).

L'API de passerelle Kubernetes (API de passerelle) est la norme nouvelle génération pour la gestion du trafic entrant et réseau dans les clusters Kubernetes, qui succède à l'API entrante. Pour plus d'informations sur l'API Gateway, reportez-vous à API Gateway dans la documentation Kubernetes et à la documentation de l'API Gateway.

Envoy Gateway est une implémentation open source de l'API Gateway qui gère Envoy Proxy en tant que plan de données. Il fournit un moyen standard et conforme de gérer le trafic entrant sans s'appuyer sur des CRD propres au fournisseur.

En déployant Envoy Gateway, vous pouvez l'utiliser en tant que contrôleur sous-jacent pour gérer les ressources d'API de passerelle Gateway, HTTPRoute et autres.

Le déploiement d'Envoy Gateway inclut plusieurs composants qui fonctionnent ensemble :

  • Les CRD d'API de passerelle étendent l'API Kubernetes avec de nouveaux types de ressource tels que Gateway et HTTPRoute, ce qui permet une gestion déclarative du trafic entrant.
  • Le contrôleur Envoy Gateway fait office de plan de contrôle, surveille les ressources d'API Gateway et les convertit en configuration détaillée pour le plan de données.
  • Les pods proxy Envoy forment le plan de données, gérant le trafic réseau conformément aux stratégies et aux routages définis par les ressources de passerelle.
  • L'intégration d'OCI Network Load Balancer garantit que le trafic externe est correctement acheminé vers les applications via les noeuds de proxy Envoy.

Prérequis

Avant de configurer Envoy Gateway pour qu'il prenne en charge l'API Kubernetes Gateway :

  • Vous devez disposer d'un accès kubectl au cluster créé par Kubernetes Engine.
  • L'interface de ligne de commande Helm (version 3.0 ou ultérieure) doit être installée sur l'ordinateur à partir duquel vous accédez au cluster.
  • Vous devez disposer des privilèges cluster-admin pour installer des définitions de ressources et des contrôleurs personnalisés.

Configuration d'Envoy Gateway en tant que contrôleur d'API Gateway

Etapes de haut niveau pour configurer la passerelle Envoy Gateway

A haut niveau, les étapes de configuration d'Envoy Gateway en tant que contrôleur d'API Gateway sont les suivantes :

Etape 1 : Installation des CRD de l'API Gateway

Les définitions de ressource personnalisées d'API Gateway (CRD) ne sont pas installées par défaut dans les clusters que vous créez à l'aide de Kubernetes Engine. Avant d'utiliser Envoy Gateway en tant que contrôleur d'API Gateway, vous devez installer les CRD.

  1. Installez les CRD de canal standard (v1.2.0) en saisissant :

    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
    
  2. Vérifiez que le CRD est installé en saisissant la commande suivante :

    kubectl get crd gateways.gateway.networking.k8s.io
    
  3. Vérifiez que le CRD est répertorié dans la sortie.

Etape 2 : installation d'Envoy Gateway

Utilisez Helm pour installer le contrôleur Envoy Gateway.

  1. Installez le graphique dans l'espace de noms envoy-gateway-system en saisissant la commande suivante :

    helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.6.3 -n envoy-gateway-system --create-namespace
    
  2. Attendez que le contrôleur de la passerelle Envoy Gateway soit prêt en saisissant :

    kubectl wait --namespace envoy-gateway-system \
      --for=condition=ready pod \
      --selector=control-plane=envoy-gateway \
      --timeout=90s
    

Etape 3 : configuration de l'intégration d'OCI Network Load Balancer

Créez une ressource personnalisée EnvoyProxy pour injecter les annotations OCI nécessaires dans le fichier Service créé par Envoy Gateway.

  1. Créez un fichier nommé oci-envoy-proxy.yaml avec le contenu suivant :

    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: EnvoyProxy
    metadata:
      name: oci-flexible-proxy
      namespace: envoy-gateway-system
    spec:
      provider:
        type: Kubernetes
        kubernetes:
          envoyService:
            annotations:
              oci.oraclecloud.com/load-balancer-type: "nlb"
    
  2. Créez la ressource personnalisée EnvoyProxy en saisissant la commande suivante :

    kubectl apply -f oci-envoy-proxy.yaml
    

Etape 4 : création d'un élément GatewayClass

Créez un élément GatewayClass qui indique au contrôleur d'utiliser l'élément EnvoyProxy que vous avez créé.

  1. Créez un fichier nommé oci-gateway-class.yaml avec le contenu suivant :

    apiVersion: gateway.networking.k8s.io/v1
    kind: GatewayClass
    metadata:
      name: oci-gateway-class
    spec:
      controllerName: gateway.envoyproxy.io/gatewayclass-controller
      parametersRef:
        group: gateway.envoyproxy.io
        kind: EnvoyProxy
        name: oci-flexible-proxy
        namespace: envoy-gateway-system
    
  2. Créez le fichier GatewayClass en saisissant la commande suivante :

    kubectl apply -f oci-gateway-class.yaml
    

Etape 5 : création d'une passerelle

Créez la ressource Gateway, qui déclenche la création de l'équilibreur de charge réseau OCI.

  1. Créez un fichier nommé my-gateway.yaml avec le contenu suivant :

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: my-envoy-gateway
      namespace: default
    spec:
      gatewayClassName: oci-gateway-class
      listeners:
      - name: http
        protocol: HTTP
        port: 80
        allowedRoutes:
          namespaces:
            from: Same
    
  2. Créez le fichier Gateway en saisissant la commande suivante :

    kubectl apply -f my-gateway.yaml
    
  3. Obtenez l'adresse IP externe en saisissant :

    kubectl get gateway my-envoy-gateway -n default
    

    Le provisionnement de l'équilibreur de charge par OCI peut prendre quelques minutes.

    Attendez que la colonne PROGRAMMED contienne True et qu'une adresse IP apparaisse dans la colonne ADDRESS.

Etape 6 : déploiement d'un exemple d'application

Testez la passerelle en déployant un service echo simple.

  1. Créez un fichier nommé echo-app.yaml avec le contenu suivant :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echo-app
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: echo
      template:
        metadata:
          labels:
            app: echo
        spec:
          containers:
          - name: echo
            image: ealen/echo-server:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: echo-service
      namespace: default
    spec:
      selector:
        app: echo
      ports:
      - port: 80
        targetPort: 80
    
  2. Créez l'application échantillon en saisissant ce qui suit :

    kubectl apply -f echo-app.yaml
    

Etape 7 : création d'un élément HTTPRoute

Créez un élément HTTPRoute pour diriger le trafic de Gateway vers l'application.

  1. Créez un fichier nommé echo-route.yaml avec le contenu suivant :

    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: echo-route
      namespace: default
    spec:
      parentRefs:
      - name: my-envoy-gateway
      rules:
      - matches:
        - path:
            type: PathPrefix
            value: /
        backendRefs:
        - name: echo-service
          port: 80
    
  2. Créez le fichier HTTPRoute en saisissant la commande suivante :

    kubectl apply -f echo-route.yaml
    

Etape 8 : vérification de la connectivité

Vérifiez la connectivité en envoyant une demande à l'adresse IP externe de Gateway.

  1. Récupérez l'adresse IP publique de la passerelle et enregistrez-la en tant que variable d'environnement en saisissant ce qui suit :

    export GATEWAY_IP=$(kubectl get gateway my-envoy-gateway -o jsonpath='{.status.addresses[0].value}')
  2. Utilisez curl pour envoyer une demande à l'adresse IP externe de la passerelle en saisissant ce qui suit :

    curl -i http://$GATEWAY_IP/
    
  3. Confirmez que vous recevez une réponse 200 OK, ainsi qu'un corps JSON qui affiche les détails de la demande (en-têtes, hôte, etc.).

(Facultatif) Nettoyage

Vous pouvez éventuellement supprimer les ressources que vous avez créées dans cette rubrique en saisissant la commande suivante :

kubectl delete -f echo-route.yaml
kubectl delete -f echo-app.yaml
kubectl delete -f my-gateway.yaml
kubectl delete -f oci-gateway-class.yaml
kubectl delete -f oci-envoy-proxy.yaml
helm uninstall eg -n envoy-gateway-system

Si vous n'avez plus besoin de l'API Gateway sur ce cluster, vous pouvez enlever les CRD en saisissant ce qui suit :

kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml