Mit Envoy Gateway arbeiten, um Kubernetes-Gateway-API zu implementieren

Erfahren Sie, wie Sie Envoy Gateway so einrichten, dass die Kubernetes-Gateway-API in Clustern unterstützt wird, die Sie mit Kubernetes Engine (OKE) erstellen.

Die Kubernetes-Gateway-API (Gateway-API) ist der Standard der nächsten Generation für die Verwaltung von Ingress- und Netzwerktraffic in Kubernetes-Clustern nach der Ingress-API. Weitere Informationen zur Gateway-API finden Sie unter Gateway-API in der Kubernetes-Dokumentation und in der Dokumentation zur Gateway-API.

Envoy Gateway ist eine Open-Source-Implementierung der Gateway-API, die den Envoy-Proxy als Data Plane verwaltet. Es bietet eine standardmäßige, konforme Möglichkeit, Ingress-Traffic zu verwalten, ohne sich auf herstellerspezifische CRDs zu verlassen.

Durch das Deployment von Envoy Gateway können Sie es als zugrunde liegenden Controller zur Verwaltung von Gateway-, HTTPRoute- und anderen Gateway-API-Ressourcen verwenden.

Das Envoy Gateway-Deployment umfasst mehrere Komponenten, die zusammenarbeiten:

  • Gateway-API-CRDs erweitern die Kubernetes-API um neue Ressourcentypen wie Gateway und HTTPRoute, sodass der Ingress-Traffic deklarativ verwaltet werden kann.
  • Der Envoy Gateway-Controller fungiert als Control Plane, überwacht Gateway-API-Ressourcen und übersetzt diese in eine detaillierte Konfiguration für die Data Plane.
  • Envoy-Proxypods bilden die Data Plane und verarbeiten den Netzwerktraffic in Übereinstimmung mit den von Gatewayressourcen definierten Policys und Routen.
  • Durch die Integration von OCI Network Load Balancer wird sichergestellt, dass externer Traffic ordnungsgemäß über Envoy-Proxyknoten an Anwendungen weitergeleitet wird.

Voraussetzungen

Bevor Sie Envoy Gateway zur Unterstützung der Kubernetes-Gateway-API einrichten:

  • Sie benötigen kubectl-Zugriff auf das von Kubernetes Engine erstellte Cluster.
  • Auf dem Rechner, von dem aus Sie auf das Cluster zugreifen, muss Helm-CLI (v3.0 oder höher) installiert sein.
  • Sie benötigen cluster-admin-Berechtigungen, um benutzerdefinierte Ressourcendefinitionen (CRDs) und Controller zu installieren.

Envoy Gateway als Gateway-API-Controller einrichten

Allgemeine Schritte zum Einrichten von Envoy Gateway

Um Envoy Gateway als Gateway-API-Controller einzurichten, gehen Sie wie folgt vor:

Schritt 1: Gateway-API-CRDs installieren

Die benutzerdefinierten Ressourcendefinitionen (CRDs) der Gateway-API werden nicht standardmäßig in Clustern installiert, die Sie mit der Kubernetes Engine erstellen. Bevor Sie Envoy Gateway als Gateway-API-Controller verwenden, müssen Sie die CRDs installieren.

  1. Installieren Sie die Standardkanal-CRDs (v1.2.0), indem Sie Folgendes eingeben:

    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
    
  2. Prüfen Sie, ob die CRD installiert ist, indem Sie Folgendes eingeben:

    kubectl get crd gateways.gateway.networking.k8s.io
    
  3. Vergewissern Sie sich, dass die CRD in der Ausgabe aufgeführt ist.

Schritt 2: Envoy Gateway installieren

Verwenden Sie Helm, um den Envoy Gateway Controller zu installieren.

  1. Installieren Sie das Diagramm im Namespace envoy-gateway-system, indem Sie Folgendes eingeben:

    helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.6.3 -n envoy-gateway-system --create-namespace
    
  2. Warten Sie, bis der Envoy Gateway Controller bereit ist, indem Sie Folgendes eingeben:

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

