
Aujourd'hui, mercredi, une nouvelle version de Kubernetes â 1.16. Comme le veut la tradition de notre blog, nous vous prĂ©sentons pour la dixiĂšme fois les changements les plus significatifs de cette nouvelle version.
Les informations utilisées pour préparer ce matériel proviennent de , et des problÚmes, demandes d'extraction, ainsi que des propositions d'amélioration de Kubernetes (KEP) correspondantes. Alors, c'est parti !..
NĆuds
Un grand nombre de nouvelles fonctionnalitĂ©s notables (en version alpha) sont prĂ©sentĂ©es du cĂŽtĂ© des nĆuds des clusters K8s (Kubelet).
Tout d'abord, nous avons les «» (Ephemeral Containers), destinĂ©s Ă simplifier les processus de dĂ©bogage dans les podâ s. Le nouveau mĂ©canisme permet de lancer des conteneurs spĂ©ciaux, qui dĂ©marrent dans l'espace de noms des podâ s existants et vivent pendant une courte durĂ©e. Leur but est d'interagir avec d'autres podâ s et conteneurs pour rĂ©soudre des problĂšmes et effectuer des dĂ©bogages. Pour cela, une nouvelle commande a Ă©tĂ© mise en place : kubectl debug, similaire Ă kubectl exec: seulement au lieu de lancer un processus dans un conteneur (comme dans le cas de exec) elle dĂ©marre un conteneur dans un pod. Par exemple, cette commande connectera un nouveau conteneur Ă un pod :
kubectl debug -c debug-shell --image=debian target-pod -- bashDes dĂ©tails sur les conteneurs Ă©phĂ©mĂšres (et des exemples de leur utilisation) peuvent ĂȘtre trouvĂ©s dans . L'implĂ©mentation actuelle (dans K8s 1.16) est en version alpha, et parmi les critĂšres pour son passage en version bĂȘta se trouve "le test de l'API des conteneurs Ă©phĂ©mĂšres sur une pĂ©riode d'au moins 2 versions [Kubernetes]".
NBEn substance et mĂȘme par son nom, la fonctionnalitĂ© rappelle dĂ©jĂ un plugin existant , dont nous . Il est prĂ©vu qu'avec l'arrivĂ©e des conteneurs Ă©phĂ©mĂšres, le dĂ©veloppement d'un plugin externe distinct sera interrompu.
Une autre nouveautĂ© â â vise Ă fournir un mĂ©canisme de calcul des frais gĂ©nĂ©raux liĂ©s aux podâ s, qui peuvent varier considĂ©rablement en fonction de l'environnement d'exĂ©cution (runtime) utilisĂ©. Par exemple, les auteurs mentionnent Kata Containers, qui nĂ©cessitent le dĂ©marrage d'un noyau invitĂ©, d'un agent kata, d'un systĂšme d'init, etc. Lorsque les frais gĂ©nĂ©raux deviennent si importants, ils ne peuvent pas ĂȘtre ignorĂ©s, ce qui signifie qu'un moyen de les prendre en compte pour le quota, la planification, etc. est nĂ©cessaire. Pour cela, un champ a Ă©tĂ© ajoutĂ© Ă PodSpec . Surcharge *ResourceList (correspond Ă des donnĂ©es dans RuntimeClass, si utilisĂ©).
Une autre innovation notable est le gestionnaire de topologie de nĆud (Node Topology Manager), conçu pour unifier l'approche de l'optimisation de la distribution des ressources matĂ©rielles pour diffĂ©rents composants dans Kubernetes. Cette initiative est motivĂ©e par la demande croissante de divers systĂšmes modernes (dans le domaine des tĂ©lĂ©communications, apprentissage automatique, services financiers, etc.) pour des calculs parallĂšles haute performance et la minimisation des dĂ©lais d'exĂ©cution, utilisant pour cela les capacitĂ©s avancĂ©es des CPU et l'accĂ©lĂ©ration matĂ©rielle. Ces optimisations dans Kubernetes ont jusqu'Ă prĂ©sent Ă©tĂ© rĂ©alisĂ©es grĂące Ă des composants disparates (gestionnaire de CPU, gestionnaire de pĂ©riphĂ©riques, CNI), et maintenant, un interface interne unifiĂ©e va ĂȘtre ajoutĂ©e, qui unifie l'approche et simplifie le branchement de nouveaux composants similaires - dits topology-aware - du cĂŽtĂ© de Kubelet. Les dĂ©tails sont dans .

Le schéma des composants du Topology Manager
La prochaine fonctionnalité est la vérification des conteneurs lors de leur démarrage (). Comme il est connu, pour les conteneurs qui mettent longtemps à démarrer, il est difficile d'obtenir un statut actuel : soit ils sont 'tués' avant de commencer réellement à fonctionner, soit ils se retrouvent longtemps coincés dans un deadlock. La nouvelle vérification (activée via une porte de fonctionnalités appelée StartupProbeEnabled) annule - ou plutÎt, retarde - l'action de toutes les autres vérifications jusqu'à ce que le pod ait terminé son démarrage. Pour cette raison, la fonctionnalité a été initialement appelée . Pour les pods qui démarrent lentement, il est possible de procéder à des sondages d'état à des intervalles de temps relativement courts.
De plus, dĂšs sa version bĂȘta, une amĂ©lioration pour RuntimeClass a Ă©tĂ© prĂ©sentĂ©e, ajoutant le support des 'clusters hĂ©tĂ©rogĂšnes'. Avec , il n'est dĂ©sormais plus nĂ©cessaire que chaque nĆud prenne en charge chaque RuntimeClass : pour les pods, il est possible de choisir RuntimeClass sans se soucier de la topologie du cluster. Auparavant, pour atteindre cet objectif - afin que les pods se retrouvent sur des nĆuds avec le support de tout ce dont ils ont besoin - il fallait assigner des rĂšgles correspondant Ă NodeSelector et tolerations. Dans des exemples d'utilisation sont dĂ©crits, ainsi que, bien sĂ»r, des dĂ©tails sur l'implĂ©mentation.
Réseau
Deux fonctionnalités réseau significatives, qui sont apparues pour la premiÚre fois (en version alpha) dans Kubernetes 1.16 - sont :
- la double pile rĂ©seau - IPv4\/IPv6 â et sa «comprĂ©hension» au niveau des pods, des nĆuds et des services. Cela inclut l'interaction IPv4 Ă IPv4 et IPv6 Ă IPv6 entre les pods, des pods vers des services externes, des mises en Ćuvre de rĂ©fĂ©rence (dans le cadre des plugins Bridge CNI, PTP CNI et Host-Local IPAM), ainsi qu'une compatibilitĂ© descendante avec les clusters Kubernetes fonctionnant uniquement sur IPv4 ou IPv6. Les dĂ©tails de la mise en Ćuvre se trouvent dans .
Un exemple d'affichage d'adresses IP de deux types (IPv4 et IPv6) dans la liste des pods :
kube-master# kubectl get pods -o wide NOM PRĂT ĂTAT REDĂMARRAGES ĂGE IP NĆUD nginx-controller 1/1 Fonctionnement 0 20m fd00:db8:1::2,192.168.1.3 kube-minion-1 kube-master# - Une nouvelle API pour Endpoint â . Elle rĂ©sout les problĂšmes de performance/Ă©volutivitĂ© de l'API Endpoint existante qui affectent divers composants dans le plan de contrĂŽle (apiserver, etcd, endpoints-controller, kube-proxy). La nouvelle API sera ajoutĂ©e au groupe API Discovery et pourra gĂ©rer des dizaines de milliers de points de terminaison backend sur chaque service dans un cluster composĂ© de milliers de nĆuds. Pour cela, chaque service est mappĂ© Ă N objets
EndpointSlice, chacun d'eux ayant par dĂ©faut pas plus de 100 points de terminaison (valeur configurable). L'API EndpointSlice prĂ©voit Ă©galement des possibilitĂ©s pour son futur dĂ©veloppement : le support de plusieurs adresses IP pour chaque pod, de nouveaux Ă©tats pour les points de terminaison (non seulementPrĂȘtetNotReady), le sous-ensemencement dynamique pour les points de terminaison.
La version bĂȘta a progressĂ© concernant le "finalizer" prĂ©sentĂ© dans la derniĂšre version , appelĂ© service.kubernetes.io/load-balancer-cleanup et attachĂ© Ă chaque service de type LoadBalancer. Lors de la suppression de ce type de service, il empĂȘche la suppression rĂ©elle de la ressource tant que le nettoyage de toutes les ressources correspondant au balancer n'est pas terminĂ©.
API Machinery
Un vĂ©ritable "jalon de stabilisation" a Ă©tĂ© enregistrĂ© dans le domaine de lâAPI server de Kubernetes et son interaction. En grande partie, cela s'est produit grĂące Ă le passage au statut stable de ceux qui n'ont pas besoin d'une prĂ©sentation spĂ©ciale (CRD), qui avaient le statut bĂȘta depuis l'Ă©poque lointaine de Kubernetes 1.7 (ce qui Ă©tait en juin 2017 !). Une telle stabilisation a Ă©galement Ă©tĂ© observĂ©e pour les fonctionnalitĂ©s qui leur sont associĂ©es :
- avec
/statuset/scaletransformation - les valeurs par défaut récemment présentées (dans K8s 1.15)
- l'application du schéma OpenAPI v3 pour créer et publier la documentation OpenAPI utilisée pour la validation des ressources CRD cÎté serveur. (par défaut) et suppression automatique des champs (élagage) transformation
- application du schéma OpenAPI v3 pour la création et la publication de la documentation OpenAPI, utilisée pour la validation des ressources CRD cÎté serveur.
Un autre mĂ©canisme, devenu familier pour les administrateurs Kubernetes : â a Ă©galement longtemps Ă©tĂ© en version bĂȘta (depuis K8s 1.9) et est maintenant dĂ©clarĂ© stable.
Deux autres fonctionnalitĂ©s ont atteint la version bĂȘta : et .
Et la seule nouveautĂ© significative de la version alpha a Ă©tĂ© Ă partir de SelfLink â un URI spĂ©cial reprĂ©sentant l'objet spĂ©cifiĂ© et faisant partie de ObjectMeta et ListMeta (câest-Ă -dire faisant partie de tout objet dans Kubernetes). Pourquoi sâen dĂ©barrasse-t-on ? La motivation « simplement » comme l'absence de raisons rĂ©elles (insurmontables) pour que ce champ continue d'exister. Des raisons plus formelles incluent l'optimisation des performances (en supprimant un champ inutile) et la simplification du travail du generic-apiserver, qui doit traiter ce champ d'une maniĂšre particuliĂšre (c'est le seul champ qui est dĂ©fini juste avant la sĂ©rialisation de l'objet). Le vĂ©ritable « dĂ©prĂ©ciation » (dans le cadre de la version bĂȘta) SelfLink interviendra dans la version Kubernetes 1.20, et la finale â 1.21.
Stockage des données
Le travail principal dans le domaine du stockage, comme dans les versions précédentes, est observé dans le domaine . Les principales modifications ici sont :
- pour la premiĂšre fois (dans la version alpha) prise en charge des plugins CSI pour les nĆuds de travail sous Windows: une mĂ©thode actuelle de travail avec les stockages qui remplacera les plugins in-tree dans le noyau Kubernetes et les plugins FlexVolume de Microsoft basĂ©s sur Powershell ;

