apiVersion: v1 kind: PersistentVolumeClaim metadata: name: uploads namespace: insurance spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 20Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: insurance-api namespace: insurance labels: app.kubernetes.io/name: insurance-api spec: replicas: 2 revisionHistoryLimit: 3 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 selector: matchLabels: app.kubernetes.io/name: insurance-api template: metadata: labels: app.kubernetes.io/name: insurance-api spec: containers: - name: api image: localhost:5000/insurance/api:latest imagePullPolicy: Always ports: - name: http containerPort: 4000 env: - name: PORT value: "4000" - name: HOST value: "0.0.0.0" - name: NODE_ENV value: production - name: UPLOAD_DIR value: /data/uploads - name: JWT_SECRET valueFrom: secretKeyRef: name: api-secrets key: jwtSecret - name: DATABASE_URL valueFrom: secretKeyRef: name: api-secrets key: databaseUrl - name: ANTHROPIC_API_KEY valueFrom: { secretKeyRef: { name: api-secrets, key: anthropicApiKey, optional: true } } - name: CLOVA_OCR_URL valueFrom: { secretKeyRef: { name: api-secrets, key: clovaOcrUrl, optional: true } } - name: CLOVA_OCR_SECRET valueFrom: { secretKeyRef: { name: api-secrets, key: clovaOcrSecret, optional: true } } - name: GCP_VISION_API_KEY valueFrom: { secretKeyRef: { name: api-secrets, key: gcpVisionApiKey, optional: true } } - name: SOLAPI_API_KEY valueFrom: { secretKeyRef: { name: api-secrets, key: solapiApiKey, optional: true } } - name: SOLAPI_API_SECRET valueFrom: { secretKeyRef: { name: api-secrets, key: solapiApiSecret, optional: true } } - name: SOLAPI_PFID valueFrom: { secretKeyRef: { name: api-secrets, key: solapiPfId, optional: true } } - name: SOLAPI_SENDER_KEY valueFrom: { secretKeyRef: { name: api-secrets, key: solapiSenderKey, optional: true } } - name: CODEF_CLIENT_ID valueFrom: { secretKeyRef: { name: api-secrets, key: codefClientId, optional: true } } - name: CODEF_CLIENT_SECRET valueFrom: { secretKeyRef: { name: api-secrets, key: codefClientSecret, optional: true } } - name: KAKAO_REST_API_KEY valueFrom: { secretKeyRef: { name: api-secrets, key: kakaoRestApiKey, optional: true } } - name: KAKAO_CLIENT_SECRET valueFrom: { secretKeyRef: { name: api-secrets, key: kakaoClientSecret, optional: true } } readinessProbe: httpGet: path: /health port: http initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: /health port: http initialDelaySeconds: 30 periodSeconds: 20 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 512Mi volumeMounts: - name: uploads mountPath: /data/uploads volumes: - name: uploads persistentVolumeClaim: claimName: uploads --- apiVersion: v1 kind: Service metadata: name: insurance-api namespace: insurance labels: app.kubernetes.io/name: insurance-api spec: type: NodePort selector: app.kubernetes.io/name: insurance-api ports: - name: http port: 4000 targetPort: http nodePort: 30201