apiVersion: v1 kind: Namespace metadata: name: noteapp --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mongodb-pvc namespace: noteapp spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi --- apiVersion: v1 kind: ConfigMap metadata: name: app-config namespace: noteapp data: MONGODB_URI: "mongodb://admin:password@mongodb:27017/noteapp?authSource=admin" JWT_SECRET: "your-super-secret-jwt-key-change-in-production" ENCRYPTION_KEY: "00000000000000000000000000000000" PORT: "8080" --- apiVersion: v1 kind: Secret metadata: name: mongodb-credentials namespace: noteapp type: Opaque stringData: username: admin password: password --- apiVersion: apps/v1 kind: StatefulSet metadata: name: mongodb namespace: noteapp spec: serviceName: mongodb replicas: 1 selector: matchLabels: app: mongodb template: metadata: labels: app: mongodb spec: containers: - name: mongodb image: mongo:7.0-alpine ports: - containerPort: 27017 name: mongodb env: - name: MONGO_INITDB_ROOT_USERNAME valueFrom: secretKeyRef: name: mongodb-credentials key: username - name: MONGO_INITDB_ROOT_PASSWORD valueFrom: secretKeyRef: name: mongodb-credentials key: password volumeMounts: - name: mongodb-storage mountPath: /data/db livenessProbe: exec: command: - mongosh - mongodb://admin:password@localhost:27017/admin?authSource=admin - --quiet - --eval - db.adminCommand('ping').ok initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: exec: command: - mongosh - mongodb://admin:password@localhost:27017/admin?authSource=admin - --quiet - --eval - db.adminCommand('ping').ok initialDelaySeconds: 5 periodSeconds: 5 resources: requests: memory: "256Mi" cpu: "100m" limits: memory: "512Mi" cpu: "500m" volumes: - name: mongodb-storage persistentVolumeClaim: claimName: mongodb-pvc --- apiVersion: v1 kind: Service metadata: name: mongodb namespace: noteapp spec: clusterIP: None ports: - port: 27017 targetPort: 27017 selector: app: mongodb --- apiVersion: apps/v1 kind: Deployment metadata: name: noteapp namespace: noteapp spec: replicas: 2 selector: matchLabels: app: noteapp template: metadata: labels: app: noteapp spec: containers: - name: noteapp image: noteapp:latest imagePullPolicy: IfNotPresent ports: - containerPort: 8080 name: http envFrom: - configMapRef: name: app-config livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 5 resources: requests: memory: "256Mi" cpu: "100m" limits: memory: "512Mi" cpu: "500m" --- apiVersion: v1 kind: Service metadata: name: noteapp namespace: noteapp spec: selector: app: noteapp ports: - port: 8080 targetPort: 8080 protocol: TCP type: ClusterIP --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: noteapp-ingress namespace: noteapp annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: ingressClassName: nginx rules: - host: noteapp.local http: paths: - path: /api pathType: Prefix backend: service: name: noteapp port: number: 8080 - path: / pathType: Prefix backend: service: name: noteapp port: number: 8080 --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: noteapp-hpa namespace: noteapp spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: noteapp 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