Dans la lignée des essais menés sur les déploiements d'applications Docker sur des clusters Kubernetes, le tout avec un certificat SSL assuré par Cert-Manager, je poursuis aujourd'hui avec une application VueJS que je vais installer sur mon cluster en tant que https://vue.domain.fr.

Voici un schéma de l'infrastructure cible :

Le but sera d'ajouter un sous-domaine à notre domaine existant et à nos plusieurs sites déjà déployés sur le même cluster et le même certificat SSL.

Pour ce faire je vais utiliser une image Docker d'un site codé avec VueJS et déjà existante donc, d'où l'articulation avec le Docker Hub.

Pré-requis :

  • kubectl installé sur votre poste de développement
  • un cluster Gke en fonction
  • Helm installé
  • Nginx ingress controller installé et configuré
  • Cert-Manager installé et paramétré

Installation sur le cluster GKE

On débute par le premier fichier, deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: vuejs
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: vuejs
    spec:
      containers:
      - image: retrobox/web
        imagePullPolicy: Always
        name: vuejs
        ports:
        - containerPort: 80

Dans la zone "containers" vous pouvez évidemment modifier l'image par celle que vous souhaitez utiliser.

Ensuite on utilise la commande :

kubectl apply -f deployment.yaml

Puis viens le tour du fichier service.yaml

apiVersion: v1
kind: Service
metadata:
  name: vuejs
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: vuejs

Et de l'ingress (pensez-bien à modifier les zones personnalisées comme l'host) :

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-vue
  annotations:
     ingress.kubernetes.io/ssl-redirect: "true"
     kubernetes.io/tls-acme: "true"
     kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - host: vue.gsagnard.fr
      http:
        paths:
          - path: /
            backend:
              serviceName: vuejs
              servicePort: 80
  tls:
     - hosts:
       - vue.gsagnard.fr
       secretName: vue-ingress-tls

On apply le tout et on a un deployment, un service et un ingress pour notre webapp. Maintenant il faut songer à la partie certificat SSL. On va modifier le fichier ingress-tls-final.yaml que nous avons déjà utilisé dans les précédents articles :

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: blog
  annotations:
    kubernetes.io/ingress.class: "nginx"
    certmanager.k8s.io/issuer: "letsencrypt-prod"
    certmanager.k8s.io/acme-challenge-type: http01

spec:
  tls:
  - hosts:
    - myblog.gsagnard.fr
    - matomo.gsagnard.fr
    - vue.gsagnard.fr
    secretName: quickstart-example-tls
  rules:
  - host: myblog.gsagnard.fr
    http:
      paths:
      - path: /
        backend:
          serviceName: blog
          servicePort: 80
  - host: matomo.gsagnard.fr
    http:
      paths:
      - path: /
        backend:
          serviceName: matomo
          servicePort: 8000
  - host: vue.gsagnard.fr
    http:
      paths:
      - path: /
        backend:
          serviceName: vuejs
          servicePort: 80

Toujours bien penser à modifier les zones personnelles (hosts) et le résultat devrait arriver rapidement, on peut toujours utiliser la fameuse commande :

kubectl describe certificate xxxxx

Cela permet de vérifier l'état d'avancement de la création du certificate en live.

Et au bout de quelques minutes, voici ce qui en résulte :

SSL ok
Site ok 

Cela me donne envie de me mettre à VueJS en tout cas :)

Trois sites déployés sous le même certificat via Cert-Manager sur le même cluster K8s, le top - Kubernetes je t'<3