A Gateway API é um projeto oficial do Kubernetes que define APIs de próxima geração para Ingress e balanceamento de carga. Use a Gateway API para configurar regras de roteamento de tráfego. Este tópico descreve como usar o Gateway com Inference Extension para configurar os recursos básicos da Gateway API.
Informações básicas
O Gateway com Inference Extension foi desenvolvido com base no projeto Envoy Gateway. Ele oferece todos os recursos básicos da Gateway API e extensões open source do Envoy Gateway.
A arquitetura do Envoy Gateway inclui os seguintes componentes:
Plano de controle: formado pelos componentes do Envoy Gateway. Monitora as regras de roteamento de tráfego do cluster, além de criar e gerenciar dinamicamente as instâncias de proxy do Envoy. O plano de controle atualiza as regras de encaminhamento de tráfego das instâncias de proxy do Envoy, mas não encaminha o tráfego diretamente.
Plano de dados: composto por instâncias de proxy do Envoy em execução. Processa e encaminha o tráfego de forma eficiente e confiável.
Pré-requisitos
Crie um cluster gerenciado do Container Service for Kubernetes (ACK) executando Kubernetes 1.30 ou posterior. Para mais informações sobre como atualizar um cluster, consulte Atualizar manualmente um cluster.
Crie um cluster do Container Compute Service (ACS) executando Kubernetes 1.30 ou posterior.
Instale o Gateway com Inference ExtensionGateway com Inference Extension no cluster.
Preparativos
-
Crie duas aplicações:
backendebackend-2.NotaApós criar a aplicação backend, modifique seu arquivo YAML substituindo
porbackend-2e utilize o arquivo YAML modificado para criar a aplicação backend-2.apiVersion: v1 kind: ServiceAccount metadata: name: backend --- apiVersion: v1 kind: Service metadata: name: backend labels: app: backend service: backend spec: ports: - name: http port: 3000 targetPort: 3000 selector: app: backend --- apiVersion: apps/v1 kind: Deployment metadata: name: backend spec: replicas: 1 selector: matchLabels: app: backend version: v1 template: metadata: labels: app: backend version: v1 spec: serviceAccountName: backend containers: - image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/envoygateway-echo-basic:v20231214-v1.0.0-140-gf544a46e imagePullPolicy: IfNotPresent name: backend ports: - containerPort: 3000 env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace -
Crie uma GatewayClass e defina
controllerNamecomogateway.envoyproxy.io/gatewayclass-controller.apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: name: eg spec: controllerName: gateway.envoyproxy.io/gatewayclass-controller -
Crie um Gateway.
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: eg spec: gatewayClassName: eg listeners: - name: http protocol: HTTP port: 80Ao criar um Gateway, o plano de controle do Gateway com Inference Extension usa automaticamente as configurações do Gateway para criar um Deployment do EnvoyProxy e um Service de LoadBalancing correspondente, que escuta na porta especificada. Para mais informações sobre as regras de faturamento de instâncias do Server Load Balancer (SLB), consulte Faturamento do SLB.
Personalize as configurações do Deployment do EnvoyProxy e ajuste os parâmetros do Service. Também é possível ativar o dimensionamento automático horizontal de pods para o gateway.
-
Obtenha o endereço IP do gateway.
export GATEWAY_HOST=$(kubectl get gateway/eg -o jsonpath='{.status.addresses[0].value}')
Configurar roteamento HTTP com base em correspondência de prefixo de caminho
O arquivo YAML de exemplo abaixo cria uma HTTPRoute que corresponde ao prefixo /get.
-
Crie uma HTTPRoute.
apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: backend spec: parentRefs: - name: eg hostnames: - "www.example.com" rules: - backendRefs: - group: "" kind: Service name: backend port: 3000 weight: 1 matches: - path: type: PathPrefix value: /get -
Acesse a aplicação.
curl -H "Host: www.example.com" http://$GATEWAY_HOST/getSaída esperada:
{ "path": "/get", "host": "www.example.com", "method": "GET", "proto": "HTTP/1.1", "headers": { "Accept": [ "*/*" ], "User-Agent": [ "curl/8.9.1" ], "X-Envoy-External-Address": [ "115.XX.XXX.55" ], "X-Forwarded-For": [ "115.XX.XXX.55" ], "X-Forwarded-Proto": [ "http" ], "X-Request-Id": [ "953b2f8f-26d3-4ba9-93ba-a482b197b1ff" ] }, "namespace": "default", "ingress": "", "service": "", "pod": "backend-5bff7XXXXX-XXXXX" }
Adicionar um cabeçalho de requisição
Atualize a HTTPRoute adicionando um cabeçalho à requisição.
-
Atualize a HTTPRoute.
apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: backend spec: parentRefs: - name: eg hostnames: - "www.example.com" rules: - matches: - path: type: PathPrefix value: /get backendRefs: - group: "" kind: Service name: backend port: 3000 weight: 1 filters: - type: RequestHeaderModifier requestHeaderModifier: add: - name: "added-header" value: "foo" -
Acesse a aplicação.
curl -H "Host: www.example.com" http://$GATEWAY_HOST/getSaída esperada:
{ "path": "/get", "host": "www.example.com", "method": "GET", "proto": "HTTP/1.1", "headers": { "Accept": [ "*/*" ], "Added-Header": [ "foo" ], "User-Agent": [ "curl/8.9.1" ], "X-Envoy-External-Address": [ "115.XX.XXX.55" ], "X-Forwarded-For": [ "115.XX.XXX.55" ], "X-Forwarded-Proto": [ "http" ], "X-Request-Id": [ "d37f19e5-25c1-45cf-90e5-51453e7ae3ed" ] }, "namespace": "default", "ingress": "", "service": "", "pod": "backend-5bff7XXXXX-XXXXX" }%A aplicação retorna o conteúdo da requisição. Se o cabeçalho de requisição aparecer na saída, a adição foi bem-sucedida.
Configurar divisão proporcional de tráfego
Atualize a HTTPRoute seguindo o modelo YAML abaixo. Neste modelo, são adicionadas regras de roteamento para o Service backend-2 e definidos pesos de tráfego para os Services backend e backend-2.
A soma dos pesos especificados no parâmetro backendRefs não precisa ser 100. A proporção de tráfego roteado para um Service =
-
Atualize a HTTPRoute.
apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: backend spec: parentRefs: - name: eg hostnames: - "www.example.com" rules: - matches: - path: type: PathPrefix value: /get backendRefs: - group: "" kind: Service name: backend port: 3000 weight: 8 - group: "" kind: Service name: backend-2 port: 3000 weight: 2 -
Acesse a aplicação 20 vezes e verifique a proporção real de tráfego entre os dois Services.
NotaO comando a seguir exibe apenas
backendebackend-2na saída.for i in $(seq 1 20); do curl -sS -H "Host: www.example.com" http://$GATEWAY_HOST/get |grep backend; done | \ sed -E 's/".*"(backend(-2)?)-[0-9a-zA-Z]*-.*/\1/'Saída esperada:
backend-2 backend backend backend backend backend backend backend backend backend backend backend-2 backend-2 backend backend backend-2 backend backend backend backendA saída indica que cerca de 80% das requisições foram encaminhadas ao Service backend, enquanto os 20% restantes foram direcionados ao Service backend-2.
Processar tráfego TLS
Atualize o Gateway adicionando um certificado e um listener TLS.
-
Gere um certificado e use-o para criar um Secret.
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=example Inc./CN=example.com' -keyout example.com.key -out example.com.crt openssl req -out www.example.com.csr -newkey rsa:2048 -nodes -keyout www.example.com.key -subj "/CN=www.example.com/O=example organization" openssl x509 -req -days 365 -CA example.com.crt -CAkey example.com.key -set_serial 0 -in www.example.com.csr -out www.example.com.crt kubectl create secret tls example-cert --key=www.example.com.key --cert=www.example.com.crt -
Adicione um listener TLS e o certificado criado na etapa anterior.
kubectl patch gateway eg --type=json --patch ' - op: add path: /spec/listeners/- value: name: https protocol: HTTPS port: 443 tls: mode: Terminate certificateRefs: - kind: Secret group: "" name: example-cert ' -
Verifique se a modificação foi bem-sucedida.
kubectl get gateway/eg -o yaml | grep spec: -A 20Saída esperada:
spec: gatewayClassName: eg listeners: - allowedRoutes: namespaces: from: Same name: http port: 80 protocol: HTTP - allowedRoutes: namespaces: from: Same name: https port: 443 protocol: HTTPS tls: certificateRefs: - group: "" kind: Secret name: example-cert mode: Terminate status:A saída confirma que a modificação foi bem-sucedida.
-
Acesse a aplicação.
curl -H Host:www.example.com --resolve "www.example.com:443:${GATEWAY_HOST}" \ --cacert example.com.crt https://www.example.com/getSaída esperada:
{ "path": "/get", "host": "www.example.com", "method": "GET", "proto": "HTTP/1.1", "headers": { "Accept": [ "*/*" ], "User-Agent": [ "curl/8.9.1" ], "X-Envoy-External-Address": [ "115.XX.XXX.55" ], "X-Forwarded-For": [ "115.XX.XXX.55" ], "X-Forwarded-Proto": [ "https" ], "X-Request-Id": [ "ac539756-3826-474b-be2f-5e57fdd49dac" ] }, "namespace": "default", "ingress": "", "service": "", "pod": "backend-5bff7XXXXX-XXXXX" }