Les 10 meilleurs trucs et astuces de Kubernetes



Il existe de nombreux ouvrages de référence sur Internet, mais parfois les conseils les plus simples deviennent les plus utiles. L'équipe Mail.ru Kubernetes aaS a traduit une sélection de dix trucs et astuces que l'auteur de l'article a collectés après un an de collaboration avec Kubernetes. Les conseils ne sont pas classés par importance, mais nous pensons que chacun trouvera quelque chose d'utile pour lui-même.

L'équipe la plus simple pour travailler avec Kubernetes


Pour commencer, peut-être l'action la plus simple et la plus utile pour travailler avec Kubernetes. La commande suivante active la saisie semi-automatique des commandes kubectldans le shell bash:

echo "source <(kubectl completion bash)" >> ~/.bashrc

La saisie semi kubectl- automatique sera écrite dans le fichier .bashrc et sera automatiquement activée à chaque démarrage du shell. Cela accélère un ensemble de commandes et de paramètres longs, tels que all-namespaces. Voir l' aide de Kubernetes bash pour plus de détails .

Restrictions par défaut sur la mémoire et le processeur dans l'espace de noms


Si l'application n'est pas écrite correctement, par exemple, chaque seconde, elle ouvre une nouvelle connexion à la base de données, mais ne la ferme jamais, une fuite de mémoire se produit dans le cluster. Et s'il n'y a pas de limite de mémoire pour l'application pendant le déploiement, cela peut entraîner une défaillance du nœud.

Pour éviter cela, Kubernetes vous permet de définir des restrictions par défaut pour chaque espace de noms. Ils sont écrits dans le fichier yaml pour un espace de noms spécifique. Voici un exemple d'un tel fichier:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

Créez un tel yaml et appliquez-le à n'importe quel espace de noms. Par exemple, dans un espace de noms limit-example. Désormais, pour tout conteneur déployé dans cet espace de noms, la limite 512 Mo s'applique, sauf si une autre limite individuelle est également définie pour ce conteneur.

Collecte des ordures dans les anciennes versions de Kubernetes


Par défaut, Kubelet démarre la récupération de place lorsque var / lib / docker occupe 90% de l'espace disque disponible. C'est très bien, cependant, avant Kubernetes 1.7, il n'y avait pas de limite par défaut sur le nombre d'inodes utilisés (inodes), qui correspond au nombre de fichiers dans le système de fichiers.

Potentiellement, votre conteneur var / lib / docker ne peut utiliser que 50% de l'espace disque, mais les inodes peuvent s'épuiser, ce qui causera des problèmes aux utilisateurs.

Dans les anciennes versions de kubelet de 1.4 à 1.6, vous devrez ajouter l'indicateur suivant:

--eviction-hard
=memory.available<100Mi,nodefs.available<10%,nodefs.inodesFree<5%

Dans les versions 1.7 et plus récentes, cet indicateur est défini par défaut. Cependant, les versions précédentes ne respectent pas la limite des inodes.

Minikube ... un Kubernetes local petit mais puissant


Minikube est le moyen le plus simple de démarrer un cluster Kubernetes local. Cela commence par une simple commande:

minikube start

À la suite de cette commande, un véritable cluster Kubernetes s'exécute sur votre ordinateur.


Source d'illustration L'

astuce consiste à créer l'application et à l'exécuter localement dans ce cluster. Sauf indication contraire, l'image Docker s'appuiera sur votre ordinateur, pas dans le cluster.

Pour forcer Docker à envoyer l'image au cluster Kubernetes local, la machine Docker reçoit la commande suivante:

eval $(minikube docker-env)

Nous pouvons maintenant créer des applications sur le cluster Kubernetes local.

Ne donnez pas accès à kubectl à tout le monde


Cela semble évident, mais si plusieurs équipes utilisent le même cluster pour leurs applications (pour lesquelles Kubernetes a été créé), vous ne devriez pas le donner à tout le monde kubectl. Il est préférable de séparer les équipes en donnant à chacune son propre espace de noms et en délimitant l'accès par les stratégies RBAC.

Vous pouvez vous embrouiller en enregistrant pour chaque module les droits d'accès, de lecture, de création, de suppression et d'autres opérations. Mais l'essentiel est de restreindre l'accès aux secrets, en ne le permettant qu'aux administrateurs. Nous distinguons donc ceux qui peuvent administrer le cluster et ceux qui peuvent simplement y déployer.

Gérer les budgets des foyers


Comment garantir aucun temps d'arrêt pour une application dans un cluster Kubernetes? PodDisruptionBudget et encore PodDisruptionBudget.

Les clusters sont régulièrement mis à jour et les nœuds sont vidés. Rien ne s'arrête, telle est la réalité. Dans chaque déploiement avec plusieurs instances, vous devez absolument inclure un PDB (PodDisruptionBudget). Il est créé dans un simple fichier yaml qui s'applique au cluster. La zone de couverture d'un PDB particulier est déterminée par des sélecteurs d'étiquettes.

Remarque: le budget de l'APB n'est pris en compte qu'en cas de perturbation volontaire . Dans des situations telles que des pannes matérielles, la PDB ne fonctionnera pas.

Exemple PDB:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: app-a-pdb
spec:
  minAvailable: 2
  selector:
      matchLabels:
        app: app-a

Deux paramètres principaux sont matchLabelset minAvailable. Le premier paramètre indique quelles applications ont un budget. Par exemple, si j'ai des déploiements avec des balises app: app-aet app: app-b, cette PDB ne s'appliquera qu'au premier.

Le paramètre est minAvailablepris en compte lors de la vidange (nettoyage) de l'unité. Par exemple, dans notre exemple, toutes les instances app: app-asauf deux sont supplantées pendant la dévastation .

Cela vous permet de contrôler le nombre d'instances de l'application à exécuter à un moment donné.

Surveillance de l'intégrité des applications


Cette surveillance est possible de deux manières: en utilisant des échantillons de préparation ou de vivacité.

Le premier test de préparation détermine si le conteneur est prêt à recevoir du trafic.

La seconde (vivacité) indique si le conteneur fonctionne ou doit être redémarré.

Les configurations appropriées sont simplement ajoutées à yaml pour le déploiement. Vous pouvez y spécifier des délais d'expiration, des délais et le nombre de tentatives. Voir la documentation de Kubernetes pour plus de détails .

Des balises partout


Les balises sont l'un des concepts fondamentaux de Kubernetes. Ils permettent aux objets de communiquer librement entre eux, ainsi que de créer des requêtes basées sur des étiquettes. Dans Kubernetes, vous pouvez même accéder au client et regarder les événements par des balises spécifiques.

À l'aide d'étiquettes, vous pouvez presque tout faire, mais un bon exemple serait de créer plusieurs environnements pour exécuter des programmes dans un cluster.

Supposons que vous utilisez le même cluster pour devet qa. Cela signifie que vous pouvez avoir une application app-as'exécutant simultanément dans les deux environnements qaet dev. Dans ce cas, nous pouvons accéder à l'instance d'application dans un environnement spécifique séparément en spécifiant le paramètre approprié environment. Par exemple, app: app-aet environment: devpour un environnement unique, et app: app-aetenvironment: qapour la seconde.

Cela vous permet d'accéder aux deux instances de l'application, par exemple, pour tester simultanément.

Mettre en ordre


Kubernetes est un système très puissant, mais tout système peut se retrouver enlisé dans un grand nombre de processus. Kubelet lance tous les processus et vérifications que vous spécifiez, ainsi que les vôtres.

Bien sûr, un service orphelin ne ralentira pas le système et Kubernetes a été initialement conçu pour évoluer. Mais si un million apparaît au lieu d'un service, le kubelet commence à s'étouffer.

Si, pour une raison quelconque, vous supprimez le déploiement (conteneur, image, etc.), assurez-vous de l'effacer complètement.

Apprenez à savoir go


Nous avons finalement sauvé les principaux conseils. Apprenez le langage de programmation Go.

Kubernetes est développé sur Go, toutes les extensions sont écrites sur Go et la bibliothèque cliente client-go est également officiellement prise en charge.

Il peut être utilisé pour des choses différentes et intéressantes. Par exemple, pour étendre le système Kubernetes à votre goût. Ainsi, vous pouvez utiliser vos propres programmes pour collecter des données, déployer des applications ou simplement nettoyer des conteneurs.

Apprendre le langage de programmation Go et maîtriser le client-go est peut-être le conseil le plus important que vous puissiez donner aux utilisateurs novices de Kubernetes.

Traduit avec le support de Mail.ru Cloud Solutions


All Articles