L’auteur a sélectionné le Open Internet / Free Speech pour recevoir un don dans le cadre du https://do.co/w4do-cta [ Ecrire pour DOnations] programme.
introduction
Kubernetes est un système d’orchestration de conteneur open source. Il vous permet de créer, mettre à jour et mettre à l’échelle des conteneurs sans vous soucier des temps d’arrêt.
Pour exécuter une application PHP, Nginx agit en tant que proxy pour PHP-FPM. La conteneurisation de cette configuration dans un seul conteneur peut être un processus fastidieux, mais Kubernetes vous aidera à gérer les deux services dans des conteneurs distincts. Utiliser Kubernetes vous permettra de garder vos conteneurs réutilisables et permutables, et vous ne devrez pas reconstruire l’image de votre conteneur à chaque nouvelle version de Nginx ou PHP.
Dans ce tutoriel, vous allez déployer une application PHP 7 sur un cluster Kubernetes avec Nginx et PHP-FPM s’exécutant dans des conteneurs distincts. Vous apprendrez également à conserver vos fichiers de configuration et le code de l’application en dehors de l’image du conteneur en utilisant le système DigitalOcean. Cette approche vous permettra de réutiliser l’image Nginx pour toute application nécessitant un serveur Web / proxy en transmettant un volume de configuration plutôt que de reconstruire l’image.
Conditions préalables
-
Une compréhension de base des objets Kubernetes. Consultez notre article Introduction to Kubernetes pour plus d’informations.
-
Un cluster Kubernetes s’exécutant sur Ubuntu 16.04. Vous pouvez le configurer en suivant les https://www.digitalocean.com/community/tutorials/how-to-create-a-kubernetes-1-10-cluster-using-kubeadm-on-ubuntu-16-04 [ Comment créer un cluster Kubernetes 1.10 utilisant Kubeadm sur Ubuntu 16.04].
-
Un compte DigitalOcean et un jeton d’accès à l’API avec des autorisations de lecture et d’écriture pour créer notre volume de stockage. Si vous n’avez pas votre jeton d’accès à l’API, vous pouvez create le ici.
-
Votre code d’application hébergé sur une URL accessible au public, telle que https://github.com [Github].
Étape 1 - Création des services PHP-FPM et Nginx
Dans cette étape, vous allez créer les services PHP-FPM et Nginx. Un service permet d’accéder à un ensemble de pods à partir du cluster. Les services d’un cluster peuvent communiquer directement par leur nom, sans avoir besoin d’adresses IP. Le service PHP-FPM autorisera l’accès aux pods PHP-FPM, alors que le service Nginx autorisera l’accès aux pods Nginx.
Étant donné que les pods Nginx utiliseront les pods PHP-FPM par proxy, vous devrez indiquer au service comment les rechercher. Au lieu d’utiliser des adresses IP, vous tirerez parti de la découverte de service automatique de Kubernetes pour utiliser des noms lisibles par l’homme pour acheminer les demandes au service approprié.
Pour créer le service, vous allez créer un fichier de définition d’objet. Chaque définition d’objet Kubernetes est un fichier YAML qui contient au moins les éléments suivants:
-
+ apiVersion +
: La version de l’API Kubernetes à laquelle la définition appartient. -
+ kind +
: L’objet Kubernetes que ce fichier représente. Par exemple, un+ pod
ou` + service`. -
+ metadata +
: Ceci contient le+ nom +
de l’objet ainsi que tous les+ labels +
que vous souhaitez éventuellement lui appliquer. -
+ spec +
: contient une configuration spécifique en fonction du type d’objet que vous créez, tel que l’image du conteneur ou les ports sur lesquels le conteneur sera accessible.
Tout d’abord, vous allez créer un répertoire contenant vos définitions d’objet Kubernetes.
SSH sur votre * nœud maître * et créez le répertoire + définitions +
qui contiendra vos définitions d’objet Kubernetes.
mkdir definitions
Accédez au répertoire + definitions +
nouvellement créé:
cd definitions
Créez votre service PHP-FPM en créant un fichier + php_service.yaml +
:
nano php_service.yaml
Définissez + kind +
en tant que + Service +
pour spécifier que cet objet est un service:
php_service.yaml
...
apiVersion: v1
kind: Service
Nommez le service + php +
car il donnera accès à PHP-FPM:
php_service.yaml
...
metadata:
name: php
Vous regrouperez logiquement différents objets avec des étiquettes. Dans ce didacticiel, vous utiliserez des étiquettes pour regrouper les objets en «niveaux», tels que frontend ou backend. Les pods PHP fonctionneront derrière ce service, vous devrez donc le qualifier de tier tier: backend +
.
php_service.yaml
...
labels:
tier: backend
Un service détermine à quels pods accéder en utilisant les labels + selector +
. Un pod correspondant à ces étiquettes sera traité, que le pod ait été créé avant ou après le service. Vous ajouterez des étiquettes pour vos pods plus tard dans le tutoriel.
Utilisez l’étiquette tier tier: backend +
pour affecter le module dans le niveau backend. Vous allez également ajouter le label + app: php +
pour spécifier que ce pod utilise PHP. Ajoutez ces deux étiquettes après la section + metadata +
.
php_service.yaml
...
spec:
selector:
app: php
tier: backend
Ensuite, spécifiez le port utilisé pour accéder à ce service. Vous utiliserez le port + 9000 +
dans ce tutoriel. Ajoutez-le au fichier + php_service.yaml +
sous + spec +
:
php_service.yaml
...
ports:
- protocol: TCP
port: 9000
Votre fichier + php_service.yaml +
complété ressemblera à ceci:
php_service.yaml
apiVersion: v1
kind: Service
metadata:
name: php
labels:
tier: backend
spec:
selector:
app: php
tier: backend
ports:
- protocol: TCP
port: 9000
Appuyez sur les touches + CTRL + o +
pour enregistrer le fichier, puis + CTRL + x
pour quitter` + nano`.
Maintenant que vous avez créé la définition d’objet pour votre service, vous devez utiliser la commande + kubectl apply +
pour l’exécuter, ainsi que l’argument + -f +
et spécifier votre fichier + php_service.yaml +
.
Créez votre service:
kubectl apply -f php_service.yaml
Cette sortie confirme la création du service:
Outputservice/php created
Vérifiez que votre service est en cours d’exécution:
kubectl get svc
Vous verrez votre service PHP-FPM s’exécuter:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10m
php ClusterIP 10.100.59.238 <none> 9000/TCP 5m
Il existe différents service[ pris en charge par Kubernetes. Votre service + php
utilise le type de service par défaut,` + ClusterIP`. Ce type de service attribue une adresse IP interne et rend le service accessible uniquement à partir du cluster.
Maintenant que le service PHP-FPM est prêt, vous allez créer le service Nginx. Créez et ouvrez un nouveau fichier nommé + nginx_service.yaml +
avec l’éditeur:
nano nginx_service.yaml
Ce service ciblera les pods Nginx, vous allez donc le nommer + nginx +
. Vous allez également ajouter un label tier tier: backend +
, comme il se doit dans le palier backend:
nginx_service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
tier: backend
Semblable au service + php +
, ciblez les pods avec les étiquettes de sélecteur + app: nginx +
et + tier: backend +
. Rendre ce service accessible sur le port 80, le port HTTP par défaut.
nginx_service.yaml
...
spec:
selector:
app: nginx
tier: backend
ports:
- protocol: TCP
port: 80
Le service Nginx sera accessible au public sur Internet à partir de l’adresse IP publique de votre Droplet. ++
est disponible sur votre https://cloud.digitalocean.com [Digital Cloud Panel]. Sous + spec.externalIPs +
, ajoutez:
nginx_service.yaml
...
spec:
externalIPs:
-
Votre fichier + nginx_service.yaml +
ressemblera à ceci:
nginx_service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
tier: backend
spec:
selector:
app: nginx
tier: backend
ports:
- protocol: TCP
port: 80
externalIPs:
-
Enregistrez et fermez le fichier. Créez le service Nginx:
kubectl apply -f nginx_service.yaml
Vous verrez la sortie suivante lorsque le service est en cours d’exécution:
Outputservice/nginx created
Vous pouvez voir tous les services en cours d’exécution en exécutant:
kubectl get svc
Vous verrez les services PHP-FPM et Nginx répertoriés dans le résultat:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13m
nginx ClusterIP 10.102.160.47 80/TCP 50s
php ClusterIP 10.100.59.238 <none> 9000/TCP 8m
Veuillez noter que si vous souhaitez supprimer un service, vous pouvez exécuter:
kubectl delete svc/
Maintenant que vous avez créé vos services PHP-FPM et Nginx, vous devrez spécifier où stocker le code de votre application et les fichiers de configuration.
Étape 2 - Installation du plug-in de stockage DigitalOcean
Kubernetes fournit différents plug-ins de stockage pouvant créer un espace de stockage pour votre environnement. Dans cette étape, vous installerez le plug-in de stockage DigitalOcean pour créer block storage sur DigitalOcean. . Une fois l’installation terminée, il ajoutera une classe de stockage nommée + do-block-storage
que vous utiliserez pour créer votre stockage en bloc.
Vous allez d’abord configurer un objet Kubernetes Secret pour stocker votre jeton d’API DigitalOcean. Les objets secrets sont utilisés pour partager des informations sensibles, telles que des clés et des mots de passe SSH, avec d’autres objets Kubernetes dans le même espace de noms. Les espaces de noms permettent de séparer logiquement vos objets Kubernetes.
Ouvrez un fichier nommé + secret.yaml +
avec l’éditeur:
nano secret.yaml
Vous allez nommer votre objet Secret + digitalocean
et l’ajouter à l’espace` + kube-system` + namespace
. L’espace de noms + kube-system +
est l’espace de noms par défaut pour les services internes de Kubernetes et est également utilisé par le plug-in de stockage DigitalOcean pour lancer divers composants.
secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: digitalocean
namespace: kube-system
Au lieu d’une clé + spec +
, un secret utilise une clé + data
ou` + string Data` pour contenir les informations requises. Le paramètre + data +
contient les données codées en base64 qui sont automatiquement décodées lors de l’extraction. Le paramètre + stringData +
contient des données non codées qui sont automatiquement codées lors de la création ou des mises à jour, et ne les sort pas lors de la récupération de Secrets. Vous utiliserez + stringData +
dans ce tutoriel pour plus de commodité.
Ajoutez le + access-token
en tant que` + string Data`:
secret.yaml
...
stringData:
access-token:
Enregistrez et quittez le fichier.
Votre fichier + secret.yaml +
ressemblera à ceci:
secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: digitalocean
namespace: kube-system
stringData:
access-token:
Créez le secret:
kubectl apply -f secret.yaml
Vous verrez cette sortie lors de la création de Secret:
Outputsecret/digitalocean created
Vous pouvez afficher le secret avec la commande suivante:
kubectl -n kube-system get secret digitalocean
La sortie ressemblera à ceci:
OutputNAME TYPE DATA AGE
digitalocean Opaque 1 41s
Le type + Opaque +
signifie que ce secret est en lecture seule, ce qui est standard pour + stringData +
. Vous pouvez en savoir plus à ce sujet sur la page Secret. Le champ + DATA +
indique le nombre d’éléments stockés dans ce secret. Dans ce cas, il indique + 1 +
car vous avez une seule clé stockée.
Maintenant que votre secret est en place, installez le plug-in de stockage de bloc DigitalOcean:
kubectl apply -f https://raw.githubusercontent.com/digitalocean/csi-digitalocean/master/deploy/kubernetes/releases/csi-digitalocean-v0.3.0.yaml
Vous verrez une sortie semblable à celle-ci:
Outputstorageclass.storage.k8s.io/do-block-storage created
serviceaccount/csi-attacher created
clusterrole.rbac.authorization.k8s.io/external-attacher-runner created
clusterrolebinding.rbac.authorization.k8s.io/csi-attacher-role created
service/csi-attacher-doplug-in created
statefulset.apps/csi-attacher-doplug-in created
serviceaccount/csi-provisioner created
clusterrole.rbac.authorization.k8s.io/external-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/csi-provisioner-role created
service/csi-provisioner-doplug-in created
statefulset.apps/csi-provisioner-doplug-in created
serviceaccount/csi-doplug-in created
clusterrole.rbac.authorization.k8s.io/csi-doplug-in created
clusterrolebinding.rbac.authorization.k8s.io/csi-doplug-in created
daemonset.apps/csi-doplug-in created
Maintenant que vous avez installé le plug-in de stockage DigitalOcean, vous pouvez créer un stockage en bloc pour contenir votre code d’application et vos fichiers de configuration.
Étape 3 - Création du volume persistant
Avec votre secret en place et le plug-in de stockage de bloc installé, vous êtes maintenant prêt à créer votre Persistent Volume. Un volume persistant, ou PV, est un bloc de stockage d’une taille spécifiée qui vit indépendamment du cycle de vie d’un pod. L’utilisation d’un volume persistant vous permettra de gérer ou de mettre à jour vos pods sans craindre de perdre votre code d’application. On accède à un volume persistant en utilisant un + PersistentVolumeClaim +
, ou un PVC, qui monte le PV au chemin requis.
Ouvrez un fichier nommé + code_volume.yaml +
avec votre éditeur:
nano code_volume.yaml
Nommez le PVC + code +
en ajoutant les paramètres et valeurs suivants à votre fichier:
code_volume.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: code
Le + spec +
pour un PVC contient les éléments suivants:
-
+ accessModes +
qui varient selon le cas d’utilisation. Ceux-ci sont: -
+ ReadWriteOnce +
- monte le volume en lecture-écriture par un seul noeud -
+ ReadOnlyMany +
- monte le volume en lecture seule par plusieurs noeuds -
+ ReadWriteMany +
- monte le volume en lecture-écriture par plusieurs noeuds -
+ resources +
- l’espace de stockage dont vous avez besoin
Le stockage de bloc DigitalOcean n’étant monté que sur un seul nœud, vous définissez le + accessModes +
sur + ReadWriteOnce +
. Ce tutoriel vous guidera dans l’ajout d’une petite quantité de code d’application. 1 Go suffira dans ce cas d’utilisation. Si vous envisagez de stocker une plus grande quantité de code ou de données sur le volume, vous pouvez modifier le paramètre + storage +
pour l’adapter à vos besoins. Vous pouvez augmenter la quantité de stockage après la création du volume, mais la réduction du disque n’est pas prise en charge.
code_volume.yaml
...
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage:
Ensuite, spécifiez la classe de stockage que Kubernetes utilisera pour provisionner les volumes. Vous utiliserez la classe + do-block-storage +
créée par le plug-in de stockage en bloc DigitalOcean.
code_volume.yaml
...
storageClassName: do-block-storage
Votre fichier + code_volume.yaml +
ressemblera à ceci:
code_volume.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: code
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage:
storageClassName: do-block-storage
Enregistrez et quittez le fichier.
Créez le + code +
PersistentVolumeClaim en utilisant + kubectl +
:
kubectl apply -f code_volume.yaml
La sortie suivante vous indique que l’objet a été créé avec succès et que vous êtes prêt à monter votre PVC 1 Go en tant que volume.
Outputpersistentvolumeclaim/code created
Pour afficher les volumes persistants (PV) disponibles:
kubectl get pv
Vous verrez votre PV répertorié:
OutputNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-ca4df10f-ab8c-11e8-b89d-12331aa95b13 1Gi RWO Delete Bound default/code do-block-storage 2m
Les champs ci-dessus donnent un aperçu de votre fichier de configuration, à l’exception de + stratégie de récupération +
et + statut +
. La ` politique de récupération'
définit ce qui est fait avec le PV après la suppression du PVC qui y accède. + Delete +
supprime le PV de Kubernetes ainsi que l’infrastructure DigitalOcean. Vous pouvez en savoir plus sur les + politique de récupération +
et + Status +
à partir de la Kubernetes documentation PV.
Vous avez créé avec succès un volume persistant à l’aide du plug-in de stockage en bloc DigitalOcean. Maintenant que votre volume persistant est prêt, vous allez créer vos pods à l’aide d’un déploiement.
Étape 4 - Création d’un déploiement PHP-FPM
Dans cette étape, vous allez apprendre à utiliser un déploiement pour créer votre pod PHP-FPM. Les déploiements offrent un moyen uniforme de créer, mettre à jour et gérer les modules en utilisant ReplicaSets. Si une mise à jour ne fonctionne pas comme prévu, un déploiement restaurera automatiquement ses pods sur une image précédente.
La clé de déploiement + spec.selector +
listera les étiquettes des pods qu’elle gérera. Il utilisera également les touches + template +
pour créer les pods requis.
Cette étape présentera également l’utilisation de Init Containers. Init Containers lance une ou plusieurs commandes avant les conteneurs classiques spécifiés sous la clé + template +
du pod. Dans ce tutoriel, votre conteneur d’initialisation va récupérer un exemple de fichier + index.php +
à partir de https://gist.github.com [GitHub Gist] en utilisant + wget +
. Voici le contenu du fichier exemple:
index.php
<?php
echo phpinfo();
Pour créer votre déploiement, ouvrez un nouveau fichier nommé + php_deployment.yaml +
avec votre éditeur:
nano php_deployment.yaml
Ce déploiement gérera vos pods PHP-FPM, vous nommerez donc l’objet de déploiement + php +
. Les pods appartiennent au niveau backend. Vous devez donc regrouper le déploiement dans ce groupe en utilisant le libellé tier tier: backend +
:
php_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php
labels:
tier: backend
Pour le paramètre + spec +
de déploiement, vous spécifierez le nombre de copies de ce pod à créer à l’aide du paramètre + réplicas +
. Le nombre de + répliques +
variera en fonction de vos besoins et des ressources disponibles. Vous allez créer une réplique dans ce tutoriel:
php_deployment.yaml
...
spec:
replicas: 1
Ce déploiement gérera les pods correspondant aux libellés + app: php +
et + tier: backend +
. Sous la touche + sélecteur +
ajouter:
php_deployment.yaml
...
selector:
matchLabels:
app: php
tier: backend
Ensuite, la + spec
de déploiement requiert le` + template` pour la définition d’objet de votre pod. Ce modèle définira les spécifications pour créer le pod. Tout d’abord, vous allez ajouter les étiquettes spécifiées pour le + php +
service + selectors +
et le + matchLabels +
de Deployment. Ajoutez + app: php
et` + tier: backend` sous + template.metadata.labels
:
php_deployment.yaml
...
template:
metadata:
labels:
app: php
tier: backend
Un pod peut avoir plusieurs conteneurs et volumes, mais chacun aura besoin d’un nom. Vous pouvez monter des volumes de manière sélective sur un conteneur en spécifiant un chemin de montage pour chaque volume.
Tout d’abord, spécifiez les volumes auxquels vos conteneurs accéderont. Vous avez créé un PVC nommé + code +
pour contenir votre code d’application. Nommez donc ce volume + code +
. Sous + spec.template.spec.volumes +
, ajoutez ce qui suit:
php_deployment.yaml
...
spec:
volumes:
- name: code
persistentVolumeClaim:
claimName: code
Ensuite, spécifiez le conteneur que vous voulez exécuter dans ce pod. Vous pouvez trouver diverses images sur the Docker Store, mais dans ce tutoriel, vous utiliserez l’image + php: 7-fpm +
.
Sous + spec.template.spec.containers +
, ajoutez ce qui suit:
php_deployment.yaml
...
containers:
- name: php
image: php:7-fpm
Ensuite, vous monterez les volumes auxquels le conteneur doit accéder. Ce conteneur exécutera votre code PHP, il devra donc avoir accès au volume + code +
. Vous utiliserez également + mountPath +
pour spécifier + / code +
en tant que point de montage.
Sous + spec.template.spec.containers.volumeMounts +
, ajoutez:
php_deployment.yaml
...
volumeMounts:
- name: code
mountPath: /code
Maintenant que vous avez monté votre volume, vous devez obtenir votre code d’application sur le volume. Vous avez peut-être déjà utilisé FTP / SFTP ou cloné le code via une connexion SSH, mais cette étape vous montrera comment copier le code à l’aide d’un conteneur d’initialisation.
En fonction de la complexité de votre processus de configuration, vous pouvez utiliser un seul + initContainer +
pour exécuter un script qui construit votre application ou utiliser un + initContainer +
par commande. Assurez-vous que les volumes sont montés sur le + initContainer +
.
Dans ce tutoriel, vous utiliserez un seul conteneur Init avec + busybox +
pour télécharger le code. + busybox +
est une petite image contenant l’utilitaire + wget +
que vous utiliserez pour accomplir cela.
Sous + spec.template.spec +
, ajoutez votre + initContainer +
et spécifiez l’image + busybox +
:
php_deployment.yaml
...
initContainers:
- name: install
image: busybox
Votre conteneur d’initialisation devra avoir accès au volume + code +
afin de pouvoir télécharger le code à cet emplacement. Sous + spec.template.spec.initContainers
, montez le volume` + code + sur le chemin
+ / code + `:
php_deployment.yaml
...
volumeMounts:
- name: code
mountPath: /code
Chaque conteneur d’initialisation doit exécuter une commande + commande +
. Votre conteneur d’initialisation utilisera + wget +
pour télécharger the code à partir de https://github.com/do-community / php-kubernetes [Github] dans le répertoire de travail + / code +
. L’option + -O +
donne un nom au fichier téléchargé et vous nommerez ce fichier + index.php +
.
Sous le conteneur + install
dans + spec.template.spec.initContainers`, ajoutez ces lignes:
php_deployment.yaml
...
command:
- wget
- "-O"
- "/code/index.php"
-
Votre fichier + php_deployment.yaml +
complété ressemblera à ceci:
php_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php
labels:
tier: backend
spec:
replicas: 1
selector:
matchLabels:
app: php
tier: backend
template:
metadata:
labels:
app: php
tier: backend
spec:
volumes:
- name: code
persistentVolumeClaim:
claimName: code
containers:
- name: php
image: php:7-fpm
volumeMounts:
- name: code
mountPath: /code
initContainers:
- name: install
image: busybox
volumeMounts:
- name: code
mountPath: /code
command:
- wget
- "-O"
- "/code/index.php"
-
Enregistrez le fichier et quittez l’éditeur.
Créez le déploiement PHP-FPM avec + kubectl +
:
kubectl apply -f php_deployment.yaml
Vous verrez la sortie suivante lors de la création du déploiement:
Outputdeployment.apps/php created
Pour résumer, ce déploiement commencera par le téléchargement des images spécifiées. Il demandera ensuite le + PersistentVolume +
à votre + PersistentVolumeClaim +
et exécutera en série votre + initContainers +
. Une fois terminé, les conteneurs seront exécutés et monteront les + volumes +
sur le point de montage spécifié. Une fois toutes ces étapes terminées, votre pod sera opérationnel.
Vous pouvez afficher votre déploiement en exécutant:
kubectl get deployments
Vous verrez la sortie:
OutputNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
php 1 1 1 0 19s
Cette sortie peut vous aider à comprendre l’état actuel du déploiement. Un + Deployment +
est one des contrôleurs qui maintient un état souhaité. Le + template +
que vous avez créé spécifie que l’état + DESIRED +
aura 1 + réplicas +
du pod nommé + php +
. Le champ + CURRENT
indique le nombre de réplicas en cours d’exécution. Il doit donc correspondre à l’état` + DESIRED`. Vous pouvez en savoir plus sur les champs restants dans la Kubernetes Deployments documentation.
Vous pouvez afficher les pods lancés par ce déploiement à l’aide de la commande suivante:
kubectl get pods
Le résultat de cette commande varie en fonction du temps écoulé depuis la création du déploiement. Si vous l’exécutez peu de temps après la création, la sortie ressemblera probablement à ceci:
OutputNAME READY STATUS RESTARTS AGE
php-86d59fd666-bf8zd 0/1 Init:0/1 0 9s
Les colonnes représentent les informations suivantes:
-
+ Ready +
: nombre de+ réplicas +
exécutant ce pod. -
+ Status +
: Le statut du pod.+ Init +
indique que les conteneurs d’initialisation sont en cours d’exécution. Dans cette sortie, 0 des 1 Init Containers sont terminés. -
+ Restarts +
: Combien de fois ce processus a-t-il redémarré pour démarrer le pod? Ce nombre augmentera si l’un de vos conteneurs d’initialisation échoue. Le déploiement le redémarrera jusqu’à atteindre l’état souhaité.
En fonction de la complexité de vos scripts de démarrage, le statut peut prendre quelques minutes pour devenir «+ podInitializing +»:
OutputNAME READY STATUS RESTARTS AGE
php-86d59fd666-lkwgn 0/1 podInitializing 0 39s
Cela signifie que les conteneurs initiaux sont terminés et que les conteneurs sont en cours d’initialisation. Si vous exécutez la commande alors que tous les conteneurs sont en cours d’exécution, vous verrez que l’état du pod est remplacé par + Running +
.
OutputNAME READY STATUS RESTARTS AGE
php-86d59fd666-lkwgn 1/1 Running 0 1m
Vous voyez maintenant que votre pod fonctionne correctement. Si votre pod ne démarre pas, vous pouvez déboguer avec les commandes suivantes:
-
Afficher les informations détaillées d’un pod:
kubectl describe pods
-
Afficher les journaux générés par un pod:
kubectl logs
-
Afficher les journaux d’un conteneur spécifique dans un pod:
kubectl logs
Votre code d’application est monté et le service PHP-FPM est maintenant prêt à gérer les connexions. Vous pouvez maintenant créer votre déploiement Nginx.
Étape 5 - Création du déploiement Nginx
Dans cette étape, vous utiliserez un ConfigMap pour configurer Nginx. Un ConfigMap conserve votre configuration dans un format clé-valeur que vous pouvez référencer dans d’autres définitions d’objet Kubernetes. Cette approche vous donnera la possibilité de réutiliser ou d’échanger l’image avec une version différente de Nginx si nécessaire. La mise à jour de ConfigMap répliquera automatiquement les modifications apportées à tout module qui le monte.
Créez un fichier + nginx_configMap.yaml +
pour votre ConfigMap avec votre éditeur:
nano nginx_configMap.yaml
Nommez ConfigMap + nginx-config +
et regroupez-le dans le micro-service tier tier: backend +
:
nginx_configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
labels:
tier: backend
Ensuite, vous allez ajouter le + data
pour ConfigMap. Nommez la clé + config +
et ajoutez le contenu de votre fichier de configuration Nginx comme valeur. Vous pouvez utiliser l’exemple de configuration Nginx à l’adresse https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04#step- trois-créer-serveur-bloc-fichiers-pour-chaque-domaine [ce tutoriel].
Étant donné que Kubernetes peut acheminer les demandes vers l’hôte approprié pour un service, vous pouvez entrer le nom de votre service PHP-FPM dans le paramètre + fastcgi_pass +
à la place de son adresse IP. Ajoutez ce qui suit dans votre fichier + nginx_configMap.yaml +
:
nginx_configMap.yaml
...
data:
config : |
server {
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root ^/code^;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass ;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Votre fichier + nginx_configMap.yaml +
ressemblera à ceci:
nginx_configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
labels:
tier: backend
data:
config : |
server {
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root ;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass ;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Enregistrez le fichier et quittez l’éditeur.
Créez le ConfigMap:
kubectl apply -f nginx_configMap.yaml
Vous verrez la sortie suivante:
Outputconfigmap/nginx-config created
Vous avez terminé de créer votre carte ConfigMap et pouvez maintenant créer votre déploiement Nginx.
Commencez par ouvrir un nouveau fichier + nginx_deployment.yaml +
dans l’éditeur:
nano nginx_deployment.yaml
Nommez le déploiement + nginx
et ajoutez le libellé` + tier: backend`:
nginx_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
tier: backend
Spécifiez que vous voulez un + réplicas +
dans le déploiement + spec +
. Ce déploiement gérera les pods avec les étiquettes + app: nginx
et` + tier: backend`. Ajoutez les paramètres et valeurs suivants:
nginx_deployment.yaml
...
spec:
replicas: 1
selector:
matchLabels:
app: nginx
tier: backend
Ensuite, ajoutez le pod + template
. Vous devez utiliser les mêmes étiquettes que vous avez ajoutées pour le déploiement + selector.matchLabels +
. Ajouter ce qui suit:
nginx_deployment.yaml
...
template:
metadata:
labels:
app: nginx
tier: backend
Donnez à Nginx l’accès au PVC + code +
que vous avez créé précédemment. Sous + spec.template.spec.volumes +
, ajoutez:
nginx_deployment.yaml
...
spec:
volumes:
- name: code
persistentVolumeClaim:
claimName: code
Les pods peuvent monter un ConfigMap en tant que volume. Spécifier un nom de fichier et une clé créera un fichier avec sa valeur en tant que contenu. Pour utiliser ConfigMap, définissez + chemin +
sur le nom du fichier qui contiendra le contenu de la touche + clé +
. Vous voulez créer un fichier + site.conf +
à partir de la clé + config +
. Sous + spec.template.spec.volumes +
, ajoutez ce qui suit:
nginx_deployment.yaml
...
- name: config
configMap:
name: nginx-config
items:
- key: config
path: site.conf
Ensuite, vous allez spécifier l’image à partir de laquelle créer votre pod. Ce tutoriel utilisera l’image + nginx: 1.7.9 +
pour la stabilité, mais vous pouvez trouver d’autres images Nginx sur the Docker Store. Aussi, rendez Nginx disponible sur le port 80. Sous + spec.template.spec +
, ajoutez:
nginx_deployment.yaml
...
containers:
- name: nginx
image:
ports:
- containerPort: 80
Nginx et PHP-FPM doivent accéder au fichier par le même chemin. Montez donc le volume + code +
sur + + code +
:
nginx_deployment.yaml
...
volumeMounts:
- name: code
mountPath: /code
L’image + nginx: 1.7.9 +
chargera automatiquement tous les fichiers de configuration situés dans le répertoire + / etc / nginx / conf.d +
. Monter le volume + config +
dans ce répertoire créera le fichier + / etc / nginx / conf.d / site.conf +
. Sous + volumeMounts +
, ajoutez ce qui suit:
nginx_deployment.yaml
...
- name: config
mountPath: /etc/nginx/conf.d
Votre fichier + nginx_deployment.yaml +
ressemblera à ceci:
nginx_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
tier: backend
spec:
replicas: 1
selector:
matchLabels:
app: nginx
tier: backend
template:
metadata:
labels:
app: nginx
tier: backend
spec:
volumes:
- name: code
persistentVolumeClaim:
claimName: code
- name: config
configMap:
name: nginx-config
items:
- key: config
path: site.conf
containers:
- name: nginx
image:
ports:
- containerPort: 80
volumeMounts:
- name: code
mountPath: /code
- name: config
mountPath: /etc/nginx/conf.d
Enregistrez le fichier et quittez l’éditeur.
Créez le déploiement de Nginx:
kubectl apply -f nginx_deployment.yaml
La sortie suivante indique que votre déploiement est maintenant créé:
Outputdeployment.apps/nginx created
Répertoriez vos déploiements avec cette commande:
kubectl get deployments
Vous verrez les déploiements Nginx et PHP-FPM:
OutputNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx 1 1 1 0 16s
php 1 1 1 1 7m
Répertoriez les pods gérés par les deux déploiements:
kubectl get pods
Vous verrez les pods en cours d’exécution:
OutputNAME READY STATUS RESTARTS AGE
nginx-7bf5476b6f-zppml 1/1 Running 0 32s
php-86d59fd666-lkwgn 1/1 Running 0 7m
Maintenant que tous les objets Kubernetes sont actifs, vous pouvez visiter le service Nginx sur votre navigateur.
Lister les services en cours d’exécution:
kubectl get services -o wide
Obtenez l’adresse IP externe de votre service Nginx:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 39m <none>
nginx ClusterIP 10.102.160.47 80/TCP 27m app=nginx,tier=backend
php ClusterIP 10.100.59.238 <none> 9000/TCP 34m app=php,tier=backend
Sur votre navigateur, visitez votre serveur en tapant + http: // +
. Vous verrez le résultat de + phpinfo () +
et aurez confirmé que vos services Kubernetes sont opérationnels.
Conclusion
Dans ce guide, vous avez conteneurisé les services PHP-FPM et Nginx afin de pouvoir les gérer indépendamment. Cette approche améliorera non seulement l’évolutivité de votre projet au fur et à mesure de votre développement, mais vous permettra également d’utiliser efficacement les ressources. Vous avez également stocké votre code d’application sur un volume afin de pouvoir facilement mettre à jour vos services à l’avenir.