diff --git a/packages/k8s/src/k8s/index.ts b/packages/k8s/src/k8s/index.ts index 120d3ad..d67ebf1 100644 --- a/packages/k8s/src/k8s/index.ts +++ b/packages/k8s/src/k8s/index.ts @@ -95,10 +95,12 @@ export async function createPod( appPod.spec.containers = containers appPod.spec.restartPolicy = 'Never' - if (!useKubeScheduler()) { - appPod.spec.nodeName = await getCurrentNodeName() + const nodeName = await getCurrentNodeName() + if (useKubeScheduler()) { + appPod.spec.affinity = await getPodAffinity(nodeName) + } else { + appPod.spec.nodeName = nodeName } - const claimName = getVolumeClaimName() appPod.spec.volumes = [ { @@ -155,8 +157,11 @@ export async function createJob( job.spec.template.spec.containers = [container] job.spec.template.spec.restartPolicy = 'Never' - if (!useKubeScheduler()) { - job.spec.template.spec.nodeName = await getCurrentNodeName() + const nodeName = await getCurrentNodeName() + if (useKubeScheduler()) { + job.spec.template.spec.affinity = await getPodAffinity(nodeName) + } else { + job.spec.template.spec.nodeName = nodeName } const claimName = getVolumeClaimName() @@ -540,6 +545,26 @@ async function getCurrentNodeName(): Promise { return nodeName } +async function getPodAffinity(nodeName: string): Promise { + const affinity = new k8s.V1Affinity() + affinity.nodeAffinity = new k8s.V1NodeAffinity() + affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution = + new k8s.V1NodeSelector() + affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms = + [ + { + matchExpressions: [ + { + key: 'kubernetes.io/hostname', + operator: 'In', + values: [nodeName] + } + ] + } + ] + return affinity +} + export function namespace(): string { if (process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE']) { return process.env['ACTIONS_RUNNER_KUBERNETES_NAMESPACE']