Ctrl K
ComunidadGuías…

deployment/production/database-production.yml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Production PostgreSQL Deployment with High Availability
# Phase 3: Production Database Infrastructure

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config
  namespace: janua-production
data:
  POSTGRES_DB: "janua"
  POSTGRES_USER: "janua"
  # PostgreSQL Configuration Optimizations
  postgresql.conf: |
    # Connection Settings
    max_connections = 200
    shared_buffers = 256MB
    effective_cache_size = 1GB
    
    # Memory Configuration
    work_mem = 4MB
    maintenance_work_mem = 64MB
    
    # Checkpoint Configuration
    checkpoint_completion_target = 0.9
    wal_buffers = 16MB
    
    # Query Performance
    random_page_cost = 1.1
    effective_io_concurrency = 200
    
    # Logging Configuration
    log_min_duration_statement = 100ms
    log_statement = 'ddl'
    log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
    
    # Replication (for future HA setup)
    wal_level = replica
    max_wal_senders = 3
    max_replication_slots = 3
    
    # Performance Monitoring
    shared_preload_libraries = 'pg_stat_statements'
    pg_stat_statements.track = all
    pg_stat_statements.save = on

---
apiVersion: v1
kind: Secret
metadata:
  name: postgres-secret
  namespace: janua-production
type: Opaque
stringData:
  POSTGRES_PASSWORD: "REPLACE_WITH_SECURE_PASSWORD"
  # Database URL for applications
  DATABASE_URL: "postgresql://janua:REPLACE_WITH_SECURE_PASSWORD@postgres-service:5432/janua"

---
# PostgreSQL StatefulSet for Production
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
  namespace: janua-production
  labels:
    app: postgres
    component: database
spec:
  serviceName: postgres-service
  replicas: 1  # Single instance for now, can be upgraded to HA later
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
        component: database
    spec:
      securityContext:
        fsGroup: 999
        runAsUser: 999
        runAsGroup: 999
      
      containers:
      - name: postgres
        image: postgres:15-alpine
        ports:
        - containerPort: 5432
          name: postgres
        
        envFrom:
        - configMapRef:
            name: postgres-config
        - secretRef:
            name: postgres-secret
        
        resources:
          requests:
            cpu: 500m
            memory: 1Gi
          limits:
            cpu: 2000m
            memory: 4Gi
        
        # Health Checks
        livenessProbe:
          exec:
            command:
            - pg_isready
            - -U
            - janua
            - -d
            - janua
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
          failureThreshold: 3
        
        readinessProbe:
          exec:
            command:
            - pg_isready
            - -U
            - janua
            - -d
            - janua
          initialDelaySeconds: 5
          periodSeconds: 5
          timeoutSeconds: 3
          successThreshold: 1
          failureThreshold: 3
        
        # Volume Mounts
        volumeMounts:
        - name: postgres-data
          mountPath: /var/lib/postgresql/data
        - name: postgres-config
          mountPath: /etc/postgresql/postgresql.conf
          subPath: postgresql.conf
        
        # Security Context
        securityContext:
          runAsNonRoot: true
          runAsUser: 999
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
      
      volumes:
      - name: postgres-config
        configMap:
          name: postgres-config
  
  volumeClaimTemplates:
  - metadata:
      name: postgres-data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "fast-ssd"  # Use SSD storage for better performance
      resources:
        requests:
          storage: 100Gi

---
# PostgreSQL Service
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
  namespace: janua-production
  labels:
    app: postgres
    component: database
spec:
  type: ClusterIP
  ports:
  - port: 5432
    targetPort: 5432
    protocol: TCP
    name: postgres
  selector:
    app: postgres

---
# PostgreSQL Exporter for Monitoring
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-exporter
  namespace: janua-production
  labels:
    app: postgres-exporter
    component: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-exporter
  template:
    metadata:
      labels:
        app: postgres-exporter
        component: monitoring
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9187"
    spec:
      containers:
      - name: postgres-exporter
        image: prometheuscommunity/postgres-exporter:latest
        ports:
        - containerPort: 9187
          name: metrics
        env:
        - name: DATA_SOURCE_NAME
          valueFrom:
            secretKeyRef:
              name: postgres-secret
              key: DATABASE_URL
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 200m
            memory: 256Mi
        securityContext:
          runAsNonRoot: true
          runAsUser: 65534
          allowPrivilegeEscalation: false
          readOnlyRootFilesystem: true
          capabilities:
            drop:
            - ALL

---
# PostgreSQL Exporter Service
apiVersion: v1
kind: Service
metadata:
  name: postgres-exporter-service
  namespace: janua-production
  labels:
    app: postgres-exporter
    component: monitoring
spec:
  type: ClusterIP
  ports:
  - port: 9187
    targetPort: 9187
    protocol: TCP
    name: metrics
  selector:
    app: postgres-exporter