API7 Cloud se integra con Kubernetes Service Discovery

Yong Qian

February 24, 2023

Products

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

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:

Crear Registro de Servicios en API7 Cloud

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

Servicio httpbin creado

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 como Host
  • / como Path 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:

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:

API /anything

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
Tags: