Browse Source

add storage configs for all dirs, add custom pvc

Anuj Bansal 3 years ago
parent
commit
0d35b25c5b

+ 9 - 1
devops/kubernetes/argus/Pulumi.yaml

@@ -22,6 +22,14 @@ template:
       description: Specifies the keys available within distributor node CLI
     buckets:
       description: Specifies the buckets distributed by the node
-      default: 'all'
     workerId:
       description: ID of the node operator (distribution working group worker)
+    dataStorage:
+      description: Amount of storage (in Gi) assigned for the data directory
+      default: 10
+    logStorage:
+      description: Amount of storage (in Gi) assigned for the logs directory
+      default: 2
+    cacheStorage:
+      description: Amount of storage (in Gi) assigned for the cache directory
+      default: 10

+ 56 - 25
devops/kubernetes/argus/index.ts

@@ -4,20 +4,23 @@ import * as eks from '@pulumi/eks'
 import * as docker from '@pulumi/docker'
 import * as k8s from '@pulumi/kubernetes'
 import * as pulumi from '@pulumi/pulumi'
-import { CaddyServiceDeployment } from 'pulumi-common'
+import { CaddyServiceDeployment, CustomPersistentVolume } from 'pulumi-common'
 
 const awsConfig = new pulumi.Config('aws')
 const config = new pulumi.Config()
 
 const queryNodeHost = config.require('queryNodeHost')
 const wsProviderEndpointURI = config.require('wsProviderEndpointURI')
-let configArgusImage = config.require('argusImage')
+const configArgusImage = config.require('argusImage')
 const lbReady = config.get('isLoadBalancerReady') === 'true'
 const keys = config.require('keys')
-const buckets = config.get('buckets') || 'all'
+const buckets = config.require('buckets')
 const workerId = config.require('workerId')
 const name = 'argus-node'
 const isMinikube = config.getBoolean('isMinikube')
+const dataStorage = config.getNumber('dataStorage') || 10
+const logStorage = config.getNumber('logStorage') || 2
+const cacheStorage = config.getNumber('cacheStorage') || 10
 
 export let kubeconfig: pulumi.Output<any>
 export let argusImage: pulumi.Output<string> = pulumi.interpolate`${configArgusImage}`
@@ -69,25 +72,41 @@ export const namespaceName = ns.metadata.name
 
 const appLabels = { appClass: name }
 
-const pvc = new k8s.core.v1.PersistentVolumeClaim(
-  `${name}-pvc`,
-  {
-    metadata: {
-      labels: appLabels,
-      namespace: namespaceName,
-      name: `${name}-pvc`,
-    },
-    spec: {
-      accessModes: ['ReadWriteOnce'],
-      resources: {
-        requests: {
-          storage: `10Gi`,
-        },
-      },
-    },
-  },
+const dataPVC = new CustomPersistentVolume(
+  'data',
+  { namespaceName: namespaceName, storage: dataStorage },
+  resourceOptions
+)
+const logsPVC = new CustomPersistentVolume(
+  'logs',
+  { namespaceName: namespaceName, storage: logStorage },
   resourceOptions
 )
+const cachePVC = new CustomPersistentVolume(
+  'cache',
+  { namespaceName: namespaceName, storage: cacheStorage },
+  resourceOptions
+)
+
+// const pvc = new k8s.core.v1.PersistentVolumeClaim(
+//   `${name}-pvc`,
+//   {
+//     metadata: {
+//       labels: appLabels,
+//       namespace: namespaceName,
+//       name: `${name}-pvc`,
+//     },
+//     spec: {
+//       accessModes: ['ReadWriteOnce'],
+//       resources: {
+//         requests: {
+//           storage: `10Gi`,
+//         },
+//       },
+//     },
+//   },
+//   resourceOptions
+// )
 
 // Create a Deployment
 const deployment = new k8s.apps.v1.Deployment(
@@ -141,17 +160,17 @@ const deployment = new k8s.apps.v1.Deployment(
               ports: [{ containerPort: 3334 }],
               volumeMounts: [
                 {
-                  name: 'persistent-data',
+                  name: 'data',
                   mountPath: '/data',
                   subPath: 'data',
                 },
                 {
-                  name: 'persistent-data',
+                  name: 'logs',
                   mountPath: '/logs',
                   subPath: 'logs',
                 },
                 {
-                  name: 'persistent-data',
+                  name: 'cache',
                   mountPath: '/cache',
                   subPath: 'cache',
                 },
@@ -160,9 +179,21 @@ const deployment = new k8s.apps.v1.Deployment(
           ],
           volumes: [
             {
-              name: 'persistent-data',
+              name: 'data',
+              persistentVolumeClaim: {
+                claimName: dataPVC.pvc.metadata.name,
+              },
+            },
+            {
+              name: 'logs',
+              persistentVolumeClaim: {
+                claimName: logsPVC.pvc.metadata.name,
+              },
+            },
+            {
+              name: 'cache',
               persistentVolumeClaim: {
-                claimName: `${name}-pvc`,
+                claimName: cachePVC.pvc.metadata.name,
               },
             },
           ],

+ 1 - 0
devops/kubernetes/pulumi-common/index.ts

@@ -1,3 +1,4 @@
 export { CaddyServiceDeployment } from './caddy'
 export { PostgresServiceDeployment } from './database'
 export { configMapFromFile } from './configMap'
+export { CustomPersistentVolume } from './volume'

+ 43 - 0
devops/kubernetes/pulumi-common/volume.ts

@@ -0,0 +1,43 @@
+import * as k8s from '@pulumi/kubernetes'
+import * as pulumi from '@pulumi/pulumi'
+
+/**
+ * This is an abstraction that uses a class to fold together the common pattern of a
+ * Kubernetes Deployment and its associated Service object.
+ * This class creates a Persistent Volume
+ */
+export class CustomPersistentVolume extends pulumi.ComponentResource {
+  public readonly pvc: k8s.core.v1.PersistentVolumeClaim
+
+  constructor(name: string, args: ServiceDeploymentArgs, opts?: pulumi.ComponentResourceOptions) {
+    super('volume:service:CustomPersistentVolume', name, {}, opts)
+
+    const volumeLabels = { app: name }
+    const pvcName = `${name}-pvc`
+
+    this.pvc = new k8s.core.v1.PersistentVolumeClaim(
+      pvcName,
+      {
+        metadata: {
+          labels: volumeLabels,
+          namespace: args.namespaceName,
+          name: pvcName,
+        },
+        spec: {
+          accessModes: ['ReadWriteOnce'],
+          resources: {
+            requests: {
+              storage: `${args.storage}Gi`,
+            },
+          },
+        },
+      },
+      { parent: this }
+    )
+  }
+}
+
+export interface ServiceDeploymentArgs {
+  namespaceName: pulumi.Output<string>
+  storage: Number
+}