Ce TP se déroule sur un cluster DigitalOcean.
- But du TP
- Etape 0 : Initialisation du numéro de groupe
- Etape 1 : Installation d'un Ingress Controler via Helm
- Etape 2 : Deploiement d'une règle Ingress HTTP
- Etape 3 : Publication en HTTPS
Manipuler l'objet Ingress Controler pour publier en HTTP et HTTPS nos services internes. Nous utiliserons l'implémentation de NGINX qui fait référence. Cilium propose depuis récemment sa propre implémentation.
Positionner une variable qui contient votre numéro de groupe :
GRP=X
echo $GRP
X
Bien sûr utiliser la bonne valeur de X
Commençons par installer localement le repo ingress-nginx
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
NB : si et seulement si helm
n'est pas installé dans votre environnement, vous pouvez l'installer par :
wget -qO- https://get.helm.sh/helm-v3.14.2-linux-amd64.tar.gz | tar xvz -C /home/vscode/.local/bin/
Créeons le NameSpace dédié :
kubectl create namespace ingress-nginx
Puis déployons l'Ingress Controller, en précisant des annotations relaitves à DigitalOcean :
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.publishService.enabled=true \
--set-string controller.service.annotations."service\.beta\.kubernetes\.io/do-loadbalancer-name"="lb-groupe${GRP}"
Vous devez obtenir :
$ kubectl get service ingress-nginx-controller --namespace ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.245.70.241 144.126.246.212 80:30343/TCP,443:31042/TCP 3m47s
NB : Un Load-Balancer frontal est toujours nécessaire, sa création est souvent implicite.
Déployons maintenant notre service de type ClusterIP qui pointe sur un Pod NGINX-DEMO, et la règle d'Ingress (Attention de bien modifier le nom du host dans le fichier ingress.yaml avec le bon numéro de groupe) :
sed "s/GRP/$GRP/" sol/ingress.tpl > sol/ingress.yaml
kubectl apply -f sol/ingress.yaml
Vérifions :
$ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
demo-ingress nginx groupeX.randco.eu a.b.c.d 80 39s
Par ailleurs, assurons que la résolution DNS du site web soit correcte (tâche du formateur):
ping groupeX.randco.eu
Si tout est OK, la consultation du site http://groupeX.randco.eu doit être fonctionnelle :
Ajoutons un générateur de certificats TLS motorisé par Let'sEncrypt, Cert-Manager:
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.12.0 \
--set installCRDs=true
Maintenant, instançions CertManager:
## issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: [email protected]
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
ingressClassName: nginx
kubectl apply -f issuer.yaml
Modifions le fichier ingress.yaml (ne pas oublier de le ré-appliquer) en ajoutant :
- une annotation relative au certificat issuer
- en fin de fichier le nom TLS et le secret associé
**!! Attention à bien adapter le groupeX **
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
rules:
- host: groupeX.randco.eu
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: demo-service
port:
number: 80
tls:
- hosts:
- groupeX.randco.eu
secretName: groupeX.randco.eu-tls
Il ne reste plus qu'à visiter https://groupeX.randco.eu
Pour les plus curieux, voici quelques commandes qui permettent d'inspecter les états :
kubectl get clusterissuer
kubectl get certificate
kubectl get certificaterequests
kubectl get order
kubectl get challenge
Si vous souhaitez visualiser le contenu du secret (c-a-d la clé privée du certificat TLS) :
kubectl get secrets/letsencrypt-prod -ncert-manager -o json | jq '.data | map_values(@base64d)'