Utilizzo di Envoy Gateway per implementare l'API del gateway Kubernetes

Scopri come impostare il gateway Envoy per supportare l'API del gateway Kubernetes nei cluster creati utilizzando Kubernetes Engine (OKE).

L'API gateway Kubernetes (API gateway) è lo standard di nuova generazione per la gestione del traffico in entrata e di rete nei cluster Kubernetes, dopo l'API in entrata. Per ulteriori informazioni sull'API gateway, vedere l'API gateway nella documentazione di Kubernetes e la documentazione dell'API gateway.

Envoy Gateway è un'implementazione open source dell'API del gateway che gestisce il proxy Envoy come piano dati. Fornisce un modo standard e conforme per gestire il traffico in entrata senza fare affidamento su CRD specifici del fornitore.

Distribuendo Envoy Gateway, puoi utilizzarlo come controller di base per gestire Gateway, HTTPRoute e altre risorse API del gateway.

La distribuzione di Envoy Gateway include diversi componenti che funzionano insieme:

  • I CRD API gateway estendono l'API Kubernetes con nuovi tipi di risorse come Gateway e HTTPRoute, consentendo la gestione dichiarativa del traffico in entrata.
  • Il controller del gateway Envoy funge da piano di controllo, controllando le risorse API del gateway e convertendole in configurazione dettagliata per il piano dati.
  • I pod proxy Envoy formano il piano dati, gestendo il traffico di rete in conformità ai criteri e agli instradamenti definiti dalle risorse del gateway.
  • L'integrazione del load balancer di rete OCI garantisce che il traffico esterno venga instradato correttamente alle applicazioni tramite i nodi proxy Envoy.

Requisiti indispensabili

Prima di impostare il gateway Envoy per supportare l'API del gateway Kubernetes, effettuare le operazioni riportate di seguito.

  • È necessario disporre dell'accesso kubectl al cluster creato da Kubernetes Engine.
  • Per il computer dal quale si accede al cluster deve essere installata l'interfaccia CLI Helm (v3.0 o versioni successive).
  • Per installare le definizioni delle risorse personalizzate (CRD) e i controller, è necessario disporre dei privilegi cluster-admin.

Impostazione del gateway Envoy come controller API gateway

Passi di alto livello per impostare il gateway Envoy

Ad alto livello, i passi per impostare Envoy Gateway per fungere da controller API gateway sono i seguenti:

Passo 1: Installa CRD API Gateway

Le definizioni delle risorse personalizzate (CRD, Custom Resource Definitions) dell'API gateway non vengono installate per impostazione predefinita nei cluster creati mediante Kubernetes Engine. Prima di utilizzare Envoy Gateway come controller API Gateway, è necessario installare i CRD.

  1. Installare le CRD di canale standard (v1.2.0) immettendo:

    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
    
  2. Verificare che la CRD sia installata immettendo:

    kubectl get crd gateways.gateway.networking.k8s.io
    
  3. Confermare che il CRD è elencato nell'output.

Passo 2: installare Envoy Gateway

Utilizzare Helm per installare il controller Envoy Gateway.

  1. Installare il grafico nello spazio di nomi envoy-gateway-system immettendo:

    helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.6.3 -n envoy-gateway-system --create-namespace
    
  2. Attendere che il controller del gateway Envoy sia pronto immettendo:

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

Passo 3: configurare l'integrazione del load balancer di rete OCI

Creare una risorsa personalizzata EnvoyProxy per inserire le annotazioni OCI necessarie nel file Service creato da Envoy Gateway.

  1. Creare un file denominato oci-envoy-proxy.yaml con il seguente contenuto:

    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. Creare la risorsa personalizzata EnvoyProxy immettendo:

    kubectl apply -f oci-envoy-proxy.yaml
    

Passo 4: Creare un GatewayClass

Creare un file GatewayClass che indichi al controller di utilizzare il file EnvoyProxy creato.

  1. Creare un file denominato oci-gateway-class.yaml con il seguente contenuto:

    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. Creare GatewayClass immettendo:

    kubectl apply -f oci-gateway-class.yaml
    

Passo 5: creazione di un gateway

Creare la risorsa Gateway, che attiva la creazione del load balancer di rete OCI.

  1. Creare un file denominato my-gateway.yaml con il seguente contenuto:

    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. Creare il file Gateway immettendo:

    kubectl apply -f my-gateway.yaml
    
  3. Ottenere l'indirizzo IP esterno immettendo:

    kubectl get gateway my-envoy-gateway -n default
    

    Il provisioning del load balancer da parte di OCI potrebbe richiedere alcuni minuti.

    Attendere che la colonna PROGRAMMED contenga True e che nella colonna ADDRESS venga visualizzato un indirizzo IP.

Passo 6: distribuire un'applicazione campione

Eseguire il test del gateway distribuendo un semplice servizio di eco.

  1. Creare un file denominato echo-app.yaml con il seguente contenuto:

    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. Creare l'applicazione di esempio immettendo:

    kubectl apply -f echo-app.yaml
    

Passo 7: creare un HTTPRoute

Creare un valore HTTPRoute per indirizzare il traffico da Gateway all'applicazione.

  1. Creare un file denominato echo-route.yaml con il seguente contenuto:

    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. Creare HTTPRoute immettendo:

    kubectl apply -f echo-route.yaml
    

Passo 8: verificare la connettività

Verificare la connettività inviando una richiesta all'indirizzo IP esterno di Gateway.

  1. Recupera l'indirizzo IP pubblico del gateway e lo salva come variabile di ambiente immettendo:

    export GATEWAY_IP=$(kubectl get gateway my-envoy-gateway -o jsonpath='{.status.addresses[0].value}')
  2. Utilizzare curl per inviare una richiesta all'indirizzo IP esterno del gateway immettendo:

    curl -i http://$GATEWAY_IP/
    
  3. Confermare di ricevere una risposta 200 OK, insieme a un corpo JSON che mostra i dettagli della richiesta (intestazioni, host e così via).

(Facoltativo) Cleanup

Facoltativamente, è possibile rimuovere le risorse create in questo argomento immettendo:

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

Se non è più necessaria l'API del gateway in questo cluster, è possibile rimuovere i CRD immettendo:

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