Kubernetes 1.19: un aperçu des principales innovations

Aujourd'hui, 25 août, une nouvelle version de Kubernetes aura lieu (elle a été retardée de prÚs de 2 mois au total) - 1.19. Suivant la tradition de notre blog, nous parlons des changements les plus significatifs de la nouvelle version.







Les informations utilisées pour préparer ce matériel sont tirées du tableau de suivi des améliorations de Kubernetes , CHANGELOG-1.19 , de l'aperçu de Sysdig , ainsi que des problÚmes connexes, des demandes d'extraction, des propositions d'amélioration de Kubernetes (KEP).



Commençons par quelques innovations majeures à caractÚre assez général ...



Avec la sortie de Kubernetes 1.19, la "fenĂȘtre de support" pour les versions de Kubernetes est passĂ©e de 9 mois (soit les 3 derniĂšres versions) Ă  1 an (soit 4 versions). Pourquoi?



Il s'est avĂ©rĂ© qu'en raison de la vitesse Ă©levĂ©e du dĂ©veloppement du projet (frĂ©quentes versions majeures), les administrateurs de cluster Kubernetes n'ont pas le temps de mettre Ă  jour leurs installations. Les auteurs du KEP correspondant se rĂ©fĂšrent Ă  une enquĂȘte menĂ©e par le groupe de travail au dĂ©but de l'annĂ©e derniĂšre et ont montrĂ© qu'environ un tiers des utilisateurs de Kubernetes traitaient des versions obsolĂštes de K8s en cours de production:





(Au moment de l'enquĂȘte, la version actuelle de Kubernetes Ă©tait 1.13, c'est-Ă -dire tous les utilisateurs de K8s 1.9 et 1.10 fonctionnaient avec des versions qui n'Ă©taient plus prises en charge Ă  l'Ă©poque.)



Ainsi, il est supposé qu'une prolongation de 3 mois de la période de support pour les versions de Kubernetes - la publication de correctifs qui corrigent les problÚmes trouvés dans le code - garantira que plus de 80% des utilisateurs travailleront sur les versions prises en charge de K8 (au lieu des 50-60% supposés pour le moment. ).



Autre grand développement: un standard pour les logs structurés a été développé ... Le systÚme de journalisation actuel dans le plan de contrÎle ne garantit pas une structure unique pour les messages et les références d'objet dans Kubernetes, ce qui complique le traitement de ces journaux. Pour résoudre ce problÚme, une nouvelle structure pour les messages dans les journaux est introduite, pour laquelle la bibliothÚque klog a été étendue avec de nouvelles méthodes qui fournissent une interface structurée pour générer des journaux, ainsi que des méthodes auxiliaires pour identifier les objets K8 dans les journaux.



SimultanĂ©ment Ă  la migration vers klog v2, la transition vers un nouveau format de sortie des logs en JSON est effectuĂ©e, ce qui simplifiera l'exĂ©cution des requĂȘtes vers les logs et leur traitement. Pour cela, un drapeau apparaĂźt --logging-format, qui utilise par dĂ©faut l'ancien format de texte.



Étant donnĂ© que le rĂ©fĂ©rentiel Kubernetes est Ă©norme et que les auteursLes KEP de journalisation structurĂ©e sont rĂ©alistes et concentreront leurs efforts pour donner vie Ă  de nouvelles idĂ©es sur les messages les plus courants.



Une illustration de la journalisation à l'aide des nouvelles méthodes de klog:



klog.InfoS("Pod status updated", "pod", "kubedns", "status", "ready")

I1025 00:15:15.525108       1 controller_utils.go:116] "Pod status updated" pod="kubedns"


klog.InfoS("Pod status updated", "pod", klog.KRef("kube-system", "kubedns"), "status", "ready")

I1025 00:15:15.525108       1 controller_utils.go:116] "Pod status updated" pod="kube-system/kubedns" status="ready"


klog.ErrorS(err, "Failed to update pod status")

E1025 00:15:15.525108       1 controller_utils.go:114] "Failed to update pod status" err="timeout"


Utilisation du format JSON:



pod := corev1.Pod{Name: "kubedns", Namespace: "kube-system", ...}
klog.InfoS("Pod status updated", "pod", klog.KObj(pod), "status", "ready")


{
   "ts": 1580306777.04728,
   "v": 4,
   "msg": "Pod status updated",
   "pod":{
      "name": "nginx-1",
      "namespace": "default"
   },
   "status": "ready"
}


