API7 Cloud integra-se com o Kubernetes Service Discovery

Yong Qian

February 24, 2023

Products

Economia de custos, adaptabilidade, escalabilidade, confiabilidade — a explosão das tecnologias de nuvem e de containerização trouxe muitas vantagens em relação à arquitetura monolítica tradicional. Essas vantagens fazem com que ela seja favorecida por muitos usuários empresariais.

O que vem junto é que a mudança na arquitetura também traz novos desafios. Por exemplo, tradicionalmente, a lista de IPs de encaminhamento upstream para proxy reverso costuma ser imutável e pode ser diretamente escrita no arquivo de configuração estático. Na era da nuvem e da containerização, a lista de IPs de cada serviço upstream está em constante mudança. A manutenção dos arquivos de configuração é um pesadelo se você continuar a usar arquivos de configuração estáticos. Como a atualização dos arquivos de configuração afeta diretamente o encaminhamento de tráfego, os usuários precisam introduzir software adicional para lidar com a atualização automática dos arquivos de configuração, aumentando significativamente a complexidade da arquitetura.

Para simplificar o processo, o API7 Cloud traz uma função de descoberta de serviços, que se conecta diretamente ao Kubernetes API Server para obter dados de Endpoints em tempo real, ajudando os usuários a fazer proxy de aplicativos implantados no cluster Kubernetes de forma conveniente.

Descoberta de Serviços no API7 Cloud

Descoberta de Serviços do API7 Cloud

Preparação

Primeiro, precisamos implantar uma instância do APISIX através do cloud-cli. Consulte a documentação do API7 Cloud: Implantando uma instância de gateway.

Neste exemplo, usaremos as diretrizes de implantação do Kubernetes fornecidas no documento para criar vários recursos no namespace apisix, que precisamos criar antecipadamente:

kubectl create namespace apisix
cloud-cli deploy kubernetes \
  --name my-apisix \
  --namespace apisix \
  --apisix-image apache/apisix:2.15.0-centos

Criar Service Account

Service Account é o recurso central para o Kubernetes implementar RBAC (Controle de acesso baseado em função). O API7 Cloud precisa ter as permissões list e watch do recurso Endpoints para obter a lista de instâncias do serviço upstream.

A configuração yaml correspondente é a seguinte:

# rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: apisix-k8s-sd-watcher
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: apisix-k8s-sd-watcher-binding
subjects:
  - kind: ServiceAccount
    name: apisix-k8s-sd-sa
    namespace: apisix
roleRef:
  kind: ClusterRole
  name: apisix-k8s-sd-watcher
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: apisix-k8s-sd-sa
  namespace: apisix

Crie o Service Account e obtenha um Token:

kubectl apply -f rbac.yaml
SECRET_NAME=`kubectl get sa -n apisix apisix-k8s-sd-sa -ojsonpath='{.secrets[0].name}'`
kubectl get secrets $SECRET_NAME -n apisix -ojsonpath='{.data.token}' | base64 -d

Criar Registro de Serviço no API7 Cloud

Vá para Control Plane -> Settings -> Service Registry, use o Token obtido na etapa anterior para criar um registro de serviço do tipo Kubernetes no API7 Cloud (note que o endereço do API Server precisa ser preenchido com base no seu caso de uso). Neste exemplo, o APISIX também está implantado no cluster Kubernetes de destino, então o endereço do servidor API que usamos é kubernetes.default.svc.cluster.local:

Criar Registro de Serviço no API7 Cloud

Implantar Serviços no Kubernetes

Para verificar a eficácia da descoberta de serviços do Kubernetes, implantamos três réplicas do serviço HTTPBin e criamos um Service correspondente.

kubectl create deployment httpbin --image=kennethreitz/httpbin:latest --replicas=3 -n apisix
kubectl create service clusterip httpbin --tcp=80:80 -n apisix

Serviço httpbin criado

Criar Aplicação e API no API7 Cloud

Após implantar o aplicativo de teste, vá para a página API Management -> Applications do API7 Cloud e clique no botão Create Application para criar uma nova aplicação. A configuração básica é a seguinte:

  • sd.httpbin.org como Host
  • / como Path prefix

A parte crítica é configurar o upstream para usar o Kubernetes e o registro que acabamos de criar para descoberta de serviços, em vez de uma lista estática de IPs:

Descoberta de Serviços em vez de lista estática de IPs

Em seguida, criamos uma API /anything na aplicação para testar o proxy:

API /anything

Testando o Proxy

Primeiro, mapeie a porta HTTP do plano de dados para a máquina local através de port-forward:

kubectl port-forward -n apisix svc/apisix-gateway 9080:80

Use curl para solicitar o serviço de destino:

curl http://127.0.0.1:9080/anything -H 'Host: sd.httpbin.org' -i
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 373
Connection: keep-alive
Date: Mon, 09 Jan 2023 08:33:44 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX
Tags: