TP Matin - Réseau & Certificats
TP Cilium : Network Policies avec eBPF
Déployer Cilium comme CNI et expérimenter les Network Policies pour contrôler les flux réseau entre pods.
Prérequis
- Un cluster Kubernetes fonctionnel (kind ou kubeadm)
helminstalléciliumCLI installé
Étape 1 : Installer Cilium via Helm
helm repo add cilium https://helm.cilium.io/
helm repo update
helm install cilium cilium/cilium \
--namespace kube-system \
--set kubeProxyReplacement=strict \
--set k8sServiceHost=<CONTROL_PLANE_IP> \
--set k8sServicePort=6443
Vérifier l'installation :
cilium status
cilium connectivity test
Étape 2 : Déployer une application de test
# Namespace de test
apiVersion: v1
kind: Namespace
metadata:
name: cilium-test
---
# Pod frontend
apiVersion: v1
kind: Pod
metadata:
name: frontend
namespace: cilium-test
labels:
app: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
# Pod backend
apiVersion: v1
kind: Pod
metadata:
name: backend
namespace: cilium-test
labels:
app: backend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
# Pod external (simulateur de trafic externe)
apiVersion: v1
kind: Pod
metadata:
name: external
namespace: cilium-test
labels:
app: external
spec:
containers:
- name: busybox
image: busybox
command: ["sleep", "3600"]
kubectl apply -f test-pods.yaml
kubectl get pods -n cilium-test
Étape 3 : Vérifier la connectivité par défaut
# Depuis le pod external, tenter de joindre le backend
kubectl exec -n cilium-test external -- wget -qO- --timeout=5 http://backend.cilium-test.svc.cluster.local
# Depuis le frontend, tenter de joindre le backend
kubectl exec -n cilium-test frontend -- wget -qO- --timeout=5 http://backend.cilium-test.svc.cluster.local
Par défaut, tous les pods peuvent communiquer entre eux.
Étape 4 : Appliquer une Network Policy restrictive
# Autoriser uniquement le frontend à accéder au backend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: cilium-test
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 80
kubectl apply -f network-policy.yaml
Étape 5 : Vérifier l'isolation
# Ce call doit RÉUSSIR (frontend → backend autorisé)
kubectl exec -n cilium-test frontend -- wget -qO- --timeout=5 http://backend.cilium-test.svc.cluster.local
# Ce call doit ÉCHOUER (external → backend bloqué)
kubectl exec -n cilium-test external -- wget -qO- --timeout=5 http://backend.cilium-test.svc.cluster.local
Étape 6 : Observer avec Hubble (optionnel)
# Activer Hubble
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--reuse-values \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true
# Ouvrir l'UI Hubble
cilium hubble ui &
# Observer les flux en CLI
hubble observe --namespace cilium-test --follow
Points à explorer
- Appliquer une politique d'egress pour bloquer les requêtes sortantes vers l'extérieur
- Comparer le comportement avec une Network Policy
deny-allsuivie de règles d'autorisation granulaires - Observer dans Hubble les flux autorisés vs rejetés
TP cert-manager : HTTPS automatique avec Let's Encrypt
Installer cert-manager et obtenir automatiquement un certificat TLS via Let's Encrypt pour une application exposée par un Ingress.
Prérequis
- Un cluster Kubernetes avec accès internet
- Un Ingress Controller déployé (Traefik ou nginx)
- Un nom de domaine pointant vers le cluster
Étape 1 : Installer cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
Vérifier l'installation :
kubectl get pods -n cert-manager
# 3 pods doivent être Running : cert-manager, cert-manager-cainjector, cert-manager-webhook
Étape 2 : Créer un ClusterIssuer Let's Encrypt (staging)
Toujours commencer par staging pour éviter les rate limits de production :
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: votre-email@domaine.com
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- http01:
ingress:
class: traefik
kubectl apply -f clusterissuer-staging.yaml
kubectl describe clusterissuer letsencrypt-staging
Étape 3 : Déployer une application de test
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: whoami
namespace: default
spec:
selector:
app: whoami
ports:
- port: 80
targetPort: 80
kubectl apply -f whoami.yaml
Étape 4 : Créer l'Ingress avec annotation cert-manager
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: whoami-ingress
namespace: default
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-staging"
spec:
tls:
- hosts:
- whoami.votre-domaine.com
secretName: whoami-tls
rules:
- host: whoami.votre-domaine.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: whoami
port:
number: 80
kubectl apply -f ingress.yaml
Étape 5 : Suivre l'émission du certificat
# Observer la création du Certificate
kubectl describe certificate whoami-tls
# Observer le CertificateRequest
kubectl get certificaterequest
# Observer le Challenge ACME
kubectl get challenge
# Observer l'Order ACME
kubectl get order
En quelques minutes, le certificat passe de l'état False à True :
kubectl get certificate whoami-tls -w
# NAME READY SECRET AGE
# whoami-tls True whoami-tls 2m
Étape 6 : Passer en production
Une fois le staging validé, créer le ClusterIssuer production :
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: votre-email@domaine.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: traefik
Mettre à jour l'annotation de l'Ingress :
kubectl annotate ingress whoami-ingress \
cert-manager.io/cluster-issuer=letsencrypt-prod --overwrite
Points à explorer
- Que se passe-t-il si le DNS ne pointe pas encore correctement ?
- Inspecter le contenu du Secret TLS :
kubectl get secret whoami-tls -o yaml - Tester le renouvellement automatique en simulant une expiration proche
- Comparer avec un
Issuer(namespace-scoped) vsClusterIssuer(cluster-wide)