Ce TP se déroule sur un cluster DigitalOcean.
- But de l'exercice
- 1.Créer le NS red
- 2.Creer un pod dans le NS red
- 3.Vérifier que vous pouvez désactiver un Pod
- 4.Créer et appliquer une règle sur le Pod podinfo
- 5.Inspecter les Headers HTTP
- Cleanup
- Apprendre à construire une CNP L7
kubectl create ns red
Créeons un déploiment avec un réplica unique et exposons-le
kubectl create deployment podinfo --image=stefanprodan/podinfo --namespace=red
kubectl expose deployment podinfo --port=80 --target-port=9898 --namespace=red
3.Vérifier que vous pouvez désactiver un Pod en faisant un POST sur /readyz/disable
(fonctionnalité de l'appli podinfo)
On crée un Pod nommé debug dans le NS red afin de requeter en L7 le svc podinfo :
kubectl run debug-pod -it --rm --restart=Never --image=nicolaka/netshoot --namespace=red -- bash
# curl -sv -X POST http://podinfo.red.svc/readyz/disable
# curl -sv http://podinfo.red.svc/readyz
Créer une NetworkPolicy L7 (composée éventuellement de plusieurs règles) qui
- s'applique sur Podinfo
- empêche le POST sur "/readyz/disable"
- autorise le GET sur "/readyz"
La documentation est accessible ici : https://docs.cilium.io/en/v1.12/policy/language/#layer-7-examples .
Voici un exemple à adapter :
## l7-policy.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "rule1"
spec:
description: "Allow HTTP GET /public from env=prod to app=service"
endpointSelector:
matchLabels:
app: service
ingress:
- fromEndpoints:
- matchLabels:
env: prod
toPorts:
- ports:
- port: "80"
protocol: TCP
rules:
http:
- method: "GET"
path: "/public"
kubectl apply -f l7-policy.yaml -n red
Pour cela utilisez une règle CiliumNetwork Policy L7
Des indices :
- préciser bien que la NP s'applique à un déploiement (app=podinfo)
- préciser que la source est le Pod debug-po (run=debug-pod)
- preciser le bon port TCP à filtrer vu du Pod
En déduire le composant logiciel tiers utilisé par Cilium qui bloque les appels L7.
On constate même la présence d'un process envoy sur le Node en question, en listant les process (via nod-shell par exemple) :
root@node-7io28:/# ps -efd | grep envoy
root 108864 3075 0 13:59 ? 00:00:02 cilium-envoy -l info -c /var/run/cilium/bootstrap.pb --base-id 0 --log-format %t|%l|%n|%v
kubectl delete -f l7-policy.yaml -n red