Top 10 des trucs et astuces Kubernetes

Top 10 des trucs et astuces Kubernetes

Il existe de nombreux ouvrages de référence sur Internet, mais parfois les conseils les plus simples sont les plus précieux. Équipe Kubernetes aaS de Mail.ru traduit une sélection de dix trucs et astuces, que l'auteur de l'article a collecté après un an de travail avec Kubernetes. Les conseils ne sont pas classés par importance, mais nous pensons que chacun y trouvera quelque chose d'utile.

La commande la plus simple pour travailler avec Kubernetes

Pour commencer, c'est peut-être l'action la plus simple et la plus utile pour travailler avec Kubernetes. La commande suivante permet l'achèvement de la commande kubectl dans le shell bash :

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

Autocomplete kubectl sera écrit dans le fichier .bashrc et sera automatiquement activé à chaque démarrage du shell. Cela accélère la saisie de commandes et de paramètres longs tels que all-namespaces. Lire la suite dans Aide Kubernetes bash.

Limites de mémoire et de processeur par défaut dans un espace de noms

Si l'application est mal écrite, par exemple si elle ouvre une nouvelle connexion à la base de données toutes les secondes mais ne la ferme jamais, alors le cluster présente une fuite de mémoire. Et si l'application n'a pas de limite de mémoire définie lors du déploiement, cela peut entraîner une panne de nœud.

Pour éviter cela, Kubernetes vous permet de définir des restrictions par défaut par 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, à l'espace de noms limit-example. Désormais, tout conteneur déployé dans cet espace de noms aura une limite de 512 Mi, à moins qu'une autre limite individuelle ne soit définie en plus pour ce conteneur.

Collecte des déchets dans les anciennes versions de Kubernetes

Kubelet démarre par défaut le garbage collection lorsque var/lib/docker occupe 90% de l'espace disque disponible. C'est formidable, cependant, jusqu'à Kubernetes 1.7, il n'y avait pas de limite par défaut sur le nombre d'inodes utilisés, qui correspondent au nombre de fichiers dans le système de fichiers.

Potentiellement votre conteneur var/lib/docker peut n'utiliser que 50 % de l'espace disque, mais peut manquer d'inodes, ce qui posera des problèmes aux travailleurs.

Dans les anciennes versions de kubelet de 1.4 à 1.6, vous devrez ajouter ce drapeau :

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

Dans les versions 1.7 et ultérieures, cet indicateur est défini par défaut. Cependant, les versions précédentes ne surveillent pas la limite des inodes.

Minikube... Kubernetes local petit mais puissant

Minikube est le moyen le plus simple d'exécuter un cluster Kubernetes local. Il se lance avec une simple commande :

minikube start

L’exécution de cette commande entraîne l’exécution d’un véritable cluster Kubernetes sur votre ordinateur.

Top 10 des trucs et astuces Kubernetes
Source des illustrations

L'astuce consiste à savoir comment créer l'application et l'exécuter localement sur ce cluster. Sauf indication contraire, l'image Docker sera créée sur votre ordinateur et non sur le cluster.

Pour forcer Docker à transférer l'image vers le cluster Kubernetes local, la machine Docker reçoit la commande suivante :

eval $(minikube docker-env)

Nous pouvons désormais créer des applications sur un 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 (ce pour quoi Kubernetes a été créé), vous ne devriez pas simplement donner à tout le monde kubectl. Il est préférable de séparer les commandes, en attribuant à chacune d'elles son propre espace de noms et en limitant l'accès à l'aide des politiques RBAC.

Vous pouvez être confus en attribuant des droits d'accès, de lecture, de création, de suppression et d'autres opérations pour chaque pod. Mais l'essentiel est de limiter l'accès aux secrets, en l'autorisant uniquement aux administrateurs. De cette façon, nous ferons la différence entre ceux qui peuvent administrer le cluster et ceux qui peuvent simplement y déployer.

Gérer les budgets des pods

Comment garantir l’absence de temps d’arrêt d’une application dans un cluster Kubernetes ? PodDisruptionBudget et encore PodDisruptionBudget.

Les clusters sont périodiquement mis à jour et les nœuds sont vidés. Rien ne s’arrête, c’est la réalité. Chaque déploiement avec plusieurs instances doit inclure un PDB (PodDisruptionBudget). Il est créé dans un simple fichier yaml appliqué au cluster. La zone de couverture d'un PDB particulier est déterminée par les sélecteurs d'étiquettes.

Note: Le budget PDB n'est pris en compte que lorsque la violation du budget est réversible (perturbation volontaire). Dans des situations telles que des pannes matérielles, PDB ne fonctionnera pas.

Exemple de PDB :

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

Les deux paramètres principaux sont matchLabels и minAvailable. Le premier paramètre précise à quelles applications le budget s'applique. Par exemple, si j'ai des déploiements avec des étiquettes app: app-a и app: app-b, alors ce PDB ne s'appliquera qu'au premier.

Paramètre minAvailable pris en compte lors de la vidange (nettoyage) du nœud. Par exemple, dans notre exemple, lors du vidage, toutes les instances sont expulsées app: app-a, sauf deux.

Cela vous permet de contrôler le nombre d'instances de l'application qui doivent être exécutées à un moment donné.

Surveillance de l’état des applications

Un tel suivi est possible de deux manières : à l'aide de tests de préparation ou de vivacité.

La première sonde (état de préparation) détermine l'état de préparation du conteneur à recevoir du trafic.

La seconde (vivabilité) indique si le conteneur est sain ou doit être redémarré.

Les configurations pertinentes sont simplement ajoutées au yaml pour le déploiement. Vous pouvez y spécifier des délais d'attente, des délais et le nombre de nouvelles tentatives. Voir plus de détails à leur sujet Documentation Kubernetes.

Les tags sont partout

Les étiquettes sont l'un des concepts fondamentaux de Kubernetes. Ils permettent aux objets de communiquer librement entre eux et 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 pour des balises spécifiques.

Vous pouvez faire presque tout avec les balises, mais un bon exemple serait de créer plusieurs environnements pour exécuter des programmes sur le même cluster.

Disons que vous utilisez le même cluster pour dev и qa. Cela signifie que vous pouvez avoir une application app-a, travaillant simultanément dans les deux environnements qa и dev. Dans ce cas, nous pouvons accéder séparément à l'instance d'application dans un environnement spécifique en spécifiant le paramètre approprié environment. Par exemple, app: app-a и environment: dev pour un environnement, et app: app-a и environment: qa pour le deuxième.

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

Mettez les choses en ordre

Kubernetes est un système très puissant, mais tout système peut finir par s'enliser dans un trop grand nombre de processus. Le Kubelet exécute tous les processus et vérifications que vous spécifiez, ainsi que les siens.

Bien entendu, un service orphelin ne ralentira pas le système, et Kubernetes est conçu pour évoluer à partir de zéro. Mais si au lieu d'un service, un million apparaît, le kubelet commence à s'étouffer.

Si, pour une raison quelconque, vous supprimez un déploiement (conteneur, image, etc.), assurez-vous simplement d'effectuer un nettoyage complet.

Rencontrez Go

Nous avons gardé les principaux conseils pour la fin. Apprenez le langage de programmation Go.

Kubernetes est développé en Go, toutes les extensions sont écrites en Go et la bibliothèque client 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 client-go est peut-être le conseil le plus important que vous puissiez donner aux nouveaux utilisateurs de Kubernetes.

Traduit avec le soutien de Mail.ru Cloud Solutions

Quoi d'autre à lire:

  1. Trois niveaux d'autoscaling dans Kubernetes et comment les utiliser efficacement.
  2. Nœuds de travail Kubernetes : plusieurs petits ou quelques grands?
  3. 25 outils utiles pour déployer et gérer Kubernetes.

Source: habr.com

Ajouter un commentaire