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
GatewayeHTTPRoute, 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
kubectlao 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.
-
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 -
Verifique se o CRD está instalado digitando:
kubectl get crd gateways.gateway.networking.k8s.io - 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.
-
Instale o gráfico no namespace
envoy-gateway-systemdigitando:helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.6.3 -n envoy-gateway-system --create-namespace -
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.
-
Crie um arquivo chamado
oci-envoy-proxy.yamlcom 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" -
Crie o recurso personalizado
EnvoyProxydigitando:kubectl apply -f oci-envoy-proxy.yaml
Etapa 4: Criar um GatewayClass
Crie uma GatewayClass que instrua o controlador a usar a EnvoyProxy criada.
-
Crie um arquivo chamado
oci-gateway-class.yamlcom 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 -
Crie o
GatewayClassdigitando: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.
-
Crie um arquivo chamado
my-gateway.yamlcom 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 -
Crie a
Gatewaydigitando:kubectl apply -f my-gateway.yaml -
Obtenha o endereço IP externo digitando:
kubectl get gateway my-envoy-gateway -n defaultO OCI pode levar alguns minutos para provisionar o balanceador de carga.
Aguarde até que a coluna
PROGRAMMEDcontenhaTruee um endereço IP seja exibido na colunaADDRESS.
Etapa 6: Implantar um aplicativo de amostra
Teste o gateway implantando um serviço de eco simples.
-
Crie um arquivo chamado
echo-app.yamlcom 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 -
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.
-
Crie um arquivo chamado
echo-route.yamlcom 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 -
Crie o
HTTPRoutedigitando:kubectl apply -f echo-route.yaml
Etapa 8: Verificar conectividade
Verifique a conectividade enviando uma solicitação ao endereço IP externo do Gateway.
-
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}') -
Use
curlpara enviar uma solicitação ao endereço IP externo do Gateway digitando:curl -i http://$GATEWAY_IP/ - 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