Trabalhando com o Envoy Gateway para implementar a API do Kubernetes Gateway

Descubra como configurar o Envoy Gateway para suportar a API do Kubernetes Gateway em clusters que você cria usando o Kubernetes Engine (OKE).

A API do Gateway do Kubernetes (API do Gateway) é o padrão de última geração para gerenciar o tráfego de entrada e rede em clusters do Kubernetes, sucedendo à API de Entrada. Para obter mais informações sobre a API do Gateway, consulte API do Gateway na documentação do Kubernetes e a documentação da API do Gateway.

O Gateway Envoy é uma implementação de código aberto da API do Gateway que gerencia o Proxy Envoy como o plano de dados. Ele fornece uma maneira padrão e compatível de gerenciar o tráfego de entrada sem depender de CRDs específicos do fornecedor.

Ao implantar o Envoy Gateway, você pode usá-lo como controlador subjacente para gerenciar Gateway, HTTPRoute e outros recursos da API do Gateway.

A implantação do Envoy Gateway inclui vários componentes que funcionam juntos:

  • Os CRDs de API do Gateway estendem a API do Kubernetes com novos tipos de recursos, como Gateway e HTTPRoute, permitindo o gerenciamento declarativo do tráfego de entrada.
  • O controlador do Gateway Envoy atua como o plano de controle, procurando recursos da API do Gateway e traduzindo-os em uma configuração detalhada para o plano de dados.
  • Os pods Proxy Envoy formam o plano de dados, tratando o tráfego de rede de acordo com as políticas e rotas definidas pelos recursos do Gateway.
  • A integração do OCI Network Load Balancer garante que o tráfego externo seja roteado corretamente para aplicativos por meio dos nós do Proxy Envoy.

Pré-requisitos

Antes de configurar o Envoy Gateway para suportar a API do Kubernetes Gateway:

  • Você deve ter acesso kubectl ao cluster criado pelo Kubernetes Engine.
  • A máquina da qual você acessa o cluster deve ter a CLI do Helm (v3.0 ou posterior) instalada.
  • Você deve ter privilégios de administrador de cluster para instalar definições de recursos personalizados (CRDs) e controladores.

Configurando o Gateway Envoy como um Controlador de API do Gateway

Etapas de alto nível para configurar o Envoy Gateway

Em um nível superior, as etapas para configurar o Gateway Envoy para servir como controlador de API do Gateway são as seguintes:

Etapa 1: Instalar CRDs de API do Gateway

As Definições de Recursos Personalizados (CRDs) da API do Gateway não são instaladas por padrão nos clusters que você cria usando o Kubernetes Engine. Antes de usar o Envoy Gateway como controlador de API do Gateway, instale os CRDs.

  1. Instale os CRDs de canal padrão (v1.2.0) digitando:

    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
    
  2. Verifique se o CRD está instalado digitando:

    kubectl get crd gateways.gateway.networking.k8s.io
    
  3. Confirme se a CRD está listada na saída.

Etapa 2: Instalar o Gateway Envoy

Use o Helm para instalar o controlador do Gateway Envoy.

  1. Instale o gráfico no namespace envoy-gateway-system digitando:

    helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.6.3 -n envoy-gateway-system --create-namespace
    
  2. Aguarde até que o controlador do Gateway Envoy esteja pronto digitando:

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

Etapa 3: Configurar a integração do OCI Network Load Balancer

Crie um recurso personalizado EnvoyProxy para injetar as anotações necessárias do OCI no Service que o Envoy Gateway cria.

  1. Crie um arquivo chamado oci-envoy-proxy.yaml com o seguinte conteúdo:

    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. Crie o recurso personalizado EnvoyProxy digitando:

    kubectl apply -f oci-envoy-proxy.yaml
    

Etapa 4: Criar um GatewayClass

Crie uma GatewayClass que instrua o controlador a usar a EnvoyProxy criada.

  1. Crie um arquivo chamado oci-gateway-class.yaml com o seguinte conteúdo:

    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. Crie o GatewayClass digitando:

    kubectl apply -f oci-gateway-class.yaml
    

Etapa 5: Criar um Gateway

Crie o recurso Gateway, que aciona a criação do balanceador de carga de rede do OCI.

  1. Crie um arquivo chamado my-gateway.yaml com o seguinte conteúdo:

    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. Crie a Gateway digitando:

    kubectl apply -f my-gateway.yaml
    
  3. Obtenha o endereço IP externo digitando:

    kubectl get gateway my-envoy-gateway -n default
    

    O OCI pode levar alguns minutos para provisionar o balanceador de carga.

    Aguarde até que a coluna PROGRAMMED contenha True e um endereço IP seja exibido na coluna ADDRESS.

Etapa 6: Implantar um aplicativo de amostra

Teste o gateway implantando um serviço de eco simples.

  1. Crie um arquivo chamado echo-app.yaml com o seguinte conteúdo:

    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. Crie a amostra de aplicativo informando:

    kubectl apply -f echo-app.yaml
    

Etapa 7: Criar um HTTPRoute

Crie um HTTPRoute para direcionar o tráfego do Gateway para o aplicativo.

  1. Crie um arquivo chamado echo-route.yaml com o seguinte conteúdo:

    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. Crie o HTTPRoute digitando:

    kubectl apply -f echo-route.yaml
    

Etapa 8: Verificar conectividade

Verifique a conectividade enviando uma solicitação ao endereço IP externo do Gateway.

  1. Recupere o endereço IP público do gateway e salve-o como uma variável de ambiente digitando:

    export GATEWAY_IP=$(kubectl get gateway my-envoy-gateway -o jsonpath='{.status.addresses[0].value}')
  2. Use curl para enviar uma solicitação ao endereço IP externo do Gateway digitando:

    curl -i http://$GATEWAY_IP/
    
  3. Confirme se você recebe uma resposta 200 OK, junto com um corpo JSON que mostra detalhes sobre a solicitação (cabeçalhos, host etc.).

(Opcional) Limpar

Opcionalmente, você pode remover os recursos que criou neste tópico informando:

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 você não precisar mais da API do Gateway neste cluster, poderá remover os CRDs informando:

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