Schritt 3: OCI Network Load Balancer-Integration konfigurieren

Erstellen Sie eine benutzerdefinierte EnvoyProxy-Ressource, um die erforderlichen OCI-Annotationen in die Service zu injizieren, die das Envoy-Gateway erstellt.

  1. Erstellen Sie eine Datei namens oci-envoy-proxy.yaml mit dem folgenden Inhalt:

    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. Erstellen Sie die benutzerdefinierte Ressource EnvoyProxy, indem Sie Folgendes eingeben:

    kubectl apply -f oci-envoy-proxy.yaml
    

Schritt 4: GatewayClass erstellen

Erstellen Sie eine GatewayClass, die den Controller anweist, die von Ihnen erstellte EnvoyProxy zu verwenden.

  1. Erstellen Sie eine Datei namens oci-gateway-class.yaml mit dem folgenden Inhalt:

    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. Erstellen Sie GatewayClass, indem Sie Folgendes eingeben:

    kubectl apply -f oci-gateway-class.yaml
    

5. Schritt: Gateway erstellen

Erstellen Sie die Ressource Gateway, die das Erstellen des OCI Network Load Balancers auslöst.

  1. Erstellen Sie eine Datei namens my-gateway.yaml mit dem folgenden Inhalt:

    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. Erstellen Sie die Gateway, indem Sie Folgendes eingeben:

    kubectl apply -f my-gateway.yaml
    
  3. Rufen Sie die externe IP-Adresse ab, indem Sie Folgendes eingeben:

    kubectl get gateway my-envoy-gateway -n default
    

    Es kann einige Minuten dauern, bis OCI den Load Balancer bereitstellt.

    Warten Sie, bis die Spalte PROGRAMMED True enthält und eine IP-Adresse in der Spalte ADDRESS angezeigt wird.

Schritt 6: Beispielanwendung bereitstellen

Testen Sie das Gateway, indem Sie einen einfachen Echoservice bereitstellen.

  1. Erstellen Sie eine Datei namens echo-app.yaml mit dem folgenden Inhalt:

    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. Erstellen Sie die Beispielanwendung, indem Sie Folgendes eingeben:

    kubectl apply -f echo-app.yaml
    

Schritt 7: HTTPRoute erstellen

Erstellen Sie eine HTTPRoute, um Traffic von der Gateway zur Anwendung zu leiten.

  1. Erstellen Sie eine Datei namens echo-route.yaml mit dem folgenden Inhalt:

    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. Erstellen Sie HTTPRoute, indem Sie Folgendes eingeben:

    kubectl apply -f echo-route.yaml
    

Schritt 8: Konnektivität prüfen

Prüfen Sie die Konnektivität, indem Sie eine Anforderung an die externe IP-Adresse der Gateway senden.

  1. Rufen Sie die öffentliche IP-Adresse des Gateways ab, und speichern Sie sie als Umgebungsvariable, indem Sie Folgendes eingeben:

    export GATEWAY_IP=$(kubectl get gateway my-envoy-gateway -o jsonpath='{.status.addresses[0].value}')
  2. Verwenden Sie curl, um eine Anforderung an die externe IP-Adresse des Gateways zu senden, indem Sie Folgendes eingeben:

    curl -i http://$GATEWAY_IP/
    
  3. Bestätigen Sie, dass Sie eine 200 OK-Antwort sowie einen JSON-Body erhalten, der Details zur Anforderung (Header, Host usw.) anzeigt.

(Optional) Bereinigen

Sie können optional die Ressourcen entfernen, die Sie in diesem Thema erstellt haben, indem Sie Folgendes eingeben:

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

Wenn Sie die Gateway-API in diesem Cluster nicht mehr benötigen, können Sie die CRDs entfernen, indem Sie Folgendes eingeben:

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