API7 Cloud integra-se com o Kubernetes Service Discovery
Yong Qian
February 24, 2023
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
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
:
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
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
comoHost
/
comoPath 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:
Em seguida, criamos uma API /anything
na aplicação para testar o proxy:
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