Socle V004 – Kubernetes

Socle V004 - Kubernetes

16 – Kubernetes

Version : 4.0.0 Date : 2025-12-09

1. Introduction

Guide de déploiement du Socle V4 sur Kubernetes.

2. Image Docker

2.1 Dockerfile

FROM eclipse-temurin:21-jre-alpine

LABEL maintainer="your-team@company.com"
LABEL version="4.0.0"

WORKDIR /app

# Non-root user
RUN addgroup -S socle && adduser -S socle -G socle
USER socle

# Copy application
COPY --chown=socle:socle target/socle-v004-4.0.0.jar app.jar

# Health check
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
  CMD wget -qO- http://localhost:8080/admin/health/live || exit 1

# Default environment
ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0"

EXPOSE 8080

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

2.2 Build et Push

# Build
docker build -t gcr.io/my-project/socle-v4:4.0.0 .

# Push
docker push gcr.io/my-project/socle-v4:4.0.0

3. Manifests Kubernetes

3.1 Namespace

apiVersion: v1
kind: Namespace
metadata:
  name: socle
  labels:
    name: socle

3.2 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: socle-config
  namespace: socle
data:
  APP_NAME: "socle-v4"
  ENV_NAME: "PROD"
  REGION: "europe-west1"
  HTTP_PORT: "8080"
  KVBUS_MODE: "redis"
  REDIS_HOST: "redis-master.redis.svc.cluster.local"
  TECHDB_ENABLED: "true"
  LOG_FORWARDER_ENABLED: "true"
  LOG_TRANSPORT_MODE: "http"
  SCHEDULER_ENABLED: "true"
  ADMIN_ENABLED: "true"
  ADMIN_AUTH_ENABLED: "true"

3.3 Secret

apiVersion: v1
kind: Secret
metadata:
  name: socle-secrets
  namespace: socle
type: Opaque
stringData:
  REDIS_PASSWORD: "your-redis-password"
  ADMIN_PASSWORD: "your-admin-password"
  API_KEY: "your-api-key"
  TECHDB_PASSWORD: "your-techdb-password"

3.4 Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: socle-v4
  namespace: socle
  labels:
    app: socle-v4
    version: "4.0.0"
spec:
  replicas: 2
  selector:
    matchLabels:
      app: socle-v4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: socle-v4
        version: "4.0.0"
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/path: "/actuator/prometheus"
        prometheus.io/port: "8080"
    spec:
      serviceAccountName: socle-sa
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
        fsGroup: 1000
      containers:
        - name: socle
          image: gcr.io/my-project/socle-v4:4.0.0
          imagePullPolicy: Always
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          envFrom:
            - configMapRef:
                name: socle-config
            - secretRef:
                name: socle-secrets
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: EXEC_ID
              value: "$(POD_NAME)"
          resources:
            requests:
              cpu: "250m"
              memory: "512Mi"
            limits:
              cpu: "1000m"
              memory: "1Gi"
          livenessProbe:
            httpGet:
              path: /admin/health/live
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          readinessProbe:
            httpGet:
              path: /admin/health/ready
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 5
            timeoutSeconds: 3
            failureThreshold: 3
          volumeMounts:
            - name: data
              mountPath: /app/data
            - name: logs
              mountPath: /app/logs
      volumes:
        - name: data
          emptyDir: {}
        - name: logs
          emptyDir: {}
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app: socle-v4
                topologyKey: kubernetes.io/hostname

3.5 Service

apiVersion: v1
kind: Service
metadata:
  name: socle-v4
  namespace: socle
  labels:
    app: socle-v4
spec:
  type: ClusterIP
  ports:
    - name: http
      port: 80
      targetPort: 8080
      protocol: TCP
  selector:
    app: socle-v4

3.6 Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: socle-v4
  namespace: socle
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - socle.example.com
      secretName: socle-tls
  rules:
    - host: socle.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: socle-v4
                port:
                  number: 80

3.7 HorizontalPodAutoscaler

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: socle-v4
  namespace: socle
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: socle-v4
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80

