Aller au contenu

Mon premier déploiement

Les déploiements permettent de gérer les pods de manière automatisée en accèdant à l'état désiré et le cycle de vie du pod.

Description d'un déploiement

Pour créer un déploiement avec la commande create (permet la création de ressource) et une image hello world :

k create deployment hello-world --image=rancher/hello-world

Cette fois, en plus du pod qui a maintenant un nom aléatoire, il y a des objets de type Deployment et Replicaset qui sont crées.

k get all
NAME                               READY   STATUS    RESTARTS   AGE
pod/hello-world-596bc57554-vhhrw   1/1     Running   0          23s

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-world   1/1     1            1           23s

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-world-596bc57554   1         1         1       23s

Que nous pouvons inspecter :

  • Deployment :

    k describe deployments hello-world
    Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
    StrategyType:           RollingUpdate
    

    Les stratégies de déploiement sont pour les plus couramment utilisées : RollingUpdate et Recreating. Ils décrivent comment les pods de deploiement sont mis à jour lors des changements de configuration. Avec la première stratégie, le nouveau pod est créé avant de détruire le précédent. Cela permet d'éviter les downtimes. Avec la deuxième stratégie, les pods sont supprimés avant la création des nouveaux.

  • Replicaset :

    Les Replicaset (ensemble de réplicas) ont pour but de maintenir un ensemble stable de pods à un moment donné. Tous les pods gérés par les Replicaset sont identiques.

    k describe replicasets.apps hello-world
    Replicas:       1 current / 1 desired
    Pods Status:    1 Running / 0 Waiting / 0 Succeeded / 0 Failed
    

Nous refaisons à présent le même déploiement avec un manifest :

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: hello-world
  name: hello-world
  namespace: tuto
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-world
  template: 
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: rancher/hello-world
        ports:
        - containerPort: 80
          protocol: TCP
k create -f helloworld.yaml

Replicas

Les replicas servent à augmenter le nombre de pod de la même application dans le but de faire du loadbalancing, passer à l'échelle ou effectuer des migrations.

spec:
  replicas: 3

Pour changer le nombre de replica du déploiement en mode interactif :

k scale deployment hello-world --replicas 2 &&\
k get rs

Déploiement de l'application Jupyter

Exercice

A partir de l'exemple précédent, écrire un manifest myjupyter-app.yaml qui déploie l'application Jupyter avec son service associé et 3 replicas. Il est possible de mettre le déploiement et le service dans le même fichier yaml avec un séparateur ---.

Solution
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myjupyter
  namespace: tuto
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myjupyter
  template:
    metadata:
      labels:
        app: myjupyter
    spec:
      containers:
      - name: myjupyter
        image: jupyter/base-notebook
        ports:
        - containerPort: 8888
---
apiVersion: v1
kind: Service
metadata:
  name: myjupyter-service
  namespace: tuto
spec:
  type: NodePort
  selector:
    app: myjupyter
  ports:
    - protocol: TCP
      port: 8888
      nodePort: 30007

Il est possible d'accèder simultanément aux logs des 3 pods avec :

stern myjupyter

Vous pouvez vérifier la résilience du déploiement en effectuant dans 2 terminaux :

  1. Terminal 1
watch k get pods
  1. Terminal 2
k delete pod/myjupyter-xxx
Authors: Cécile Cavet