Sommaire

Introduction à Kubernetes

Qu’est-ce que Kubernetes?

Kubernetes est un système open-source qui automatise le déploiement, la mise à l’échelle et la gestion des applications conteneurisées. Il regroupe les conteneurs qui constituent une application en unités logiques pour une gestion facile et efficace.

Kubernetes fournit un cadre pour exécuter des systèmes distribués résilients.

Il gère la mise à l’échelle et la redondance pour vous. Il fournit également des interfaces et des services de niveau supérieur pour faciliter le déploiement et l’exploitation des applications.

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: myapp

Pourquoi Kubernetes est-il important?

Kubernetes a apporté une nouvelle ère dans le domaine de la technologie avec l’orchestration de conteneurs.

Avec la croissance rapide des microservices, Kubernetes est devenu une plateforme indispensable pour automatiser, déployer, mettre à l’échelle et gérer les applications conteneurisées.

Cela a permis aux développeurs de se concentrer sur l’écriture du code sans se soucier de l’infrastructure sous-jacente.

Kubernetes est maintenant supporté par une grande communauté et est utilisé par de grandes entreprises dans le monde entier.

Vue d’ensemble de l’architecture Kubernetes

L’architecture Kubernetes est composée d’un cluster qui contient un master node et plusieurs worker nodes.

Le master node est le centre de contrôle de Kubernetes qui gère le cluster et coordonne toutes les activités, tandis que les worker nodes sont les machines qui exécutent les applications.

Un cluster Kubernetes est généralement composé des éléments suivants :

  • Master Node: Il contient les composants de contrôle comme l’API server, le controller manager, le scheduler et etcd.
  • Worker Nodes: Ils contiennent les applications conteneurisées et les composants de runtime comme le Kubelet et le Kube Proxy.
  • Pods: Les pods sont les plus petites unités déployables que vous pouvez créer et gérer dans Kubernetes.
apiVersion: v1
kind: Node
metadata:
  name: node1
spec:
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master

L’architecture de Kubernetes permet une orchestration efficace des conteneurs, une mise à l’échelle automatique, une tolérance aux pannes et bien d’autres fonctionnalités qui sont essentielles pour exécuter des applications en production.

Comprendre les composants de Kubernetes

src: logo du site kubernetes

Les pods

Un pod est la plus petite unité de calcul déployable que vous pouvez créer et gérer dans Kubernetes.

Il peut contenir un ou plusieurs conteneurs. Chaque pod dans Kubernetes a une adresse IP unique et les conteneurs à l’intérieur d’un pod partagent le même contexte de réseau, ce qui leur permet de communiquer entre eux via localhost.

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: myapp

Les services

Un service Kubernetes est un objet abstrait qui définit un ensemble logique de pods et une politique permettant d’y accéder (parfois appelée micro-service).

Les services permettent de découpler la politique de réseau des pods. Un service peut mapper n’importe quelle interface entrante (port) à un ensemble de pods cibles.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

Les volumes et le stockage persistant

Les volumes Kubernetes sont une abstraction qui permet aux conteneurs de stocker des données de manière persistante et de partager des données entre les conteneurs d’un pod.

Un volume a une durée de vie identique à celle du pod qui le contient, ce qui signifie que le volume survit aux redémarrages de conteneurs.

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: myfrontend
    image: nginx
    volumeMounts:
    - mountPath: "/var/www/html"
      name: mypd
  volumes:
  - name: mypd
    persistentVolumeClaim:
      claimName: myclaim

Les namespaces

Les namespaces Kubernetes sont destinés à être utilisés dans les environnements avec de nombreux utilisateurs répartis en plusieurs équipes, ou projets. Les namespaces sont un moyen de diviser les ressources d’un cluster entre plusieurs utilisateurs.

apiVersion: v1
kind: Namespace
metadata:
  name: mynamespace

Un namespace fournit une portée pour les noms. Les noms de ressources doivent être uniques à l’intérieur d’un namespace, mais pas à travers les namespaces.

Les namespaces ne peuvent pas être imbriqués à l’intérieur les uns des autres et chaque ressource Kubernetes peut seulement être dans un namespace.

Gestion des applications avec Kubernetes

Déploiements

Un déploiement dans Kubernetes vous offre des mises à jour déclaratives pour les Pods et les ReplicaSets.

Vous décrivez l’état souhaité dans un objet de déploiement, et le contrôleur de déploiement modifie l’état réel à l’état souhaité à un taux contrôlé.

Vous pouvez définir des déploiements pour créer de nouveaux ReplicaSets ou pour supprimer des déploiements existants et adopter toutes leurs ressources avec de nouveaux déploiements.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Rollbacks et mises à jour

Kubernetes déploiement fournit la fonctionnalité de rollback pour revenir à une version précédente de votre application, ce qui peut être utile en cas d’échec de votre application suite à une mise à jour.

kubectl rollout undo deployment.v1.apps/nginx-deployment

Configuration et gestion des secrets

Kubernetes Secrets vous permettent de stocker et de gérer des informations sensibles, comme les mots de passe, les jetons OAuth et les clés ssh.

Les informations sensibles peuvent être mises en place de manière sécurisée et utilisées sans être exposées dans votre pile de configuration.

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: dmFsdWUxCg==
  username: dmFsdWUy

Stocker des informations sensibles dans des secrets est plus sûr et plus flexible que de les placer en dur dans les définitions de pods ou les images de conteneurs.

Travailler avec le réseau dans Kubernetes

Comprendre le réseau dans Kubernetes

src: https://images.squarespace-cdn.com/content/v1/5bc48e00a9ab951efbd3baa2/e524d077-40c1-4bea-be41-11af3dcdaa22/kubernetes.png?format=750w

Dans Kubernetes, chaque Pod reçoit sa propre adresse IP. Cela signifie que vous n’avez pas besoin de créer explicitement des liens entre les Pods et vous pouvez presque traiter chaque Pod comme une machine physique ou virtuelle dans votre cluster.

Cela facilite le portage d’applications.

Les services de réseau

Un Service Kubernetes est un objet abstrait qui définit un ensemble logique de Pods et une politique d’accès à ces Pods.

Les services permettent à votre application de recevoir du trafic. Les services peuvent être exposés de différentes manières en définissant un type de service dans le serviceSpec : ClusterIP, NodePort, LoadBalancer et Ingress.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

L’équilibrage de charge et l’exposition des services

L’équilibrage de charge dans Kubernetes est généralement géré par le service de type LoadBalancer. Un Service de type LoadBalancer est une fonctionnalité de l’infrastructure cloud qui expose le Service à l’extérieur du cluster Kubernetes.

apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer
spec:
  type: LoadBalancer
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

Les services peuvent également être exposés via un Ingress, qui est un objet API qui gère l’accès externe aux services dans un cluster, généralement avec HTTP. L’Ingress peut fournir un équilibrage de charge, la terminaison SSL et la redirection de nom d’hôte.

Orchestration et automatisation avec Kubernetes

Les Jobs et les CronJobs

Un Job dans Kubernetes est une tâche ponctuelle, c’est-à-dire une tâche qui doit être exécutée jusqu’à son achèvement. Pour des tâches qui doivent être exécutées périodiquement, Kubernetes propose des CronJobs, une version automatisée et planifiée des Jobs.

apiVersion: batch/v1
kind: Job
metadata:
  name: hello
spec:
  template:
    spec:
      containers:
      - name: hello
        image: busybox
        command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 30']
      restartPolicy: OnFailure

Auto-scaling

L’auto-scaling est une fonctionnalité clé de Kubernetes qui vous permet d’adapter automatiquement le nombre de Pods en fonction de l’utilisation des ressources à l’aide de l’Horizontal Pod Autoscaler.

Cette fonctionnalité garantit que vous utilisez de manière optimale les ressources de votre cluster.

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: my-autoscaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

Health checks et readiness probes

Les health checks (contrôles de santé) sont cruciaux pour maintenir la fiabilité et la stabilité des applications dans un environnement de microservices.

Kubernetes propose deux types de sondes pour vérifier l’état de santé des Pods : les Liveness probes et les Readiness probes.

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: my-app
    image: my-app-image
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080

Dans l’exemple ci-dessus, la Liveness probe vérifie si l’application est toujours en cours d’exécution et doit être redémarrée en cas de défaillance. La Readiness probe vérifie si l’application est prête à recevoir du trafic.

Sécurité dans Kubernetes

Les principes de la sécurité dans Kubernetes

La sécurité est un aspect essentiel de toute application ou système, et Kubernetes ne fait pas exception.