Le schĂ©ma de mise en Ćuvre des plugins CSI dans Kubernetes pour Windows - la possibilitĂ© , prĂ©sentĂ©e encore dans K8s 1.12, a atteint la version bĂȘta ;
- une « montĂ©e en version » similaire (de alpha Ă bĂȘta) a Ă©tĂ© atteinte avec la possibilitĂ© d'utiliser CSI pour crĂ©er des volumes Ă©phĂ©mĂšres locaux ().
Apparue dans la derniĂšre version de Kubernetes (utiliser des PVC existants comme DataSource pour crĂ©er de nouveaux PVC) a Ă©galement maintenant le statut de version bĂȘta.
Planificateur
Deux modifications notables dans la planification (les deux en version alpha) :
- â la possibilitĂ© d'utiliser des pods pour une « distribution Ă©quitable » des charges au lieu d'unitĂ©s logiques d'application (comme Deployment et ReplicaSet) et de rĂ©guler cette distribution (comme une exigence stricte ou comme une condition souple, câest-Ă -dire une prioritĂ©). La fonctionnalitĂ© Ă©largira les capacitĂ©s existantes de distribution des pods planifiĂ©s, actuellement limitĂ©es aux options
PodAffinityetPodAntiAffinity, fournissant aux administrateurs un contrĂŽle plus fin sur cette question, et par consĂ©quent â une meilleure disponibilitĂ© Ă©levĂ©e et une consommation de ressources optimisĂ©e. Plus de dĂ©tails dans . - Utilisation Politique BestFit dans Fonction de prioritĂ© RequestedToCapacityRatio lors de la planification des pods, permettant Ă des rĂ©pertoires contenant les fichiers correspondants, mais dans le cas d'autres systĂšmes de fichiers, cela peut ne pas ĂȘtre le cas. (« emballage en conteneurs ») tant pour les ressources principales (processeur, mĂ©moire) que pour les ressources avancĂ©es (comme le GPU). Pour plus de dĂ©tails, consultez .

Planification des pods : avant d'utiliser la politique best fit (directement via le planificateur par défaut) et en l'utilisant (via le scheduler extender)
De plus, la possibilité de créer des plug-ins pour le planificateur en dehors de l'arbre principal de développement de Kubernetes (out-of-tree).
Autres changements
De plus, dans la version Kubernetes 1.16, on peut noter l'initiative visant Ă les mĂ©triques existantes de maniĂšre cohĂ©rente, en d'autres termes â conformĂ©ment aux concernant l'instrumentation de K8s. Elles reposent essentiellement sur la documentation appropriĂ©e de Les incohĂ©rences ont Ă©tĂ© causĂ©es pour diverses raisons (par exemple, certaines mĂ©triques ont Ă©tĂ© créées avant que les instructions actuelles n'apparaissent), et les dĂ©veloppeurs ont dĂ©cidĂ© qu'il Ă©tait temps de mettre tout cela au mĂȘme standard, « en conformitĂ© avec le reste de l'Ă©cosystĂšme Prometheus ». La mise en Ćuvre actuelle de cette initiative est en version alpha, qui sera progressivement Ă©levĂ©e dans les futures versions de Kubernetes jusqu'Ă la bĂȘta (1.17) et Ă la stable (1.18).
De plus, on peut noter les changements suivants :
- Développement du support de Windows avec de l'outil Kubeadm pour ce systÚme d'exploitation (version alpha),
Une publication sur la plateforme d'orchestration des conteneurs a Ă©tĂ© publiĂ©e.pour les conteneurs Windows (version alpha), le support du Group Managed Service Account (gMSA) jusqu'Ă la version bĂȘta, mount/attach pour les volumes vSphere. - de compression des donnĂ©es dans les rĂ©ponses API. Auparavant, pour cela, un filtre HTTP Ă©tait utilisĂ©, ce qui imposait de nombreuses limitations empĂȘchant son activation par dĂ©faut. Maintenant, il existe une « compression transparente des requĂȘtes » : les clients envoyant
Accept-Encoding: gzipdans l'en-tĂȘte reçoivent une rĂ©ponse compressĂ©e en GZIP si sa taille dĂ©passe 128 Ko. Les clients en Go prennent automatiquement en charge la compression (envoient l'en-tĂȘte nĂ©cessaire), donc ils remarqueront immĂ©diatement une rĂ©duction du trafic. (D'autres langages peuvent nĂ©cessiter de petites modifications.) - de scaler HPA de zĂ©ro pods Ă partir de mĂ©triques externes.Si le dimensionnement est effectuĂ© sur la base d'objets / de mĂ©triques externes, il est possible de rĂ©duire automatiquement Ă 0 rĂ©pliques lorsque les charges de travail sont inactives, afin d'Ă©conomiser des ressources. Cette fonctionnalitĂ© devrait ĂȘtre particuliĂšrement utile dans les cas oĂč les workers demandent des ressources GPU, et oĂč le nombre de diffĂ©rents types de workers inactifs dĂ©passe le nombre de GPU disponibles.
- Nouveau client â â pour un accĂšs « gĂ©nĂ©rique » aux objets. Il est conçu pour faciliter lâobtention des mĂ©tadonnĂ©es (câest-Ă -dire la subdivision
métadonnées) des ressources du cluster et d'effectuer des opérations telles que le nettoyage et la quotisation. - La collecte de Kubernetes sans les fournisseurs de cloud obsolÚtes (« intégrés » dans in-tree) (version alpha).
- Dans l'outil kubeadm la possibilité expérimentale (version alpha) d'appliquer des correctifs kustomize lors des opérations
init,joindreetde mise Ă niveau. Pour plus d'informations sur l'utilisation du drapeau--experimental-kustomize, consultez . - Nouveau point de terminaison pour apiserver â , â permettant d'exporter des informations sur sa disponibilitĂ©. De plus, le serveur API a maintenant un drapeau
--maximum-startup-sequence-duration, qui permet de réguler ses redémarrages. - Deux fonctionnalités pour Azure ont été déclarées stables : prise en charge (Availability Zones) et (RG). De plus, Azure a ajouté :
- AAD et ADFS ;
-
service.beta.kubernetes.io/azure-pip-namepour indiquer l'IP publique du load balancer ; - des paramĂštres
LoadBalancerNameetLoadBalancerResourceGroup.
- AWS a reçu pour EBS sur Windows et les appels API EC2
DescribeInstances. - Kubeadm migre désormais automatiquement Les binaires
- dans l'image Docker correspondante etcd sont exécutables dans le monde, ce qui permet de lancer cette image sans nécessité de droits root. De plus, l'image de migration etcd a cessé Cluster Autoscaler 1.16.0
- Dans Mises à jour des logiciels utilisés / dépendants : Go 1.12.9, etcd 3.3.15, CoreDNS 1.6.2.
- Kubernetes 1.15 : aperçu des principales nouveautés
P.S.
Lisez aussi dans notre blog :
- «»;
- «»;
- «»;
- «».
Source : habr.com