Une autre innovation importante (et trĂšs pertinente) est le mĂ©canisme d'information sur les API obsolĂštes , implĂ©mentĂ©es immĂ©diatement en version bĂȘta (c'est-Ă -dire actives dans les installations par dĂ©faut). Comme expliquĂ© par les auteurs, dans de nombreux Kubernetes capacitĂ© constamment pas Ă  jour, en restant dans les diffĂ©rents Etats et avec le temps diffĂ©rent de perspectives mi. Il est presque impossible de les suivre, en lisant attentivement toutes les notes de publication et en nettoyant manuellement les configurations / paramĂštres.



Pour rĂ©soudre ce problĂšme, maintenant lors de l'utilisation de l'API obsolĂšte, un en-tĂȘte est ajoutĂ© Ă  ses rĂ©ponses Warning, qui est reconnu cĂŽtĂ© client (client-go) avec possibilitĂ© de rĂ©ponses diffĂ©rentes: ignorer, dĂ©dupliquer, consigner. Dans l'utilitaire kubectl, ils ont appris Ă  envoyer ces messages Ă  stderr, Ă  mettre en Ă©vidence le message dans la console avec une couleur et Ă  ajouter un indicateur --warnings-as-errorsavec un nom explicite .



En plus de cela, des métriques spéciales ont été ajoutées pour signaler l'utilisation d'API obsolÚtes et d'annotations d'audit.



Enfin, les dĂ©veloppeurs ont assistĂ© Ă  l' avancement des fonctionnalitĂ©s de Kubernetes Ă  partir de la version bĂȘta . Comme l'expĂ©rience du projet l'a montrĂ©, certaines nouvelles fonctionnalitĂ©s et modifications de l'API Ă©taient "bloquĂ©es" dans l'Ă©tat de la bĂȘta, car elles Ă©taient dĂ©jĂ  automatiquement (par dĂ©faut) activĂ©es et ne nĂ©cessitaient aucune action supplĂ©mentaire de la part des utilisateurs.



Pour Ă©viter que cela ne se produise, il est suggĂ©rĂ© envoyer automatiquement Ă  la liste d'obsolescence les fonctionnalitĂ©s qui sont en version bĂȘta depuis 6 mois (deux versions) et ne remplissent aucune de ces conditions:



  1. répondent aux critÚres de l'AG et sont promus au statut stable;
  2. ont une nouvelle version bĂȘta qui rend obsolĂšte la version bĂȘta prĂ©cĂ©dente.


Et maintenant, pour d'autres changements dans Kubernetes 1.19, classés par leurs SIG respectifs.



coffres



Les nouveaux objets CSIStorageCapacity sont destinĂ©s Ă  amĂ©liorer le processus de planification pour les pods qui utilisent des volumes CSI: ils ne seront pas placĂ©s sur des nƓuds qui n'ont plus d'espace de stockage. Pour cela, les informations sur l'espace disque disponible seront stockĂ©es dans le serveur API et disponibles pour les pilotes CSI et le planificateur. L'Ă©tat actuel de l'implĂ©mentation est la version alpha; voir KEP pour plus de dĂ©tails .