Kubernetes offre un ensemble de fonctionnalités pour sécuriser votre cluster, telles que le contrôle d’accès basé sur les rôles (RBAC), l’isolation du réseau et la gestion sécurisée des secrets.

apiVersion: v1
kind: Pod
metadata:
  name: secure-pod
spec:
  containers:
    - name: secure-container
      securityContext:
        runAsNonRoot: true
      image: my-image

Les rôles et les bindings de rôles

Kubernetes utilise le contrôle d’accès basé sur les rôles (RBAC) pour gérer l’accès aux ressources du cluster. Cela permet aux administrateurs de limiter l’accès à certaines ressources et actions.

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

La gestion des secrets

Kubernetes propose un objet Secret pour stocker et gérer des informations sensibles, comme les mots de passe, les jetons OAuth et les clés ssh.

Les secrets peuvent être montés comme des volumes de données ou exposés comme des variables d’environnement pour être utilisés par un Pod.

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: dGhpcyBpcyBhIHNlY3JldA==

Dans cet exemple, nous créons un secret avec un mot de passe. La valeur du mot de passe est codée en base64.

Surveillance et dépannage

Logging et monitoring

Pour maintenir un système Kubernetes sain, il est crucial d’avoir un système de journalisation et de surveillance robuste. Cela peut aider à comprendre l’état de votre cluster et à identifier rapidement les problèmes.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: logging-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: logging-app
  template:
    metadata:
      labels:
        app: logging-app
    spec:
      containers:
      - name: logging-app
        image: my-logging-app
        ports:
        - containerPort: 8080

Dans cet exemple, nous déployons une application qui enregistre les logs dans stdout et stderr, qui sont collectés et stockés par le service de journalisation de Kubernetes.

Debugging des applications Kubernetes

Le débogage des applications Kubernetes peut être réalisé de plusieurs façons, notamment en utilisant kubectl logs pour visualiser les journaux d’application, kubectl describe pour voir les détails d’une ressource, et kubectl exec pour exécuter des commandes dans un conteneur.

# Get logs from a Pod
kubectl logs my-pod

# Describe a Pod
kubectl describe pod my-pod

# Execute command in a container
kubectl exec -it my-pod -- /bin/bash

Utilisation de kubectl pour le dépannage

kubectl est l’outil en ligne de commande principal pour interagir avec un cluster Kubernetes. Il offre une multitude de commandes pour le dépannage, y compris l’inspection des ressources, la visualisation des journaux, et l’exécution de commandes dans les conteneurs.

# Get all Pods
kubectl get pods

# Get details about a Pod
kubectl describe pod my-pod

# Tail logs from a Pod
kubectl logs -f my-pod

Utilisation de Helm pour la gestion des packages Kubernetes

Introduction à Helm

Helm est un gestionnaire de packages pour Kubernetes qui simplifie le déploiement et la gestion des applications sur un cluster Kubernetes. Il utilise une structure de chart, qui est un ensemble de fichiers décrivant une application Kubernetes.

# Installation de Helm
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

# Vérification de l'installation
helm version

Gestion des dépendances avec Helm

Helm vous permet de définir des dépendances pour votre application à l’aide du fichier Chart.yaml. Ces dépendances peuvent être d’autres charts Helm qui sont nécessaires pour votre application.

# Exemple de Chart.yaml avec des dépendances
apiVersion: v2
name: myapp
version: 1.0.0
dependencies:
  - name: postgresql
    version: 9.6.2
    repository: "https://charts.bitnami.com/bitnami"

Dans cet exemple, l’application dépend du chart PostgreSQL du dépôt Bitnami.

Création et partage des charts Helm

Helm fournit des outils pour créer vos propres charts. Une fois créés, ces charts peuvent être partagés sur un dépôt de charts Helm, rendant votre application facilement déployable par d’autres.

# Création d'un nouveau chart
helm create mychart

# Empaquetage du chart pour le partage
helm package mychart

# L'opération d'empaquetage crée un fichier .tgz que vous pouvez partager

Avec Helm, la gestion des applications Kubernetes devient une tâche beaucoup plus simple et plus gérable.

Kubernetes avancé

Utilisation des Custom Resource Definitions (CRD)

Dans cette section, nous explorerons les Custom Resource Definitions (CRD) qui permettent aux utilisateurs de créer de nouvelles types de ressources sans ajouter un autre serveur d’API.

