Chapitre 02

Premier déploiement

Trois objets, un fichier, une commande. À la fin de ce chapitre, un serveur web répond en HTTPS sur un nom à vous, et vous savez pourquoi.

Niveau intermédiaire  ·  Lecture 12 min  ·  Pour les développeurs

Renseignez le domaine de votre plateforme et votre namespace : les commandes et les manifestes de la page s'adaptent. Les valeurs restent dans votre navigateur.

01Trois objets suffisent

ObjetRôleAnalogie
DeploymentFait tourner votre conteneur, en plusieurs copiesL'équipe en cuisine
ServiceDonne une adresse interne stable à ces copiesLe passe-plat
IngressPublie un nom de domaine en HTTPS vers le ServiceLa porte du restaurant

Notre exemple publie un serveur nginx sur hello.demo.k8s.exemple.fr. Choisissez un nom libre sous demo.k8s.exemple.fr : préfixez-le avec le nom de votre équipe si vous êtes plusieurs à suivre ce guide en même temps.

02Le manifeste complet

Enregistrez ce fichier sous hello.yaml. Les trois objets sont séparés par --- :

hello.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  replicas: 2
  selector:
    matchLabels: { app: hello }
  template:
    metadata:
      labels: { app: hello }
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile: { type: RuntimeDefault }
      containers:
        - name: web
          image: nginxinc/nginx-unprivileged:stable-alpine
          ports:
            - containerPort: 8080
          resources:
            requests: { cpu: 50m, memory: 64Mi }
            limits: { memory: 128Mi }
          securityContext:
            allowPrivilegeEscalation: false
            capabilities: { drop: ["ALL"] }
          readinessProbe:
            httpGet: { path: /, port: 8080 }
---
apiVersion: v1
kind: Service
metadata:
  name: hello
spec:
  selector: { app: hello }
  ports:
    - port: 80
      targetPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  ingressClassName: traefik
  tls:
    - hosts: [hello.demo.k8s.exemple.fr]
      secretName: hello-tls
  rules:
    - host: hello.demo.k8s.exemple.fr
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service: { name: hello, port: { number: 80 } }

Les blocs securityContext et resources ne sont pas décoratifs. Le premier dit que le conteneur tourne sans être root et sans privilèges : c'est pourquoi l'image choisie écoute sur le port 8080 et non 80, réservé à root. Le second réserve de quoi tourner et fixe un plafond de mémoire ; sans lui, le quota du projet refuse le pod. Quant au tag stable-alpine, il suffit pour un essai ; le chapitre 05 explique pourquoi la production mérite un tag précis.

03Appliquer avec kubectl

Déployer et suivre
kubectl apply -f hello.yaml
kubectl rollout status deploy/hello      # attend que les 2 copies soient prêtes
kubectl get pods,svc,ingress
kubectl get certificate                  # READY=True après une à deux minutes
curl -I https://hello.demo.k8s.exemple.fr

La première réponse peut demander une à deux minutes : le temps de créer l'enregistrement DNS, de le propager, puis d'obtenir le certificat. Les fois suivantes, une mise à jour est en ligne en quelques secondes.

04Ou depuis l'interface Rancher

Dans le cluster demo, le bouton Import YAML (icône en haut à droite) accepte le même fichier : collez-le, choisissez votre namespace, validez. Les objets apparaissent ensuite dans Workloads et Service Discovery, avec un bouton pour les journaux et un autre pour ouvrir un shell dans chaque pod.

Pratique pour un premier essai. Pour la suite, gardez vos fichiers : un manifeste se relit, se versionne et se rejoue, un clic non.

05Ce qui vient de se passer

  1. Le Deployment a créé deux pods, placés sur deux serveurs différents quand c'est possible.
  2. Le Service les a regroupés derrière une adresse interne, et n'envoie du trafic qu'aux pods dont la sonde readinessProbe répond.
  3. external-dns a vu l'Ingress et créé l'enregistrement hello.demo.k8s.exemple.fr vers l'IP publique de la plateforme, 203.0.113.47.
  4. cert-manager a obtenu un certificat Let's Encrypt et le renouvellera seul, tous les deux mois environ.
  5. Traefik route le trafic HTTPS vers le Service, et CrowdSec filtre les visiteurs indésirables au passage.

Vous avez écrit 60 lignes de YAML ; la plateforme a fait le reste. C'est le contrat.

06Nettoyer

Tout supprimer d'un coup
kubectl delete -f hello.yaml

Le même fichier qui a tout créé supprime tout. L'enregistrement DNS, lui, reste en place : la plateforme ne supprime jamais un nom, par prudence. Il ne pointe plus vers rien et sera réutilisé si vous redéployez.

Vous codez, nous veillons sur le cluster

Cette plateforme existe pour que vos développeurs déploient sans attendre personne et sans ticket. Nous l'hébergeons et l'exploitons pour vous : réseau, certificats, sauvegardes, mises à jour et surveillance des attaques. Il vous reste le plus intéressant.