Déploiement Blue/Green

Prérequis

Créer un namespace

kubectl create namespace myspace
kubectl config set-context --current --namespace=myspace

Vérifier que le namespace est vide

kubectl get all
No resources found in myspace namespace.

Créer un fichier de déploiement

mkdir -p apps/kubefiles/
vi apps/kubefiles/myboot-deployment-resources-limits.yml

myboot-deployment-resources-limits.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myboot
  name: myboot
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myboot
  template:
    metadata:
      labels:
        app: myboot
    spec:
      containers:
      - name: myboot
        image: quay.io/rhdevelopers/myboot:v1
        ports:
          - containerPort: 8080
        resources:
          requests:
            memory: "300Mi"
            cpu: "250m" # 1/4 core
          # NOTE: These are the same limits we tested our Docker Container with earlier
          # -m matches limits.memory and --cpus matches limits.cpu
          limits:
            memory: "400Mi"
            cpu: "1000m" # 1 core

Déployer la version 1 de l’applciation myboot

kubectl apply -f apps/kubefiles/myboot-deployment-resources-limits.yml

Scale l’application avec 2 replicas

kubectl scale deployment/myboot --replicas=2

Vérifier l’état de l’application

watch kubectl get pods --show-labels

Créer un fichier pour votre service

vi apps/kubefiles/myboot-service.yml

myboot-service.yml

apiVersion: v1
kind: Service
metadata:
  name: myboot
  labels:
    app: myboot
spec:
  ports:
  - name: http
    port: 8080
  selector:
    app: myboot
  type: LoadBalancer

Déployer le service

kubectl apply -f apps/kubefiles/myboot-service.yml

Créer les variables d’environnement IP et Port

IP=$(minikube ip -p devnation)
PORT=$(kubectl get service/myboot -o jsonpath="{.spec.ports[*].nodePort}")

Réaliser une requete du service

curl $IP:$PORT

Et maintenant créer une boucle de requete

while true
do curl $IP:$PORT
sleep .3
done

Créer un fichier de déploiement pour la version 2

vi apps/kubefiles/myboot-deployment-resources-limits-v2.yml

myboot-deployment-resources-limits-v2.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myboot-next
  name: myboot-next-5
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myboot-next
  template:
    metadata:
      labels:
        app: myboot-next
    spec:
      containers:
      - name: myboot
        image: quay.io/rhdevelopers/myboot:v3
        ports:
          - containerPort: 8080
        resources:
          requests:
            memory: "300000Mi"
            cpu: "250m" # 1/4 core
          limits:
            memory: "900000Mi"
            cpu: "1000m" # 1 core

Vérifiez que le nouveau pod/déploiement porte le nouveau code :

PODNAME=$(kubectl get pod -l app=myboot-next -o name)
kubectl exec -it $PODNAME -- curl localhost:8080
Bonjour from Spring Boot! 1 on myboot-next-66b68c6659-ftcjr

Maintenant, mettez à jour le service unique pour pointer vers le nouveau pod et passez au Green :

kubectl patch svc/myboot -p '{"spec":{"selector":{"app":"myboot-next"}}}'
Aloha from Spring Boot! 240 on myboot-d78fb6d58-929wn
Bonjour from Spring Boot! 2 on myboot-next-66b68c6659-ftcjr
Bonjour from Spring Boot! 3 on myboot-next-66b68c6659-ftcjr
Bonjour from Spring Boot! 4 on myboot-next-66b68c6659-ftcjr

Vous déterminez que vous préférez l’hawaïen (bleu) au français (vert) et faites un rollback :

Mettez maintenant à jour le service unique pour pointer vers le nouveau pod et passez en Bleu :

kubectl patch svc/myboot -p '{"spec":{"selector":{"app":"myboot"}}}'
Bonjour from Spring Boot! 17 on myboot-next-66b68c6659-ftcjr
Aloha from Spring Boot! 257 on myboot-d78fb6d58-vqvlb
Aloha from Spring Boot! 258 on myboot-d78fb6d58-vqvlb

Supprimer les ressources

kubectl delete service myboot
kubectl delete deployment myboot
kubectl delete deployment myboot-next