Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Expor serviços usando Gateway com Inference Extension

Última atualização: Jul 04, 2026

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

Preparativos

  1. Crie duas aplicações: backend e backend-2.

    Nota

    Após criar a aplicação backend, modifique seu arquivo YAML substituindo por backend-2 e 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
  2. Crie uma GatewayClass e defina controllerName como gateway.envoyproxy.io/gatewayclass-controller.

    apiVersion: gateway.networking.k8s.io/v1
    kind: GatewayClass
    metadata:
      name: eg
    spec:
      controllerName: gateway.envoyproxy.io/gatewayclass-controller
  3. Crie um Gateway.

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: eg
    spec:
      gatewayClassName: eg
      listeners:
        - name: http
          protocol: HTTP
          port: 80

    Ao 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.

  4. 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.

  1. 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
  2. Acesse a aplicação.

    curl -H "Host: www.example.com" http://$GATEWAY_HOST/get

    Saí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.

  1. 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"
  2. Acesse a aplicação.

    curl -H "Host: www.example.com" http://$GATEWAY_HOST/get

    Saí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.

Nota

A soma dos pesos especificados no parâmetro backendRefs não precisa ser 100. A proporção de tráfego roteado para um Service =. Todas as requisições são distribuídas aos Services conforme suas proporções de tráfego.

  1. 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
  2. Acesse a aplicação 20 vezes e verifique a proporção real de tráfego entre os dois Services.

    Nota

    O comando a seguir exibe apenas backend e backend-2 na 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
     backend

    A 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.

  1. 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
  2. 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
      '
  3. Verifique se a modificação foi bem-sucedida.

    kubectl get gateway/eg -o yaml | grep spec: -A 20

    Saí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.

  4. 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/get

    Saí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"
    }