les meilleures pratiques d'exploitation et d'entretien de conteneurs

Cet article décrit un ensemble de meilleures pratiques pour rendre le récipient plus facile fonctionnement et l'entretien. Ces pratiques impliquent la sécurité, un large éventail de sujets tels que la surveillance et l'exploitation forestière, conçu pour rendre les applications plus faciles à exécuter Kubernetes moteur et réservoir général. De nombreuses pratiques abordées ici sont inspirés par la méthode d'approche du facteur facteur 12, 12 est de construire une application native nuage de ressources de haute qualité.

Degré d'importance de ces meilleures pratiques ne sont pas les mêmes. Par exemple, avec une certaine pratique, vous pouvez manquer dans leur cas afin de fonctionner avec succès dans un environnement de production, mais d'autres pratiques est indispensable. En particulier, l'importance des meilleures pratiques en matière de sécurité est subjective, si elles atteignent dépend de votre environnement et les contraintes.

Ces pratiques ne sont pas adaptés pour les lecteurs à base zéro, vous voudrez peut-être connaître quelques connaissances et Kubernetes de Docker. Certaines des meilleures pratiques décrites ici appliquent également aux navires de Windows, mais dans la plupart des cas, le nombre est supposé que vous utilisez conteneur Linux. Conseils sur la construction de conteneurs, voir les meilleures pratiques pour la construction de conteneurs.

En utilisant le mécanisme d'enregistrement des conteneurs natif

Importance: Haute

Dans le cadre de la gestion des applications, journal contient des informations précieuses qui peuvent faire comprendre les événements dans votre application. engagement Docker et Kubernetes pour simplifier la gestion du journal.

Traditionnellement serveur, vous devrez peut-être d'écrire des fichiers journaux spécifiques et connectez-vous processus de rotation pour éviter de remplir le disque. Si vous avez le système d'enregistrement avancé, vous pouvez utiliser ces journaux transmis au serveur distant pour les centraliser.

stdout journal et stderr peuvent être écrits à travers le récipient, le récipient fournit ainsi un moyen simple et standardisé dans le journal de processus. Docker capture ces lignes de journaux, et vous permet d'utiliser la commande pour accéder aux journaux d'docker eux. En tant que développeur d'application, vous n'avez pas besoin de mettre en uvre le mécanisme de journalisation avancée, essayez d'utiliser le mécanisme d'enregistrement natif de celui-ci.

les opérateurs de la plate-forme doivent fournir un système centralisé pour enregistrer et rechercher, vous pouvez utiliser fluentd et Stackdriver Logging Engine Kubernetes fournit. D'autres procédés courants comprennent l'utilisation de l'EFK (ElasticSearch, Fluentd, Kibana) pile.

Figure 1.  Kubernetes système typique de gestion des journaux de la figure.

journal JSON

La plupart des systèmes de gestion des journaux est en fait une base de données de séquence pour stocker des documents d'index de temps. Ces documents sont généralement fournis au format JSON. Dans Stackdriver Logging et EFK, une ligne de journal unique et certaines métadonnées (groupes de récipients, des conteneurs, et d'autres informations connexes noeud) sont stockées sous forme de document ensemble.

Vous pouvez différents domaines en vous connectant directement au format JSON. Ensuite, le journal peut être rechercher plus efficacement pour ces champs.

Par exemple, considérons le journal suivant la conversion format JSON:

foo - AVERTISSEMENT - foo.bar - Il y a quelque chose de mal.

Ceci est un journal après la conversion:

{ "Date": "01/01/201801:01:01", "Composant": "foo", "Sous-composante": "foo.bar", « Niveau »: « AVERTISSEMENT », « Message »: « Il y a quelque chose de mal. » }

Par cette conversion, vous pouvez facilement rechercher tous les journaux tous les journaux de niveau d'avertissement ou de composants foo.bar dans le journal.

Si vous décidez de vous connecter au format JSON, veuillez noter que vous devez joindre à l'événement sur chaque ligne afin de résoudre correctement. Dans la pratique, il ressemble à ce qui suit:

{ "Date": "01/01/201801:01:01", "composant": "foo", "sous-composant": "foo.bar", "niveau": "AVERTISSEMENT", "message": « Il il est quelque chose de mal. « }

Comme vous pouvez le voir, le résultat est beaucoup mieux que le journal lisible normal. Si vous décidez d'utiliser cette méthode, assurez-vous que votre équipe ne repose pas fortement sur l'inspection manuelle du journal.

agrégateur de mode d'enregistrement Sidecar

Certaines applications (comme Tomcat) les journaux ne peuvent pas être générés par une configuration simple. Ces différentes applications écrites dans un fichier journal sur le disque, le processus de la meilleure façon qu'ils Kubernetes en utilisant le mode d'enregistrement de sidecar. Sidecar est un petit récipient avec une application en cours d'exécution dans le même conteneur. Pour plus d'informations sur le side-car, consultez la documentation officielle Kubernetes.

Dans cette solution, vous ajoutez un proxy pour ouvrir une session application conteneur sidecar volume emptyDir, par exemple (dans la même nacelle,) et partagé entre deux conteneurs: l'exemple YAML sur GitHub. Ensuite, l'application de configuration pour se connecter dans le volume partagé, puis en lisant l'agent de journal de configuration, et transmis à l'endroit souhaité.

Dans ce mode, car aucun mécanisme d'enregistrement natif Docker et Kubernetes, il doit être traité rotation du journal. Si vous n'êtes pas connecté l'agent ne gère pas la rotation des journaux, dans la même nacelle d'un autre processus de conteneur de sidecar.

Figure 2. mode sidecar de gestion Log

Assurez-vous que le conteneur est apatride et immuable

Importance: Haute

Si vous êtes une première tentative du récipient, ne les traitez pas comme des serveurs traditionnels. Par exemple, vous pouvez mettre à jour l'application en cours d'exécution dans le conteneur ou les conteneurs pour un patch en cours d'exécution lorsque les vulnérabilités apparaissent. Au fond, le conteneur ne fonctionne pas de cette manière. Ils sont conçus pour devenir apatrides et ne peuvent pas être modifiés.

apatride

Désigne tout état sans état (tout type de données persistantes) sont stockés à l'extérieur du récipient. La mémoire externe peut prendre plusieurs formes, en fonction de vos besoins:

  • Pour stocker des fichiers, nous vous recommandons l'utilisation du Cloud Storage et d'autres objets sont stockés.

  • Pour stocker des informations telles que les sessions utilisateur, nous vous recommandons d'utiliser un temps d'attente de faible mémoire de valeur de clé externe, comme Redis ou Memcached.

  • Si le stockage du niveau souhaité (par exemple une base de données), peut être utilisé pour se connecter au conteneur de disque externe. Pour moteur Kubernetes, nous vous recommandons l'utilisation du disque persistant.

Par la méthode ci-dessus les données est retirée du conteneur lui-même, ce qui signifie que vous pouvez toujours fermer proprement et détruire le récipient, sans se soucier de la perte de données. Si vous créez un nouveau navire pour remplacer l'ancien conteneur, un nouveau conteneur est simplement connecté au même magasin de données ou se lier au même disque peut être.

invariance

des moyens Immuable que le conteneur ne sera pas modifié au cours de son cycle de vie: Aucune mise à jour, aucun correctif, aucune modification de la configuration. Si vous devez mettre à jour le code d'application ou d'un patch, vous devez construire une nouvelle image et redéployer. Invariance rendre le déploiement plus sûr et plus reproductible. Si vous devez rouler en arrière, vous pouvez simplement redéployer vieux miroir. Cette méthode vous permet de déployer le même conteneur miroir dans chaque environnement, pour les rendre plus cohérente possible.

