Remarque perev. : L'auteur de l'article original est Théo Chamley, un architecte Google Cloud. Dans cette publication pour le blog Google Cloud, il a présenté un bref extrait de la gestion plus détaillée de son entreprise, intitulé « Meilleures pratiques pour l'exploitation des conteneurs ». Dans ce document, les experts de Google ont rassemblé les meilleures pratiques pour exploiter des conteneurs dans le contexte de l'utilisation de Google Kubernetes Engine et non seulement aborder un large éventail de sujets: de la sécurité au suivi et à la journalisation. Alors, quelles pratiques de conteneur sont les plus importantes pour Google?
Le moteur Kubernetes (service basé sur Kubernetes pour exécuter des applications conteneurisées sur Google Cloud - environ la traduction ) est l'un des meilleurs moyens d'exécuter des charges de travail qui doivent être mises à l'échelle.
Kubernetes garantira le bon fonctionnement de la plupart des applications si elles sont conteneurisées. Mais si vous voulez que l'application soit facile à gérer et que vous souhaitiez tirer pleinement parti de Kubernetes, vous devez suivre les meilleures pratiques. Ils simplifieront le fonctionnement de l'application, sa surveillance et son débogage, tout en améliorant la sécurité.
Dans cet article, nous allons parcourir une liste de ce que vous devez savoir et faire pour le fonctionnement efficace des conteneurs dans Kubernetes. Ceux qui souhaitent se plonger dans les détails devraient lire les
meilleures pratiques pour le fonctionnement des conteneurs , ainsi que prêter attention à notre
précédent poste d' assemblage de conteneurs.
1. Utilisez des mécanismes de conteneur natifs pour la journalisation
Si l'application s'exécute dans un cluster Kubernetes, il n'en faut pas beaucoup pour les journaux. Un système de journalisation centralisé est probablement déjà intégré au cluster que vous utilisez. Dans le cas de l'utilisation du moteur
Kubernetes ,
Stackdriver Logging en est responsable.
( Remarque : si vous utilisez votre propre installation Kubernetes, nous vous recommandons de regarder de plus près notre solution Open Source - loghouse .) Ne compliquez pas votre vie et utilisez les mécanismes natifs pour la journalisation des conteneurs. Écrivez les journaux dans stdout et stderr - ils seront automatiquement reçus, enregistrés et indexés.
Si vous le souhaitez, vous pouvez également écrire des journaux au
format JSON . Cette approche permet de leur ajouter facilement des métadonnées. Et avec eux dans Stackdriver Logging, vous pourrez rechercher les journaux en utilisant ces métadonnées.
2. Assurez-vous que les conteneurs sont apatrides et immuables
Pour que les conteneurs fonctionnent correctement dans un cluster Kubernetes, ils doivent être sans état et immuables. Lorsque ces conditions seront remplies, Kubernetes pourra faire son travail, créer et détruire l'entité de l'application, quand et où cela sera nécessaire.
Sans état signifie que tout état (données persistantes de toute nature) est stocké en dehors du conteneur. Pour cela, selon les besoins, différents types de stockage externe peuvent être impliqués:
Cloud Storage ,
disques persistants ,
Redis ,
Cloud SQL ou autres bases de données gérées.
( Remarque : pour en savoir plus, consultez notre article « Opérateurs pour Kubernetes: comment exécuter des applications avec état ».)Immuable signifie que le conteneur ne sera pas modifié pendant sa durée de vie: pas de mises à jour, correctifs, changements de configuration. Si vous devez mettre à jour le code d'application ou appliquer un correctif, créez une nouvelle image et déployez-la. Il est recommandé de déplacer la configuration du conteneur (port d'écoute, options pour le
runtime, etc.) vers l'extérieur - dans
Secrets et
ConfigMaps . Ils peuvent être mis à jour sans avoir à créer une nouvelle image de conteneur. Vous pouvez utiliser
Cloud Build pour créer facilement des pipelines avec l'assemblage d'images.
( Remarque : nous utilisons l' outil open source dapp à cet effet.)
Exemple de mise à jour de la configuration de déploiement dans Kubernetes à l'aide de ConfigMap monté dans des pods comme configuration3. Évitez les conteneurs privilégiés
Vous n'exécutez pas d'applications en tant que root sur vos serveurs, non? Si un attaquant s'introduit dans l'application, il obtiendra un accès root. Les mêmes considérations s'appliquent à la non-exécution de conteneurs privilégiés. Si vous souhaitez modifier les paramètres sur l'hôte, vous pouvez donner au conteneur des
capacités spécifiques
en utilisant l'option
securityContext
dans Kubernetes. Si vous devez modifier
sysctls , Kubernetes a une
annotation distincte pour cela. En général, essayez de maximiser l'utilisation des
conteneurs init et sidecar pour effectuer de telles opérations privilégiées. Ils n'ont pas besoin d'accessibilité pour le trafic interne ou externe.
Si vous administrez un cluster, vous pouvez utiliser la
politique de sécurité des pods pour restreindre l'utilisation de conteneurs privilégiés.
4. Évitez d'exécuter en tant que root
Nous avons déjà parlé des conteneurs privilégiés, mais ce sera encore mieux si, en plus de cela, vous n'exécuterez pas d'applications à l'intérieur du conteneur en tant que root. Si un attaquant trouve une vulnérabilité à distance avec la possibilité d'exécuter du code dans une application avec des privilèges root, après quoi il peut quitter le conteneur à travers une vulnérabilité encore inconnue, il obtiendra root sur l'hôte.
La meilleure façon d'éviter cela est de ne rien exécuter en tant que root en premier lieu. Pour ce faire, vous pouvez utiliser la directive
USER
dans le
Dockerfile
ou
runAsUser
dans Kubernetes. L'administrateur de cluster peut également configurer l'application à l'aide de la
stratégie de sécurité des pods .
5. Rendez l'application facile à surveiller.
Comme la journalisation, la surveillance fait partie intégrante de la gestion de l'application. Une solution de surveillance populaire dans la communauté Kubernetes est
Prometheus , un système qui détecte automatiquement les modules et les services qui nécessitent une surveillance.
( Remarque : Voir également notre rapport détaillé sur la surveillance à l'aide de Prometheus et Kubernetes.) Stackdriver est capable de surveiller les clusters Kubernetes et inclut sa propre version de Prometheus pour la surveillance des applications.
Tableau de bord Kubernetes dans StackdriverPrometheus s'attend à ce que l'application transmette des métriques au point de terminaison HTTP.
Des bibliothèques clientes Prometheus sont disponibles pour cela. D'autres outils comme
OpenCensus et
Istio utilisent le même format.
6. Rendez disponible l'état de santé de l'application.
La gestion d'une application en production est facilitée par sa capacité à signaler son état à l'ensemble du système. L'application est-elle en cours d'exécution? Est-ce que ça va? Est-il prêt à recevoir du trafic? Comment se comporte-t-il? La façon la plus courante de résoudre ce problème consiste à implémenter
des contrôles d'intégrité . Kubernetes a deux types: les
sondes de vivacité et de préparation .
Pour une sonde de vivacité, l'application doit avoir un point de terminaison HTTP renvoyant une réponse «200 OK» si elle fonctionne et que ses principales dépendances sont satisfaites. Pour la sonde de préparation
(vérifier la disponibilité du service), l' application doit avoir un point de terminaison HTTP différent, renvoyant la réponse «200 OK» si l'application est dans un état sain, les étapes d'initialisation sont terminées et toute demande correcte ne conduit pas à une erreur. Kubernetes ne dirigera le trafic vers le conteneur que si l'application est prête conformément à ces vérifications. Deux critères d'évaluation peuvent être combinés s'il n'y a pas de différence entre la vivacité et la préparation.
Pour plus d'informations, consultez l'article connexe de Sandeep Dinesh, développeur des avocats de Google: «
Kubernetes best practices: Setting up health checks with readiness and viveness sondes ».
7. Choisissez soigneusement la version de l'image
La plupart des images publiques et privées utilisent un système de balisage similaire à celui décrit dans
Meilleures pratiques pour la construction de conteneurs . Si l'image utilise un système proche du
versioning sémantique , vous devez considérer les spécificités du balisage. Par exemple, la
latest
balise peut souvent passer d'une image à une autre - vous ne pouvez pas vous y fier si vous avez besoin d'assemblages et d'installations prévisibles et reproductibles.
Vous pouvez utiliser la balise
XYZ
(ils sont presque toujours inchangés), mais dans ce cas, gardez une trace de tous les correctifs et mises à jour de l'image. Si votre image a une balise
XY
, c'est une bonne option intermédiaire. En le choisissant, vous recevez automatiquement des correctifs et en même temps vous reposez sur une version stable de l'application.
PS du traducteur
Lisez aussi dans notre blog: