Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Plan de données EKS
Pour exploiter des applications résilientes et à haute disponibilité, vous avez besoin d'un plan de données hautement disponible et résilient. Un plan de données élastique permet à Kubernetes de dimensionner et de réparer automatiquement vos applications. Un plan de données résilient se compose de deux nœuds de travail ou plus, peut augmenter ou diminuer en fonction de la charge de travail et se rétablir automatiquement en cas de panne.
Deux options s'offrent à vous pour les nœuds de travail avec EKS : EC2instances et Fargate. Si vous choisissez EC2 des instances, vous pouvez gérer vous-même les nœuds de travail ou utiliser des groupes de nœuds gérés par EKS. Vous pouvez avoir un cluster composé à la fois de nœuds de travail gérés et autogérés et de Fargate.
EKS on Fargate offre le chemin le plus simple vers un plan de données résilient. Fargate exécute chaque Pod dans un environnement informatique isolé. Chaque Pod exécuté sur Fargate possède son propre nœud de travail. Fargate redimensionne automatiquement le plan de données au fur et à mesure que Kubernetes redimensionne les pods. Vous pouvez redimensionner à la fois le plan de données et votre charge de travail à l'aide de l'autoscaler horizontal.
La méthode préférée pour dimensionner les nœuds de EC2 travail consiste à utiliser Kubernetes Cluster Autoscaler,
Recommandations
Utilisez EC2 Auto Scaling Groups pour créer des nœuds de travail
Il est recommandé de créer des nœuds de travail à l'aide de groupes EC2 Auto Scaling au lieu de créer des EC2 instances individuelles et de les joindre au cluster. Auto Scaling Groups remplacera automatiquement tous les nœuds interrompus ou défaillants afin que le cluster ait toujours la capacité d'exécuter votre charge de travail.
Utiliser Kubernetes Cluster Autoscaler pour dimensionner les nœuds
Cluster Autoscaler ajuste la taille du plan de données lorsque certains pods ne peuvent pas être exécutés parce que le cluster ne dispose pas de ressources suffisantes, et l'ajout d'un autre nœud de travail serait utile. Bien que Cluster Autoscaler soit un processus réactif, il attend que les pods soient en attente en raison d'une capacité insuffisante du cluster. Lorsqu'un tel événement se produit, il ajoute EC2 des instances au cluster. Chaque fois que la capacité du cluster est épuisée, les nouvelles répliques (ou les nouveaux pods) ne seront pas disponibles (à l'état En attente) jusqu'à ce que des nœuds de travail soient ajoutés. Ce délai peut avoir un impact sur la fiabilité de vos applications si le plan de données ne peut pas évoluer suffisamment rapidement pour répondre aux exigences de la charge de travail. Si un nœud de travail est constamment sous-utilisé et que tous ses pods peuvent être planifiés sur d'autres nœuds de travail, Cluster Autoscaler le met fin à celui-ci.
Configurer le surprovisionnement avec Cluster Autoscaler
Cluster Autoscaler déclenche une mise à l'échelle du plan de données lorsque les pods du cluster sont déjà en attente. Par conséquent, il peut y avoir un délai entre le moment où votre application a besoin de plus de répliques et le moment où elle obtient en fait davantage de répliques. Une option pour tenir compte de ce retard éventuel consiste à ajouter plus de répliques que nécessaire, ce qui augmente le nombre de répliques pour l'application.
Un autre modèle recommandé par Cluster Autoscaler utilise les pods de pause et la fonction de préemption prioritaire
Utilisation de Cluster Autoscaler avec plusieurs groupes Auto Scaling
Exécutez le Cluster Autoscaler avec le --node-group-auto-discovery
drapeau activé. Cela permettra au Cluster Autoscaler de trouver tous les groupes de mise à l'échelle automatique qui incluent une balise définie particulière et évitera d'avoir à définir et à gérer chaque groupe de mise à l'échelle automatique dans le manifeste.
Utilisation de Cluster Autoscaler avec un stockage local
Par défaut, le Cluster Autoscaler ne réduit pas les nœuds dotés de pods déployés avec un stockage local connecté. Définissez l'--skip-nodes-with-local-storage
indicateur sur false pour permettre à Cluster Autoscaler de réduire la taille de ces nœuds.
Répartissez les nœuds de travail et la charge de travail sur plusieurs AZs
Vous pouvez protéger vos charges de travail contre les défaillances dans une zone de disponibilité individuelle en exécutant plusieurs AZs nœuds et pods de travail. Vous pouvez contrôler l'AZ dans laquelle les nœuds de travail sont créés à l'aide des sous-réseaux dans lesquels vous créez les nœuds.
Si vous utilisez Kubernetes 1.18+, la méthode recommandée pour répartir les pods AZs est d'utiliser les contraintes de propagation topologique
Le déploiement ci-dessous répartit les pods AZs si possible, en les laissant fonctionner de toute façon sinon :
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
replicas: 3
selector:
matchLabels:
app: web-server
template:
metadata:
labels:
app: web-server
spec:
topologySpreadConstraints:
- maxSkew: 1
whenUnsatisfiable: ScheduleAnyway
topologyKey: topology.kubernetes.io/zone
labelSelector:
matchLabels:
app: web-server
containers:
- name: web-app
image: nginx
resources:
requests:
cpu: 1
Note
kube-scheduler
ne connaît les domaines topologiques que via les nœuds qui existent avec ces étiquettes. Si le déploiement ci-dessus est déployé sur un cluster avec des nœuds dans une seule zone, tous les pods seront planifiés sur ces kube-scheduler
nœuds, sans connaître les autres zones. Pour que cette répartition topologique fonctionne comme prévu avec le planificateur, des nœuds doivent déjà exister dans toutes les zones. Ce problème sera résolu dans Kubernetes 1.24 avec l'ajout du portail de MinDomainsInPodToplogySpread
fonctionnalitésminDomains
propriété pour informer le planificateur du nombre de domaines éligibles.
Avertissement
Si DoNotSchedule
vous définissez whenUnsatisfiable
cette valeur sur, les pods ne seront pas planifiables si la contrainte de propagation de la topologie ne peut pas être respectée. Il ne doit être défini que s'il est préférable que les pods ne s'exécutent pas au lieu de violer la contrainte de propagation de la topologie.
Sur les anciennes versions de Kubernetes, vous pouvez utiliser les règles anti-affinité des pods pour planifier des pods sur plusieurs. AZs Le manifeste ci-dessous indique au planificateur Kubernetes de préférer planifier les pods de manière distincte. AZs
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
labels:
app: web-server
spec:
replicas: 4
selector:
matchLabels:
app: web-server
template:
metadata:
labels:
app: web-server
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-server
topologyKey: failure-domain.beta.kubernetes.io/zone
weight: 100
containers:
- name: web-app
image: nginx
Avertissement
N'exigez pas que les pods soient planifiés de AZs manière distincte, sinon le nombre de pods dans un déploiement ne dépassera jamais le nombre de AZs.
Garantir la capacité dans chaque AZ lors de l'utilisation de volumes EBS
Si vous utilisez Amazon EBS pour fournir des volumes persistants, vous devez vous assurer que les pods et le volume EBS associé se trouvent dans le même AZ. Au moment de la rédaction du présent rapport, les volumes EBS ne sont disponibles que dans un seul AZ. Un pod ne peut pas accéder aux volumes persistants sauvegardés par EBS situés dans une autre zone de disponibilité. Le planificateur Kubernetes sait dans quelle AZ se trouve un nœud de travail
Créez un groupe Auto Scaling pour chaque zone de disponibilité avec une capacité suffisante pour garantir que le cluster dispose toujours de la capacité nécessaire pour planifier les pods dans la même zone que les volumes EBS dont ils ont besoin. En outre, vous devez activer --balance-similar-node-groups
cette fonctionnalité dans Cluster Autoscaler.
Si vous exécutez une application qui utilise le volume EBS mais qui n'a aucune exigence de haute disponibilité, vous pouvez limiter le déploiement de l'application à une seule AZ. Dans EKS, les nœuds de travail reçoivent automatiquement une failure-domain.beta.kubernetes.io/zone
étiquette qui contient le nom de l'AZ. Vous pouvez voir les étiquettes attachées à vos nœuds en exécutantkubectl get nodes --show-labels
. De plus amples informations sur les étiquettes de nœuds intégrées sont disponibles ici
Dans l'exemple ci-dessous, le pod sera uniquement planifié en us-west-2c
AZ :
apiVersion: v1
kind: Pod
metadata:
name: single-az-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: failure-domain.beta.kubernetes.io/zone
operator: In
values:
- us-west-2c
containers:
- name: single-az-container
image: kubernetes/pause
Les volumes persistants (soutenus par EBS) sont également automatiquement étiquetés avec le nom AZ ; vous pouvez voir à quel AZ appartient votre volume persistant en exécutantkubectl get pv -L topology.ebs.csi.aws.com/zone
. Lorsqu'un pod est créé et revendique un volume, Kubernetes planifie le pod sur un nœud situé dans la même zone que le volume.
Imaginons ce scénario ; vous avez un cluster EKS avec un groupe de nœuds. Ce groupe de nœuds comprend trois nœuds de travail répartis sur trois AZs. Vous avez une application qui utilise un volume persistant soutenu par EBS. Lorsque vous créez cette application et le volume correspondant, son Pod est créé dans le premier des trois AZs. Ensuite, le nœud de travail qui exécute ce Pod devient défectueux et ne peut donc pas être utilisé. Cluster Autoscaler remplacera le nœud défectueux par un nouveau nœud de travail ; toutefois, comme le groupe de mise à l'échelle automatique s'étend sur trois AZs, le nouveau nœud de travail peut être lancé dans la deuxième ou la troisième zone, mais pas dans la première zone, comme la situation l'exige. Comme le volume EBS limité en AZ n'existe que dans la première zone de zone, mais qu'aucun nœud de travail n'est disponible dans cette zone, le pod ne peut pas être planifié. Par conséquent, vous devez créer un groupe de nœuds dans chaque zone de disponibilité, afin qu'il y ait toujours suffisamment de capacité disponible pour exécuter des pods qui ne peuvent pas être planifiés dans une autre zone AZs.
L'EFS
Détectez les problèmes liés aux nœuds grâce à l'agent de surveillance des nœuds
Les défaillances des nœuds de travail peuvent avoir un impact sur la disponibilité de vos applications. Vous pouvez utiliser l'agent de surveillance des nœuds pour détecter et signaler les problèmes de santé. Vous pouvez également activer la réparation automatique des nœuds pour remplacer automatiquement les nœuds lorsque des problèmes sont détectés.
L'agent de surveillance des nœuds est inclus en tant que fonctionnalité pour tous les clusters en mode automatique Amazon EKS. Pour les autres types de clusters, vous pouvez ajouter l'agent de surveillance en tant que module complémentaire Amazon EKS. Pour plus d'informations, consultez Activer la réparation automatique des nœuds et étudiez les problèmes de santé des nœuds dans le guide de l'utilisateur Amazon EKS.
Réserver des ressources pour le système et les démons Kubernetes
Vous pouvez améliorer la stabilité des nœuds de travail en réservant la capacité de calcul au système d'exploitation et aux démons Kuberneteslimits
déclarés, peuvent saturer les ressources du système, ce qui place les nœuds dans une situation où les processus du système d'exploitation et les démons Kubernetes (environnement d'exécution des conteneurskubelet
, etc.) sont en concurrence avec les pods pour les ressources système. Vous pouvez utiliser kubelet
des drapeaux --system-reserved
et --kube-reserved
réserver des ressources pour les processus système (udev
,sshd
, etc.) et les démons Kubernetes respectivement.
Si vous utilisez l'AMI Linux optimisée pour EKS, le processeur, la mémoire et le stockage sont réservés par défaut au système et aux daemons Kubernetes. Lorsque les nœuds de travail basés sur cette AMI sont lancés, EC2 les données utilisateur sont configurées pour déclencher le bootstrap.sh
scriptKubeletConfiguration
fichier situé à l'adresse/etc/kubernetes/kubelet/kubelet-config.json
.
Vous devrez peut-être augmenter la réservation des ressources système si vous exécutez des démons personnalisés sur le nœud et si la quantité de processeur et de mémoire réservée par défaut est insuffisante.
eksctl
offre le moyen le plus simple de personnaliser la réservation des ressources pour le système et les démons Kubernetes
Implémenter la QoS
Pour les applications critiques, pensez à définir requests
= limits
pour le conteneur du Pod. Cela garantira que le conteneur ne sera pas détruit si un autre pod demande des ressources.
Il est recommandé d'implémenter des limites de processeur et de mémoire pour tous les conteneurs, car cela évite qu'un conteneur ne consomme par inadvertance des ressources système et n'ait un impact sur la disponibilité d'autres processus colocalisés.
Configurer et dimensionner les demandes/limites de ressources pour toutes les charges de travail
Certaines directives générales peuvent être appliquées au dimensionnement des demandes de ressources et aux limites des charges de travail :
-
Ne spécifiez pas de limites de ressources sur le processeur. En l'absence de limites, la demande agit comme un poids sur le temps processeur relatif dont disposent les conteneurs
. Cela permet à vos charges de travail d'utiliser l'intégralité du processeur sans limite artificielle ni privation. -
Pour les ressources autres que le processeur, la configuration
requests
=limits
fournit le comportement le plus prévisible. Sirequests
! =limits
, la qualité de service du conteneur est également réduite,passant de garantie à burstable, ce qui le rend plus susceptible d'être expulsé en cas de pression sur les nœuds. -
Pour les ressources autres que le processeur, ne spécifiez pas de limite beaucoup plus grande que la demande. Plus le nombre de nœuds
limits
configurés est élevé par rapport àrequests
, plus il est probable que les nœuds soient surengagés, ce qui augmente les risques d'interruption de la charge de travail. -
Les requêtes correctement dimensionnées sont particulièrement importantes lors de l'utilisation d'une solution d'auto-scaling des nœuds telle que Karpenter
ou Cluster. AutoScaler Ces outils examinent vos demandes de charge de travail afin de déterminer le nombre et la taille des nœuds à provisionner. Si vos demandes sont trop petites et que les limites sont plus élevées, vous risquez de voir vos charges de travail expulsées ou d'éliminer OOM si elles ont été regroupées sur un nœud.
Il peut être difficile de déterminer les demandes de ressources, mais des outils tels que le Vertical Pod Autoscaler
Configurer les quotas de ressources pour les espaces de noms
Les espaces de noms sont destinés à être utilisés dans des environnements avec de nombreux utilisateurs répartis sur plusieurs équipes ou projets. Ils fournissent un champ d'application pour les noms et permettent de répartir les ressources du cluster entre plusieurs équipes, projets et charges de travail. Vous pouvez limiter la consommation globale de ressources dans un espace de noms. L'ResourceQuota
Si le quota de ressources est activé pour un espace de noms pour les ressources de calcul telles que le processeur et la mémoire, les utilisateurs doivent spécifier les demandes ou les limites pour chaque conteneur de cet espace de noms.
Envisagez de configurer des quotas pour chaque espace de noms. Envisagez LimitRanges
de l'utiliser pour appliquer automatiquement des limites préconfigurées aux conteneurs au sein d'un espace de noms.
Limiter l'utilisation des ressources du conteneur au sein d'un espace de noms
Les quotas de ressources permettent de limiter la quantité de ressources qu'un espace de noms peut utiliser. L'LimitRange
objetLimitRange
Vous pouvez ainsi définir une demande par défaut et des limites pour les conteneurs, ce qui est utile si la définition de limites de ressources de calcul n'est pas une pratique courante dans votre organisation. Comme son nom l'indique, LimitRange
peut imposer une utilisation minimale et maximale des ressources de calcul par pod ou conteneur dans un espace de noms. De plus, appliquez le minimum et le maximum de demandes de stockage par PersistentVolumeClaim espace de noms.
Envisagez LimitRange
de l'utiliser conjointement avec ResourceQuota
pour appliquer des limites au niveau du conteneur et de l'espace de noms. La définition de ces limites garantit qu'un conteneur ou un espace de noms n'empiète pas sur les ressources utilisées par les autres locataires du cluster.
CoreDNS
CoreDNS remplit les fonctions de résolution de noms et de découverte de services dans Kubernetes. Il est installé par défaut sur les clusters EKS. Pour des raisons d'interopérabilité, le service Kubernetes pour CoreDNS est toujours appelé kube-dns.kube-system
dans un espace de noms, et dans EKS, par défaut, ils exécutent deux répliques avec des demandes et des limites déclarées. Les requêtes DNS sont envoyées au kube-dns
service qui s'exécute dans l'espace de kube-system
noms.
Recommandations
Surveillez les métriques CoreDNS
CoreDNS a intégré le support de Prometheus.coredns_dns_request_duration_seconds_sum
(avantcore_dns_response_rcode_count_total
appelée), les erreurs coredns_dns_responses_total
(, NXDOMAIN, SERVFAIL, FormErr) et la consommation de mémoire du CoreDNS Pod.
À des fins de résolution des problèmes, vous pouvez utiliser kubectl pour afficher les journaux CoreDNS :
for p in $(kubectl get pods -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[*].metadata.name}'); do kubectl logs $p -n kube-system; done
Utiliser NodeLocal DNSCache
Vous pouvez améliorer les performances du DNS du cluster en exécutant NodeLocalDNSCachekube-dns
service.
Configuration cluster-proportional-scaler pour CoreDNS
Une autre méthode pour améliorer les performances du DNS du cluster consiste à dimensionner automatiquement horizontalement le déploiement CoreDNS
Les nœuds et l'agrégation des cœurs de processeur dans les nœuds sont les deux indicateurs avec lesquels vous pouvez dimensionner CoreDNS. Vous pouvez utiliser les deux indicateurs simultanément. Si vous utilisez des nœuds plus grands, le dimensionnement CoreDNS est basé sur le nombre de cœurs de processeur. Par contre, si vous utilisez des nœuds plus petits, le nombre de répliques CoreDNS dépend des cœurs de processeur de votre plan de données. La configuration de l'autoscaler proportionnel ressemble à ceci :
linear: '{"coresPerReplica":256,"min":1,"nodesPerReplica":16}'
Choix d'une AMI avec un groupe de nœuds
EKS fournit des solutions optimisées EC2 AMIs qui sont utilisées par les clients pour créer des groupes de nœuds autogérés et gérés. Ils AMIs sont publiés dans chaque région pour chaque version de Kubernetes prise en charge. EKS les marque AMIs comme obsolètes lorsqu'un bogue est découvert. CVEs Par conséquent, il est recommandé de ne pas utiliser de produit obsolète AMIs lors du choix d'une AMI pour le groupe de nœuds.
La version obsolète AMIs peut être filtrée à l'aide de l'API Ec2 describe-images à l'aide de la commande ci-dessous :
aws ec2 describe-images --image-id ami-0d551c4f633e7679c --no-include-deprecated
Vous pouvez également reconnaître une AMI obsolète en vérifiant si la sortie describe-image contient un DeprecationTime champ en tant que. Par exemple :
aws ec2 describe-images --image-id ami-xxx --no-include-deprecated
{
"Images": [
{
"Architecture": "x86_64",
"CreationDate": "2022-07-13T15:54:06.000Z",
"ImageId": "ami-xxx",
"ImageLocation": "123456789012/eks_xxx",
"ImageType": "machine",
"Public": false,
"OwnerId": "123456789012",
"PlatformDetails": "Linux/UNIX",
"UsageOperation": "RunInstances",
"State": "available",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"DeleteOnTermination": true,
"SnapshotId": "snap-0993a2fc4bbf4f7f4",
"VolumeSize": 20,
"VolumeType": "gp2",
"Encrypted": false
}
}
],
"Description": "EKS Kubernetes Worker AMI with AmazonLinux2 image, (k8s: 1.19.15, docker: 20.10.13-2.amzn2, containerd: 1.4.13-3.amzn2)",
"EnaSupport": true,
"Hypervisor": "xen",
"Name": "aws_eks_optimized_xxx",
"RootDeviceName": "/dev/xvda",
"RootDeviceType": "ebs",
"SriovNetSupport": "simple",
"VirtualizationType": "hvm",
"DeprecationTime": "2023-02-09T19:41:00.000Z"
}
]
}