Trabajar con el gateway de Envoy para implantar la API de gateway de Kubernetes

Descubra cómo configurar el gateway de Envoy para soportar la API de gateway de Kubernetes en los clusters que cree mediante Kubernetes Engine (OKE).

La API de gateway de Kubernetes (API de gateway) es el estándar de última generación para gestionar el tráfico de entrada y de red en los clusters de Kubernetes, lo que sucede con la API de entrada. Para obtener más información sobre la API de gateway, consulte la API de gateway en la documentación de Kubernetes y la documentación de API de gateway.

Envoy Gateway es una implementación de código abierto de la API de Gateway que gestiona el proxy de Envoy como el plano de datos. Proporciona una forma estándar y compatible de gestionar el tráfico de entrada sin depender de CRD específicos del proveedor.

Al desplegar el gateway de Envoy, puede utilizarlo como controlador subyacente para gestionar Gateway, HTTPRoute y otros recursos de API de gateway.

El despliegue del gateway de Envoy incluye varios componentes que funcionan conjuntamente:

  • Las CRD de API de gateway amplían la API de Kubernetes con nuevos tipos de recursos, como Gateway y HTTPRoute, lo que permite la gestión declarativa del tráfico de entrada.
  • El controlador de gateway de Envoy actúa como plano de control, vigilando los recursos de API de gateway y traduciéndolos en una configuración detallada para el plano de datos.
  • Los pods de proxy de Envoy forman el plano de datos y gestionan el tráfico de red de acuerdo con las políticas y las rutas definidas por los recursos de gateway.
  • La integración del equilibrador de carga de red de OCI garantiza que el tráfico externo se enrute correctamente a las aplicaciones mediante nodos de proxy de Envoy.

Requisitos

Antes de configurar el gateway de Envoy para soportar la API de gateway de Kubernetes:

  • Debe tener acceso kubectl al cluster creado por Kubernetes Engine.
  • La máquina desde la que accede al cluster debe tener instalada la CLI de Helm (v3.0 o posterior).
  • Debe tener privilegios de administrador de cluster para instalar definiciones de recursos (CRD) y controladores personalizados.

Configuración de Envoy Gateway como controlador de API de Gateway

Pasos de alto nivel para configurar el gateway de Envoy

En un nivel superior, los pasos para configurar el gateway de Envoy para que funcione como controlador de API de gateway son los siguientes:

Paso 1: Instalación de CRD de API de Gateway

Las definiciones de recursos personalizados (CRD) de API de gateway no están instaladas por defecto en los clusters que cree mediante Kubernetes Engine. Antes de utilizar Envoy Gateway como controlador de API de Gateway, debe instalar las CRD.

  1. Instale las CRD de canal estándar (v1.2.0) introduciendo:

    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
    
  2. Verifique que la CRD esté instalada escribiendo:

    kubectl get crd gateways.gateway.networking.k8s.io
    
  3. Confirme que la CRD se muestre en la salida.

Paso 2: Instalación del gateway de Envoy

Utilice Helm para instalar el controlador de puerta de enlace de Envoy.

  1. Instale el gráfico en el espacio de nombres envoy-gateway-system introduciendo:

    helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.6.3 -n envoy-gateway-system --create-namespace
    
  2. Espere a que el controlador de gateway de Envoy esté listo introduciendo:

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

Paso 3: Configurar la integración del equilibrador de carga de red de OCI

Cree un recurso personalizado EnvoyProxy para inyectar las anotaciones de OCI necesarias en Service que crea el gateway de Envoy.

  1. Cree un archivo denominado oci-envoy-proxy.yaml con el siguiente contenido:

    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. Cree el recurso personalizado EnvoyProxy introduciendo:

    kubectl apply -f oci-envoy-proxy.yaml
    

Paso 4: Crear un GatewayClass

Cree un GatewayClass que indique al controlador que utilice el EnvoyProxy que ha creado.

  1. Cree un archivo denominado oci-gateway-class.yaml con el siguiente contenido:

    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. Cree GatewayClass introduciendo:

    kubectl apply -f oci-gateway-class.yaml
    

Paso 5: Crear una puerta de enlace

Cree el recurso Gateway, que dispara la creación del equilibrador de carga de red de OCI.

  1. Cree un archivo denominado my-gateway.yaml con el siguiente contenido:

    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. Cree Gateway introduciendo:

    kubectl apply -f my-gateway.yaml
    
  3. Para obtener la dirección IP externa, introduzca:

    kubectl get gateway my-envoy-gateway -n default
    

    OCI puede tardar unos minutos en aprovisionar el equilibrador de carga.

    Espere hasta que la columna PROGRAMMED contenga True y aparezca una dirección IP en la columna ADDRESS.

Paso 6: Desplegar una aplicación de muestra

Pruebe el gateway mediante el despliegue de un servicio de eco simple.

  1. Cree un archivo denominado echo-app.yaml con el siguiente contenido:

    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. Cree la aplicación de ejemplo introduciendo:

    kubectl apply -f echo-app.yaml
    

Paso 7: Crear un HTTPRoute

Cree un HTTPRoute para dirigir el tráfico de Gateway a la aplicación.

  1. Cree un archivo denominado echo-route.yaml con el siguiente contenido:

    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. Cree HTTPRoute introduciendo:

    kubectl apply -f echo-route.yaml
    

Paso 8: Verificar la conectividad

Verifique la conectividad enviando una solicitud a la dirección IP externa de Gateway.

  1. Recupere la dirección IP pública del gateway y guárdela como una variable de entorno introduciendo:

    export GATEWAY_IP=$(kubectl get gateway my-envoy-gateway -o jsonpath='{.status.addresses[0].value}')
  2. Utilice curl para enviar una solicitud a la dirección IP externa del gateway introduciendo:

    curl -i http://$GATEWAY_IP/
    
  3. Confirme que recibe una respuesta 200 OK, junto con un cuerpo JSON que muestra detalles sobre la solicitud (cabeceras, host, etc.).

(Opcional) Limpieza

Si lo desea, puede eliminar los recursos que ha creado en este tema introduciendo:

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 ya no necesita la API de Gateway en este cluster, puede eliminar las CRD introduciendo:

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