Avancé

Déploiement d'applications avec Kubernetes

Guide pratique pour déployer et gérer vos applications dans un cluster Kubernetes avec les meilleures pratiques.

Publié le
10 janvier 2024
Lecture
12 min
Vues
890
Auteur
Florian Courouge
kubernetes
devops
containers
deployment

Table des matières

📋 Vue d'ensemble rapide des sujets traités dans cet article

Cliquez sur les sections ci-dessous pour naviguer rapidement

Déploiement d'applications avec Kubernetes

Kubernetes est devenu la plateforme de référence pour l'orchestration de conteneurs. Dans cet article, nous allons explorer les meilleures pratiques pour déployer vos applications.

💡Concepts fondamentaux

Pods

Un Pod est la plus petite unité déployable dans Kubernetes. Il peut contenir un ou plusieurs conteneurs qui partagent le même réseau et stockage.

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: nginx:1.20
    ports:
    - containerPort: 80

Deployments

Les Deployments gèrent les Pods et fournissent des fonctionnalités comme les mises à jour progressives.

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

💡Services et exposition

ClusterIP

Service par défaut pour la communication interne :

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

LoadBalancer

Pour exposer votre application à l'extérieur :

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

💡Configuration et secrets

🚨
Sécurité

Ne jamais stocker de secrets en dur dans vos images Docker ou manifestes Kubernetes.

ConfigMaps

Pour la configuration non sensible :

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database_url: "postgresql://db:5432/myapp"
  debug: "false"

Secrets

Pour les données sensibles :

apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  password: cGFzc3dvcmQ=  # base64 encoded

💡Meilleures pratiques

1. Ressources et limites

Toujours définir des requests et limits :

resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"

2. Health checks

Configurer les probes pour la santé de l'application :

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

3. Stratégies de déploiement

Rolling Update (par défaut)

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 1
    maxSurge: 1

Blue-Green Deployment

Utilisation d'Argo Rollouts pour des déploiements avancés.

💡Monitoring et observabilité

Métriques avec Prometheus

apiVersion: v1
kind: Service
metadata:
  name: my-app-metrics
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "8080"
    prometheus.io/path: "/metrics"
spec:
  selector:
    app: my-app
  ports:
  - port: 8080
    name: metrics

Logs centralisés

Configuration pour Fluentd ou Fluent Bit :

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
data:
  fluent-bit.conf: |
    [INPUT]
        Name tail
        Path /var/log/containers/*.log
        Parser docker
        Tag kube.*

💡Sécurité

Network Policies

Contrôler le trafic réseau entre Pods :

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

Pod Security Standards

apiVersion: v1
kind: Pod
metadata:
  name: secure-pod
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    fsGroup: 2000
  containers:
  - name: app
    image: nginx:1.20
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
        drop:
        - ALL

💡Conclusion

Le déploiement sur Kubernetes nécessite une bonne compréhension des concepts fondamentaux et l'application des meilleures pratiques. En suivant ces recommandations, vous pourrez déployer des applications robustes et sécurisées.

Conseil

Commencez petit avec des applications simples avant de passer à des architectures complexes.

Dans le prochain article, nous verrons comment mettre en place un pipeline CI/CD avec GitLab et Kubernetes.

À propos de l'auteur

Florian Courouge - Expert DevOps et Apache Kafka avec plus de 5 ans d'expérience dans l'architecture de systèmes distribués et l'automatisation d'infrastructures.

Cet article vous a été utile ?

Découvrez mes autres articles techniques ou contactez-moi pour discuter de vos projets DevOps et Kafka.