Ajoutez une entrée pour un service externe (base de données, API tierce ou système hérité) au registre de services interne d'une instance Service Mesh (ASM). Les services de l'instance ASM peuvent ainsi accéder au service externe.
Chaque entrée de service définit le nom de domaine, les ports, le protocole et l'endpoint d'un service externe.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance ASM
Un accès à la console ASM
Un service externe cible dont l'hôte, l'adresse IP ou le nom de domaine est connu
Créer une entrée de service
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez Service Mesh > Mesh Management.
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez Cluster & Workload Management > External Service(ServiceEntry).
Cliquez sur Create from YAML.
Sur la page Create, sélectionnez un namespace et un modèle de scénario, modifiez le code YAML dans l'éditeur, puis cliquez sur Create. Pour obtenir la liste complète des champs d'une entrée de service, consultez la section ServiceEntry de la documentation Istio.
Vérifier le résultat
Après avoir créé une entrée de service, vérifiez son fonctionnement :
Confirmez que l'entrée de service apparaît sur la page External Service(ServiceEntry) avec le nom et le namespace attendus.
-
Depuis un pod situé dans le mesh, envoyez une requête de test vers le service externe. La sortie attendue confirme que le service externe est accessible via le mesh :
kubectl exec <pod-name> -c <container-name> -- curl -sI https://www.aliyun.com | grep "HTTP/"HTTP/2 200
Modifier une entrée de service
Sur la page des détails de l'instance ASM, choisissez Cluster & Workload Management > External Service(ServiceEntry) dans le volet de navigation de gauche.
Recherchez l'entrée de service à modifier et cliquez sur YAML dans la colonne Actions.
Dans la boîte de dialogue Edit, mettez à jour la configuration et cliquez sur OK.
Supprimer une entrée de service
Sur la page des détails de l'instance ASM, choisissez Cluster & Workload Management > External Service(ServiceEntry) dans le volet de navigation de gauche.
Recherchez l'entrée de service à supprimer et cliquez sur Delete dans la colonne Actions.
Dans le message Submit, cliquez sur OK.
La suppression d'une entrée de service retire immédiatement l'accès au service externe pour toutes les charges de travail du mesh. Avant de supprimer une entrée, assurez-vous qu'aucune charge de travail active n'en dépend.
Référence des champs d'entrée de service
Champs
| Champ | Description |
|---|---|
hosts |
Les noms DNS associés au service externe. Pour le protocole HTTP, le proxy fait correspondre l'en-tête Host. Pour HTTPS/TLS, il fait correspondre la valeur SNI. Prend en charge les caractères génériques (par exemple, *.aliyun.com). |
addresses |
Adresses IP virtuelles pour le service. Obligatoire pour les services TCP qui ne disposent pas d'en-tête Host ni de SNI. |
ports |
Les ports exposés par le service externe. Les noms de port doivent respecter les conventions de dénomination indiquées dans la section Conventions de dénomination des ports ci-dessous. |
location |
MESH_EXTERNAL pour les services situés à l'extérieur du mesh. MESH_INTERNAL pour les charges de travail non gérées (par exemple, les machines virtuelles) qui doivent être traitées comme internes au mesh. |
resolution |
Méthode utilisée par le proxy pour résoudre l'adresse IP du service. Consultez la section Modes de résolution ci-dessous. |
exportTo |
Contrôle les namespaces pouvant accéder à l'entrée de service. La valeur par défaut s'applique à tous les namespaces ("*"). Définissez la valeur sur "." pour restreindre l'accès au seul namespace de création. |
Modes de résolution
Le champ resolution contrôle la manière dont le proxy résout l'adresse IP du service externe :
| Mode | Comportement | Cas d'utilisation |
|---|---|---|
DNS |
Interroge le DNS pour résoudre l'hôte et achemine le trafic vers l'adresse IP renvoyée. | Services identifiés par un nom de domaine. Recommandé pour la plupart des cas d'utilisation. |
NONE |
Transmet le trafic vers l'adresse IP de destination d'origine sans résolution. | Connexions déjà routées vers la bonne adresse IP, par exemple via des règles iptables. |
Avec la résolution DNS, le proxy ignore l'adresse IP de destination d'origine et interroge le DNS pour l'hôte spécifié afin d'obtenir l'adresse IP routable.
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: aliyun
spec:
hosts:
- '*.aliyun.com'
addresses:
- 192.168.0.0
- 172.16.0.0
location: MESH_EXTERNAL
ports:
- number: 443
protocol: https
name: https
resolution: DNS
Conventions de dénomination des ports
Istio utilise les noms de port pour déterminer le protocole de routage du trafic. Nommez les ports dans les entrées de service selon les conventions suivantes :
| Protocole | Nom du port | Nom du port avec suffixe |
|---|---|---|
| HTTP | http | http-\ |
| HTTP2 | http2 | http2-\ |
| HTTPS | https | https-\ |
| TLS | tls | tls-\ |
| gRPC | grpc | grpc-\ |
| TCP | tcp | tcp-\ |
| UDP | UDP | udp-\ |
| Mongo | mongo | mongo-\ |
| MySQL | mysql | mysql-\ |
| Redis | redis | redis-\ |
Ports Envoy réservés
N'utilisez pas les ports suivants dans les entrées de service. Ces ports sont réservés par le proxy sidecar Envoy et provoqueraient des conflits :
| Port | Protocole | Description |
|---|---|---|
| 15000 | TCP | Port d'administration Envoy |
| 15001 | TCP | Port sortant Envoy |
| 15006 | TCP | Port entrant Envoy |
| 15020 | HTTP | Télémétrie Prometheus fusionnée pour le proxy Istio, Envoy et l'application |
| 15021 | HTTP | Port de vérification de l'état (health check) |
| 15090 | HTTP | Port de télémétrie Prometheus Envoy |
Configuration spécifique au protocole
Les champs requis dans une entrée de service dépendent du protocole utilisé.
HTTP, HTTPS ou TLS
Spécifiez le champ hosts. Le proxy fait correspondre l'en-tête Host (HTTP) ou la valeur SNI (HTTPS/TLS) pour router le trafic.
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: aliyun
spec:
hosts:
- www.aliyun.com
- aliyun.com
ports:
- number: 443
name: https
protocol: HTTPS
resolution: DNS
location: MESH_EXTERNAL
TCP
Spécifiez le champ addresses avec des plages d'adresses IP. Le proxy utilise la correspondance basée sur l'adresse IP, car le protocole TCP ne dispose ni d'en-tête Host ni de SNI.
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: mysql-external
spec:
hosts:
- mysql-01.foo.bar
addresses:
- 10.0.0.5/32
- 10.0.0.6/32
ports:
- name: tcp
number: 3306
protocol: tcp
location: MESH_EXTERNAL
Plusieurs services TCP sur le même port
Attribuez des adresses IP distinctes à chaque entrée de service afin que le proxy puisse différencier le trafic.
Service 1 :
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: external-svc-1
namespace: default
spec:
hosts:
- fqdna.fqdn.com
addresses:
- 10.0.0.0
location: MESH_EXTERNAL
ports:
- name: TCP
number: 3306
protocol: TCP
resolution: DNS
Service 2 :
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: external-svc-2
namespace: default
spec:
hosts:
- fqdnb.fqdn.com
addresses:
- 10.1.0.0
location: MESH_EXTERNAL
ports:
- name: TCP
number: 3306
protocol: TCP
resolution: DNS
Visibilité du namespace
Par défaut, une entrée de service est accessible depuis tous les namespaces du mesh. Pour restreindre la visibilité au namespace où l'entrée est créée, définissez exportTo sur "." :
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: aliyun
spec:
hosts:
- www.aliyun.com
exportTo:
- "."
ports:
- number: 443
name: https
protocol: HTTPS
resolution: DNS
location: MESH_EXTERNAL
Étapes suivantes
Après avoir créé une entrée de service, appliquez des politiques de gestion du trafic au service externe à l'aide des ressources VirtualService et DestinationRule. Vous pouvez configurer des délais d'expiration, des tentatives ou l'injection de pannes. L'exemple suivant de VirtualService définit un délai d'expiration de 3 secondes pour les requêtes adressées à un service externe :
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: aliyun-ext
spec:
hosts:
- www.aliyun.com
http:
- timeout: 3s
route:
- destination:
host: www.aliyun.com
Pour plus d'informations sur les champs d'entrée de service et les configurations avancées, consultez la section ServiceEntry de la documentation Istio.