Introduction au docker du développeur WordPress, partie 3: kubernetes
Permettez – moi de m’excuser avant de commencer ce long tutoriel. Il s’agit de la troisième partie (voir première et deuxième parties) et il m’a fallu des mois pour l’écrire pour deux raisons: premièrement, en tant que fondateur de l’entreprise, ma présence et mon attention ont besoin d’un autre endroit, et deuxièmement, je veux que notre site fonctionne sur cette configuration pendant un certain temps, donc je suis sûr que ce que j’ai écrit donnera de bons résultats, Fiable et performant. De plus, lorsque nous allons déployer cette solution en utilisant Google Cloud, n’oubliez pas que nous allons exécuter deux serveurs virtuels relativement petits, ce qui coûtera quelques dollars (pendant que vous exécutez ces serveurs pour suivre les tutoriels), alors assurez – vous de les supprimer complètement une fois que vous avez terminé. La bonne nouvelle est que si vous n’avez jamais utilisé Google Cloud auparavant, Google vous donnera un bonus de 300 $pour essayer!
Allons – y! En bref, kubernets est un outil d’orchestration de conteneurs. Cela signifie qu’il doit faire tout le travail lourd pour s’assurer que nos conteneurs fonctionnent correctement, détruire les conteneurs inutiles ou démarrer de nouveaux conteneurs, s’assurer que le trafic entre eux est acheminé correctement, et beaucoup d’autres choses utiles, dont la plupart doivent être faites manuellement dans le monde traditionnel de la gestion des serveurs. Pourquoi pas docker Swarm? Tout d’abord, je n’ai aucune expérience dans ce domaine, et deuxièmement, cubenetes est en train de devenir un leader du marché dans la gestion des conteneurs. Il y a aussi une bonne raison, parce qu’il s’agit d’un projet Open source de Google, qui a une certaine compréhension de la technologie des serveurs et des obstacles qu’elle crée.
Nous nous référerons à plusieurs entités (dans kubernets, ces entités sont définies en utilisant le fichier YAML) que nous utiliserons dans ce tutoriel et qui méritent d’être mentionnées à l’avance, mais qui pourraient devenir plus
Dans l’utorial précédent, nous pouvons lui permettre de lire des variables d’environnement, des valeurs codées assez strictes.
La deuxième partie est beaucoup plus compliquée. Nous avons besoin que tous les conteneurs partagent le même contenu WP, ce qui signifie que nous devons configurer un disque réseau sur lequel le répertoire sera stocké. Heureusement, kubernetes prend immédiatement en charge une solution appelée glusterfs et est très simple à configurer! Sur la page instances listées, cliquez sur créer une instance, puis sélectionnez à nouveau le micro de la machine et insérez – le dans la zone où se trouve le cluster conteneur. Gluster – 1. La création d’une instance glusterfs crée l’instance et en crée une autre lorsque l’Instance est configurée avec les mêmes paramètres, mais gluster – 2.
Oui, nous avons besoin de deux instances glusterfs pour deux raisons: premièrement, nous avons une redondance; deuxièmement, à des fins éducatives, l’écran d’instance VM devrait maintenant ressembler à ceci: Toutes nos instances du moteur de calcul si vous avez remarqué lors de la création des instances des paragraphes précédents, vous avez peut – être remarqué que le coût par instance est d’environ 4 $par mois, ce qui signifie que cette configuration nous coûtera environ 20 $par mois, ce qui n’est pas cher! Bien sûr, pour la production, vous aurez probablement besoin d’instances plus puissantes, mais vous devriez être en mesure de faire fonctionner la pile entière pour moins de 100 $par mois. Oui, ce n’est pas un simple réglage de blog, mais c’est un coût raisonnable lorsque vous avez besoin de disponibilité et de performance.
Commencez à configurer glusterfs maintenant! Pour continuer, vous devez d’abord installer le SDK Google, qui vous permettra de vous connecter à n’importe quelle instance via un shell. Je ne décrirai pas les paramètres ici parce que la documentation officielle contient des lignes directrices étape par étape pour les rendre fonctionnels. Una vo
Allez – y. Il est important de noter qu’il n’y a pas de concept de noeud maître \/ esclave et que tous les serveurs sont appelés serveurs Peer – to – peer parce que les clients qui montent les volumes glusterfs peuvent se connecter et lire \/ écrire l’un d’eux.
Nous retournons à la console Cloud et vérifions les adresses IP internes des noeuds glusterfs, car nous devons les connecter les uns aux autres. Dans mon cas, IP est 10.132.0.5 (nous appelons ce noeud gluster – 1) et 10.132.0.6 (gluster – 2). En exécutant $gluster peer Probe 10.132.0.6 sur gluster – 1 et $gluster peer Probe 10.132.0.5 sur gluster – 2, nous avons exploré ces deux instances entre elles, ce qui signifie qu’elles se connaissent maintenant, mais aucun volume n’a été fourni, donc nous allons le faire plus tard. Sur les deux noeuds, créez un répertoire qui sera un volume séparé mais répliqué appelé WP content site1 (répliqué signifie que des répertoires spécifiques sont toujours synchronisés sur les deux noeuds). Je recommande un nom plus spécifique, car vous voudrez peut – être plus de sites Web pour monter le contenu WP à partir du même noeud glusterfs (ne vous inquiétez pas pour wordpress pour le moment, nous pouvons monter ce volume dans WP avec un nom complètement différent). Pour créer un répertoire, lancez $MkDir – P \/ data \/ brick1 \/ WP – content – site1! Puisque les deux noeuds ont leurs propres répertoires, tout ce que nous avons à faire est de créer un volume glusterfs. Sur gluster – 1, lancez la commande suivante: $$gluster volume create WP – content – site1 Replica 2 10.132.0.5: \/ data \/ brick1 \/ WP – content – Site 1 10.132.0.6: \/ data \/ brick1 \/ WP – content – Site 1 10.132.0.6: \/ data \/ brick1 \/ WP – content – site1 force $gluster volume Start Start WP – content – site1 $MkDir – P \/ MNT \/ WP – content – site1 $Mount – t – glusterfs 10.132.0.0.5:: \/ data \/ brick1 \/ WP – content – site1: \/ data \/ brick1 \/ WP – content – site1: $$gluster volume – Volume create WP – content – Site 1 10.132.0.5:: \/ data \/ data \/ brick1 \/ WP – content – site1 \/ MNT \/ WP – content – site1 $Touch \/ MNT \/ WP – content – site1 \/ test. Voyons ce qu’on vient de faire. Tout d’abord, nous avons créé un nouveau volume qui a été copié sur les deux noeuds et qui utilise le paramètre force, sinon glusterfs se plaint
Il préfère avoir un volume sur un disque externe. Ensuite, nous avons lancé le volume nouvellement créé, ce qui signifie que le client externe peut maintenant se connecter à l’un ou l’autre de ces noeuds pour monter le volume sur lui – même. En fait, c’est ce que nous avons fait à l’étape 4, où nous avons monté le volume sur le noeud lui – même via glusterfs. (Note: Ne confondez pas \/ data \/ brick1 \/ WP – content – site1 avec \/ MNT \/ WP – content – site1 – le premier est le système de fichiers utilisé par glusterfs, et le second est simplement monté pour tester le volume, et nous pourrions sauter cette étape.) Enfin, nous avons créé un fichier de test sur gluster – 1, et si nous avions lancé $Ls \/ data \/ brick1 \/ WP – content – site1, il devrait maintenant être listé sur gluster – 2. Vous pouvez maintenant désassembler \/ MNT \/ WP – content – site1, mais laissez – nous tel quel, car c’est le répertoire que nous utiliserons comme contenu WP (n’hésitez pas à quitter le shell sur gluster – 2 – vous n’en aurez plus besoin). Ainsi, avant de fermer le shell gluster – 1, nous téléchargerons WordPress et extrayons le contenu WP: + $CD \/ MNT \/ WP – content – site1 – wget https:\/\/wordpress.org\/latest.tar.gz – la dernière version de $Tar zxf. Goudron Gz – MV WordPress \/ WP content \/ *. – La dernière version de RM RF WordPress. Goudron Gz – chown – R 1000: 1000 $. Notez qu’à l’avenir, si vous devez modifier le contenu de WP, qui est le Répertoire dans lequel vous effectuerez les changements, les changements seront automatiquement propagés correctement aux deux noeuds. De plus, gardez à l’esprit que nous avons défini les permissions utilisateur \/ groupe avec uid \/ gid 1000 parce que notre image WordPress définit l’utilisateur et le Groupe de données www au même ID, donc nous avons évité tout problème d’autorisation. Comme ça, n’hésitez pas à fermer le boîtier, notre Cluster glusterfs est maintenant correctement configuré et peut être installé dans n’importe quel nombre de nacelles kubernets que nous voulons! Configurer MySQL heureusement, Google Cloud offre un produit MySQL hébergé qui peut
L’anti – configuration est très simple, en fait en quelques clics. Dans la console Cloud, allez à SQL (si le menu n’est pas visible, cliquez sur l’icône hamburger en haut à droite) et sélectionnez créer une instance. Sur la page suivante, sélectionnez MySQL, puis sélectionnez deuxième génération. Vous devriez maintenant vous familiariser avec les écrans suivants: La configuration de l’Instance MySQL est facultative pour sélectionner le même type de machine que nous avons fait pour tous les autres services: DB – F1 – micro. Comme l’interface peut vous avertir que cette machine n’est pas dans le champ d’application de Google SLA, elle est idéale pour les tests et le développement, et c’est toujours ce que nous faisons ici. Sélectionnez l’emplacement de l’Instance dans la même zone \/ zone que le cluster conteneur pour minimiser la latence du réseau. MySQL de Google prend en charge la réplication FAILOVER disponible à tout moment, vous n’avez qu’à sélectionner la case à cocher créer une réplication FAILOVER, mais nous n’utilisons pas cette case à cocher pour le moment: Nous pouvons revenir à l’instance principale à tout moment pendant qu’elle est en cours d’exécution et la créer plus tard. Enfin, créez un mot de passe racine pour MySQL (n’oubliez pas de l’enregistrer en lieu sûr), puis cliquez sur créer en bas. Après quelques minutes, votre instance devrait être prête, Donc continuez à la valider en cliquant sur le nom de l’instance (dans mon exemple, MySQL – 0). Il n’y a rien à faire ici maintenant, mais vous pouvez retourner à cette page plus tard pour ajouter des répliques, des sauvegardes et vérifier leurs performances. Avant de continuer à configurer kubernets, vous n’avez qu’une seule chose à faire: un compte de service. Il s’agit de types spéciaux de comptes qui sont utilisés par le service et non par les personnes, avec des détails supplémentaires tels que les clés privées et les rôles. Pour créer un compte de service, allez à la page comptes de service (sous iam et admin dans la navigation principale), cliquez sur créer un compte de service et remplissez le formulaire ici
Le navigateur vous permet – il d’autoriser Shell $gcloud config set Project Avian Current – 168511 à définir le projet actif actuel $gcloud config set Compute \/ zone Europe – west1 – B à définir le fuseau horaire $gcloud Container Clusters get Credentials cluster – 1 à enregistrer les paramètres dans un fichier local votre commande kubectl devrait maintenant être disponible et connectée Au bon Cluster. Pour vérifier, lancez $kubectl get pods – – tous les espaces de noms doivent renvoyer ce qui suit: La liste des pods dans le terminal est similaire à Container, comme indiqué ci – dessus, où vous pouvez voir quelques pods sous l’espace de noms du système KUBE, qui sont créés automatiquement par le moteur de conteneur Google et sont nécessaires pour le bon fonctionnement du cluster, donc vous pouvez vouloir les garder seuls pour que notre WordPress fonctionne correctement, Nous devons d’abord définir quelques secrets, et surtout les identifiants de Connexion MySQL. Vous vous souvenez du fichier de compte de service que nous avons créé plus tôt (appelé my-project-name-12345.json)? Il est temps de l’utiliser; Copiez – le dans le Répertoire du projet et renommez – le en justificatifs d’identité. Json et Run: $kubectl créent des identifiants d’instance cloudsql génériques confidentiels – – à partir du fichier = identifiants. Json pour vérifier que vos secrets sont correctement distribués, lancez $kubectl Edit secret cloudsql instance Credentials. Ceci ouvre un éditeur (probablement Vim) qui contient une clé de données appelée identifiants. Json, la valeur contenue dans le fichier de justificatifs d’identité original, codée en base64. Bien que cela puisse sembler déroutant au début, c’est logique. Comme indiqué ci – dessus, lorsque kubernets utilise des secrets, ils sont montés comme des fichiers réguliers dans le système de fichiers, kubernets décode automatiquement et vous verrez bientôt. Appuyez sur: Q (deux points, puis appuyez sur q) pour fermer Vim. Les secrets que nous venons de créer seront utilisés
Mais pas par notre WordPress, donc nous devons créer un autre ensemble de secrets sans lesquels wordpress ne peut pas travailler. Monte dans la voiture. Dans votre répertoire de projet, créez un nouveau répertoire et k8s (abréviation de kubernets) et saisissez le fichier suivant, appelé WordPress secrets. Yml: [points clés] https:\/\/gist.github.com\/tomazzaman\/5639efa1cf694f629008345e35a12baf#file – WordPress secrets yml \/] comme indiqué dans le fichier, Vous devez convertir chaque sel et clé WordPress (généré ici avec sa valeur encodée base64, ceci est fait avec la commande suivante: $echo \
Une fois que omalo est configuré, certaines commandes sont très utiles pour enquêter sur ce qui se passe: $kubectl logs wordpress – 498979938 – 258sj générera un journal pour un POD donné. Si le POD est dans un cycle de redémarrage, vous devrez peut – être ajouter -. Ou, visitez la page Google log et visualisez – les dans un navigateur $kubectl exec – Ti wordpress – 498979938 – 258sj Bash se connectera au Shell POD, comme SSH $ Kubectl delete POD wordpress – 498979938 – 258sj supprimera le POD et comme nous utilisons Deployment, un nouveau POD sera automatiquement créé à son emplacement. Exposer WordPress à Internet le tutoriel officiel recommande la création d’un Service de type loadbalancier pour exposer les ports sur les pods, mais ce n’est pas vraiment une bonne pratique pour plusieurs raisons: Nous ne pouvons pas contrôler quels services IP seront exposés et nous devons gérer la terminaison SSL nous – mêmes, Ajout d’un autre niveau de complexité que nous devons maintenir, ou d’une responsabilité accrue à l’égard de l’image nous ne pouvons pas exposer plus d’un domaine sur la même IP nos journaux n’afficheront pas l’IP correcte du visiteur, mais plutôt l’IP interne de notre service, donc ce que nous devons faire est de créer un service, comme nodeport. Ce type de service associe notre port conteneur 80 à tous les noeuds du cluster, que le conteneur soit sur un noeud spécifique ou non, et que le conteneur soit sur n’importe quel port supérieur à 30 000. [halètements] https:\/\/gist.github.com\/tomazzaman\/5639efa1cf694f629008345e35a12baf#file – WordPress Service yml \/] enregistrez ce fichier dans le Répertoire k8s et lancez le Service $kubectl create – f WordPress. Yml. Pour vérifier que le Service a créé les paramètres nécessaires, lancez $kubectl get SVC, EP. Si vous voyez la capture d’écran ci – dessous, le service achemine correctement le trafic du port 31586 du noeud (dans mon cas, le vôtre peut être différent) vers le port
Vous pouvez agrandir l’affichage. Il se passe beaucoup de choses là – Bas: il y a un front clair, Il s’agit d’une IP et d’un port que nous acceptons pour le trafic. Il y a des règles définies (nous l’avons fait avec notre entrée). Il y a un Backend défini (Google l’a fait pour nous). Je vous encourage à changer cette configuration du système d’équilibrage de charge et à cliquer un peu pour voir comment combiner les choses: Je ne vais pas l’expliquer en détail ici parce que Les tutoriels sont assez longs et les documents officiels de Google peuvent être une bonne source d’apprentissage. De plus, si vous souhaitez conserver la nouvelle IP que Google a assignée à l’entrée, visitez la page des adresses IP externes et changez l’IP d’effimer à statique. Avantages: letencrypt et Kube lego maintenant que notre pile est entièrement lancée et en cours d’exécution, l’ajout d’une distribution responsable de la terminaison SSL et de l’enregistrement des certificats ne nécessite que quelques commandes supplémentaires. Nous utiliserons Kube lego pour ces deux tâches, car il s’agit d’une méthode largement utilisée et éprouvée au combat pour gérer les certificats sur le cluster kubernets. La première chose dont nous avons besoin est configmap. Dans kubernets, comme son nom l’indique, configmaps est utilisé pour la configuration. La section Mapping du nom représente une combinaison de clés et de leurs valeurs. Comme Kube lego utilise par défaut un serveur temp letencrypt, notre diagramme de configuration doit inclure l’URL et l’adresse e – mail du serveur de production. [halètements] https:\/\/gist.github.com\/tomazzaman\/5639efa1cf694f629008345e35a12baf#file – LEGO configmap yml \/] enregistrez le fichier dans le Répertoire k8s et lancez $kubectl create – f lego configmap. Yml (Notez que la documentation officielle de Kube lego utilise l’espace de noms Kube lego pour distribuer les entités, mais je trouve qu’il est plus clair de l’utiliser dans l’espace de noms du système Kube