Skip to content

Instantly share code, notes, and snippets.

@Oxalide-Team-2
Last active May 3, 2021 07:22
Show Gist options
  • Select an option

  • Save Oxalide-Team-2/23f4a775fb1a01489319fd472c98b9c3 to your computer and use it in GitHub Desktop.

Select an option

Save Oxalide-Team-2/23f4a775fb1a01489319fd472c98b9c3 to your computer and use it in GitHub Desktop.
interview-k8s

K8s-lab-run

Sommaire

Pré-requis

Setup initial

Installer gcloud

# 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

Les basiques (TP)

  • 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"
EOF

Vé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 nginx

Vérifier que le pod s'execute.

Supprimer ce POD.

  • Que se passe-t-il ?
  • Le POD réapparait-il ?
  • Expliquez pourquoi.

Les réplicas

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 ?

Troubleshooting / Diagnostique

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

Analyse des logs

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 ?

Les Services

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
EOF

Exposer 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
EOF

Vé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: 80

Detruire le deploiement nginx

kubectl delete deployment nginx

Exercice 1

Tester les liveness et readiness Probe

Cré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.

Les LivenessProbes

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 ?
Les ReadinessProbes

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: 1

Helm

Installer Helm

https://helm.sh/docs/intro/install/

Excercice 2

  • 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


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/mysql

Vé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.2

Accéder au ghost en trouvant l'IP Pub sur laquelle il est exposé.

Exercice 2

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=ghost

Le 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

  1. release est le nom du déploiement helm. (eg. dans helm --install marelease stable/ghost marelease est le nom de la release).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment