Dans cette section nous allons voir comment configurer un ingress SSL avec redirection HTTP vers HTTPS sous Google Kubernetes Engine (GKE).
Dans un premier temps nous allons ajouter un déploiement nginx simple :
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
Puis nous allons associer ce déploiement à un service :
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
Le déploiement est maintenant lié à un service.
Nous aimerions maintenant créer un ingress (Load Balancer GKE) redirigeant le trafic HTTP vers HTTPS avec un certificat SSL géré par Google. Pour se faire, nous allons devoir créer une IP fixe :
gcloud compute addresses create nginx --global
Ici, nous avons demandé une IP publique à GCP. Pour récupérer cette IP :
$ gcloud compute addresses describe nginx --global
address: 34.XXX.XXX.XXX
addressType: EXTERNAL
creationTimestamp: '2021-07-25T03:37:27.716-07:00'
...
Une fois que nous avons l'adresse, nous allons rediriger notre sous domaine nginx.antoine-chiris.com
sur notre hébergeur.
Une fois effectué nous pouvons maintenant nous attaquer à la configuration du certificat/frontend/ingress :
apiVersion: networking.gke.io/v1
kind: ManagedCertificate # Type spécifique à GKE
metadata:
name: nginx-antoine-chiris
spec:
domains:
- nginx.antoine-chiris.com # Domaine qui redirige vers l'adresse IP créée au-dessus
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
name: redirect-http
spec:
redirectToHttps: # Crée un load balancer HTTP qui redirige vers le LB HTTPS
enabled: true
responseCodeName: MOVED_PERMANENTLY_DEFAULT
En regardant la doc GCP, il existe différent code de retour :
Nous allons maintenant créer l'ingress qui va appliquer les différentes configurations ci-dessus :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: nginx # IP Créée au début
networking.gke.io/managed-certificates: nginx-antoine-chiris # Nom du certificat
kubernetes.io/ingress.class: "gce" # Optionnel, GCE de base
networking.gke.io/v1beta1.FrontendConfig: "redirect-http" # Applique la configuration frontend côté GCP.
spec:
defaultBackend: # Ingress standard
service:
name: nginx-service
port:
number: 80
Une fois appliqué, cela peut prendre du temps avant de valider le certificat (10/20 minutes). Lorsque le certificat est validé :
$ curl nginx.antoine-chiris.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://nginx.antoine-chiris.com/">here</A>.
</BODY></HTML>
$ curl https://nginx.antoine-chiris.com
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
En résumé, la configuration ci-dessus nous a permis :
En allant dans la partie Load Balancing de GCP, nous pouvons voir le travail effectué par GKE :
En cliquant sur le LB HTTPS, nous pouvons voir qu'il est lié à un certificat. Un healthcheck a automatiquement été crée :
Si vous souhaitez en savoir plus sur les features de ingress sous GKE regardez ici.