3.8 PodDisruptionBudget

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: socle-v4
  namespace: socle
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: socle-v4

3.9 ServiceAccount

apiVersion: v1
kind: ServiceAccount
metadata:
  name: socle-sa
  namespace: socle

4. Persistence avec PVC

4.1 PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: socle-data
  namespace: socle
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: standard
  resources:
    requests:
      storage: 10Gi

4.2 Deployment avec PVC

# Dans le Deployment
spec:
  template:
    spec:
      containers:
        - name: socle
          volumeMounts:
            - name: data
              mountPath: /app/data
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: socle-data

5. Network Policies

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: socle-network-policy
  namespace: socle
spec:
  podSelector:
    matchLabels:
      app: socle-v4
  policyTypes:
    - Ingress
    - Egress
  ingress:
    # Allow from ingress controller
    - from:
        - namespaceSelector:
            matchLabels:
              name: ingress-nginx
      ports:
        - port: 8080
    # Allow from Prometheus
    - from:
        - namespaceSelector:
            matchLabels:
              name: monitoring
      ports:
        - port: 8080
  egress:
    # Allow to Redis
    - to:
        - namespaceSelector:
            matchLabels:
              name: redis
      ports:
        - port: 6379
    # Allow to DNS
    - to:
        - namespaceSelector: {}
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - port: 53
          protocol: UDP

6. Helm Chart

6.1 Chart.yaml

apiVersion: v2
name: socle-v4
description: Socle V4 Framework
version: 4.0.0
appVersion: "4.0.0"

6.2 values.yaml

replicaCount: 2

image:
  repository: gcr.io/my-project/socle-v4
  tag: "4.0.0"
  pullPolicy: Always

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: true
  className: nginx
  hosts:
    - host: socle.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: socle-tls
      hosts:
        - socle.example.com

resources:
  requests:
    cpu: 250m
    memory: 512Mi
  limits:
    cpu: 1000m
    memory: 1Gi

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 70

config:
  APP_NAME: socle-v4
  ENV_NAME: PROD
  KVBUS_MODE: redis

secrets:
  REDIS_PASSWORD: ""
  ADMIN_PASSWORD: ""
  API_KEY: ""

6.3 Installation

# Install
helm install socle-v4 ./socle-v4-chart -n socle --create-namespace -f values-prod.yaml

# Upgrade
helm upgrade socle-v4 ./socle-v4-chart -n socle -f values-prod.yaml

# Uninstall
helm uninstall socle-v4 -n socle

7. Observability

7.1 ServiceMonitor (Prometheus Operator)

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: socle-v4
  namespace: socle
  labels:
    release: prometheus
spec:
  selector:
    matchLabels:
      app: socle-v4
  endpoints:
    - port: http
      path: /actuator/prometheus
      interval: 15s

7.2 PrometheusRule

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: socle-v4-alerts
  namespace: socle
spec:
  groups:
    - name: socle-v4
      rules:
        - alert: SocleHighErrorRate
          expr: rate(socle_errors_total[5m]) > 0.1
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: High error rate

8. Déploiement Multi-région

8.1 Structure

clusters/
├── europe-west1/
│   ├── kustomization.yaml
│   └── config-patch.yaml
├── us-central1/
│   ├── kustomization.yaml
│   └── config-patch.yaml
└── base/
    ├── kustomization.yaml
    ├── deployment.yaml
    ├── service.yaml
    └── configmap.yaml

8.2 Kustomize overlay

# clusters/europe-west1/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../../base
patchesStrategicMerge:
  - config-patch.yaml
configMapGenerator:
  - name: socle-config
    behavior: merge
    literals:
      - REGION=europe-west1

9. Troubleshooting

Commandes utiles

# Logs
kubectl logs -f deployment/socle-v4 -n socle

# Describe pod
kubectl describe pod -l app=socle-v4 -n socle

# Port forward
kubectl port-forward svc/socle-v4 8080:80 -n socle

# Exec into pod
kubectl exec -it deployment/socle-v4 -n socle -- sh

# Check events
kubectl get events -n socle --sort-by='.lastTimestamp'

10. Références

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *