Explorar o código

Add other container deployments, add optional args to k8sjs

Anuj Bansal %!s(int64=3) %!d(string=hai) anos
pai
achega
bba81059c3

+ 77 - 2
devops/infrastructure/query-node/index.ts

@@ -25,19 +25,94 @@ const cluster = new eks.Cluster('eksctl-my-cluster', {
 export const kubeconfig = cluster.kubeconfig
 
 // Create a repository
-const repo = new awsx.ecr.Repository('my-repo')
+const repo = new awsx.ecr.Repository('joystream/apps')
 
-const redisLeader = new k8sjs.ServiceDeployment('redis-leader', {
+export const joystreamAppsImage = repo.buildAndPushImage({
+  dockerfile: '../../../apps.Dockerfile',
+  context: '../../../',
+})
+
+const redis = new k8sjs.ServiceDeployment('redis', {
   image: 'redis:6.0-alpine',
   ports: [6379],
+  provider: cluster.provider,
 })
 
 const db = new k8sjs.ServiceDeployment('postgres-db', {
   image: 'postgres:12',
   ports: [5432],
+  provider: cluster.provider,
+  env: [
+    { name: 'POSTGRES_USER', value: process.env.DB_USER! },
+    { name: 'POSTGRES_PASSWORD', value: process.env.DB_PASS! },
+    { name: 'POSTGRES_DB', value: process.env.INDEXER_DB_NAME! },
+  ],
+  allocateIpAddress: false,
+})
+
+const indexer = new k8sjs.ServiceDeployment('indexer', {
+  image: 'joystream/hydra-indexer:2.1.0-beta.9',
+  provider: cluster.provider,
+  env: [
+    { name: 'DB_HOST', value: 'postgres-db' },
+    { name: 'DB_NAME', value: process.env.INDEXER_DB_NAME! },
+    { name: 'INDEXER_WORKERS', value: '5' },
+    { name: 'REDIS_URI', value: 'redis://redis:6379/0' },
+    { name: 'DEBUG', value: 'index-builder:*' },
+    { name: 'WS_PROVIDER_ENDPOINT_URI', value: process.env.WS_PROVIDER_ENDPOINT_URI! },
+    { name: 'TYPES_JSON', value: 'types.json' },
+  ],
+  command: ['yarn db:bootstrap && yarn start:prod'],
+  allocateIpAddress: false,
+})
+
+const hydraIndexerGateway = new k8sjs.ServiceDeployment('hydra-indexer-gateway', {
+  image: 'joystream/hydra-indexer:2.1.0-beta.9',
+  ports: [5432],
+  provider: cluster.provider,
   env: [
     { name: 'POSTGRES_USER', value: process.env.DB_USER! },
     { name: 'POSTGRES_PASSWORD', value: process.env.DB_PASS! },
     { name: 'POSTGRES_DB', value: process.env.INDEXER_DB_NAME! },
   ],
+  allocateIpAddress: false,
+})
+
+const processor = new k8sjs.ServiceDeployment('processor', {
+  image: joystreamAppsImage,
+  provider: cluster.provider,
+  env: [
+    { name: 'INDEXER_ENDPOINT_URL', value: `http://hydra-indexer-gateway:${process.env.WARTHOG_APP_PORT}/graphql` },
+    { name: 'TYPEORM_HOST', value: 'postgres-db' },
+    { name: 'TYPEORM_DATABASE', value: process.env.DB_NAME! },
+    { name: 'DEBUG', value: 'index-builder:*' },
+    { name: 'PROCESSOR_POLL_INTERVAL', value: '1000' },
+  ],
+  volumeMounts: [
+    {
+      mountPath: '/joystream/query-node/mappings/lib/generated/types/typedefs.json',
+      name: 'tmp-volume',
+    },
+  ],
+  volumes: [
+    {
+      name: 'tmp-volume',
+      hostPath: {
+        path: '../../../types/augment/all/defs.json',
+        type: 'FileOrCreate',
+      },
+    },
+  ],
+  allocateIpAddress: false,
+})
+
+const graphqlServer = new k8sjs.ServiceDeployment('graphql-server', {
+  image: joystreamAppsImage,
+  ports: [Number(process.env.GRAPHQL_SERVER_PORT!)],
+  provider: cluster.provider,
+  env: [
+    { name: 'DB_HOST', value: 'postgres-db' },
+    { name: 'DB_NAME', value: process.env.DB_NAME! },
+  ],
+  allocateIpAddress: true,
 })

+ 10 - 4
devops/infrastructure/query-node/k8sjs.ts

@@ -23,7 +23,9 @@ export class ServiceDeployment extends pulumi.ComponentResource {
       image: args.image,
       resources: args.resources || { requests: { cpu: '100m', memory: '100Mi' } },
       env: currentEnv,
+      command: args.command,
       ports: args.ports && args.ports.map((p) => ({ containerPort: p })),
+      volumeMounts: args.volumeMounts,
     }
     this.deployment = new k8s.apps.v1.Deployment(
       name,
@@ -33,11 +35,11 @@ export class ServiceDeployment extends pulumi.ComponentResource {
           replicas: args.replicas || 1,
           template: {
             metadata: { labels: labels },
-            spec: { containers: [container] },
+            spec: { containers: [container], volumes: args.volumes },
           },
         },
       },
-      { parent: this }
+      { provider: args.provider, parent: this }
     )
 
     this.service = new k8s.core.v1.Service(
@@ -55,7 +57,7 @@ export class ServiceDeployment extends pulumi.ComponentResource {
           type: args.allocateIpAddress ? (args.isMinikube ? 'ClusterIP' : 'LoadBalancer') : undefined,
         },
       },
-      { parent: this }
+      { provider: args.provider, parent: this }
     )
 
     if (args.allocateIpAddress) {
@@ -70,11 +72,15 @@ interface EnvironmentType {
 }
 
 export interface ServiceDeploymentArgs {
-  image: string
+  image: string | pulumi.Output<string>
+  provider: k8s.Provider
   resources?: k8stypes.core.v1.ResourceRequirements
   replicas?: number
   ports?: number[]
   env?: EnvironmentType[]
+  command?: string[]
+  volumeMounts?: any[]
+  volumes?: any[]
   allocateIpAddress?: boolean
   isMinikube?: boolean
 }