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 "wiki-svc, qui devrait être en fonctionnement sur le port 3000. Pour vérifier si l'ingress a été correctement appliqué, exécutez:
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:
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:
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 ?