- Installer gcloud
- Activer l'autocompletion kubectl dans votre shell
# Authentification auprès de GCP
gcloud auth login
# Obtenir la liste des projets GCP
gcloud projects list
# Se placer dans le bon projet
gcloud config set project oxalide-bumediapresse-sandbox
export REGION=$(gcloud container clusters list --format 'value(location)')
export CLUSTER_NAME=$(gcloud container clusters list --format 'value(name)')
# Initialisation des variables d'environnement.
export KUBECONFIG=~/.kube/${CLUSTER_NAME}-config
# Récupérer les informations de connexion du nouveau cluster (kubeconfig)
gcloud container clusters get-credentials --region=${REGION} ${CLUSTER_NAME}
# Obtenir la liste des clusters présents dans le projet
gcloud container clusters list- Combien y a-t-il de nodes dans le cluster ?
- Combien de CPU allouable, de RAM ?
# Créer un POD
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep
spec:
containers:
- name: busybox
image: busybox
args:
- sleep
- "1000000"
EOFVérifier que le pod s'execute.
Supprimer ce POD.
- Que se passe-t-il ?
- Le POD réapparait-il ?
- Expliquez pourquoi
kubectl create deployment nginx --image=nginx # Démarre une instance unique de nginxVérifier que le pod s'execute.
Supprimer ce POD.
- Que se passe-t-il ?
- Le POD réapparait-il ?
- Expliquez pourquoi.
kubectl scale deployment nginx --replicas 3- Constater que le nombre de POD augmente.
- Faire un describe et regarder les Events.
- Que constatez vous dans les Events ?
Un problème est survenu, essayer un diagnostique.
Ne pas ouvrir - aide
- Faire un get des POD nginx, regarder le status des POD.
- Faire un describe des POD dont le status n'est pas Running.
- Regarder les Events, qu'indiquent-ils ?
- Faire un describe du deployment nginx et regarder si tout est correct (ligne Replicas)
- Identifier et corriger le problème
- Re-vérifier que tous les POD sont bien en Running
Nous gardons le deployment nginx effectué plus tôt:
- Lancer la commande kubectl logs
kubectl logs <POD>.- Pourquoi une erreur est-elle retournée ?
- Comment obtenir les logs des différents containers ?
Créez le Pod suivant en l'appliquant avec la commande kubectl apply:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
spec:
containers:
- name: nginx
image: nginx
EOFExposer le POD avec un service via le manifeste suivant:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: web-1
ports:
- protocol: TCP
port: 80
targetPort: 80
EOFVérifier la connectivité via service grâce à la commande port-forward.
Supprimer le service précédent, puis créer un Service de type loadBalancer via ce manifeste:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: http
EOF-
Vérifier l'accès au service et si besoin réparer le manifeste
-
Quel différence entre les deux types de Services (ClusterIp et LoadBalancer) ?
- Quelles sont les implications à créer des services de type LoadBalancer ?
- Quelles alternatives ?
Ne pas ouvrir - aide
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80Detruire le deploiement nginx
kubectl delete deployment nginxCréer un deployment de l'image gcr.io/kuar-demo/kuard-amd64:blue
Augmenter le nombre de réplicas à 3.
Exposer le service via un LoadBalancer sur le port 80 (kuard se lance sur 8080).
Accéder à kuard par la commande curl.
On crée une liveness :
# On install une liveness Probe.
kubectl patch deployment kuard --type='merge' -p'
spec:
template:
spec:
containers:
- name: kuard-amd64
image: gcr.io/kuar-demo/kuard-amd64:blue
ports:
- containerPort: 8080
livenessProbe:
failureThreshold: 5
httpGet:
path: /healthy1
port: 8080
initialDelaySeconds: 3
periodSeconds: 3'- Observez quel est le statut des pods (restart count ?)
- Pourquoi les containers restart ?
On ajoute une readiness probe.
kubectl patch deployment kuard --type='merge' -p'
spec:
template:
spec:
containers:
- name: kuard-amd64
image: gcr.io/kuar-demo/kuard-amd64:blue
ports:
- containerPort: 8080
livenessProbe:
failureThreshold: 5
httpGet:
path: /healthy
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
failureThreshold: 3
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
'On ajuste les liveness et readiness Probe pour fonctionner avec cette application.
kubectl patch deployment kuard --type='merge' -p'
spec:
template:
spec:
containers:
- name: kuard-amd64
image: gcr.io/kuar-demo/kuard-amd64:blue
livenessProbe:
failureThreshold: 5
httpGet:
path: /healthy
port: 8080
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 3
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 2
httpGet:
path: /ready
port: 8080
scheme: HTTP
initialDelaySeconds: 15
periodSeconds: 3
successThreshold: 2
timeoutSeconds: 1https://helm.sh/docs/intro/install/
- installer la version officiel du chart ghost 8.0.2 dans un namespace nommé
ghost.- Où se trouve le repo des chart officiel ?
Ne pas utiliser l'install mariadb intégrée mais déployer un chart mysql dans le namespace nommé
database.
- Utiliser ces noms pour les
release:1 helm:- ghost pour le chart ghost
- mysql pour le chart mysql
Réponse à l'exercice 1
- Ghost: https://github.com/bitnami/charts/
- Mysql: https://artifacthub.io/packages/helm/bitnami/mysql
Voici une version fonctionnelle de la commande:
# Install le chart mysql
helm install --name mysql --namespace database \
--set mysqlRootPassword=MySqlRootpasswordIsGreateAndPowerful \
--set mysqlUser=ghost-user \
--set mysqlPassword=MyAppsecretpasswordIsGreateAndPowerful \
--set mysqlDatabase=ghost-database \
bitnami/mysqlVérifier que la base fonctionne correctement.
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace database mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
# Execute the following command to route the connection:
kubectl port-forward -n database svc/mysql 3306 &
sleep 5
mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}Installer ghost
helm upgrade --install ghost --set nameOverride=ghost --namespace ghost bitnami/ghost \
--set mariadb.enabled=false \
--set externalDatabase.host=mysql.database \
--set externalDatabase.user=ghost-user \
--set externalDatabase.password=MyAppsecretpasswordIsGreateAndPowerful \
--set externalDatabase.database=ghost-database \
--set ghostHost=ghost.slashetc.host \
--set ghostUsername=admin \
--set ghostPassword=MyGhostsecretpasswordIsGreateAndPowerful \
--version 8.0.2Accéder au ghost en trouvant l'IP Pub sur laquelle il est exposé.
Réparer votre ghost
Réponse à l'exercice 2
Vous constatez que votre POD Ghost passe du status Running à Error puis CrashLoopBackOff
Vous lancer un describe pour vérifier le state du POD:
kubectl describe pod -n ghost -l app=ghostLe state est :
Last State: Terminated
Reason: Error
Exit Code: 1
C'est donc l'application qui a quitté avec un code 0.
Vous regardez les logs de l'application:
kubectl logs -n ghost -l app=ghost
Welcome to the Bitnami ghost container
Subscribe to project updates by watching https://github.com/bitnami/bitnami-docker-ghost
Submit issues and feature requests at https://github.com/bitnami/bitnami-docker-ghost/issues
WARN ==> You set the environment variable ALLOW_EMPTY_PASSWORD=yes. For safety reasons, do not use this flag in a production environment.
nami INFO Initializing mysql-client
nami INFO mysql-client successfully initialized
nami INFO Initializing ghost
Error executing 'postInstallation': The admin password must be at least 10 characters.Vous en déduisez que le mot de passe admin est trop court. Il a été changé dans les secrets.
Footnotes
-
release est le nom du déploiement helm. (eg. dans
helm --install marelease stable/ghostmarelease est le nom de la release). ↩