Browse Source

Update node network, query node to pass config

Anuj Bansal 3 years ago
parent
commit
301cd2a63b

+ 11 - 1
devops/infrastructure/node-network/index.ts

@@ -302,9 +302,19 @@ const service = new k8s.core.v1.Service(
 export const serviceName = service.metadata.name
 
 const lbReady = config.get('isLoadBalancerReady') === 'true'
+
+const caddyEndpoints = [
+  `/ws-rpc {
+  reverse_proxy node-network:9944
+}`,
+  `/http-rpc {
+  reverse_proxy node-network:9933
+}`,
+]
+
 const caddy = new CaddyServiceDeployment(
   'caddy-proxy',
-  { lbReady, namespaceName: namespaceName, isMinikube },
+  { lbReady, namespaceName: namespaceName, isMinikube, caddyEndpoints },
   resourceOptions
 )
 

+ 7 - 8
devops/infrastructure/pulumi-common/caddy.ts

@@ -14,7 +14,7 @@ export class CaddyServiceDeployment extends pulumi.ComponentResource {
   public readonly secondaryEndpoint?: pulumi.Output<string>
 
   constructor(name: string, args: ServiceDeploymentArgs, opts?: pulumi.ComponentResourceOptions) {
-    super('k8sjs:service:ServiceDeployment', name, {}, opts)
+    super('caddy:service:CaddyServiceDeployment', name, {}, opts)
 
     const labels = { app: name }
     let volumes: pulumi.Input<pulumi.Input<k8s.types.input.core.v1.Volume>[]> = []
@@ -58,14 +58,11 @@ export class CaddyServiceDeployment extends pulumi.ComponentResource {
       })
 
       function getProxyString(ipAddress: pulumi.Output<string>) {
-        return pulumi.interpolate`${ipAddress}.nip.io/ws-rpc {
-          reverse_proxy node-network:9944
+        let result: pulumi.Output<string> = pulumi.interpolate``
+        for (const endpoint of args.caddyEndpoints) {
+          result = pulumi.interpolate`${ipAddress}.nip.io${endpoint}\n${result}`
         }
-
-        ${ipAddress}.nip.io/http-rpc {
-          reverse_proxy node-network:9933
-        }
-        `
+        return result
       }
 
       caddyConfig = pulumi.interpolate`${getProxyString(lbIps[0].address)}
@@ -130,6 +127,8 @@ export class CaddyServiceDeployment extends pulumi.ComponentResource {
 
 export interface ServiceDeploymentArgs {
   namespaceName: pulumi.Output<string>
+  // Endpoints are caddyConfig strings concatenated after IP.nip.io
+  caddyEndpoints: string[]
   lbReady?: boolean
   isMinikube?: boolean
 }

+ 0 - 137
devops/infrastructure/query-node/caddy.ts

@@ -1,137 +0,0 @@
-import * as k8s from '@pulumi/kubernetes'
-import * as pulumi from '@pulumi/pulumi'
-import * as dns from 'dns'
-
-/**
- * ServiceDeployment is an example abstraction that uses a class to fold together the common pattern of a
- * Kubernetes Deployment and its associated Service object.
- */
-export class CaddyServiceDeployment extends pulumi.ComponentResource {
-  public readonly deployment: k8s.apps.v1.Deployment
-  public readonly service: k8s.core.v1.Service
-  public readonly hostname?: pulumi.Output<string>
-  public readonly primaryEndpoint?: pulumi.Output<string>
-  public readonly secondaryEndpoint?: pulumi.Output<string>
-
-  constructor(name: string, args: ServiceDeploymentArgs, opts?: pulumi.ComponentResourceOptions) {
-    super('k8sjs:service:ServiceDeployment', name, {}, opts)
-
-    const labels = { app: name }
-    let volumes: pulumi.Input<pulumi.Input<k8s.types.input.core.v1.Volume>[]> = []
-    let caddyVolumeMounts: pulumi.Input<pulumi.Input<k8s.types.input.core.v1.VolumeMount>[]> = []
-
-    async function lookupPromise(url: string): Promise<dns.LookupAddress[]> {
-      return new Promise((resolve, reject) => {
-        dns.lookup(url, { all: true }, (err: any, addresses: dns.LookupAddress[]) => {
-          if (err) reject(err)
-          resolve(addresses)
-        })
-      })
-    }
-
-    this.service = new k8s.core.v1.Service(
-      name,
-      {
-        metadata: {
-          name: name,
-          namespace: args.namespaceName,
-          labels: labels,
-        },
-        spec: {
-          type: 'LoadBalancer',
-          ports: [
-            { name: 'http', port: 80 },
-            { name: 'https', port: 443 },
-          ],
-          selector: labels,
-        },
-      },
-      { parent: this }
-    )
-
-    this.hostname = this.service.status.loadBalancer.ingress[0].hostname
-
-    if (args.lbReady) {
-      let caddyConfig: pulumi.Output<string>
-      const lbIps: pulumi.Output<dns.LookupAddress[]> = this.hostname.apply((dnsName) => {
-        return lookupPromise(dnsName)
-      })
-
-      function getProxyString(ipAddress: pulumi.Output<string>) {
-        return pulumi.interpolate`${ipAddress}.nip.io/indexer/* {
-          uri strip_prefix /indexer
-          reverse_proxy query-node:4000
-        }
-
-        ${ipAddress}.nip.io/server/* {
-          uri strip_prefix /server
-          reverse_proxy query-node:8081
-        }
-        `
-      }
-
-      caddyConfig = pulumi.interpolate`${getProxyString(lbIps[0].address)}
-        ${getProxyString(lbIps[1].address)}`
-
-      this.primaryEndpoint = pulumi.interpolate`${lbIps[0].address}.nip.io`
-      this.secondaryEndpoint = pulumi.interpolate`${lbIps[1].address}.nip.io`
-
-      const keyConfig = new k8s.core.v1.ConfigMap(
-        name,
-        {
-          metadata: { namespace: args.namespaceName, labels: labels },
-          data: { 'fileData': caddyConfig },
-        },
-        { parent: this }
-      )
-      const keyConfigName = keyConfig.metadata.apply((m) => m.name)
-
-      caddyVolumeMounts.push({
-        mountPath: '/etc/caddy/Caddyfile',
-        name: 'caddy-volume',
-        subPath: 'fileData',
-      })
-      volumes.push({
-        name: 'caddy-volume',
-        configMap: {
-          name: keyConfigName,
-        },
-      })
-    }
-
-    this.deployment = new k8s.apps.v1.Deployment(
-      name,
-      {
-        metadata: { namespace: args.namespaceName, labels: labels },
-        spec: {
-          selector: { matchLabels: labels },
-          replicas: 1,
-          template: {
-            metadata: { labels: labels },
-            spec: {
-              containers: [
-                {
-                  name: 'caddy',
-                  image: 'caddy',
-                  ports: [
-                    { name: 'caddy-http', containerPort: 80 },
-                    { name: 'caddy-https', containerPort: 443 },
-                  ],
-                  volumeMounts: caddyVolumeMounts,
-                },
-              ],
-              volumes,
-            },
-          },
-        },
-      },
-      { parent: this }
-    )
-  }
-}
-
-export interface ServiceDeploymentArgs {
-  namespaceName: pulumi.Output<string>
-  lbReady?: boolean
-  isMinikube?: boolean
-}

+ 17 - 8
devops/infrastructure/query-node/index.ts

@@ -5,9 +5,7 @@ import * as pulumi from '@pulumi/pulumi'
 import { configMapFromFile } from './configMap'
 import * as k8s from '@pulumi/kubernetes'
 import * as s3Helpers from './s3Helpers'
-import { CaddyServiceDeployment } from './caddy'
-import { workers } from 'cluster'
-// import * as fs from 'fs'
+import { CaddyServiceDeployment } from 'pulumi-common'
 
 require('dotenv').config()
 
@@ -36,7 +34,7 @@ if (isMinikube) {
   const vpc = new awsx.ec2.Vpc('query-node-vpc', { numberOfAvailabilityZones: 2 })
 
   // Create an EKS cluster with the default configuration.
-  const cluster = new eks.Cluster('eksctl-my-cluster', {
+  const cluster = new eks.Cluster('eksctl-query-node', {
     vpcId: vpc.id,
     subnetIds: vpc.publicSubnetIds,
     desiredCapacity: 3,
@@ -441,12 +439,23 @@ const service = new k8s.core.v1.Service(
 // Export the Service name and public LoadBalancer Endpoint
 export const serviceName = service.metadata.name
 
-// When "done", this will print the public IP.
-// export let serviceHostname: pulumi.Output<string>
+const caddyEndpoints = [
+  `/indexer/* {
+    uri strip_prefix /indexer
+    reverse_proxy query-node:4000
+}`,
+  `/server/* {
+    uri strip_prefix /server
+    reverse_proxy query-node:8081
+}`,
+]
 
-// serviceHostname = service.status.loadBalancer.ingress[0].hostname
 const lbReady = config.get('isLoadBalancerReady') === 'true'
-const caddy = new CaddyServiceDeployment('caddy-proxy', { lbReady, namespaceName: namespaceName }, resourceOptions)
+const caddy = new CaddyServiceDeployment(
+  'caddy-proxy',
+  { lbReady, namespaceName: namespaceName, isMinikube, caddyEndpoints },
+  resourceOptions
+)
 
 export const endpoint1 = caddy.primaryEndpoint
 export const endpoint2 = caddy.secondaryEndpoint

+ 2 - 1
devops/infrastructure/query-node/package.json

@@ -12,6 +12,7 @@
     "@pulumi/docker": "^3.0.0",
     "dotenv": "^10.0.0",
     "mime": "^2.5.2",
-    "@types/mime": "^2.0.0"
+    "@types/mime": "^2.0.0",
+    "pulumi-common": "file:../pulumi-common"
   }
 }