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