Nous discuterons des avantages des CRD, comment ils sont utilisés dans Kubernetes et fournirons des exemples de code pour créer et gérer les CRD.

Travailler avec l’API de Kubernetes

L’API de Kubernetes est au cœur de sa gestion des opérations. Cette section expliquera comment l’API est structurée et comment elle peut être utilisée pour effectuer diverses tâches, de la création de pods à la mise à jour des services et à l’interrogation du statut du cluster.

Nous utiliserons des exemples de code pour montrer comment effectuer des appels d’API pour effectuer diverses tâches.

Kubernetes Federation

La fédération est une fonctionnalité avancée qui permet la gestion d’un cluster Kubernetes réparti sur plusieurs régions ou fournisseurs de cloud.

Cette section introduira le concept de fédération, expliquera quand et pourquoi elle est utilisée, et donnera des exemples d’application pour la mise en place d’une fédération de clusters Kubernetes.

Cette partie du chapitre aidera à comprendre comment Kubernetes peut être utilisé pour orchestrer des déploiements à grande échelle, transfrontaliers et multi-cloud.

Cas pratique : Déploiement d’une application microservices avec Kubernetes

Description du projet

Dans ce projet pratique, nous allons déployer une application basée sur une architecture microservices sur un cluster Kubernetes.

L’application sera composée de plusieurs services interagissant entre eux, incluant une base de données, une API, et une interface utilisateur front-end.

Mise en place de l’infrastructure Kubernetes

Pour mettre en place notre infrastructure, nous allons créer un cluster Kubernetes et configurer les différents namespaces pour séparer nos environnements de développement, de test et de production.

Nous installerons également les outils nécessaires tels que Helm pour la gestion des packages.

# Création d'un cluster Kubernetes
kind create cluster --name mon-projet

# Création des namespaces
kubectl create namespace dev
kubectl create namespace test
kubectl create namespace prod

Déploiement et gestion de l’application

Nous allons déployer chaque service de notre application dans le cluster Kubernetes en utilisant les charts Helm.

Nous allons également mettre en place l’équilibrage de charge, l’auto-scaling et les readiness probes pour assurer la disponibilité et la performance de notre application.

# Déploiement de la base de données
helm install mydb ./mydb-chart --namespace dev

# Déploiement de l'API
helm install myapi ./myapi-chart --namespace dev

# Déploiement du front-end
helm install myfrontend ./myfrontend-chart --namespace dev

Cette expérience pratique vous donnera une compréhension approfondie de la façon de déployer et de gérer des applications basées sur une architecture microservices dans un environnement Kubernetes.

Conclusion et perspectives d’avenir pour Kubernetes

Résumé des points clés

Nous avons voyagé à travers l’écosystème Kubernetes, depuis l’introduction de ses concepts fondamentaux jusqu’à l’application pratique de ces connaissances à travers le déploiement d’une application basée sur une architecture microservices.

Vous avez appris comment configurer et gérer les composants de Kubernetes, comment automatiser et orchestrer les applications, comment assurer la sécurité dans un environnement Kubernetes, comment surveiller et dépanner vos applications, et comment utiliser Helm pour la gestion des packages Kubernetes.

Tendances et évolutions futures de Kubernetes

Kubernetes continue d’évoluer et de mûrir, s’imposant comme le standard de facto pour l’orchestration des conteneurs.

Les futurs développements dans Kubernetes pourraient inclure des améliorations dans la gestion du réseau, une automatisation encore plus poussée, une meilleure intégration avec les environnements cloud et on-premise, et des améliorations dans la sécurité et la confidentialité des données.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: future-app
  labels:
    app: future
spec:
  replicas: 3
  selector:
    matchLabels:
      app: future
  template:
    metadata:
      labels:
        app: future
    spec:
      containers:
      - name: future-app
        image: my-org/future-app:1.0.0
        ports:
        - containerPort: 8080

Ressources pour continuer à apprendre

L’apprentissage de Kubernetes est un voyage continu.

Des ressources telles que la documentation officielle de Kubernetes, les cours en ligne, les tutoriels, les blogs, les livres, et les forums de la communauté sont d’excellents moyens de rester à jour avec les derniers développements et les meilleures pratiques dans le domaine de Kubernetes.

Continuez à apprendre, à expérimenter, et à contribuer à cette merveilleuse communauté.