0%
Orchestration avec Kubernetes

Kubernetes

Orchestration avec Kubernetes

10-15 min

Orchestration avec Kubernetes

Kubernetes est la solution standard pour l’orchestration des conteneurs. Nous allons voir comment déployer et gérer nos microservices sur un cluster Kubernetes.

1. Configuration de Base

1.1 Déploiement des Services

# product-service-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: product-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: product-service
  template:
    metadata:
      labels:
        app: product-service
    spec:
      containers:
      - name: product-service
        image: product-service:latest
        ports:
        - containerPort: 8081
        env:
        - name: SPRING_PROFILES_ACTIVE
          value: "prod"
        - name: EUREKA_CLIENT_SERVICEURL_DEFAULTZONE
          value: "http://eureka-server:8761/eureka/"
        - name: SPRING_CLOUD_CONFIG_URI
          value: "http://config-server:8888"
        resources:
          requests:
            memory: "512Mi"
            cpu: "200m"
          limits:
            memory: "1Gi"
            cpu: "500m"
        readinessProbe:
          httpGet:
            path: /actuator/health
            port: 8081
          initialDelaySeconds: 30
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /actuator/health
            port: 8081
          initialDelaySeconds: 60
          periodSeconds: 20

1.2 Services Kubernetes

# product-service-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: product-service
spec:
  selector:
    app: product-service
  ports:
  - port: 8081
    targetPort: 8081
  type: ClusterIP

2. Configuration des ConfigMaps et Secrets

2.1 ConfigMap

# application-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: application-config
data:
  application.yml: |
    spring:
      application:
        name: product-service
      cloud:
        config:
          uri: http://config-server:8888
    eureka:
      client:
        service-url:
          defaultZone: http://eureka-server:8761/eureka/

2.2 Secret

# database-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: database-secret
type: Opaque
data:
  DB_USERNAME: cHJvZHVjdF91c2Vy  # product_user en base64
  DB_PASSWORD: cHJvZHVjdF9wYXNzd29yZA==  # product_password en base64

3. Ingress et Load Balancing

3.1 Ingress Controller

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: microservices-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /products
        pathType: Prefix
        backend:
          service:
            name: product-service
            port:
              number: 8081
      - path: /orders
        pathType: Prefix
        backend:
          service:
            name: order-service
            port:
              number: 8082

4. Gestion des Volumes

4.1 PersistentVolume

# postgres-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data/postgres"

4.2 PersistentVolumeClaim

# postgres-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

5. Monitoring et Logging

5.1 Prometheus Configuration

# prometheus-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
    scrape_configs:
      - job_name: 'spring-actuator'
        metrics_path: '/actuator/prometheus'
        static_configs:
          - targets: ['product-service:8081', 'order-service:8082']

5.2 Grafana Dashboard

# grafana-dashboard.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: grafana-dashboard
data:
  microservices-dashboard.json: |
    {
      "dashboard": {
        "title": "Microservices Dashboard",
        "panels": [
          {
            "title": "Request Rate",
            "type": "graph",
            "datasource": "Prometheus",
            "targets": [
              {
                "expr": "rate(http_requests_total[5m])",
                "legendFormat": "{{service}}"
              }
            ]
          }
        ]
      }
    }

6. Auto-scaling

6.1 HorizontalPodAutoscaler

# product-service-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: product-service-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: product-service
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

7. Tests

7.1 Test d’Intégration Kubernetes

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class KubernetesIntegrationTest {
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    void whenGetProduct_thenProductIsReturned() {
        ResponseEntity<Product> response = restTemplate.getForEntity(
            "/api/products/1", Product.class);
        assertEquals(HttpStatus.OK, response.getStatusCode());
        assertNotNull(response.getBody());
    }
}

7.2 Test de Charge

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class KubernetesLoadTest {
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    void whenHighLoad_thenAutoScalingWorks() {
        ExecutorService executor = Executors.newFixedThreadPool(50);
        List<Future<ResponseEntity<Product>>> futures = new ArrayList<>();

        for (int i = 0; i < 1000; i++) {
            futures.add(executor.submit(() ->
                restTemplate.getForEntity("/api/products/1", Product.class)));
        }

        int successCount = 0;
        for (Future<ResponseEntity<Product>> future : futures) {
            try {
                if (future.get().getStatusCode() == HttpStatus.OK) {
                    successCount++;
                }
            } catch (Exception e) {
                fail("Request failed: " + e.getMessage());
            }
        }

        assertTrue(successCount > 950); // 95% de succès minimum
        executor.shutdown();
    }
}

Conclusion

L’orchestration avec Kubernetes offre plusieurs avantages :

  • Gestion automatique des conteneurs
  • Auto-scaling basé sur la charge
  • Haute disponibilité et résilience
  • Gestion centralisée des configurations
  • Monitoring et logging avancés
  • Déploiement sans interruption

Cette série de tutoriels vous a permis de maîtriser les concepts essentiels des microservices avec Spring Cloud. Vous êtes maintenant prêt à développer et déployer vos propres applications microservices.

Commentaires

Les commentaires sont alimentés par GitHub Discussions

Connectez-vous avec GitHub pour participer à la discussion

Lien copié !