Par défaut, les endpoints backend d'un service Kubernetes sont répartis sur tous les nœuds d'un cluster. Cela peut entraîner des problèmes de connectivité ou dégrader les performances du trafic circulant entre différents groupes de nœuds. La topologie de service permet de restreindre le trafic vers les applications s'exécutant sur des nœuds périphériques, en garantissant qu'elles ne soient accessibles que par les nœuds du même pool de nœuds ou par le nœud local. Cette rubrique présente la fonctionnalité de topologie de service et explique comment la configurer.
Contexte
Dans les scénarios d'informatique en périphérie (edge computing), les nœuds périphériques sont souvent regroupés par emplacement géographique ou par d'autres attributs logiques, tels que l'architecture CPU, le fournisseur d'accès à Internet (FAI) ou le fournisseur de services cloud. Ces groupes de nœuds sont généralement isolés les uns des autres. Cet isolement implique une absence de connectivité réseau, un partage nul des ressources, l'utilisation de ressources hétérogènes ou l'exécution d'applications indépendantes.
Fonctionnement de la topologie de service
Pour résoudre ces problèmes, Container Service for Kubernetes (ACK) Edge ajoute au service natif une fonctionnalité de gestion de la topologie des endpoints. Elle permet de restreindre la portée d'accès des endpoints backend d'un service via de simples configurations. Par exemple, une application s'exécutant sur un nœud périphérique n'est accessible que par les nœuds du même pool de nœuds ou uniquement par le nœud local. Le principe de mise en œuvre est illustré dans la figure suivante.
Service1 est associé à deux instances de pod backend : Pod 2 et Pod 3. L'
annotation: "openyurt.io/topologyKeys: kubernetes.io/zone"définit la portée topologique de Service1 au niveau du pool de nœuds.Pod 2 se trouve sur le nœud 2 et Pod 3 sur le nœud 4. Ces nœuds appartiennent à deux pools de nœuds différents : respectivement le pool de nœuds A et le pool de nœuds B.
Comme Pod 1 et Pod 3 n'appartiennent pas au même pool de nœuds, le trafic issu de Pod 1 à destination de Service1 est acheminé uniquement vers Pod 2. L'accès à Pod 3 est bloqué.
Remarques d'utilisation
Versions antérieures à v1.26.3-aliyun.1 : vous devez appliquer l'annotation de topologie de service lors de la création du service pour activer cette fonctionnalité. Si vous ajoutez l'annotation après la création du service, la fonctionnalité ne prend pas effet. Vous devez alors supprimer et recréer le service.
Version v1.26.3-aliyun.1 et ultérieures : vous pouvez modifier l'annotation de topologie de service après la création du service. Les modifications prennent effet immédiatement.
Annotations
Configurez la topologie de service en ajoutant une annotation à un service Kubernetes standard. Le tableau suivant décrit les annotations disponibles.
|
Clé d'annotation |
Valeur d'annotation |
Description |
|
openyurt.io/topologyKeys |
kubernetes.io/hostname |
Restreint l'accès au service au seul nœud local. |
|
openyurt.io/topologyKeys |
kubernetes.io/zone ou openyurt.io/nodepool |
Restreint l'accès au service aux nœuds situés dans le même pool de nœuds. Si la version de votre ACK Edge cluster est 1,18 ou ultérieure, nous vous recommandons d'utiliser openyurt.io/nodepool. |
|
- |
- |
Aucune restriction topologique n'est appliquée au service. |
Configurer la topologie de service
Vous pouvez configurer la topologie de service via la console ou la CLI.
Console
Pour créer un service accessible uniquement par les nœuds du même pool de nœuds, ajoutez une annotation au service. Par exemple, définissez Name sur openyurt.io/topologyKeys et Value sur kubernetes.io/zone. Pour plus d'informations sur la création d'un service, consultez Gestion des services.
CLI
Pour créer un service utilisant un pool de nœuds comme domaine de topologie, utilisez l'exemple YAML suivant.
apiVersion: v1
kind: Service
metadata:
annotations:
openyurt.io/topologyKeys: kubernetes.io/zone
name: my-service-nodepool
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: nginx
sessionAffinity: None
type: ClusterIP