API7 Cloud s'intègre à la découverte de services Kubernetes
Yong Qian
February 24, 2023
Économies de coûts, adaptabilité, scalabilité, fiabilité — l'explosion des technologies cloud et de la conteneurisation a apporté de nombreux avantages par rapport à l'architecture monolithique traditionnelle. Ces avantages en font une solution privilégiée par de nombreux utilisateurs d'entreprise.
Cependant, ce changement d'architecture apporte également de nouveaux défis. Par exemple, traditionnellement, la liste des IP de transfert en amont pour le proxy inverse est souvent inchangée et peut être directement écrite dans le fichier de configuration statique. À l'ère du cloud et de la conteneurisation, la liste des IP de chaque service en amont change constamment. La maintenance des fichiers de configuration devient un cauchemar si vous continuez à utiliser des fichiers de configuration statiques. Comme la mise à jour des fichiers de configuration affecte directement le transfert du trafic, les utilisateurs doivent introduire des logiciels supplémentaires pour gérer la mise à jour automatique des fichiers de configuration, ce qui augmente considérablement la complexité de l'architecture.
Pour simplifier ce processus, API7 Cloud propose une fonction de découverte de services, qui se connecte directement au Kubernetes API Server pour obtenir des données d'Endpoints en temps réel, aidant ainsi les utilisateurs à proxifier les applications déployées dans un cluster Kubernetes de manière pratique.
Découverte de services dans API7 Cloud
Préparation
Tout d'abord, nous devons déployer une instance d'APISIX via cloud-cli. Consultez la documentation d'API7 Cloud : Déploiement d'une instance de passerelle.
Dans cet exemple, nous utiliserons les directives de déploiement Kubernetes fournies dans le document pour créer diverses ressources sous le namespace apisix
, que nous devons créer au préalable :
kubectl create namespace apisix
cloud-cli deploy kubernetes \
--name my-apisix \
--namespace apisix \
--apisix-image apache/apisix:2.15.0-centos
Créer un Service Account
Le Service Account est la ressource centrale pour implémenter le RBAC (contrôle d'accès basé sur les rôles) dans Kubernetes. API7 Cloud a besoin des permissions list
et watch
sur la ressource Endpoints pour obtenir la liste des instances du Service en amont.
La configuration yaml correspondante est la suivante :
# 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
Créez le Service Account et obtenez 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
Créer un registre de services dans API7 Cloud
Allez dans Control Plane -> Settings -> Service Registry, utilisez le Token obtenu à l'étape précédente pour créer un registre de services de type Kubernetes dans API7 Cloud (notez que l'adresse API Server doit être remplie en fonction de votre cas d'utilisation). Dans cet exemple, APISIX est également déployé dans le cluster Kubernetes cible, donc l'adresse du serveur API que nous utilisons est kubernetes.default.svc.cluster.local
:
Déployer des services dans Kubernetes
Afin de vérifier l'efficacité de la découverte de services Kubernetes, nous avons déployé trois réplicas du service HTTPBin et créé un Service correspondant.
kubectl create deployment httpbin --image=kennethreitz/httpbin:latest --replicas=3 -n apisix
kubectl create service clusterip httpbin --tcp=80:80 -n apisix
Créer une application et une API dans API7 Cloud
Après avoir déployé l'application de test, allez sur la page API Management -> Applications d'API7 Cloud et cliquez sur le bouton Create Application pour créer une nouvelle application. La configuration de base est la suivante :
sd.httpbin.org
commeHost
/
commePath prefix
La partie critique consiste à configurer l'amont pour utiliser Kubernetes et le registre que nous venons de créer pour la découverte de services, au lieu d'une liste statique d'IP :
Ensuite, nous avons créé une API /anything
dans l'application pour tester le proxy :
Tester le proxy
Commencez par mapper le port HTTP du plan de données sur la machine locale via port-forward
:
kubectl port-forward -n apisix svc/apisix-gateway 9080:80
Utilisez curl pour demander le service cible :
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