Une autre innovation de la version alpha est la possibilitĂ© de dĂ©finir des volumes Ă©phĂ©mĂšres directement dans les spĂ©cifications des pods, volumes gĂ©nĂ©riques en ligne Ă©phĂ©mĂšres ( KEP). Les volumes Ă©phĂ©mĂšres sont crĂ©Ă©s pour des pods spĂ©cifiques au moment de leur apparition et sont supprimĂ©s Ă  leur sortie. Ils auraient pu ĂȘtre dĂ©finis plus tĂŽt (y compris directement dans la spĂ©cification, c'est-Ă -dire par la mĂ©thode en ligne), mais l'approche existante, ayant prouvĂ© la cohĂ©rence de la fonctionnalitĂ© elle-mĂȘme, ne couvrait pas tous les cas d'utilisation.



Le nouveau mécanisme offre une API simple pour définir des volumes éphémÚres pour tout pilote avec prise en charge du provisionnement dynamique (auparavant, cela nécessitait une modification du pilote). Il vous permet de travailler avec tous les volumes éphémÚres (à la fois CSI et dans l'arborescence, par exemple EmptyDir), et prend également en charge une autre nouvelle fonctionnalité (décrite ci-dessus) - le suivi de l'espace de stockage disponible.



Un exemple d'objet Kubernetes de haut niveau utilisant un nouveau volume éphémÚre (générique en ligne):



apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: scratch
          mountPath: /scratch
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: scratch
        ephemeral:
          metadata:
            labels:
              type: fluentd-elasticsearch-volume
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "scratch-storage-class"
            resources:
              requests:
                storage: 1Gi


Ici, le contrÎleur DaemonSet crée des pods avec des noms de vue fluentd-elasticsearch-b96sd, aprÚs quoi un PersistentVolumeClaim sera ajouté pour un tel pod fluentd-elasticsearch-b96sd-scratch.



Et la derniÚre fonctionnalité de stockage entiÚrement nouvelle, introduite en version alpha, est un nouveau champ csidriver.spec.SupportsFSGrouppour les pilotes CSI qui indique la prise en charge des autorisations basées sur FSGroup ( KEP ). Motivation: un changement de propriété d'un volume CSI est effectué avant son montage dans un conteneur, mais tous les types de stockage ne prennent pas en charge une telle opération (par exemple, NFS), c'est pourquoi elle peut désormais entraßner des erreurs.



Jusqu'Ă  la version bĂȘta (c'est-Ă -dire, les inclusions par dĂ©faut) ont "augmentĂ©":





/ Kubelet



Seccomp a été déclaré stable (GA) . En particulier, ces travaux ont conduit à la transition vers des champs pour seccomp dans l'API au lieu d'annotations déclarées obsolÚtes (les nouveaux Kubelets ignorent les annotations), et ont affecté PodSecurityPolicy .



Un nouveau champ a été ajouté au PodSpec fqdnInHostnamepour vous permettre de définir le FQDN (nom de domaine complet) pour l'hÎte du pod . L'objectif est d'améliorer la prise en charge des applications héritées dans Kubernetes. Voici comment les auteurs expliquent leurs intentions:



« Unix Linux-, Red Hat CentOS, FQDN- hostname. , , Kubernetes, . ».


La valeur par dĂ©faut sera falsede conserver l'ancien comportement (pour Kubernetes). Statut de la fonctionnalitĂ© - version alpha, qui devrait ĂȘtre dĂ©clarĂ©e stable dans la prochaine version (1.20).



Il a Ă©tĂ© dĂ©cidĂ© d' abandonner les mĂ©triques d'accĂ©lĂ©rateur collectĂ©es par Kubelet . Il est proposĂ© de collecter ces mĂ©triques par des agents de surveillance externes via l'API PodResources. Cette API elle-mĂȘme a Ă©tĂ© crĂ©Ă©e prĂ©cisĂ©ment dans le but de supprimer toutes les mĂ©triques spĂ©cifiques aux appareils du rĂ©fĂ©rentiel principal Kubernetes, permettant aux fournisseurs de les implĂ©menter sans apporter de modifications au cƓur de Kubernetes. L'API PodResources est en version bĂȘta (Feature Gate en est responsable KubeletPodResources) et sera bientĂŽt stable. Pour la version actuelle, le processus d'abandon est en statut alpha, les dĂ©tails sont dans KEP .



DĂ©sormais, Kubelet peut ĂȘtre construit sans Docker : par ce "sans" les auteurs signifient l'absence de tout code spĂ©cifique Ă  Docker et la dĂ©pendance au package Golang docker/docker. Le but ultime de cette initiative est d'arriver Ă  un Kubelet complĂštement "sans docker" (c'est-Ă -dire sans dĂ©pendance Docker). Vous pouvez en savoir plus sur la motivation, comme toujours, chez KEP . Cette opportunitĂ© a immĂ©diatement reçu le statut GA.



Le Node Topology Manager, qui a atteint sa version bĂȘta dans la derniĂšre version de K8, a dĂ©sormais la possibilitĂ© de niveler les ressources au niveau du pod.



Planificateur



De retour dans Kubernetes 1.18, nous avons écrit sur une configuration globale pour une distribution uniforme de pod (Even Pod Spreading) , mais il a ensuite été décidé de reporter cette fonctionnalité en fonction des résultats des tests de performances. Elle est maintenant dans Kubernetes (en statut alpha).



L'essence de l'innovation est l'ajout de contraintes globales ( DefaultConstraints), qui permettent de réguler les rÚgles de distribution des pods à un niveau supérieur - au niveau du cluster, et pas seulement en PodSpec(à travers topologySpreadConstraints), comme c'était le cas jusqu'à présent. La configuration par défaut sera similaire au plugin actuel DefaultPodTopologySpread:



defaultConstraints:
  - maxSkew: 3
    topologyKey: "kubernetes.io/hostname"
    whenUnsatisfiable: ScheduleAnyway
  - maxSkew: 5
    topologyKey: "topology.kubernetes.io/zone"
    whenUnsatisfiable: ScheduleAnyway


Les détails sont dans KEP .



Autre particularitĂ© liĂ©e Ă  Even Pod Spreading: la rĂ©partition d'un groupe de pods par domaines de dĂ©faillance (rĂ©gions, zones, nƓuds, etc.), - transfĂ©rĂ©e de l'alpha Ă  la beta (activĂ©e par dĂ©faut).



Trois autres fonctionnalités du planificateur ont atteint une "augmentation" similaire:





RĂ©seaux



La ressource Ingress est finalement dĂ©clarĂ©e stable et a une version v1dans l'API. À cet Ă©gard, de nombreuses mises Ă  jour ont Ă©tĂ© prĂ©sentĂ©es dans la documentation pertinente. Une attention particuliĂšre doit ĂȘtre portĂ©e aux changements perceptibles par l'utilisateur Ă  partir de ce PR : par exemple, il existe des renoms tels que spec.backend→ spec.defaultBackend, serviceName→ service.name, servicePort→ service.port.number...



Le champ AppProtocol pour les services et les points de terminaison, ainsi que l' API EndpointSlice (kube-proxy sous Linux démarre utiliser EndpointSlices par défaut, mais est resté en alpha pour Windows) et le support SCTP .



kubeadm



Deux nouvelles fonctionnalités (en version alpha) sont introduites pour l'utilitaire kubeadm.



La premiÚre consiste à utiliser des correctifs pour modifier les manifestes générés par kubeadm. Il était déjà possible de les modifier en utilisant Kustomize (en alpha), mais les développeurs de kubeadm ont décidé que l'utilisation de correctifs réguliers était la méthode préférée (puisque Kustomize devient une dépendance inutile, ce qui n'est pas le bienvenu).



Il est maintenant possible d'appliquer des patchs bruts (via un drapeau --experimental-patches) pour les commandes kubeadm init, joinet upgrade, ainsi que leurs phases. L'implémentation basée sur Kustomize (indicateur --experimental-kustomize) sera obsolÚte et supprimée.



La deuxiÚme fonctionnalité est une nouvelle approche pour travailler avec les configurations de composantsavec lequel kubeadm fonctionne. L'utilitaire génÚre, valide, définit les valeurs par défaut, stocke les configurations (sous la forme de ConfigMaps) pour des composants de cluster Kubernetes tels que Kubelet et kube-proxy. Au fil du temps, il est devenu clair que cela posait un certain nombre de difficultés: comment distinguer les configurations générées par kubeadm ou soumises par l'utilisateur (et si non, que faire de la migration de configuration)? Quels champs avec des valeurs par défaut ont été générés automatiquement, et lesquels ont été intentionnellement définis? ..



Pour rĂ©soudre ces problĂšmes, un grand ensemble de modifications est prĂ©sentĂ© , notamment: le refus de dĂ©finir les valeurs par dĂ©faut (cela doit ĂȘtre fait par les composants eux-mĂȘmes), la dĂ©lĂ©gation de validation de la configuration par eux-mĂȘmes composants, signature de chaque ConfigMap gĂ©nĂ©rĂ©, etc.



Et une autre fonctionnalité moins importante pour kubeadm est une porte de fonctionnalités appelée PublicKeysECDSA, qui inclut la possibilité de créer un cluster [via kubeadm init] avec des certificats ECDSA. La mise à jour des certificats existants (via kubeadm alpha certs renew) est également fournie, mais il n'existe aucun mécanisme permettant de basculer facilement entre RSA et ECDSA.



Autres changements



  • Le statut GA a reçu 3 fonctionnalitĂ©s dans le domaine de l'authentification: l' API CertificateSigningRequest , la restriction de l'accĂšs des nƓuds Ă  certaines API (via un plugin d'admission NodeRestriction), le bootstrap et le renouvellement automatique du certificat client Kubelet.
  • La nouvelle API d'Ă©vĂ©nements a Ă©galement Ă©tĂ© dĂ©clarĂ©e stable avec une approche modifiĂ©e de la dĂ©duplication (pour Ă©viter de surcharger le cluster avec des Ă©vĂ©nements).
  • (kube-apiserver, kube-scheduler, etcd ) debian distroless. : , ( — KEP).
  • Kubelet Docker runtime target-, TargetContainerName EphemeralContainer ( ).
  • « » .status.conditions, API .
  • kube-proxy IPv6DualStack Windows ( feature gate).
  • La porte de fonctionnalitĂ© avec un nom explicite CSIMigrationvSphere(migration du plug-in intĂ©grĂ© - dans l'arborescence - pour vSphere vers le pilote CSI) est passĂ©e Ă  la version bĂȘta.
  • Pour kubectl run un drapeau ajoutĂ©--privileged .
  • Un nouveau point d'extension a Ă©tĂ© ajoutĂ© au planificateur - , - qui dĂ©marre aprĂšs la phase .PostFilterFilter
  • -Containerd Cri support sur Windows a atteint beta.


Changements de dépendance:



  • version de CoreDNS incluse dans kubeadm - 1.7.0;
  • cri-tools 1.18.0;
  • CNI (Container Networking Interface) 0.8.6;
  • etcd 3.4.9;
  • la version de Go utilisĂ©e est 1.15.0-rc.1.


PS



Lisez aussi sur notre blog:






All Articles