Pour utiliser le même conteneur en miroir dans des environnements différents, nous vous recommandons de configuration du conteneur externalisez (port d'écoute, options exécution, etc.). Container est typiquement configuré avec un fichier de configuration variable d'environnement ou de montage sur un chemin particulier. En Kubernetes, vous pouvez utiliser l'ensemble confidentiel dictionnaire et configuration en tant que variables d'environnement ou fichiers de configuration seront injectés dans le récipient.

Si vous avez besoin de mettre à jour la configuration, utilisez la configuration mise à jour pour déployer de nouveaux conteneurs (basé sur la même image).

Figure 3. Comment mettre à jour le jeu de configuration monté sur le profil de déploiement dans les groupes de récipients disposés en

Stateless et invariance est l'un des points de vente de l'infrastructure à base de conteneurs combinés. Cette combinaison permet d'automatiser le déploiement et améliorer la fréquence et la fiabilité.

Évitez d'utiliser le privilège des conteneurs

Importance: Haute

Dans la machine virtuelle ou serveurs métal nu, vous évitez d'utiliser l'utilisateur root exécute l'application, la raison est très simple: Si l'application est attaqué, l'attaquant un accès complet au serveur. Pour la même raison, évitez d'utiliser les privilèges du conteneur. récipient Privilège est un conteneur, tous les appareils peuvent accéder à une multitude de fonctionnalités pour contourner presque tous les conteneurs de sécurité.

Si vous pensez besoin d'utiliser les privilèges du conteneur, considérez les alternatives suivantes:

  • Fournir des fonctionnalités spécifiques pour le conteneur par des options --cap-add ou signer SecurityContext de Kubernetes de Docker. Le document indique également le Docker activé par défaut et doit être activé explicitement fonctions.

  • Si vous devez modifier l'ensemble de l'application hôte pour exécuter, modifier les paramètres dans le conteneur de sidecar ou d'un conteneur d'initialisation. Contrairement à votre application, ces conteneurs ne doivent pas être exposés à la circulation interne ou externe, plus indépendant.

  • Si vous devez modifier sysctls dans Kubernetes, utilisez les notes spéciales.

Dans Kubernetes, le conteneur peut être interdit privilège Pod politiques de sécurité spécifiques. la politique de sécurité Pod est un administrateur de cluster pour configurer et gérer objet Kubernetes qui mettent en uvre des exigences spécifiques de la nacelle. En groupe Kubernetes, vous ne pouvez pas créer un pod en violation de ces exigences.

Il permet aux applications d'être facilement surveillés

Importance: Haute

Comme le journal, la surveillance fait partie intégrante de la gestion des applications. À bien des égards, le principe de la surveillance du conteneur d'application et contrôle de l'application non-conteneur du même. Cependant, étant donné que le conteneur d'infrastructures ont tendance à être très dynamique, avec de fréquents créer ou supprimer un conteneur, vous ne pouvez pas toujours aller reconfigurer le système de surveillance.

Vous pouvez distinguer deux types principaux de surveillance: boîte noire du moniteur et de surveillance boîte blanche. surveillance de la boîte noire se réfère à l'application de l'examen externe, vous êtes l'utilisateur final. Si vous voulez finalement fournir les services disponibles et valides, la surveillance de la boîte noire est utile. Parce qu'il est situé en dehors de l'infrastructure, la boîte noire a aucune différence entre l'infrastructure de surveillance classique et le récipient de l'infrastructure.

surveillance boîte blanche est l'utilisation d'une sorte d'accès privilégié pour vérifier l'application et les paramètres utilisateurs finaux virés ne peuvent pas voir. Comme la surveillance boîte blanche doit examiner la plus profonde infrastructure, donc une infrastructure très différente des traditions et de l'infrastructure conteneurisées.

Prometheus est un choix populaire communauté Kubernetes surveillée boîte blanche, trouvé automatiquement nécessaire pour surveiller le conteneur. Obtenez Metrics groupes Prometheus de conteneurs dans un format spécifique souhaité. Stackdriver peut surveiller Kubernetes groupe, les applications peuvent également exécuter leur propre de Prométhée. Découvrez comment activer Stackdriver Kubernetes Surveillance sur Kubernetes Engine.

Ce qui suit est un exemple de démonstration de suivi Stackdriver Kubernetes:

Figure 4.  Stackdriver Kubernetes Surveillance du tableau de bord

Stackdriver Kubernetes Suivi de Prométhée ou le bénéfice, selon les besoins de l'application à l'index format ouvert Prometheus. Vous pouvez faire les deux méthodes suivantes.

HTTP mesure point final

De même les mesures de santé HTTP et point final endpoint travaux publics applications mentionnées ci-dessous. Il est généralement de programme d'application sur les URI indicateurs internes / métriques. La réponse est la suivante:

http_requests_total {method = "post", code = "200"} 1027 http_requests_total {method = "post", code = "400"} 3 http_requests_total {method = "get", code = "200"} 10892 http_requests_total {method = "get", code = "400"} 97

Dans cet exemple, http_requests_total est une mesure, le code de méthode est une étiquette et, le numéro est la valeur extrême droite d'index pour ces étiquettes. Comme le montre la figure ci-dessus, depuis le début, l'application est un code d'erreur 400 en réponse à la requête HTTP GET 97.

Prometheus par la bibliothèque client multilingue existante, vous pouvez facilement générer ce point de terminaison HTTP. OpenCensus peut également utiliser ce format (ainsi que beaucoup d'autres caractéristiques) des indicateurs d'exportation. Ne pas exposer au point d'extrémité de réseau public.

Prometheus document officiel détaille le sujet. Vous pouvez également lire le chapitre 6 ingénierie de la fiabilité du site, pour en savoir plus d'informations sur la boîte blanche (et boîte noire) de surveillance.

Mode Sidecar pour la surveillance

Toutes les applications peuvent utiliser le / les paramètres de détection point final HTTP. Afin de maintenir un suivi standardisé, nous vous recommandons d'utiliser un indice d'exportation de mode sidecar dans le bon format.

Connexion mode agrégation sidecar sidecar décrit comment utiliser le conteneur pour gérer le journal des applications. Vous pouvez utiliser le même mode de surveillance: sidecar conteneur géré par l'agent de surveillance, l'agent ouvrira les applications métriques formats et protocoles de conversion pour le système mondial de suivi peut comprendre.

Prenons un exemple spécifique: les applications Java et Java Management Extensions (JMX). De nombreuses applications Java utilisent des métriques JMX ouvertes. Utilisez jmx_exporter, vous n'avez pas de réécrire les applications à l'index format ouvert Prometheus. jmx_exporter recueilli par les paramètres d'application JMX, et peut être lu par le Prometheus / paramètres décrits extrémité de celui-ci. Cette méthode a aussi l'avantage de limiter l'exposition de point final JMX, car il peut être utilisé pour modifier les paramètres de l'application.

Figure 5. Mode Sidecar pour la surveillance

L'exposition à la santé de l'application

Importance: moyenne

Pour faciliter la gestion de la production, la demande doit être communiquée à l'état de l'ensemble du système: si l'application est en cours? Il est en bonne santé? Il est prêt à recevoir le trafic il? Comment est-il exprimé?

Kubernetes Il existe deux types de contrôle de la santé: sonde active (sondes de vivacité) et sonde prête (sondes de préparation). Comme décrit ci-dessous, chacun avec un but spécifique. Vous pouvez obtenir de deux façons (y compris l'exécution d'une commande ou vérifier le port TCP dans le conteneur), mais la méthode préférée consiste à utiliser un point de terminaison HTTP, cette pratique décrite dans le meilleur de diverses façons. Pour plus d'informations sur ce sujet, consultez la documentation Kubernetes.

REMARQUE: Le chemin donné dans cette section est seulement une convention. point final HTTP chemin réel peut varier en fonction de l'application.

activité sonde

Atteindre la méthode de sonde active recommandée est de rendre le HTTP publique application / santé critère d'évaluation. Sur cette réception du point final de la demande, si elle est jugée en bonne santé, l'application doit envoyer une réponse « 200 OK ». En Kubernetes dans des moyens de santé que le conteneur n'a pas besoin d'être tué ou redémarré. Les facteurs qui influent sur la santé en raison de l'application, cependant, cela signifie généralement les suivantes:

  • L'application est en cours d'exécution.

  • Ses principales dépendances sont satisfaites (par exemple, il peut accéder à sa base de données).

sonde prête

Sonde Prêt méthode recommandée pour atteindre est d'avoir l'application ouverte / prêt point final HTTP. Dès réception d'une demande sur ce point final, si l'application est prête à recevoir le trafic, il doit envoyer une réponse « 200 OK ». Prêt à recevoir des moyens de circulation ce qui suit:

  • L'application est en bonne santé.

  • Effectuez une étape d'initialisation potentiel.

  • Toute demande valide est envoyée à l'application n'entraînera une erreur.

Kubernetes prêt pour sondes d'utilisation pour orchestrer le déploiement de l'application. Si le déploiement de la mise à jour, Kubernetes appartiendra à la nacelle déployée mise à jour progressive. La politique de mise à jour par défaut est mis à jour une fois par pod: Kubernetes attente d'un nouveau pod prêt (comme le montre la sonde prêt) avant la mise à jour à la nacelle suivante.

Remarque: Dans de nombreuses applications, / santé et / points d'extrémité en un seul prêt / point final de la santé, parce qu'il n'y a pas de différence réelle entre leur état de santé et de préparation.

Évitez de faire fonctionner en tant que root

Importance: moyenne

Conteneur fournit l'isolement: les paramètres par défaut, dans le processus des conteneurs Docker ne peuvent pas accéder aux informations de l'hôte ou d'autres conteneurs juxtaposés. Toutefois, étant donné que le conteneur partagé hôtes du noyau, les machines virtuelles et donc pas comme un isolement complet. Un attaquant pourrait trouver des vulnérabilités inconnues (dans Docker ou Linux lui-même noyau), ces vulnérabilités permettraient à un attaquant d'échapper du récipient. Si un attaquant fait des failles de trouver et de votre processus en tant que root dans un conteneur, ils auront un accès root à l'hôte.

6. Sur la gauche, une machine virtuelle utilise un matériel virtuel. Droit, conteneur d'application utilise le noyau hôte.

Pour éviter cette possibilité, les meilleures pratiques ne sont pas dans le processus de conteneur en tant que root. Vous pouvez utiliser PodSecurityPolicy appliquer ce comportement dans Kubernetes dans. Lorsque vous créez un pod dans Kubernetes en utilisant l'option RunAsUser pour spécifier l'utilisateur Linux est en cours d'exécution du processus. Cette méthode remplace la commande USER Dockerfile.

En fait, il y a des défis. De nombreux processus de progiciels exécute sa racine principale. Si vous voulez éviter de courir en tant que root, la conception de votre récipient avec un utilisateur non privilégié inconnu à courir. Cette approche signifie généralement que vous devez ajuster les autorisations de divers dossiers. Dans le récipient, un récipient selon les meilleures pratiques si une application et une application utilisateur (de préférence pas l'utilisateur root), puis donner tous les utilisateurs lisent et l'accès en écriture ne sont pas un problème pour les dossiers et les fichiers.

Une façon simple de vérifier si le navire en conformité avec cette meilleure pratique consiste à utiliser les utilisateurs aléatoires pour exécuter dans le conteneur local et test fonctionne correctement. remplacer  Est-ce le nom de votre conteneur.

docker run --user $ ((RANDOM + 1))

Si vous avez besoin d'un volume de conteneur externe, vous pouvez configurer l'option fsGroup Kubernetes à la propriété de ce volume accordé à un groupe particulier de Linux. Cette configuration permet de résoudre le problème de la propriété de fichier externe.

Si votre processus est exécuté par un utilisateur non privilégié, il ne se lie pas aux ports en dessous de 1024. Ce n'est pas un gros problème, parce que vous pouvez configurer le trafic de service Kubernetes acheminé d'un port à un autre port. Par exemple, vous pouvez configurer un serveur HTTP lié au port 8080, et de 80 services Kubernetes du port pour rediriger le flux de retour.

Version sélection rigoureuse en miroir

Importance: moyenne

Lorsque vous utilisez le miroir Docker, soit comme Dockerfile l'image de base, ou comme un Kubernetes miroir déployé, vous devez choisir utilisé une image miroir de l'étiquette.

La plupart des systèmes d'étiquettes privé et public miroir construit suivent les meilleures pratiques dans le conteneur. Si le miroir en utilisant une sémantique du système de contrôle de version, vous devez tenir compte des détails de l'étiquette.

La chose la plus importante est, l'étiquette « dernier » peut se déplacer fréquemment entre le miroir. Le résultat est que vous ne pouvez pas compter sur cet onglet pour construire prévisible ou reproductible. Par exemple, le Dockerfile suivant:

DE debian: dernier RUN apt-get update && -y \ apt-get -y install nginx

Si vous utilisez cette version Dockerfile deux miroirs à différents moments, vous vous retrouvez avec deux versions différentes de Debian et Nginx. Au lieu de cela, considérer cette édition révisée:

DE debian: 9.4 RUN apt-get update && -y \ apt-get -y install nginx

En utilisant une étiquette plus précise, vous pouvez vous assurer que l'image générée est toujours basée sur une sous-version spécifique de Debian. Parce que la version Debian de spécifique est également livré avec une version spéciale de Nginx, donc vous pouvez mieux contrôler l'image en cours de construction.

Lorsque ce résultat vaut non seulement pour la construction, mais aussi à terme. Si vous faites référence à l'étiquette « dernier » dans la liste Kubernetes, il n'y a aucune garantie la version Kubernetes à utiliser. Les différents nuds du cluster pourraient tirer la même à différents moments label « dernière ». Si l'étiquette a été mis à jour à un moment donné entre la traction, il peut se retrouver dans différents nuds de différentes image d'exécution (car en même temps marqué « dernier » étiquette).

Idéalement, vous devriez toujours être utilisé dans l'étiquette de la ligne ne peut pas être changé. Cet onglet vous permet de reproduire le bâtiment. Cependant, il y a des compromis la sécurité: plus vous utilisez la version fixe, plus le niveau de correctif de sécurité de l'automatisation dans le miroir. Si vous utilisez la sémantique correcte contrôle de version miroir, la version de patch (ie « de X.Y.Z » dans le « Z ») ne devrait pas être des changements incompatibles arrière: Vous pouvez utiliser la balise « X.Y » et corriger automatiquement les erreurs.

Remarque: tag Docker est pas vraiment la même chose. Tant que les propriétaires décident de changer l'image de l'étiquette. Cependant, l'étiquette de « X.Y.Z » est en fait presque toujours le même.

Imaginez un logiciel appelé « SuperSoft » de. Les procédures de sécurité supposent SuperSoft est de corriger les vulnérabilités grâce à une nouvelle version du patch. Vous souhaitez personnaliser Supersoft, et préparé le Dockerfile suivant:

DE Supersoft: 1.2.3 RUN a-commande

Après un certain temps, le fournisseur a trouvé une échappatoire, et a publié la version 1.2.4 SuperSoft pour résoudre ce problème. Dans ce cas, vous pouvez tenir au courant des correctifs SuperSoft et mise à jour Dockerfile. Si vous utilisez DE Supersoft en Dockerfile en: remplaçant 1.2, il va tirer automatiquement une nouvelle version.

Enfin, vous devez soigneusement examiner chaque système d'étiquette de rétroviseur extérieur est utilisé pour déterminer votre niveau de confiance dans la construction de ces images de la personne, et déterminer l'étiquette que vous souhaitez utiliser.

temps de singe joint quelques blocs longue rangée d'objets à la fin? Sous un tour de ......
Précédent
Perforer repère Shu occupé printemps touristes muets
Prochain
Python pointe avancée: coupé en deux avec une seule ligne de l'empreinte mémoire de code
BAIGNANT APE® apporter l'élément le plus mortel! « proportions épiques » la libération du produit unique!
En plus de surveiller la pile de la technologie open source ELK, il InfluxData le TICK
Premier trimestre 2019 en baisse de 1,6 milliard de résultats au box-office de la partie continentale ont continué à tomber en Mars, Avril « complexe avec 4 » Champion de réserve
UZI Tigers petite amie et sa petite amie enlacé dans les rues, une tante images fortes, la posture très professionnel
Chi Chuan GA6 modèles PHEV ou des informations de déclaration seront disponibles en Août
Chaussures modèle pourrait être à l'avant-garde si audacieux! Cette paire de goût artistique plein suprême x Vans assaut imminent!
repère Punch | deuxième élément scène comique fantastique est apparu Anneau Station Haitangxi
Roi de gloire: l'interprétation exquise, pourquoi êtes-vous encore attardait segment de platine? Après avoir lu le diamant facilement
Regardez ces, le moment clé cinq types courants d'accidents peut être en mesure de vous faire économiser
Ali cinquième piste
Pourquoi l'auto-SUV peut vendre si le feu, mais la voiture était autonome des ventes lamentables?