diff --git a/pkg/infra/pulumi_aws/iac/eks.ts b/pkg/infra/pulumi_aws/iac/eks.ts index 52b2486c4..743220ed4 100644 --- a/pkg/infra/pulumi_aws/iac/eks.ts +++ b/pkg/infra/pulumi_aws/iac/eks.ts @@ -34,6 +34,7 @@ export interface EksExecUnitArgs { memoryUtilization?: number // Differs from ephemeral-storage resource request (stable in k8s 1.25) maxReplicas?: number } + stickinessTimeout?: number } export interface HelmOptions { @@ -546,7 +547,7 @@ export class Eks { dependsOn: [deployment], }) } - const service = this.createService(execUnit, lib.klothoVPC, args.nodeType, deployment) + const service = this.createService(execUnit, lib.klothoVPC, args, deployment) serviceName = service.metadata.name dependencyParent = service } @@ -941,7 +942,7 @@ export class Eks { public createService( execUnit: string, vpc: awsx.ec2.Vpc, - nodeType: 'fargate' | 'node', + args: EksExecUnitArgs, parent, dependsOn: (pulumi.Resource | pulumi.Output)[] = [], serviceDiscoveryDomain?: pulumi.Output, @@ -976,8 +977,9 @@ export class Eks { return k8s.createService( execUnit, this.provider, - generateLabels(execUnit, nodeType === 'fargate'), + generateLabels(execUnit, args.nodeType === 'fargate'), metadataAnnotations, + args.stickinessTimeout ? args.stickinessTimeout : 0, parent, dependsOn ) diff --git a/pkg/infra/pulumi_aws/iac/kubernetes.ts b/pkg/infra/pulumi_aws/iac/kubernetes.ts index 82d1622f5..8b346899c 100644 --- a/pkg/infra/pulumi_aws/iac/kubernetes.ts +++ b/pkg/infra/pulumi_aws/iac/kubernetes.ts @@ -71,9 +71,22 @@ export const createService = ( k8sProvider: k8s.Provider, appLabels: { [key: string]: string }, annotations, + stickinessTimeout: number, parent, dependsOn ): k8s.core.v1.Service => { + let sessionAffinityFields = {} + if (stickinessTimeout > 0) { + sessionAffinityFields = { + sessionAffinity: 'ClientIP', + sessionAffinityConfig: { + clientIP: { + timeoutSeconds: stickinessTimeout, + }, + }, + } + } + return new k8s.core.v1.Service( execUnit.replace('-', '').toLowerCase(), { @@ -91,6 +104,7 @@ export const createService = ( }, ], selector: appLabels, + ...sessionAffinityFields, }, }, { provider: k8sProvider, parent, dependsOn }