Utilisez les tolérances et l'affinité de nœud pour planifier les pods sur Elastic Compute Service (ECS), ECI ou les deux, avec un basculement basé sur les priorités.
Concepts clés
Taint : règle appliquée à un nœud qui empêche la planification de certains pods sur celui-ci.
Toleration : paramètre configuré sur un pod lui permettant d'ignorer les taints d'un nœud.
-
Node affinity : propriété d'un pod qui favorise sa planification sur des nœuds portant des libellés spécifiques. Il existe deux types :
requiredDuringSchedulingIgnoredDuringExecution: exigence stricte. Le planificateur ne place les pods que sur les nœuds correspondants.preferredDuringSchedulingIgnoredDuringExecution: préférence souple. Le planificateur tente de respecter la règle, mais planifie le pod ailleurs si aucune correspondance n'est trouvée.
Consultez les pages Taints and Tolerations et Node affinity.
Prérequis
Un cluster géré ACK Pro exécutant Kubernetes v1.22 ou une version ultérieure.
La version 2.10.0 ou ultérieure du module complémentaire ack-virtual-node (voir Virtual nodes).
-
La version 5.9 ou ultérieure du composant kube-scheduler, avec la stratégie de planification des nœuds virtuels activée.
Sur la page Add-ons, recherchez Kube Scheduler, cliquez sur Configuration et vérifiez que l'option Enable Virtual Node-based Pod Scheduling est sélectionnée.
Exemples de configuration
Les nœuds virtuels dans les clusters ACK portent par défaut le taint virtual-kubelet.io/provider=alibabacloud:NoSchedule. Pour planifier des pods sur des nœuds virtuels (ECI), ajoutez une tolérance pour ce taint.
Exemple :
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
Combinez les tolérances et l'affinité de nœud pour créer des stratégies de planification adaptées à différents besoins en ressources.
Préférer ECS : utilisez ECS par défaut ; basculez sur ECI lorsque la capacité ECS est insuffisante.
Utiliser uniquement ECI : utilisez exclusivement des ressources ECI.
Utiliser uniquement ECS : utilisez exclusivement des ressources ECS existantes.
Préférer ECS
Ajoutez une tolérance pour le taint par défaut, puis utilisez preferredDuringSchedulingIgnoredDuringExecution pour privilégier les nœuds ne portant pas le libellé type: virtual-kubelet (nœuds ECS).
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecs-prefer
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: type
operator: NotIn
values:
- virtual-kubelet
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
À propos de l'affinité de nœud :
Plusieurs éléments
nodeSelectorTermssont combinés avec un OU logique : un pod est planifié si au moins une expressionmatchExpressionscorrespond. Plusieurs expressions au sein d'un même blocmatchExpressionssont combinées avec un ET logique : toutes doivent correspondre.L'utilisation de
preferredDuringSchedulingIgnoredDuringExecutionne garantit pas un basculement exclusif vers ECI : les pods peuvent toujours être planifiés sur ECI même si la capacité ECS est suffisante. Pour un contrôle plus strict, combinez cette option avecrequiredDuringSchedulingIgnoredDuringExecution.
Le fichier YAML suivant privilégie les nœuds ECS portant un libellé spécifique (par exemple label_1=key_1) et bascule sur les nœuds virtuels lorsque la capacité supplémentaire est nécessaire.
Utiliser uniquement ECI
Ajoutez une tolérance pour le taint par défaut des nœuds virtuels, puis utilisez requiredDuringSchedulingIgnoredDuringExecution pour exiger des nœuds portant le libellé type: virtual-kubelet.
apiVersion: apps/v1
kind: Deployment
metadata:
name: eci-only
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
Utiliser uniquement ECS
Par défaut, les pods sont planifiés uniquement sur les nœuds ECS car les nœuds virtuels possèdent un taint. Aucune configuration supplémentaire n'est requise.
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecs-only
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6