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.
Placez des pods Kubernetes sur Amazon en EKS utilisant l'affinité, les entorses et les tolérances des nœuds
Créé par Hitesh Parikh (AWS) et Raghu Bhamidimarri () AWS
Environnement : PoC ou pilote | Technologies : Conteneurs et microservices | Charge de travail : Open source |
AWSservices : Amazon EKS |
Récapitulatif
Ce modèle illustre l'utilisation de l'affinité des nœuds Kubernetes, de l'altération des nœuds et des tolérances des pods pour planifier intentionnellement des pods d'applications sur des nœuds de travail spécifiques d'un cluster Amazon Elastic Kubernetes Service (Amazon) EKS sur le cloud Amazon Web Services (). AWS
Une souillure est une propriété de nœud qui permet aux nœuds de rejeter un ensemble de modules. Une tolérance est une propriété de Pod qui permet au planificateur Kubernetes de planifier des Pods sur des nœuds présentant les mêmes caractéristiques.
Cependant, les tolérances ne peuvent à elles seules empêcher un planificateur de placer un Pod sur un nœud de travail qui ne présente aucune trace. Par exemple, un pod à forte intensité de calcul assorti d'une tolérance peut involontairement être programmé sur un nœud non contaminé à usage général. Dans ce scénario, la propriété d'affinité de nœud d'un Pod indique au planificateur de placer le Pod sur un nœud qui répond aux critères de sélection de nœuds spécifiés dans l'affinité de nœud.
Ensemble, les entailles, les tolérances et l'affinité des nœuds indiquent au planificateur de planifier les pods de manière cohérente sur les nœuds avec les taches correspondantes et les étiquettes des nœuds qui correspondent aux critères de sélection des nœuds d'affinité de nœud spécifiés sur le pod.
Ce modèle fournit un exemple de fichier manifeste de déploiement de Kubernetes, ainsi que les étapes à suivre pour créer un EKS cluster, déployer une application et valider le placement du Pod.
Conditions préalables et limitations
Prérequis
Un AWS compte avec des informations d'identification configurées pour créer des ressources sur votre AWS compte
AWSInterface de ligne de commande (AWSCLI)
eksctl
kubectl
Docker
a été installé (pour le système d'exploitation utilisé) et le moteur a démarré (pour plus d'informations sur les exigences de licence Docker, consultez le site Docker ) Java
version 11 ou ultérieure Un microservice Java exécuté sur votre environnement de développement intégré préféré (IDE) ; par exemple, IDEAIntelliJ Community
Edition ou Eclipse (si vous n'avez pas de microservice Java, consultez le modèle Déployer un exemple de microservice Java sur EKS Amazon et Microservices with Spring pour obtenir de l'aide sur la création du microservice )
Limites
Ce modèle ne fournit pas le code Java et suppose que vous êtes déjà familiarisé avec Java. Pour créer un microservice Java de base, consultez Déployer un exemple de microservice Java sur Amazon. EKS
Les étapes décrites dans cet article créent AWS des ressources qui peuvent entraîner des coûts. Assurez-vous de nettoyer les AWS ressources une fois que vous avez terminé les étapes de mise en œuvre et de validation du modèle.
Architecture
Pile technologique cible
Amazon EKS
Java
Docker
Amazon Elastic Container Registry (AmazonECR)
Architecture cible
Le schéma d'architecture de la solution montre Amazon EKS avec deux pods (déploiement 1 et déploiement 2) et deux groupes de nœuds (ng1 et ng2) avec deux nœuds chacun. Les pods et les nœuds possèdent les propriétés suivantes.
| Déploiement : 1 pod | Déploiement 2 Pod | Groupe de nœuds 1 (ng1) | Groupe de nœuds 2 (ng2) |
---|---|---|---|---|
Tolérance | clé : classified_workload, valeur : true, effet : NoSchedule clé : machine_learning_workload, valeur : vrai, effet : NoSchedule | Aucun |
|
|
Affinité des nœuds | clé : alpha.eksctl.io/nodegroup-name = ng1 ; | Aucun | nodeGroups.nom = ng1 |
|
Souillure |
|
| clé : classified_workload, valeur : true, effet : NoSchedule clé : machine_learning_workload, valeur : vrai, effet : NoSchedule | Aucun |
Le pod Deployment 1 a des tolérances et une affinité de nœud définies, ce qui indique au planificateur Kubernetes de placer les pods de déploiement sur les nœuds du groupe de nœuds 1 (ng1).
Le groupe de nœuds 2 (ng2) n'a pas d'étiquette de nœud correspondant à l'expression du sélecteur de nœuds d'affinité pour le déploiement 1. Les pods ne seront donc pas planifiés sur les nœuds ng2.
Aucune tolérance ou affinité de nœud n'est définie dans le manifeste de déploiement pour le module Deployment 2. Le planificateur refusera de planifier le déploiement de 2 pods sur le groupe de nœuds 1 en raison des entorses sur les nœuds.
Les pods Deployment 2 seront plutôt placés sur le groupe de nœuds 2, car les nœuds ne présentent aucune trace.
Ce modèle montre qu'en utilisant des contraintes et des tolérances, associées à l'affinité des nœuds, vous pouvez contrôler le placement des pods sur des ensembles spécifiques de nœuds de travail.
Outils
AWSservices
AWSL'interface de ligne de commande (AWSCLI) est un outil open source qui vous permet d'interagir avec les AWS services par le biais de commandes dans votre interface de ligne de commande.
Amazon Elastic Container Registry (AmazonECR) est un service géré de registre d'images de conteneurs sécurisé, évolutif et fiable.
Amazon Elastic Kubernetes Service (EKSAmazon) vous permet d'exécuter Kubernetes sans avoir à installer ou à gérer votre propre plan de contrôle ou vos propres nœuds AWS Kubernetes.
eksctl est l'AWSéquivalent de kubectl et aide à créer. EKS
Autres outils
Docker
est un ensemble de produits de plateforme en tant que service (PaaS) qui utilisent la virtualisation au niveau du système d'exploitation pour fournir des logiciels dans des conteneurs. kubectl
est une interface de ligne de commande qui vous permet d'exécuter des commandes sur des clusters Kubernetes.
Épopées
Tâche | Description | Compétences requises |
---|---|---|
Créez le fichier cluster.yaml. | Créez un fichier appelé
| Propriétaire de l'application AWS DevOps, administrateur du cloud, DevOps ingénieur |
Créez le cluster à l'aide de eksctl. | Exécutez le
| AWS DevOps, administrateur AWS système, développeur d'applications |
Tâche | Description | Compétences requises |
---|---|---|
Créez un référentiel ECR privé Amazon. | Pour créer un ECR dépôt Amazon, consultez Création d'un dépôt privé. Notez le URI nom du dépôt. | AWS DevOps, DevOps ingénieur, développeur d'applications |
Créez le Dockerfile. | Si vous avez une image de conteneur Docker existante que vous souhaitez utiliser pour tester le modèle, vous pouvez ignorer cette étape. Pour créer un Dockerfile, utilisez l'extrait suivant comme référence. Si vous rencontrez des erreurs, consultez la section Dépannage.
| AWS DevOps, DevOps ingénieur |
Créez le fichier pom.xml et les fichiers source, puis créez et publiez l'image Docker. | Pour créer le Utilisez les instructions de ce modèle pour créer et envoyer l'image Docker. | AWS DevOps, DevOps ingénieur, développeur d'applications |
Tâche | Description | Compétences requises |
---|---|---|
Créez le fichier deployment.yaml. | Pour créer le Dans le code, la clé de l'affinité des nœuds est toute étiquette que vous créez lors de la création de groupes de nœuds. Ce modèle utilise l'étiquette par défaut créée par eksctl. Pour plus d'informations sur la personnalisation des étiquettes, consultez la section Affectation de pods à des nœuds La valeur de la clé d'affinité de nœud est le nom du groupe de nœuds créé par Pour obtenir la clé et la valeur de la tache, exécutez la commande suivante.
L'image est celle URI du ECR référentiel Amazon que vous avez créé lors d'une étape précédente. | AWS DevOps, DevOps ingénieur, développeur d'applications |
Déployez le fichier. | Pour effectuer un déploiement sur AmazonEKS, exécutez la commande suivante.
| Développeur d'applications, DevOps ingénieur, AWS DevOps |
Vérifiez le déploiement. |
| Développeur d'applications, DevOps ingénieur, AWS DevOps |
Créez un deuxième fichier de déploiement .yaml sans tolérance ni affinité de nœud. | Cette étape supplémentaire consiste à valider que lorsqu'aucune affinité ou tolérance de nœud n'est spécifiée dans le fichier manifeste de déploiement, le pod résultant n'est pas planifié sur un nœud présentant des entaches. (Il doit être planifié sur un nœud qui ne présente aucune trace). Utilisez le code suivant pour créer un nouveau fichier de déploiement appelé
| Développeur d'applications AWS DevOps, DevOps ingénieur |
Déployez le deuxième fichier .yaml de déploiement et validez le placement du Pod |
| Développeur d'applications AWS DevOps, DevOps ingénieur |
Tâche | Description | Compétences requises |
---|---|---|
Nettoyez les ressources. | Pour éviter d'encourir des AWS frais pour les ressources qui restent actives, utilisez la commande suivante.
| AWS DevOps, Développeur d'applications |
Résolution des problèmes
Problème | Solution |
---|---|
Certaines de ces commandes risquent de ne pas s'exécuter si votre système utilise l'architecture arm64
| Si vous rencontrez des erreurs lors de l'exécution du Dockerfile, remplacez la
|
Ressources connexes
Informations supplémentaires
deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: microservice-deployment spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: java-microservice template: metadata: labels: app.kubernetes.io/name: java-microservice spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: alpha.eksctl.io/nodegroup-name operator: In values: - <node-group-name-from-cluster.yaml> tolerations: #only this pod has toleration and is viable to go to ng with taint - key: "<Taint key>" #classified_workload in our case operator: Equal value: "<Taint value>" #true effect: "NoSchedule" - key: "<Taint key>" #machine_learning_workload in our case operator: Equal value: "<Taint value>" #true effect: "NoSchedule" containers: - name: java-microservice-container image: <account_number>.dkr.ecr<region>.amazonaws.com/<repository_name>:latest ports: - containerPort: 4567
décrire un exemple de sortie du pod
Name: microservice-deployment-in-tainted-nodes-5684cc495b-vpcfx Namespace: default Priority: 0 Node: ip-192-168-29-181.us-west-1.compute.internal/192.168.29.181 Start Time: Wed, 14 Sep 2022 11:06:47 -0400 Labels: app.kubernetes.io/name=java-microservice-taint pod-template-hash=5684cc495b Annotations: kubernetes.io/psp: eks.privileged Status: Running IP: 192.168.13.44 IPs: IP: 192.168.13.44 Controlled By: ReplicaSet/microservice-deployment-in-tainted-nodes-5684cc495b Containers: java-microservice-container-1: Container ID: docker://5c158df8cc160de8f57f62f3ee16b12725a87510a809d90a1fb9e5d873c320a4 Image: 934188034500.dkr.ecr.us-east-1.amazonaws.com/java-eks-apg Image ID: docker-pullable://934188034500.dkr.ecr.us-east-1.amazonaws.com/java-eks-apg@sha256:d223924aca8315aab20d54eddf3443929eba511b6433017474d01b63a4114835 Port: 4567/TCP Host Port: 0/TCP State: Running Started: Wed, 14 Sep 2022 11:07:02 -0400 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-ddvvw (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: kube-api-access-ddvvw: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: BestEffort Node-Selectors: <none> Tolerations: classifled_workload=true:NoSchedule machine_learning_workload=true:NoSchedule node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: <none>