From 96c658b9ab91bc18534c39930651da440fc721ea Mon Sep 17 00:00:00 2001 From: timothycarambat Date: Thu, 23 May 2024 08:27:18 -0700 Subject: [PATCH] K8 Manifest resolves #1463 --- cloud-deployments/k8/manifest.yaml | 214 +++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 cloud-deployments/k8/manifest.yaml diff --git a/cloud-deployments/k8/manifest.yaml b/cloud-deployments/k8/manifest.yaml new file mode 100644 index 00000000..9aeef6a2 --- /dev/null +++ b/cloud-deployments/k8/manifest.yaml @@ -0,0 +1,214 @@ +--- +apiVersion: v1 +kind: PersistentVolume +metadata: + name: anything-llm-volume + annotations: + pv.beta.kubernetes.io/uid: "1000" + pv.beta.kubernetes.io/gid: "1000" +spec: + storageClassName: gp2 + capacity: + storage: 5Gi + accessModes: + - ReadWriteOnce + awsElasticBlockStore: + # This is the volume UUID from AWS EC2 EBS Volumes list. + volumeID: "{{ anythingllm_awsElasticBlockStore_volumeID }}" + fsType: ext4 + nodeAffinity: + required: + nodeSelectorTerms: + - matchExpressions: + - key: topology.kubernetes.io/zone + operator: In + values: + - us-east-1c +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: anything-llm-volume-claim + namespace: "{{ namespace }}" +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5Gi +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: anything-llm + namespace: "{{ namespace }}" + labels: + anything-llm: "true" +spec: + selector: + matchLabels: + k8s-app: anything-llm + replicas: 1 + strategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 0% + maxUnavailable: 100% + template: + metadata: + labels: + anything-llm: "true" + k8s-app: anything-llm + app.kubernetes.io/name: anything-llm + app.kubernetes.io/part-of: anything-llm + annotations: + prometheus.io/scrape: "true" + prometheus.io/path: /metrics + prometheus.io/port: "9090" + spec: + serviceAccountName: "default" + terminationGracePeriodSeconds: 10 + securityContext: + fsGroup: 1000 + runAsNonRoot: true + runAsGroup: 1000 + runAsUser: 1000 + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: topology.kubernetes.io/zone + operator: In + values: + - us-east-1c + containers: + - name: anything-llm + resources: + limits: + memory: "1Gi" + cpu: "500m" + requests: + memory: "512Mi" + cpu: "250m" + imagePullPolicy: IfNotPresent + image: "mintplexlabs/anythingllm:render" + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - SYS_ADMIN + runAsNonRoot: true + runAsGroup: 1000 + runAsUser: 1000 + command: + # Specify a command to override the Dockerfile's ENTRYPOINT. + - /bin/bash + - -c + - | + set -x -e + sleep 3 + echo "AWS_REGION: $AWS_REGION" + echo "SERVER_PORT: $SERVER_PORT" + echo "NODE_ENV: $NODE_ENV" + echo "STORAGE_DIR: $STORAGE_DIR" + { + cd /app/server/ && + npx prisma generate --schema=./prisma/schema.prisma && + npx prisma migrate deploy --schema=./prisma/schema.prisma && + node /app/server/index.js + echo "Server process exited with status $?" + } & + { + node /app/collector/index.js + echo "Collector process exited with status $?" + } & + wait -n + exit $? + readinessProbe: + httpGet: + path: /v1/api/health + port: 8888 + initialDelaySeconds: 15 + periodSeconds: 5 + successThreshold: 2 + livenessProbe: + httpGet: + path: /v1/api/health + port: 8888 + initialDelaySeconds: 15 + periodSeconds: 5 + failureThreshold: 3 + env: + - name: AWS_REGION + value: "{{ aws_region }}" + - name: AWS_ACCESS_KEY_ID + value: "{{ aws_access_id }}" + - name: AWS_SECRET_ACCESS_KEY + value: "{{ aws_access_secret }}" + - name: SERVER_PORT + value: "3001" + - name: JWT_SECRET + value: "my-random-string-for-seeding" # Please generate random string at least 12 chars long. + - name: STORAGE_DIR + value: "/storage" + - name: NODE_ENV + value: "production" + - name: UID + value: "1000" + - name: GID + value: "1000" + volumeMounts: + - name: anything-llm-server-storage-volume-mount + mountPath: /storage + volumes: + - name: anything-llm-server-storage-volume-mount + persistentVolumeClaim: + claimName: anything-llm-volume-claim +--- +# This serves the UI and the backend. +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: anything-llm-ingress + namespace: "{{ namespace }}" + annotations: + external-dns.alpha.kubernetes.io/hostname: "{{ namespace }}-chat.{{ base_domain }}" + kubernetes.io/ingress.class: "internal-ingress" + nginx.ingress.kubernetes.io/rewrite-target: / + ingress.kubernetes.io/ssl-redirect: "false" +spec: + rules: + - host: "{{ namespace }}-chat.{{ base_domain }}" + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: anything-llm-svc + port: + number: 3001 + tls: # < placing a host in the TLS config will indicate a cert should be created + - hosts: + - "{{ namespace }}-chat.{{ base_domain }}" + secretName: letsencrypt-prod +--- +apiVersion: v1 +kind: Service +metadata: + labels: + kubernetes.io/name: anything-llm + name: anything-llm-svc + namespace: "{{ namespace }}" +spec: + ports: + # "port" is external port, and "targetPort" is internal. + - port: 3301 + targetPort: 3001 + name: traffic + - port: 9090 + targetPort: 9090 + name: metrics + selector: + k8s-app: anything-llm \ No newline at end of file