TP noté Kubetnetes
Attention ce sujet est le sujet de la séance du jeudi 16 janvier, ne le suivez pas si vous commencer le vendredi 17 !
Pour ce TP vous utiliserez votre plateforme kubernetes créée au TP précédant. Pour finir, il faut que votre plateforme soit fonctionnelle avec un ingress-controler
fonctionnel aussi.
Un embryon de script de test est disponible ici test-kube.zip
Description de l'architecture
Vous devez avoir 2 déploiement,
- le premier avec un pod qui n'est pas répliqué et qui est basé sur le serveur redis :
- Il servira à stocker les sessions web.
- Il doit être accessible du second via un service.
- Il devra être initialisé pour demander une authentification via un secret.
- le second avec un pod dupliqué 3 fois basé sur une image php compatible avec redis :
- Il servira de serveur web.
- Il sera accessible de l'extérieur via un service
ingress
- Il sera initialisé en récupérant le code php et via des secrets.
Pour le fonctionnement, il faut donc un secret et 2 services (un normal et un ingress).
- Commencez par créer un répertoire
~/TpNOte
sur le manager de votre cluster. Vous devrez placer tous les fichier du TP dans ce répertoire. - Sur tomuss, placez
- les IPs de vos machines dans les colonnes
IPManager
,IPWorker1
etIPWorker2
. - le nom DNS de votre cluster dans la colonne
NomDNS
. - le nom de votre groupe dans la colonne
NomDeGroupe
attention, les deux membres du groupe doivent remplir cette colonne, cela me permettra de retrouver les groupes. Ce nom va être utilisé dans le sujet et ne doit contenir que des lettres et des-
. - un login dans la case
Login
et un mot de passe dans la caseMotDePasse
(PAs ceux de l'université !!).
Description des pods
Pour ce TP noté automatiquement, vous devez faire bien attention à utiliser les noms qui sont demandé
Le secret
Créez un secret :
- dont le nom est
secr-tpnote
- qui contient un champs
user_NOMDEGROUPE
oùNOMDEGROUPE
doit être le nom de votre groupe et la valeur est le login déposé sur tomuss. - qui contient un champs
pwd_NOMDEGROUPE
oùNOMDEGROUPE
doit être le nom de votre groupe et la valeur est le mot de passe déposé sur tomuss.
Si vous créer le secret avec un fichier yml
appelez le secret.yml
. Si c'est avec une commande, recopiez-la dans secret.sh
.
Le déploiement redis
Dans ce qui suis, NOMDEGROUPE
doit être remplacé par le nom de votre groupe.
- Créez un deploiement :
- dont le nom est
redis-NOMDEGROUPE
- qui crée un seul réplica de pods
- le pod créé à les labels
{app: redis, tp: note, groupe: NOMDEGROUPE}
- le pod utilise l'image publique
redis
- la commande exécuté par le conteneur doit être
["redis-server", "/etc/redis/redis.conf"]
- il monte 2 volumes :
- un sur
/data
qui est vide au démarrage - un sur
/etc/redis/
contenant au démarrage le fichierredis.conf
suivant (où NOMDELOGIN doit être le nom de l'utilisateur déposé sur tomuss récupéré à partir du secret):
requirepass NOMDELOGIN
Cela va exécuter un serveur redis qui réclame une authentification. Pour le tester, vous pouvez utiliser la commande redis-client
dans le pod. Pour cela
$ kubectl exec -it NOMDUPOD redis-cli # on est connecé dans le serveur redis # test de la commande HELP 127.0.0.1:6379> HELP redis-cli 5.0.7 To get help about Redis commands type: "help @<group>" to get a list of commands in <group> "help <command>" for help on <command> "help <tab>" to get a list of possible help topics "quit" to exit To set redis-cli preferences: ":set hints" enable online hints ":set nohints" disable online hints Set your preferences in ~/.redisclirc # Test de la commande MGET 127.0.0.1:6379> MGET * (error) NOAUTH Authentication required. # Authentification, le login que j'utilise est ''fabien'' 127.0.0.1:6379> AUTH fabien OK # Retest de MGET, il n'y a pas de variable dans le serveur qui est vide au démarrage 127.0.0.1:6379> MGET * 1) (nil) 127.0.0.1:6379> QUIT
Service redis
- Pour que d'autres pods puisse utiliser le service, créez un service :
- dont le nom est
serv-redis-tpnote
- qui envoie le port
6379
du service sur le port6379
du pods redis
Pour le tester vous pouvez utiliser le pod busybox
du dernier TP :
$ kubectl exec -it NOMDUPOD sh / # telnet serv-redis-tpnote 6379 Connected to serv-redis-tpnote GET TOTO -NOAUTH Authentication required. AUTH ee -ERR invalid password AUTH fabien +OK MGET * *1 $-1 QUIT +OK Connection closed by foreign host / #
Le serveur php
Dans ce qui suis, NOMDEGROUPE
doit être remplacé par le nom de votre groupe.
- Créez un déploiement :
- dont le nom est
php-NOMDEGROUPE
- qui crée un seul réplica
- le pod créé utilise les labels
{app: php, tp: note, groupe: NOMDEGROUPE}
- le pod utilise l'image publique
forge.univ-lyon1.fr:4567/fabien.rico/tpnotekube/php-redis-cli
- le pod a une variable d'environnement
SERVEUR_REDIS
égale au nom du serveur redis qui doit être contacté - le pod a une variable d'environnement
CC_LOGIN
égale au contenu du champsuser_NOMDEGROUPE
du secret - le pod monte le volume
/var/www/html
initialisé avec le code php se trouvant dans l'archive http://perso.univ-lyon1.fr/fabien.rico/site/_media/cloud:2019:codephp.zip (les fichiers doivent être téléchargés, desarchivés et l'archive effacée durant l'initialisation).
Rq : Pour les soucis d'initialisation, vous pouvez accéder au log d'un conteneurs d'initialisation en tapant :
kubectl logs NOMDUPOD -c NOMDUCONTENEUR
Publication du site
- Faire un service qui permet de contacter le site php. appelez ce service
serv-NOMDEGROUPE
. - À l'aide d'un ingress publiez le site php.
- Testez votre service, il n'est pas immédiatement fonctionnel, mais vous devez arrivez sur une page de login.
À ce stade il est normal que le site ne trouve pas le mot de passe où le token
Pensez à supprimer le ingress du dernier TP qui pourrait perturber celui là. Pensez à noter le nom DNS utilisé dans tomuss.
Ajout du mot de passe et du token
Le mot de passe et le token doivent être dispribué via le secret utiliser. Vous trouverez le token dans les log du pod php.
- Ajoutez ce token au secret utilisé précédemment sous le nom de clef
token
. - Ajoutez au pod php un volume qui sera basé sur le secret et qui contiendra 2 fichiers :
token
contenant le token;password
contenant le mot de passe.
Pour exporter seulement une partie de secret dans un volume et changer les nom des fichies générés, il faut utilisez le shema suivant lors de la définition du volume :
name: NOMDUVOLUME secret: secretName: NOMDUSECRET items: - key: NOMDELACLEF1 path: NOMDUFICHIERGENERE1 - key: NOMDELACLEF2 path: NOMDUFICHIERGENERE2
- Montez le volume créé dans le répertoire
/secrets
du pod php. - Vérifiez que le pod n'affiche plus d'erreur.
- Tentez de vous loguer vous devez arriver à une page qui affiche
vous y etes presque
. - Passez le nombre de réplicat à 3 et appuyez sur
tester le load balancing
- Au bout de trois connections via des replica différent, la page affiche
Bravo
vous avez terminé.