7 meilleures pratiques d'exploitation des conteneurs selon Google

Note de traduction.: L'auteur de l'article original est Théo Chamley, architecte de solutions cloud chez Google. Dans cette publication pour le blog Google Cloud, il présente un bref aperçu d'un guide plus détaillé de son entreprise, intitulé "Meilleures pratiques pour l'exploitation des conteneurs». Dans ce guide, des experts de Google ont rassemblé les meilleures pratiques pour l'exploitation des conteneurs dans le contexte de l'utilisation de Google Kubernetes Engine et au-delà, abordant une large gamme de sujets : de la sécurité à la surveillance et à la journalisation. Quelles sont donc, selon Google, les pratiques les plus importantes à suivre lors de l'utilisation des conteneurs ?

7 meilleures pratiques d'exploitation des conteneurs selon Google

Kubernetes Engine (un service basĂ© sur Kubernetes pour exĂ©cuter des applications conteneurisĂ©es dans Google Cloud — Note de traduction.) — est l'un des meilleurs moyens de dĂ©ployer des charges de travail nĂ©cessitant une mise Ă  l'Ă©chelle. Kubernetes Cela garantira le bon fonctionnement de la plupart des applications, Ă  condition qu'elles soient conteneurisĂ©es. Mais si vous souhaitez que votre application soit facile Ă  gĂ©rer et que vous souhaitiez tirer parti de tous les avantages de Kubernetes, il est nĂ©cessaire de suivre les meilleures pratiques. Celles-ci faciliteront l'exploitation de l'application, sa surveillance et son dĂ©pannage, tout en amĂ©liorant la sĂ©curitĂ©.

Dans cet article, nous passerons en revue les Ă©lĂ©ments Ă  connaĂźtre et Ă  mettre en Ɠuvre pour le fonctionnement efficace des conteneurs dans Kubernetes. Pour ceux qui souhaitent approfondir les dĂ©tails, nous vous encourageons Ă  lire le matĂ©riel Meilleures pratiques pour l'exploitation des conteneurs, ainsi qu'Ă  jeter un Ɠil Ă  notre article prĂ©cĂ©dent sur la crĂ©ation de conteneurs.

1. Utilisez les mécanismes natifs des conteneurs pour la journalisation

Si l'application s'exĂ©cute dans un cluster Kubernetes, il n'y a pas besoin de beaucoup de log. Un systĂšme de journalisation centralisĂ© est probablement dĂ©jĂ  intĂ©grĂ© dans le cluster utilisĂ©. Dans le cas de Kubernetes Engine, cela est gĂ©rĂ© par Stackdriver Logging. (Note de traduction.: Et dans le cas d'une installation Kubernetes autonome, nous recommandons d'explorer notre solution open source — loghouse.) Ne vous compliquez pas la vie et utilisez les mĂ©canismes de journalisation natifs des conteneurs. Écrivez les logs dans stdout et stderr — ils seront automatiquement rĂ©cupĂ©rĂ©s, stockĂ©s et indexĂ©s.

Si vous le souhaitez, vous pouvez également écrire les logs au format JSON. Cette approche permettra d'ajouter facilement des métadonnées. Et avec celles-ci, il sera possible de rechercher dans Stackdriver Logging les logs en utilisant ces métadonnées.

2. Assurez-vous que les conteneurs sont sans état et immuables

Pour un fonctionnement correct des conteneurs dans un cluster Kubernetes, ceux-ci doivent ĂȘtre sans Ă©tat et immuables. Lorsque ces conditions sont remplies, Kubernetes sera capable de remplir sa fonction en crĂ©ant et dĂ©truisant des entitĂ©s d'application quand et oĂč cela est nĂ©cessaire.

Sans Ă©tat signifie que tout Ă©tat (donnĂ©es permanentes de tout type) est stockĂ© en dehors du conteneur. Pour cela, selon les besoins, diffĂ©rents types de stockage externe peuvent ĂȘtre utilisĂ©s : Stockage Cloud, Disques Persistants, Redis, Cloud SQL ou d'autres bases de donnĂ©es gĂ©rĂ©es. (Note de traduction.: Pour en savoir plus, consultez Ă©galement notre article «OpĂ©rateurs pour Kubernetes : comment exĂ©cuter des applications stateful».)

Immuable signifie que le conteneur ne sera pas modifiĂ© durant sa vie : pas de mises Ă  jour, de correctifs, ou de modifications de configuration. Si vous devez mettre Ă  jour le code de l'application ou appliquer un correctif, crĂ©ez une nouvelle image et dĂ©ployez-la. Il est recommandĂ© de sortir la configuration du conteneur (port d'Ă©coute, options de l'environnement d'exĂ©cution, etc.) Ă  l'extĂ©rieur — dans Secrets et ConfigMaps. Ceux-ci peuvent ĂȘtre mis Ă  jour sans avoir besoin de reconstruire une nouvelle image de conteneur. Pour crĂ©er facilement des pipelines de construction d'images, vous pouvez utiliser Cloud Build. (Note de traduction.: Pour ces objectifs, nous utilisons l'outil Open Source dapp.)

7 meilleures pratiques d'exploitation des conteneurs selon Google
Exemple de mise à jour de la configuration Deployment dans Kubernetes à l'aide de ConfigMap, monté dans les pods comme configuration

3. Évitez les conteneurs privilĂ©giĂ©s

Vous ne lancez pas vos applications en tant que root sur vos serveurs, n'est-ce pas ? Si un attaquant pĂ©nĂštre dans l'application, il obtiendra l'accĂšs avec les droits root. Les mĂȘmes considĂ©rations s'appliquent pour ne pas lancer de conteneurs privilĂ©giĂ©s. Si vous devez modifier des paramĂštres sur l'hĂŽte, vous pouvez donner au conteneur des des capacitĂ©s avec l'option securityContext dans Kubernetes. Si vous devez modifier les sysctls, Kubernetes dispose d une annotation distincte pour cela. En gĂ©nĂ©ral, essayez d'utiliser au maximum les init- et les conteneurs sidecar pour effectuer des opĂ©rations privilĂ©giĂ©es similaires. Ils n'ont pas besoin d'ĂȘtre accessibles ni pour le trafic interne, ni pour le trafic 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 de lancer en tant que root

Il a déjà été question des conteneurs privilégiés, mais il serait encore mieux que vous ne lanciez pas d'applications en tant que root à l'intérieur du conteneur. Si un attaquant trouve une vulnérabilité à distance dans une application exécutée avec des droits root, lui permettant d'exécuter du code, puis réussit à sortir des limites du conteneur via une vulnérabilité encore inconnue, il obtiendra des droits root sur l'hÎte.

Le meilleur moyen d'éviter cela est avant tout de ne rien exécuter en tant que root. Pour cela, vous pouvez utiliser la directive UTILISATEUR dans Dockerfile ou runAsUser dans Kubernetes. L'administrateur du cluster peut également configurer un comportement forcé à l'aide de la Politique de Sécurité des Pods.

5. Rendez l'application facile Ă  surveiller

Tout comme le journalisation, la surveillance est une partie intĂ©grante de la gestion de l'application. Une solution populaire de surveillance dans la communautĂ© Kubernetes est Prometheus — un systĂšme qui dĂ©couvre automatiquement les pods et les services nĂ©cessitant une surveillance. (Note de traduction.: Voir Ă©galement notre rapport dĂ©taillĂ© sur la surveillance avec Prometheus et Kubernetes.) Stackdriver peut surveiller les clusters Kubernetes et inclut sa propre version de Prometheus pour la surveillance des applications.

7 meilleures pratiques d'exploitation des conteneurs selon Google
Le tableau de bord Kubernetes dans Stackdriver

Prometheus s'attend à ce que l'application expose des métriques sur un endpoint HTTP. Pour cela, des bibliothÚques clientes Prometheussont disponibles. Un format similaire est utilisé par d'autres outils comme OpenCensus et Istio.

6. Rendez l'état de santé de l'application accessible

La gestion d'une application en production est aidĂ©e par sa capacitĂ© Ă  communiquer son Ă©tat Ă  l'ensemble du systĂšme. L'application est-elle en cours d'exĂ©cution ? Est-elle en bon Ă©tat ? PrĂȘte Ă  recevoir du trafic ? Comment se comporte-t-elle ? La maniĂšre la plus courante de rĂ©soudre ce problĂšme est de mettre en Ɠuvre des contrĂŽles de santĂ© (health checks). Kubernetes a deux types : liveness et readiness probes.

Pour un liveness probe (contrĂŽle de l'Ă©tat de vie) l'application doit avoir un endpoint HTTP renvoyant une rĂ©ponse « 200 OK » si elle fonctionne et que ses principales dĂ©pendances sont satisfaites. Pour un readiness probe (contrĂŽle de la disponibilitĂ©) L'application doit avoir un autre point de terminaison HTTP, renvoyant une rĂ©ponse « 200 OK », si l'application est en bon Ă©tat, que les Ă©tapes d'initialisation sont terminĂ©es et qu'aucune requĂȘte correcte ne gĂ©nĂšre d'erreur. Kubernetes dirigera le trafic vers le conteneur uniquement lorsque l'application sera prĂȘte selon ces vĂ©rifications. Les deux points de terminaison peuvent ĂȘtre combinĂ©s si l'Ă©cart entre les Ă©tats de viabilitĂ© (liveness) et de prĂ©paration (readiness) n'existe pas.

Pour en savoir plus, vous pouvez lire l'article correspondant de Sandeep Dinesh, Developer Advocate chez Google : «Meilleures pratiques Kubernetes : Configuration des vérifications de santé avec des sondes de préparation et de viabilité».

7. Choisissez attentivement 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 construire des conteneurs. Si l'image applique un systĂšme proche de la version sĂ©mantique, il faut tenir compte des spĂ©cificitĂ©s du balisage. Par exemple, la balise latest peut souvent ĂȘtre dĂ©placĂ©e d'une image Ă  l'autre — elle ne peut pas ĂȘtre fiable si vous avez besoin de constructions et d'installations prĂ©visibles et reproductibles.

Vous pouvez utiliser la balise X.Y.Z (elles sont presque toujours constantes), mais dans ce cas, suivez tous les correctifs et mises à jour de l'image. Si l'image utilisée a la balise X.Y, c'est une bonne option de compromis. En choisissant celle-ci, vous obtenez automatiquement des correctifs tout en vous appuyant sur une version stable de l'application.

P.S. de l'auteur

Lisez aussi dans notre blog :

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster