A Gateway API é um projeto Kubernetes open-source mantido pela comunidade SIG-NETWORK. Ela oferece interfaces expressivas, extensíveis e orientadas a funções para redes de serviços. O Service Mesh (ASM) oferece suporte à Gateway API, permitindo definir regras de roteamento para expor aplicações por meio de um gateway de entrada.
Este tópico descreve como configurar regras de roteamento HTTP e HTTPS para expor a aplicação httpbin em um gateway de entrada do ASM.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster Container Service for Kubernetes (ACK) adicionado a uma instância do ASM versão 1,18 ou posterior. Para mais informações, consulte Adicionar um cluster a uma instância do ASM.
Um gateway de entrada com as portas 80 e 443 habilitadas. Para mais informações, consulte Criar um gateway de entrada.
A aplicação httpbin implantada. Para mais informações, consulte a Etapa 1 em Implantar a aplicação httpbin.
Compatibilidade de versões
|
Versão do ASM |
Versão da Gateway API |
Suporte adicional |
|
v1.18 |
v0.6.0 |
- |
|
v1.22 e posteriores |
v1.1 |
GRPCRoute |
|
v1.24 e posteriores |
v1.2.0 |
- |
No modo multi-cluster, se dois clusters de plano de dados contiverem recursos Gateway com o mesmo nome no mesmo namespace, o recurso aplicado posteriormente substituirá o anterior.
Etapa 1: Verificar os CRDs da Gateway API no cluster ACK
Clusters ACK da versão 1,24 e posteriores incluem automaticamente as CustomResourceDefinitions (CRDs) da Gateway API. Execute o comando abaixo para verificar se as CRDs existem:
kubectl get crds | grep gateway.networking.k8s.io
Se as CRDs existirem, a saída será semelhante a:
gatewayclasses.gateway.networking.k8s.io 2023-05-10T02:51:33Z
gateways.gateway.networking.k8s.io 2023-05-10T02:51:33Z
httproutes.gateway.networking.k8s.io 2023-05-10T02:51:33Z
referencegrants.gateway.networking.k8s.io 2023-05-10T02:51:33Z
Para verificar as versões das CRDs:
kubectl get crds -o yaml | grep 'gateway.networking.k8s.io/bundle-version'
Saída esperada:
gateway.networking.k8s.io/bundle-version: v0.6.0
gateway.networking.k8s.io/bundle-version: v0.6.0
gateway.networking.k8s.io/bundle-version: v0.6.0
gateway.networking.k8s.io/bundle-version: v0.6.0
Caso a saída não inclua as CRDs da Gateway API, faça login no console do ACK e instale o componente da Gateway API na página Add-ons. Para mais informações, consulte Gerenciar componentes.
Etapa 2: Habilitar a Gateway API para a instância do ASM
Conecte-se à instância do ASM com kubectl usando o arquivo kubeconfig. Defina enableGatewayAPI como true no recurso ASMMeshConfig chamado default:
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMeshConfig
metadata:
name: default
spec:
enableGatewayAPI: true
Após ativar essa configuração, o plano de controle gera as CRDs da Gateway API.
Tanto a Gateway API quanto o Istio definem um recurso chamado "gateway". Isso pode causar conflitos ao consultar com kubectl. Usekubectl get gtwpara o recurso de gateway da Gateway API ekubectl get gwpara o recurso de gateway do Istio.
Etapa 3: Configurar uma regra de roteamento HTTP
Para expor a aplicação httpbin via HTTP, crie um Gateway e uma HTTPRoute no cluster ACK.
Criar o Gateway
-
Crie um arquivo chamado
gateway.yamlcom o seguinte conteúdo. Substitua o placeholder abaixo pelo valor real. Este Gateway se vincula ao gateway de entrada especificado e escuta na porta 80 (HTTP) hosts correspondentes a*.aliyun.com. Rotas de todos os namespaces são permitidas.Para corresponder a todos os hosts, deixe o campo
hostnameem branco. Não há suporte para definir esse campo como*.Placeholder
Descrição
<ingress-gateway-name>Nome do gateway de entrada implantado
apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: name: gateway namespace: istio-system spec: addresses: - type: Hostname value: istio-<ingress-gateway-name>.istio-system.svc.cluster.local gatewayClassName: istio listeners: - allowedRoutes: namespaces: from: All hostname: '*.aliyun.com' name: default port: 80 protocol: HTTP -
Aplique o Gateway:
kubectl apply -f gateway.yaml
Criar a HTTPRoute
-
Crie um arquivo chamado
http-route.yamlcom o seguinte conteúdo. Esta HTTPRoute se anexa aogatewayno namespaceistio-system. Como nenhum nome de listener específico foi definido, ela utiliza todos os listeners do Gateway. Requisições com o prefixo de caminho/getsão roteadas para a porta 8000 do serviço httpbin.Por padrão, apenas serviços no mesmo namespace da HTTPRoute podem ser referenciados em
backendRefs. Para referenciar serviços em outros namespaces, configure um ReferenceGrant .apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: http namespace: default spec: parentRefs: - name: gateway namespace: istio-system hostnames: ["*.aliyun.com"] rules: - matches: - path: type: PathPrefix value: /get backendRefs: - name: httpbin port: 8000 -
Aplique a HTTPRoute:
kubectl apply -f http-route.yaml
Verificar a regra de roteamento HTTP
Execute o comando a seguir para enviar uma requisição pelo gateway de entrada:
curl -I -HHost:httpbin.aliyun.com "http://<ingress-gateway-ip>:80/get"
Substitua <ingress-gateway-ip> pelo endereço IP do seu gateway de entrada.
Se a regra de roteamento estiver funcionando, a saída será semelhante a:
HTTP/1.1 200 OK
server: istio-envoy
date: Fri, 12 May 2023 08:16:30 GMT
content-type: application/json
content-length: 516
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 4
Uma resposta 200 OK confirma que a regra de roteamento HTTP está ativa.
Etapa 4: Configurar uma regra de roteamento HTTPS
Para expor a aplicação httpbin via HTTPS com terminação TLS no gateway de entrada, crie um certificado TLS, um Gateway e uma HTTPRoute.
Preparar um certificado TLS
Use o recurso de gerenciamento de certificados do ASM para criar um certificado para o host a.aliyun.com. Defina o nome do certificado como myexample-credential. Para mais informações, consulte Preparar certificados de servidor e chaves privadas.
Criar o Gateway HTTPS
-
Crie um arquivo chamado
gateway-https.yamlcom o seguinte conteúdo. Substitua o placeholder abaixo pelo valor real. Este Gateway escuta na porta 443 (HTTPS) hosts correspondentes a*.aliyun.come termina o TLS usando o certificadomyexample-credential.Placeholder
Descrição
<ingress-gateway-name>Nome do gateway de entrada implantado
apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: name: gateway-https namespace: istio-system spec: addresses: - type: Hostname value: istio-<ingress-gateway-name>.istio-system.svc.cluster.local gatewayClassName: istio listeners: - name: https hostname: "*.aliyun.com" port: 443 protocol: HTTPS tls: mode: Terminate certificateRefs: - name: myexample-credential allowedRoutes: namespaces: from: All -
Aplique o Gateway:
kubectl apply -f gateway-https.yaml
Criar a HTTPRoute HTTPS
-
Crie um arquivo chamado
httpbin-https.yamlcom o seguinte conteúdo. Esta HTTPRoute roteia requisições com caminhos prefixados por/statusou/delaypara a porta 8000 do serviço httpbin.apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: httpbin-https namespace: default spec: parentRefs: - name: gateway-https namespace: istio-system hostnames: ["*.aliyun.com"] rules: - matches: - path: type: PathPrefix value: /status - path: type: PathPrefix value: /delay backendRefs: - name: httpbin port: 8000 -
Aplique a HTTPRoute:
kubectl apply -f httpbin-https.yaml
Verificar a regra de roteamento HTTPS
Execute o comando a seguir para enviar uma requisição pelo gateway de entrada via HTTPS:
curl -k -H Host:a.aliyun.com --resolve a.aliyun.com:443:<ingress-gateway-ip> https://a.aliyun.com/status/418
Substitua <ingress-gateway-ip> pelo endereço IP do gateway de entrada implantado.
Se a regra de roteamento estiver funcionando, a saída será:
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`
A resposta "teapot" confirma que a regra de roteamento HTTPS com terminação TLS está ativa.