L’objectif de cet article est de présenter les concepts de base nécessaires pour le déploiement d’une application Dockerisée dans un cluster Kubernetes.
Dépôts GIT
Le code présenté dans cet article est extrait des deux dépôts GIT suivants.
books-api-simple
API de gestion de livres.
books-api-simple-run
Module de déploiement de l’API dans Kubernetes.
Déploiement de l’API
Le déploiement du conteneur de l’API est réalisé en définissant un objet Deployment.
Le résultat du déploiement est la création d’un Pod dans le cluster.
Le déployment spécifie :
- l’image Docker à déployer (registry.k8.wildwidewest.xyz/repository/docker-repository/pocs/books-api-simple)
- le nombre de replicas (1 ci-dessous))
- le port exposé par l’application (8080 ci-dessous)
- le mot de passe d’accès au registry docker stocké sous forme de secret (regsecret ci-dessous)
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: books-api-simple
spec:
replicas: 1
template:
metadata:
labels:
app: books-api-simple
spec:
containers:
- name: books-api-simple
image: registry.k8.wildwidewest.xyz/repository/docker-repository/pocs/books-api-simple:version
ports:
- containerPort: 8080
imagePullSecrets:
- name: regsecret
Création d’un service d’accès
Dans Kubernetes, les Pods étant des objets éphémères, le Service est le point d’accès, interne au cluster, aux conteneurs déployés.
Kubernetes enregistre les Services dans le DNS local au cluster, l’appel d’un service se fait donc via son nom.
kind: Service
apiVersion: v1
metadata:
name: books-api-simple
spec:
selector:
app: books-api-simple
ports:
- protocol: TCP
port: 80
targetPort: 8080
Publication du service
Kubernetes permet via la notion d’Ingress de publier les services en dehors du cluster.
Le fragment de code ci-dessous map les requêtes envoyées à l’URL books-api-simple.k8.wildwidewest.xyz vers le service books-api-simple.
Le proxy utilisé est un proxy traefik.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: books-api-simple
annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: PathPrefixStrip
spec:
rules:
- host: books-api-simple.k8.wildwidewest.xyz
http:
paths:
- path: /
backend:
serviceName: books-api-simple
servicePort: 80
tls:
- secretName: traefik-cert