1
1
import * as k8s from "@kubernetes/client-node" ;
2
+ import {
3
+ EnvironmentType ,
4
+ MachinePreset ,
5
+ PostStartCauses ,
6
+ PreStopCauses ,
7
+ } from "@trigger.dev/core/v3" ;
2
8
import {
3
9
ProviderShell ,
10
+ SimpleLogger ,
4
11
TaskOperations ,
5
12
TaskOperationsCreateOptions ,
6
13
TaskOperationsIndexOptions ,
7
14
TaskOperationsPrePullDeploymentOptions ,
8
15
TaskOperationsRestoreOptions ,
9
16
} from "@trigger.dev/core/v3/apps" ;
10
- import { SimpleLogger } from "@trigger.dev/core/v3/apps" ;
11
- import {
12
- MachinePreset ,
13
- PostStartCauses ,
14
- PreStopCauses ,
15
- EnvironmentType ,
16
- } from "@trigger.dev/core/v3" ;
17
- import { TaskMonitor } from "./taskMonitor" ;
18
17
import { PodCleaner } from "./podCleaner" ;
18
+ import { TaskMonitor } from "./taskMonitor" ;
19
19
import { UptimeHeartbeat } from "./uptimeHeartbeat" ;
20
20
21
21
const RUNTIME_ENV = process . env . KUBERNETES_PORT ? "kubernetes" : "local" ;
22
22
const NODE_NAME = process . env . NODE_NAME || "local" ;
23
23
const OTEL_EXPORTER_OTLP_ENDPOINT =
24
24
process . env . OTEL_EXPORTER_OTLP_ENDPOINT ?? "http://0.0.0.0:4318" ;
25
+ const COORDINATOR_HOST = process . env . COORDINATOR_HOST ?? undefined ;
26
+ const COORDINATOR_PORT = process . env . COORDINATOR_PORT ?? undefined ;
27
+ const KUBERNETES_NAMESPACE = process . env . KUBERNETES_NAMESPACE ?? "default" ;
25
28
26
29
const POD_CLEANER_INTERVAL_SECONDS = Number ( process . env . POD_CLEANER_INTERVAL_SECONDS || "300" ) ;
27
30
@@ -45,19 +48,22 @@ type ResourceQuantities = {
45
48
} ;
46
49
47
50
class KubernetesTaskOperations implements TaskOperations {
48
- #namespace: Namespace ;
51
+ #namespace: Namespace = {
52
+ metadata : {
53
+ name : "default" ,
54
+ } ,
55
+ } ;
56
+
49
57
#k8sApi: {
50
58
core : k8s . CoreV1Api ;
51
59
batch : k8s . BatchV1Api ;
52
60
apps : k8s . AppsV1Api ;
53
61
} ;
54
62
55
- constructor ( namespace = "default" ) {
56
- this . #namespace = {
57
- metadata : {
58
- name : namespace ,
59
- } ,
60
- } ;
63
+ constructor ( opts : { namespace ?: string } = { } ) {
64
+ if ( opts . namespace ) {
65
+ this . #namespace. metadata . name = opts . namespace ;
66
+ }
61
67
62
68
this . #k8sApi = this . #createK8sApi( ) ;
63
69
}
@@ -229,16 +235,7 @@ class KubernetesTaskOperations implements TaskOperations {
229
235
imagePullPolicy : "IfNotPresent" ,
230
236
command : [ "/bin/sh" , "-c" ] ,
231
237
args : [ "printenv COORDINATOR_HOST | tee /etc/taskinfo/coordinator-host" ] ,
232
- env : [
233
- {
234
- name : "COORDINATOR_HOST" ,
235
- valueFrom : {
236
- fieldRef : {
237
- fieldPath : "status.hostIP" ,
238
- } ,
239
- } ,
240
- } ,
241
- ] ,
238
+ env : this . #coordinatorEnvVars,
242
239
volumeMounts : [
243
240
{
244
241
name : "taskinfo" ,
@@ -409,6 +406,41 @@ class KubernetesTaskOperations implements TaskOperations {
409
406
} ;
410
407
}
411
408
409
+ get #coordinatorHostEnvVar( ) : k8s . V1EnvVar {
410
+ return COORDINATOR_HOST
411
+ ? {
412
+ name : "COORDINATOR_HOST" ,
413
+ value : COORDINATOR_HOST ,
414
+ }
415
+ : {
416
+ name : "COORDINATOR_HOST" ,
417
+ valueFrom : {
418
+ fieldRef : {
419
+ fieldPath : "status.hostIP" ,
420
+ } ,
421
+ } ,
422
+ } ;
423
+ }
424
+
425
+ get #coordinatorPortEnvVar( ) : k8s . V1EnvVar | undefined {
426
+ if ( COORDINATOR_PORT ) {
427
+ return {
428
+ name : "COORDINATOR_PORT" ,
429
+ value : COORDINATOR_PORT ,
430
+ } ;
431
+ }
432
+ }
433
+
434
+ get #coordinatorEnvVars( ) : k8s . V1EnvVar [ ] {
435
+ const envVars = [ this . #coordinatorHostEnvVar] ;
436
+
437
+ if ( this . #coordinatorPortEnvVar) {
438
+ envVars . push ( this . #coordinatorPortEnvVar) ;
439
+ }
440
+
441
+ return envVars ;
442
+ }
443
+
412
444
#getSharedEnv( envId : string ) : k8s . V1EnvVar [ ] {
413
445
return [
414
446
{
@@ -435,14 +467,6 @@ class KubernetesTaskOperations implements TaskOperations {
435
467
} ,
436
468
} ,
437
469
} ,
438
- {
439
- name : "COORDINATOR_HOST" ,
440
- valueFrom : {
441
- fieldRef : {
442
- fieldPath : "status.hostIP" ,
443
- } ,
444
- } ,
445
- } ,
446
470
{
447
471
name : "MACHINE_NAME" ,
448
472
valueFrom : {
@@ -451,6 +475,7 @@ class KubernetesTaskOperations implements TaskOperations {
451
475
} ,
452
476
} ,
453
477
} ,
478
+ ...this . #coordinatorEnvVars,
454
479
] ;
455
480
}
456
481
@@ -623,7 +648,9 @@ class KubernetesTaskOperations implements TaskOperations {
623
648
}
624
649
625
650
const provider = new ProviderShell ( {
626
- tasks : new KubernetesTaskOperations ( ) ,
651
+ tasks : new KubernetesTaskOperations ( {
652
+ namespace : KUBERNETES_NAMESPACE ,
653
+ } ) ,
627
654
type : "kubernetes" ,
628
655
} ) ;
629
656
@@ -663,7 +690,7 @@ taskMonitor.start();
663
690
664
691
const podCleaner = new PodCleaner ( {
665
692
runtimeEnv : RUNTIME_ENV ,
666
- namespace : "default" ,
693
+ namespace : KUBERNETES_NAMESPACE ,
667
694
intervalInSeconds : POD_CLEANER_INTERVAL_SECONDS ,
668
695
} ) ;
669
696
@@ -672,7 +699,7 @@ podCleaner.start();
672
699
if ( UPTIME_HEARTBEAT_URL ) {
673
700
const uptimeHeartbeat = new UptimeHeartbeat ( {
674
701
runtimeEnv : RUNTIME_ENV ,
675
- namespace : "default" ,
702
+ namespace : KUBERNETES_NAMESPACE ,
676
703
intervalInSeconds : UPTIME_INTERVAL_SECONDS ,
677
704
pingUrl : UPTIME_HEARTBEAT_URL ,
678
705
maxPendingRuns : UPTIME_MAX_PENDING_RUNS ,
0 commit comments