Comparando as APIs Kubernetes Gateway e Ingress
October 21, 2022
Há alguns meses, a nova API de Gateway do Kubernetes atingiu o status beta.
Por que você precisaria de outra API para lidar com tráfego externo quando já existe a estável API de Ingress do Kubernetes e dezenas de implementações? Quais problemas da API de Ingress a nova API de Gateway resolve? Isso significa o fim da API de Ingress?
Vou tentar responder a essas perguntas neste artigo, explorando essas APIs e observando como elas evoluíram.
Padronizando o Acesso Externo a Serviços: A API de Ingress
A API de Ingress do Kubernetes foi criada para padronizar a exposição de serviços no Kubernetes ao tráfego externo. A API de Ingress superou as limitações dos tipos de serviço padrão, NodePort
e LoadBalancer
, ao introduzir recursos como roteamento e terminação SSL.
Existem mais de 20 implementações de controladores de Ingress disponíveis. Neste artigo, vou usar o Apache APISIX e seu controlador de Ingress para exemplos.
Você pode criar um recurso de Ingress para configurar o APISIX ou qualquer outra implementação de Ingress.
O exemplo abaixo mostra como você pode rotear o tráfego entre duas versões de uma aplicação com o Ingress do APISIX:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-routes
spec:
ingressClassName: apisix
rules:
- host: local.navendu.me
http:
paths:
- backend:
service:
name: bare-minimum-api-v1
port:
number: 8080
path: /v1
pathType: Prefix
- backend:
service:
name: bare-minimum-api-v2
port:
number: 8081
path: /v2
pathType: Prefix
Dica: Você pode conferir este tutorial prático para aprender mais sobre como configurar o Ingress no Kubernetes com o controlador de Ingress do Apache APISIX.
Como a API de Ingress não está vinculada a nenhuma implementação específica de controlador, você pode substituir o APISIX por qualquer outro controlador de Ingress, e ele funcionará de forma semelhante.
Isso é suficiente para roteamento simples. Mas a API é limitada, e se você quiser usar todos os recursos fornecidos pelo seu controlador de Ingress, você fica preso às anotações.
Por exemplo, a API de Ingress do Kubernetes não fornece um esquema para configurar reescritas. Reescritas são úteis quando a URL do seu upstream/backend difere do caminho configurado na sua regra de Ingress.
O APISIX suporta esse recurso, e você precisa usar anotações personalizadas para aproveitá-lo:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-routes
annotations:
k8s.apisix.apache.org/rewrite-target-regex: "/app/(.*)"
k8s.apisix.apache.org/rewrite-target-regex-template: "/$1"
spec:
ingressClassName: apisix
rules:
- host: local.navendu.me
http:
paths:
- backend:
service:
name: bare-minimum-api
port:
number: 8080
path: /app
pathType: Prefix
Isso cria um recurso de Ingress que configura o APISIX para rotear qualquer solicitação com o prefixo /app
para o backend com o prefixo removido. Por exemplo, uma solicitação para /app/version
será encaminhada para /version
.
As anotações são específicas para a sua escolha de controlador de Ingress. Essas extensões "proprietárias" limitaram o escopo de portabilidade inicialmente pretendido com a API de Ingress.
CRDs Personalizados > API de Ingress
Ficar preso a anotações também sacrifica a usabilidade dos controladores de Ingress.
Portanto, os controladores resolveram as limitações da API de Ingress criando seus próprios recursos personalizados. O exemplo abaixo mostra como configurar o Ingress para rotear o tráfego entre duas versões de uma aplicação usando o recurso personalizado do APISIX:
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: api-routes
spec:
http:
- name: route-1
match:
hosts:
- local.navendu.me
paths:
- /v1
backends:
- serviceName: bare-minimum-api-v1
servicePort: 8080
- name: route-2
match:
hosts:
- local.navendu.me
paths:
- /v2
backends:
- serviceName: bare-minimum-api-v2
servicePort: 8081
Esses CRDs tornaram muito mais fácil configurar o Ingress, mas você fica vinculado à implementação específica do controlador de Ingress. Sem a evolução da API de Ingress, você tinha que escolher entre usabilidade ou portabilidade.
Extensão do Ingress e Evolução para a API de Gateway
A API de Ingress não estava quebrada; ela era limitada. A API de Gateway foi projetada para superar essas limitações.
(API de Gateway) visa evoluir o serviço de rede do Kubernetes por meio de interfaces expressivas, extensíveis e orientadas a papéis ...
Ela se inspira nos CRDs personalizados de diferentes controladores de Ingress mencionados anteriormente.
A API de Gateway adiciona muitos recursos "além" das capacidades da API de Ingress. Isso inclui correspondência baseada em cabeçalhos HTTP, divisão de tráfego ponderada e outros recursos que exigem anotações proprietárias personalizadas com a API de Ingress.
Divisão de tráfego com o recurso de Ingress do APISIX (veja referência ApisixRoute/v2):
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: traffic-split
spec:
http:
- name: rule-1
match:
hosts:
- local.navendu.me
paths:
- /get*
backends:
- serviceName: bare-minimum-api-v1
servicePort: 8080
weight: 90
- serviceName: bare-minimum-api-v2
servicePort: 8081
weight: 10
Divisão de tráfego com a API de Gateway (veja Canary traffic rollout):
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: HTTPRoute
metadata:
name: traffic-split
spec:
hostnames:
- local.navendu.me
rules:
- backendRefs:
- name: bare-minimum-api-v1
port: 8080
weight: 90
- name: bare-minimum-api-v2
port: 8081
weight: 10
Outra melhoria em relação à API de Ingress é como a API de Gateway separa as responsabilidades. Com o Ingress, o desenvolvedor da aplicação e o operador do cluster trabalham no mesmo objeto Ingress, sem estar cientes das responsabilidades do outro, o que abre espaço para más configurações.
A API de Gateway separa as configurações em objetos Route e Gateway, proporcionando autonomia para o desenvolvedor da aplicação e o operador do cluster. O diagrama abaixo explica isso claramente:
Isso Significa o Fim da API de Ingress?
A API de Gateway é relativamente nova, e suas implementações estão constantemente mudando. Por outro lado, a API de Ingress está em uma versão estável e já passou pelo teste do tempo.
Se o seu caso de uso envolve apenas roteamento simples e se você está disposto a usar anotações personalizadas para obter recursos extras, a API de Ingress ainda é uma escolha sólida.
Como a API de Gateway é um superconjunto da API de Ingress, pode fazer sentido consolidar ambas. Graças à comunidade SIG Network, a API de Gateway ainda está crescendo e em breve estará pronta para produção.
A maioria dos controladores de Ingress e malhas de serviço já implementaram a API de Gateway junto com a API de Ingress, e, à medida que o projeto evolui, mais implementações surgirão.
Pessoalmente, pelo menos por enquanto, eu ficaria com os CRDs personalizados fornecidos pelos controladores de Ingress, como o Apache APISIX, em vez da API de Ingress ou Gateway.