API7 Cloud se integra con Kubernetes Service Discovery
Yong Qian
February 24, 2023
Ahorro de costos, adaptabilidad, escalabilidad, fiabilidad: el auge de las tecnologías en la nube y la contenerización ha traído muchas ventajas sobre la arquitectura monolítica tradicional. Estas ventajas las han hecho favoritas entre muchos usuarios empresariales.
Sin embargo, junto con estos cambios en la arquitectura también llegan nuevos desafíos. Por ejemplo, tradicionalmente, la lista de IP de reenvío ascendente para el proxy inverso solía ser estática y podía escribirse directamente en el archivo de configuración. En la era de la nube y la contenerización, la lista de IP de cada servicio ascendente cambia constantemente. Mantener los archivos de configuración se convierte en una pesadilla si se siguen utilizando archivos de configuración estáticos. Dado que la actualización oportuna de los archivos de configuración afecta directamente al reenvío del tráfico, los usuarios deben introducir software adicional para manejar la actualización automática de los archivos de configuración, lo que aumenta significativamente la complejidad de la arquitectura.
Para simplificar este proceso, API7 Cloud ofrece una función de descubrimiento de servicios, que se conecta directamente al Kubernetes API Server para obtener datos en tiempo real de los Endpoints, ayudando a los usuarios a redirigir aplicaciones implementadas en clústeres de Kubernetes de manera conveniente.
Descubrimiento de Servicios en API7 Cloud
Preparación
Primero, necesitamos desplegar una instancia de APISIX a través de cloud-cli. Consulta la documentación de API7 Cloud: Desplegar una instancia de gateway.
En este ejemplo, utilizaremos las directrices de implementación de Kubernetes proporcionadas en el documento para crear varios recursos bajo el espacio de nombres apisix
, que debemos crear previamente:
kubectl create namespace apisix
cloud-cli deploy kubernetes \
--name my-apisix \
--namespace apisix \
--apisix-image apache/apisix:2.15.0-centos
Crear una Cuenta de Servicio
La Cuenta de Servicio es el recurso central para implementar RBAC (Control de acceso basado en roles) en Kubernetes. API7 Cloud necesita tener permisos de list
y watch
sobre el recurso Endpoints para obtener la lista de instancias del servicio ascendente.
La configuración yaml correspondiente es la siguiente:
# 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
Crea la Cuenta de Servicio y obtén un 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
Crear un Registro de Servicios en API7 Cloud
Ve a Control Plane -> Settings -> Service Registry, utiliza el Token obtenido en el paso anterior para crear un registro de servicios de tipo Kubernetes en API7 Cloud (nota: la dirección del API Server debe completarse según tu caso de uso). En este ejemplo, APISIX también está desplegado en el clúster de Kubernetes objetivo, por lo que la dirección del servidor API que usamos es kubernetes.default.svc.cluster.local
:
Desplegar Servicios en Kubernetes
Para verificar la efectividad del descubrimiento de servicios de Kubernetes, desplegamos tres réplicas del servicio HTTPBin y creamos un Service correspondiente.
kubectl create deployment httpbin --image=kennethreitz/httpbin:latest --replicas=3 -n apisix
kubectl create service clusterip httpbin --tcp=80:80 -n apisix
Crear Aplicación y API en API7 Cloud
Después de desplegar la aplicación de prueba, ve a la página API Management -> Applications de API7 Cloud y haz clic en el botón Create Application para crear una nueva aplicación. La configuración básica es la siguiente:
sd.httpbin.org
comoHost
/
comoPath prefix
La parte crítica es configurar el upstream para usar Kubernetes y el registro que acabamos de crear para el descubrimiento de servicios, en lugar de una lista estática de IPs:
A continuación, creamos una API /anything
en la aplicación para probar el proxy:
Probar el Proxy
Primero, mapea el puerto HTTP del plano de datos a la máquina local mediante port-forward
:
kubectl port-forward -n apisix svc/apisix-gateway 9080:80
Usa curl para solicitar el servicio objetivo:
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