Skip to content

Lab 2b : Kubernetes Avancé

Ingress

L'Ingress de Kubernetes gère l'accès externe aux services dans un cluster, généralement via HTTP et HTTPS. Il offre des fonctionnalités telles que l'équilibrage de charge, la terminaison SSL et le routage basé sur les noms.

Installer le Contrôleur Ingress

Une ressource Ingress nécessite qu'un Contrôleur Ingress soit déployé dans votre cluster pour fonctionner. Un contrôleur très courant est le controller ingress NGINX.

Créez une Ressource Ingress

Réutilisez le travail que vous avez effectué dans le laboratoire précédent. Commencez par créer et appliquer la ressource Ingress suivante (vous devez modifier le fichier):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wikijs-ingress-<votre-nom>
  namespace: <votre_namespace>
spec:
  rules:
  - host: <votre-nom>.cnam.cluster.org
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: wiki-svc
            port:
              number: 3000

La configuration ci-dessus dirige le trafic de ".cnam.cluster.org" vers le service wiki-svc, qui devrait être en fonctionnement sur le port 3000. Pour vérifier si l'ingress a été correctement appliqué, exécutez:

kubectl get ingress

Maintenant, naviguez vers http://163.173.230.100/

Questions 5-6

Question 5

Pourquoi ne voyez-vous pas la page WikiJS ? Que pouvez-vous faire pour résoudre ce problème ?

Question 6

Votre cluster expose maintenant un NodePort et un Ingress pour le même service. Pouvez-vous penser à quelques raisons pour lesquelles cela est considéré comme une mauvaise pratique ? Quel autre type de service utiliseriez-vous dans ce cas ?

NetworkPolicy ressource

Les politiques réseau dans Kubernetes sont gérées par le CNI. La ressource de base (compatible avec tous les CNIs) est la NetworkPolicy.

Info

Pouvez-vous comprendre quel CNI nous utilisons ?

Par défaut, tout est autorisé dans Kubernetes. Une politique de refus par défaut ressemble à :

# policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny # nom
# Par default dans le default namespace
spec:
  podSelector: {} # Deny all
  policyTypes:
  - Ingress
  - Egress

Appliquez la politique dans votre espace de noms et vérifiez la connectivité Internet depuis le conteneur de test, par exemple:

 ping google.com

Vous ne devriez pas être autorisé à pinger le site de Google.

Question 7

Installez le conteneur de test Ubuntu dans le default namespace. Le conteneur peut-il pinger google.com? Et les conteneurs des autres étudiants ?

Pour supprimer la NetworkPolicy:

kubectl delete -f policy.yaml -n <votre-namespace>

Question 8

Créez une NetworkPolicy qui permet à WikiJS de recevoir des connexions de chaque Pod, mais empêche WikiJS d'initier des connexions. De plus, WikiJS ne devrait pas être en mesure de se connecter à Internet. Fournissez le contenu YAML de la politique.

Le pattern Sidecar dans Kubernetes

L’application Kubernetes suivante déploie un site web Wordpress et une base de données pour stocker son contenu. Prenez le temps de le lire et de comprendre son contenu.

Tout d'abord, nous devons supprimer toutes les ressources de l'étape précédente. Cela peut être fait soit en supprimant chaque ressource par son nom : par exemple, kubectl delete service/wiki-svc, ou en utilisant les fichiers YAML.

# wordpress.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          ports:
            - containerPort: 3306
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "password"
            - name: MYSQL_DATABASE
              value: "wordpress"
          volumeMounts:
            - name: mysql-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-storage
          persistentVolumeClaim:
            claimName: mysql-pvc

---
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
        - name: wordpress
          image: wordpress:latest
          ports:
            - containerPort: 80
          env:
            - name: WORDPRESS_DB_HOST
              value: "mysql-service"
            - name: WORDPRESS_DB_USER
              value: "root"
            - name: WORDPRESS_DB_PASSWORD
              value: "password"
            - name: WORDPRESS_DB_NAME
              value: "wordpress"
          volumeMounts:
            - name: wordpress-storage
              mountPath: /var/www/html
      volumes:
        - name: wordpress-storage
          persistentVolumeClaim:
            claimName: wordpress-pvc

---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-service
spec:
  selector:
    app: wordpress
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080 # <-- Attention

Exercise 9

Nous voulons ajouter un conteneur proxy sidecar (nginx) nommé logs-proxy qui écoute sur le port 8080. Ce sidecar transmet chaque requête au conteneur Wordpress et affiche chaque requête dans la sortie standard (STDOUT) au format JSON. Dans cet exercice, vous fournirez le fichier wordpress.yaml mis à jour.

graph LR
  A[User] --> B[Wordpress Service]
  B --> |8080| C[logs-proxy]
  C -->|80| D[Wordpress]
  D -->A

Warning

**Ne fournissez pas** de captures d'écran du fichier. Seul le texte sera pris en compte pour la soumission de cet exercice.

Tip

Vous pouvez utiliser la ressource ConfigMap pour ajouter des fichiers de configuration à un Pod. Consultez la documentation Kubernetes.

Service Mesh dans Kubernetes

Nous utiliserons Istio comme service mesh dans ce laboratoire.

1. Installer Istio

Tout d'abord, installez et téléchargez Istio en suivant les instructions officielles.

Warning

Vous n'avez pas à suivre l'ensemble du tutoriel sur le site d'Istio, installez simplement Istio.

2. Exécuter le tutoriel bookinfo

Exécutez le tutoriel bookinfo sur le site d'Istio et répondez aux questions suivantes:

Questions

Question 10

Istio - dans la configuration actuelle - permet-il la communication pod-à-pod ? Expliquez votre raisonnement et les commandes que vous utilisez pour vérifier cela.

Tip

Vous pouvez utiliser la commande kubectl exec -it <podname> -- bash dans certains des conteneurs pour obtenir un shell.

Question 11

Regardez les pods et conteneurs installés par Istio. Où sont installés les conteneurs sidecar ? Quelles commandes sont exécutées ?

Tip

Vous pouvez inspecter le contenu d'un Pod en utilisant la commande kubectl describe <podname>.

Introduction à Helm

Helm est un gestionnaire de packages et un moteur de modèles pour Kubernetes qui permet de gérer facilement des applications. Les applications Helm sont appelées charts et elles constituent une collection de fichiers qui décrivent les ressources Kubernetes.

Pourquoi Helm ?

Voici quelques raisons qui font de Helm une solution populaire :

  • Déploiement facile : Une seule commande peut installer des applications complexes.
  • Contrôle de version : Les charts Helm peuvent être versionnés, ce qui vous permet de revenir à des versions précédentes de votre application si nécessaire.
  • Réutilisabilité : Les charts Helm peuvent être réutilisés dans différents environnements, garantissant la cohérence des déploiements.

Tutoriels Helm

Nous vous suggérons de suivre le guide de démarrage rapide officiel pour Helm.

Question 12

Prenez la configuration YAML de l'exercice précédent et transformez-la en un chart Helm. Fournissez le chart Helm sous forme d'archive. Quels paramètres avez-vous choisi d'être paramétrés dans le fichier values.yaml et pourquoi ?