Node scheduling: taints, tolerations, affinity and score mode
Keep workloads off a node with taints, let chosen apps onto it with tolerations, place apps near or away from each other with affinity, and pick spread or bin-pack scoring live.
Not yet verified on a real multi-node host. The rules below are covered by unit and API tests on a single control plane. Treat this page as a preview until a two-node run is recorded here.
Nothing on this page changes a one-node install. With no taints, no tolerations, no affinity rules and the default spread score mode, every placement is decided exactly as described in Resource-aware placement.
For each new app or database without an explicit node_id, and for each move or drain without a target, the control plane:
Drops nodes that are offline, cordoned, missing a node_selector label or too small for the workload’s requests.
Drops nodes with a NoSchedule or NoExecute taint the workload does not tolerate.
Drops nodes that fail a required affinity term (node_required, or a together or apart term with weight 0).
Scores the rest: the score mode picks the base order, preferred affinity terms add or subtract weight, and an untolerated PreferNoSchedule taint ranks the node lower.
# keep everything off this node unless it tolerates dedicated=gpulevelrail-cli nodes taint <node-id> dedicated=gpu:NoSchedule# a key with no valuelevelrail-cli nodes taint <node-id> maintenance:PreferNoSchedule# show the taints, then remove them alllevelrail-cli nodes taint <node-id>levelrail-cli nodes taint <node-id> --clear
A taint is key[=value]:Effect. Passing taints replaces the node’s whole set.
NoSchedule and NoExecute keep new placements off the node. PreferNoSchedule only ranks it lower.
Workloads already running on the node stay where they are. Use levelrail-cli nodes drain <node-id> to move them.
API: GET and PUT /api/v1/nodes/{id}/taints with body {"taints":[{"key":"dedicated","value":"gpu","effect":"NoSchedule"}]}. Root only.
# tolerate one exact taintlevelrail-cli nodes placement app web --toleration dedicated=gpu:NoSchedule# tolerate any value of a key, for any effectlevelrail-cli nodes placement app web --toleration-exists dedicated# remove the app's tolerations and affinitylevelrail-cli nodes placement app web --clear-placement-rules
A toleration allows a node; it does not attract the app to it. Pair it with a node_selector label or a node_required term to pin the app there.
# affinity.yamlnode_required: # every term must match the node's labels - {key: disk, op: In, values: [ssd]}node_preferred: # soft, weight 1 to 100 - weight: 50 term: {key: zone, op: In, values: [eu-1]}together: # prefer nodes already running matching apps - match: [{key: name, op: In, values: [cache]}] weight: 20apart: # weight 0 means required: never share a zone with db - match: [{key: name, op: In, values: [db]}] topology: zone
API: PUT /api/v1/apps/{name}/placement takes node_selector, tolerations and affinity (databases take node_selector). Leaving tolerations or affinity out of the body keeps what is stored.
levelrail-cli settings runtime get placement.score_modelevelrail-cli settings runtime set placement.score_mode binpacklevelrail-cli settings runtime set placement.score_mode spread
spread (default) picks the node that keeps the most headroom.
binpack fills the fullest node that still fits, which leaves whole nodes free.
Failure-domain spread is applied before the score mode. When any node carries a zone label, a new replica goes to the zone with the fewest replicas first, and binpack only orders the nodes inside that zone. The decision output says so (“spread across failure domains”). Remove the zone labels to get pure bin-packing.
The setting is read on every placement and needs no restart. APP_PLACEMENT_SCORE_MODE only seeds the default. The dashboard has it under Settings, Runtime.
The output lists the eligible nodes, every rejected node with its reason (taint, affinity, selector, capacity) and the stored tolerations. GET /api/v1/apps/{name}/placement/decision returns the recorded placement decision for the app.
One instance per matching node (workload: per-node in app.yaml) is accepted by validation but not scheduled yet.
NoExecute does not evict running workloads by itself. A drain does.
Last modified on November 8, 2026
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Levelrail","description":"Self-hosted deployment platform. Push to git, get a running app with TLS, logs, metrics and rollback. One Go binary, no Kubernetes.","colors":{"primary":"#107292","light":"#2FB3DC","dark":"#084F67"},"logo":{"light":"https://mintcdn.com/levelrail/56HjW70mOjUmjIrm/assets/brand/wordmark-light.svg?fit=max\u0026auto=format\u0026n=56HjW70mOjUmjIrm\u0026q=85\u0026s=cbe02b3c3d17b11f9cc5a18551a30782","dark":"https://mintcdn.com/levelrail/56HjW70mOjUmjIrm/assets/brand/wordmark-dark.svg?fit=max\u0026auto=format\u0026n=56HjW70mOjUmjIrm\u0026q=85\u0026s=a4aa78b496c43e0a5edd9dffce778a45","href":"https://levelrail.com"},"favicon":"https://mintcdn.com/levelrail/zPhEnShTGkGFCjPc/public/favicon.svg?fit=max\u0026auto=format\u0026n=zPhEnShTGkGFCjPc\u0026q=85\u0026s=65f3143dd7539d4b1d34090204f05be0","appearance":{"default":"dark","strict":false},"background":{"color":{"light":"#ffffff","dark":"#000000"}},"navbar":{"links":[{"icon":"globe","href":"https://levelrail.com","label":"Website"},{"icon":"clock-rotate-left","href":"/changelog","label":"Changelog"},{"icon":"github","href":"https://github.com/glincker/levelrail","label":"GitHub"}],"primary":{"type":"button","label":"Get started","href":"/getting-started"}},"footer":{"socials":{"github":"https://github.com/glincker/levelrail","x":"https://x.com/thegdsks","website":"https://levelrail.com"}},"search":{"prompt":"Search docs, CLI, API, guides"},"seo":{"metatags":{"og:site_name":"Levelrail Docs","og:type":"website","og:image":"https://docs.levelrail.com/public/og/default.png","og:image:width":"1200","og:image:height":"630","twitter:card":"summary_large_image","twitter:image":"https://docs.levelrail.com/public/og/default.png","twitter:site":"@thegdsks","keywords":"self-hosted PaaS, Coolify alternative, Docker deployment platform, self-hosted deploys, Levelrail"},"indexing":"navigable"},"fonts":{"heading":{"family":"Geist","weight":500},"body":{"family":"Geist"}},"styling":{"codeblocks":"dark","latex":true},"errors":{"404":{"redirect":false,"title":"Page not found","description":"This page moved or never existed. Try the [quickstart](/getting-started), the [all pages index](/all-pages) or search above."}},"contextual":{"options":["copy","view","chatgpt","claude","cursor","mcp"],"display":"header"},"interaction":{"drilldown":true},"metadata":{"timestamp":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"levelrail","hasAudioNarration":false,"actualSubdomain":"levelrail","customDomains":["docs.levelrail.com"],"gitSource":{"type":"github","owner":"glincker","repo":"levelrail","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"entitlements":{},"buildId":"6af01eaae387668b0257a8ea","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"Self-host gallery","count":445},{"language":"default","tag":"How-to guides","count":226},{"language":"default","tag":"Productivity","count":82},{"language":"default","tag":"Developer Tools","count":67},{"language":"default","tag":"Get started","count":50},{"language":"default","tag":"Deploying","count":49},{"language":"default","tag":"Reference","count":42},{"language":"default","tag":"AI","count":36},{"language":"default","tag":"Appendix","count":35},{"language":"default","tag":"Monitoring","count":35}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":":root{--lr-live: #2fb3dc;--lr-soft: #58b1ce;--lr-teal: #107292;--lr-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--lr-r: 12px;--lr-face: #0e0f11;--lr-face-2: #141617;--lr-text: #cfcfd3;--lr-link: #58b1ce;--lr-line: rgba(255, 255, 255, 0.08);--lr-ring: linear-gradient(180deg, rgba(255, 255, 255, 0.18), rgba(255, 255, 255, 0.04) 40%, rgba(255, 255, 255, 0.06));--lr-ring-hot: linear-gradient(180deg, rgba(47, 179, 220, 0.55), rgba(47, 179, 220, 0.12) 45%, rgba(47, 179, 220, 0.2));--lr-sheen: linear-gradient(180deg, rgba(255, 255, 255, 0.035), rgba(255, 255, 255, 0));--lr-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 1px 1px rgba(0, 0, 0, 0.5), 0 8px 16px -4px rgba(0, 0, 0, 0.55), 0 24px 48px -12px rgba(0, 0, 0, 0.65);--lr-glow-op: 1;--lr-grain: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n' x='0' y='0' width='100%25' height='100%25'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 9 0 0 0 -4.3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E\")}html:not(.dark){--lr-face: #ffffff;--lr-face-2: #f6f6f7;--lr-text: #3a3d40;--lr-link: #107292;--lr-line: rgba(14, 15, 17, 0.1);--lr-ring: linear-gradient(180deg, rgba(14, 15, 17, 0.2), rgba(14, 15, 17, 0.08) 40%, rgba(14, 15, 17, 0.1));--lr-ring-hot: linear-gradient(180deg, rgba(16, 114, 146, 0.6), rgba(16, 114, 146, 0.18) 45%, rgba(16, 114, 146, 0.26));--lr-sheen: linear-gradient(180deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0));--lr-shadow: 0 1px 1px rgba(14, 15, 17, 0.06), 0 8px 16px -6px rgba(14, 15, 17, 0.1);--lr-glow-op: 0.35}html.dark body{background-color:#000}body{position:relative;font-feature-settings:\"cv11\", \"ss03\";-webkit-font-smoothing:antialiased}body::before,body::after{content:\"\";position:absolute;inset:0 0 auto 0;height:440px;z-index:-1;pointer-events:none;background:radial-gradient(54% 92% at 50% 0%, rgba(47, 179, 220, 0.42), transparent 72%),\n radial-gradient(38% 78% at 10% 0%, rgba(31, 200, 176, 0.3), transparent 72%),\n radial-gradient(36% 70% at 92% 0%, rgba(108, 125, 255, 0.3), transparent 72%)}body::before{opacity:calc(0.4 * var(--lr-glow-op))}body::after{opacity:calc(0.9 * var(--lr-glow-op));filter:saturate(1.2) brightness(1.25);-webkit-mask-image:var(--lr-grain), linear-gradient(to bottom, #000 0%, transparent 88%);-webkit-mask-size:220px 220px, 100% 100%;-webkit-mask-composite:source-in;mask-image:var(--lr-grain), linear-gradient(to bottom, #000 0%, transparent 88%);mask-size:220px 220px, 100% 100%;mask-composite:intersect}html{isolation:isolate}#content-area,#content-container{color:var(--lr-text)}#page-title{font-weight:300;letter-spacing:-0.03em;line-height:1.08;text-wrap:balance}#content-area h2{font-weight:300;letter-spacing:-0.025em}#content-area h3,#content-area h4{font-weight:500;letter-spacing:-0.02em}#header p,#content-area p{text-wrap:pretty}#header>div>div:first-child:not(:has(h1)){font-family:var(--lr-mono);font-size:0.75rem;letter-spacing:0.08em;text-transform:uppercase;color:#8d8d96}#content-area a:not(.card):not([data-component-part]){color:var(--lr-link)}#content-area a[href]:not(.card){text-decoration-color:color-mix(in srgb, var(--lr-link) 40%, transparent)}#content-area a[href]:not(.card):hover{text-decoration-color:currentColor}code,pre,kbd,samp{font-family:var(--lr-mono)!important;font-feature-settings:\"calt\" 0}#content-area :not(pre)>code{background:var(--lr-face-2);border:1px solid var(--lr-line);border-radius:6px;padding:0.1em 0.4em;font-size:0.875em;color:inherit}html.dark #content-area :not(pre)>code{color:#e4e4e7}.code-block{border-radius:var(--lr-r);border:1px solid transparent;box-shadow:var(--lr-shadow);background:var(--lr-sheen) padding-box, linear-gradient(#08090a, #08090a) padding-box, var(--lr-ring) border-box}.code-block-background,.code-block>div{border-radius:var(--lr-r);background-color:transparent}.code-block [data-component-part=\"code-block-root\"],.code-block pre{background:transparent}.code-block code{font-size:0.8125rem;line-height:1.7}.card,.accordion,.accordion-group,.callout{border:1px solid transparent;border-radius:var(--lr-r);box-shadow:var(--lr-shadow);background:var(--lr-sheen) padding-box, linear-gradient(var(--lr-face), var(--lr-face)) padding-box, var(--lr-ring) border-box}.card{transition:box-shadow 0.2s, transform 0.2s}.card:hover{transform:translateY(-1px)}html.dark .card:hover{border-color:rgba(47, 179, 220, 0.45)}.card [data-component-part=\"card-title\"]{font-weight:500;letter-spacing:-0.01em}.card [data-component-part=\"card-icon\"]{color:var(--lr-live)}html:not(.dark) .card [data-component-part=\"card-icon\"]{color:#107292}.accordion{margin-bottom:0.75rem;overflow:hidden}.accordion-group{overflow:hidden}.callout{padding:1rem 1.25rem}.callout[class*=\"border-yellow\"],.callout[class*=\"border-green\"],.callout[class*=\"border-blue\"],.callout[class*=\"border-red\"],.callout[class*=\"border-sky\"]{background:var(--lr-sheen) padding-box, linear-gradient(var(--lr-face), var(--lr-face)) padding-box, var(--lr-ring) border-box}@media (prefers-reduced-motion: reduce){.card{transition:none}.card:hover{transform:none}}#content-area table{border-collapse:separate;border-spacing:0;border:1px solid var(--lr-line);border-radius:var(--lr-r);overflow:hidden;box-shadow:var(--lr-shadow)}#content-area thead th{font-family:var(--lr-mono);font-size:0.75rem;font-weight:500;letter-spacing:0.06em;text-transform:uppercase;color:#8d8d96;background:var(--lr-face-2)}#content-area tbody td,#content-area thead th{border-bottom:1px solid var(--lr-line)}#content-area tbody tr:last-child td{border-bottom:0}#navbar>div.absolute,#navbar>div>div.absolute{background:color-mix(in srgb, var(--lr-face) 38%, transparent);border-bottom-color:var(--lr-line);backdrop-filter:blur(20px) saturate(1.3);-webkit-backdrop-filter:blur(20px) saturate(1.3)}#sidebar .sticky.pointer-events-none{background:none}#navbar .nav-tabs-item[data-active=\"true\"]{color:var(--lr-live)}html:not(.dark) #navbar .nav-tabs-item[data-active=\"true\"]{color:#107292}#navbar .nav-tabs-item[data-active=\"true\"]>div,#navbar .nav-tabs-item[data-active=\"true\"]::after{background:var(--lr-live)}html:not(.dark) #navbar .nav-tabs-item[data-active=\"true\"]>div,html:not(.dark) #navbar .nav-tabs-item[data-active=\"true\"]::after{background:#107292}#topbar-cta-button a>span.absolute{border-radius:50px;background:var(--lr-live);border:1px solid rgba(255, 255, 255, 0.35);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.55), inset 0 -2px 0 rgba(0, 0, 0, 0.18), 0 6px 14px -6px rgba(47, 179, 220, 0.45)}#topbar-cta-button a{padding-left:1rem;padding-right:0.75rem}#topbar-cta-button a .text-white,#topbar-cta-button a svg{color:#000!important}html:not(.dark) #topbar-cta-button a>span.absolute{background:#06232c;border-color:transparent;box-shadow:0 1px 1px rgba(14, 15, 17, 0.3)}html:not(.dark) #topbar-cta-button a .text-white,html:not(.dark) #topbar-cta-button a svg{color:#2fb3dc!important}#search-bar-entry{border-radius:50px;border:1px solid transparent;box-shadow:var(--lr-shadow);background:var(--lr-sheen) padding-box, linear-gradient(var(--lr-face-2), var(--lr-face-2)) padding-box, var(--lr-ring) border-box}#search-bar-entry:hover{background:var(--lr-sheen) padding-box, linear-gradient(var(--lr-face-2), var(--lr-face-2)) padding-box, var(--lr-ring-hot) border-box}#sidebar .sidebar-group-header{font-family:var(--lr-mono);font-size:0.6875rem;letter-spacing:0.08em;text-transform:uppercase;font-weight:500;color:#8d8d96}#sidebar a[aria-current=\"page\"]{border-radius:50px;color:var(--lr-live);background:rgba(47, 179, 220, 0.08);box-shadow:inset 0 0 0 1px rgba(47, 179, 220, 0.2)}html:not(.dark) #sidebar a[aria-current=\"page\"]{color:#084f67;background:rgba(16, 114, 146, 0.09);box-shadow:inset 0 0 0 1px rgba(16, 114, 146, 0.25)}#sidebar a:not([aria-current=\"page\"]):hover{border-radius:50px}#table-of-contents a[data-active=\"true\"],#table-of-contents .toc-item[data-active=\"true\"]{color:var(--lr-live)}html:not(.dark) #table-of-contents a[data-active=\"true\"]{color:#107292}#footer{border-top:1px solid var(--lr-line)}#content-area table th,#content-area table td{padding:0.75rem 1rem;vertical-align:top}#content-area table td:first-child{font-weight:500}#sidebar a[aria-current=\"page\"] img[src*=\"/assets/icons/\"],#navbar .nav-tabs-item[data-active=\"true\"] img[src*=\"/assets/icons/\"]{filter:brightness(0) saturate(100%) invert(58%) sepia(96%) saturate(237%) hue-rotate(148deg) brightness(81%) contrast(149%)}html:not(.dark) #sidebar a[aria-current=\"page\"] img[src*=\"/assets/icons/\"],html:not(.dark) #navbar .nav-tabs-item[data-active=\"true\"] img[src*=\"/assets/icons/\"]{filter:brightness(0) saturate(100%) invert(28%) sepia(90%) saturate(323%) hue-rotate(148deg) brightness(118%) contrast(123%)}"}],"page":{"pagePath":"node-scheduling","slug":"/node-scheduling","pageMetadata":{"title":"Node scheduling: taints, tolerations, affinity and score mode","tag":"Beta","description":"Keep workloads off a node with taints, let chosen apps onto it with tolerations, place apps near or away from each other with affinity, and pick spread or bin-pack scoring live.","og:url":"https://docs.levelrail.com/node-scheduling","href":"/node-scheduling"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Keep workloads off a node with taints, let chosen apps onto it with tolerations, place apps near or away from each other with affinity, and pick spread or bin-pack scoring live.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Warning,{children:_jsx(_components.p,{children:`Not yet verified on a real multi-node host. The rules below are covered by unit and API tests on a single control plane. Treat this page as a preview until a two-node run is recorded here.`})}),`\n`,_jsxs(_components.p,{children:[`Nothing on this page changes a one-node install. With no taints, no tolerations, no affinity rules and the default `,_jsx(_components.code,{children:`spread`}),` score mode, every placement is decided exactly as described in `,_jsx(_components.a,{href:`/resource-aware-placement`,children:`Resource-aware placement`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-a-node-is-chosen`,children:`How a node is chosen`}),`\n`,_jsxs(_components.p,{children:[`For each new app or database without an explicit `,_jsx(_components.code,{children:`node_id`}),`, and for each move or drain without a target, the control plane:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Drops nodes that are offline, cordoned, missing a `,_jsx(_components.code,{children:`node_selector`}),` label or too small for the workload’s requests.`]}),`\n`,_jsxs(_components.li,{children:[`Drops nodes with a `,_jsx(_components.code,{children:`NoSchedule`}),` or `,_jsx(_components.code,{children:`NoExecute`}),` taint the workload does not tolerate.`]}),`\n`,_jsxs(_components.li,{children:[`Drops nodes that fail a required affinity term (`,_jsx(_components.code,{children:`node_required`}),`, or a `,_jsx(_components.code,{children:`together`}),` or `,_jsx(_components.code,{children:`apart`}),` term with weight `,_jsx(_components.code,{children:`0`}),`).`]}),`\n`,_jsxs(_components.li,{children:[`Scores the rest: the score mode picks the base order, preferred affinity terms add or subtract weight, and an untolerated `,_jsx(_components.code,{children:`PreferNoSchedule`}),` taint ranks the node lower.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`An explicit `,_jsx(_components.code,{children:`node_id`}),` always overrides this choice.`]}),`\n`,_jsx(Heading,{level:`2`,id:`taints-reserve-a-node`,children:`Taints: reserve a node`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# keep everything off this node unless it tolerates dedicated=gpu`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` nodes`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` taint`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`node-i`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`d`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`> `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`dedicated=gpu:NoSchedule`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# a key with no value`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` nodes`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` taint`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`node-i`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`d`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`> `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`maintenance:PreferNoSchedule`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# show the taints, then remove them all`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` nodes`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` taint`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`node-i`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`d`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` nodes`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` taint`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`node-i`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`d`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`> `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`--clear`})]}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A taint is `,_jsx(_components.code,{children:`key[=value]:Effect`}),`. Passing taints replaces the node’s whole set.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`NoSchedule`}),` and `,_jsx(_components.code,{children:`NoExecute`}),` keep new placements off the node. `,_jsx(_components.code,{children:`PreferNoSchedule`}),` only ranks it lower.`]}),`\n`,_jsxs(_components.li,{children:[`Workloads already running on the node stay where they are. Use `,_jsx(_components.code,{children:`levelrail-cli nodes drain \u003cnode-id>`}),` to move them.`]}),`\n`,_jsxs(_components.li,{children:[`API: `,_jsx(_components.code,{children:`GET`}),` and `,_jsx(_components.code,{children:`PUT /api/v1/nodes/{id}/taints`}),` with body `,_jsx(_components.code,{children:`{\"taints\":[{\"key\":\"dedicated\",\"value\":\"gpu\",\"effect\":\"NoSchedule\"}]}`}),`. Root only.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`tolerations-let-an-app-onto-a-tainted-node`,children:`Tolerations: let an app onto a tainted node`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# tolerate one exact taint`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` nodes`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` placement`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` app`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` web`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --toleration`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` dedicated=gpu:NoSchedule`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# tolerate any value of a key, for any effect`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` nodes`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` placement`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` app`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` web`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --toleration-exists`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` dedicated`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# remove the app's tolerations and affinity`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` nodes`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` placement`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` app`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` web`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --clear-placement-rules`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`A toleration allows a node; it does not attract the app to it. Pair it with a `,_jsx(_components.code,{children:`node_selector`}),` label or a `,_jsx(_components.code,{children:`node_required`}),` term to pin the app there.`]}),`\n`,_jsx(Heading,{level:`2`,id:`affinity-near-away-or-on-a-kind-of-node`,children:`Affinity: near, away, or on a kind of node`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`12`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`12`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# affinity.yaml`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`node_required`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# every term must match the node's labels`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` - {`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`key`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`disk`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`op`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`In`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`values`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`ssd`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`]}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`node_preferred`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# soft, weight 1 to 100`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`weight`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#B5CEA8`,\"--shiki-dark\":`#B5CEA8`},children:`50`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` term`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: {`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`key`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`zone`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`op`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`In`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`values`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`eu-1`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`]}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`together`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# prefer nodes already running matching apps`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`match`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: [{`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`key`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`name`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`op`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`In`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`values`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`cache`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`]}]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` weight`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#B5CEA8`,\"--shiki-dark\":`#B5CEA8`},children:`20`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`apart`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# weight 0 means required: never share a zone with db`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`match`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: [{`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`key`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`name`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`op`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`In`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`values`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`db`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`]}]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` topology`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`zone`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` nodes`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` labels`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` \u003c`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`node-i`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`d`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`> `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`disk=ssd`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` zone=eu-1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` nodes`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` placement`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` app`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` web`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` --affinity-file`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` affinity.yaml`})]}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Operators are `,_jsx(_components.code,{children:`In`}),`, `,_jsx(_components.code,{children:`NotIn`}),`, `,_jsx(_components.code,{children:`Exists`}),` and `,_jsx(_components.code,{children:`DoesNotExist`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Apps are matched by their labels and by `,_jsx(_components.code,{children:`name=\u003capp name>`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`topology`}),` is `,_jsx(_components.code,{children:`node`}),` (the default) or a node label key such as `,_jsx(_components.code,{children:`zone`}),` or `,_jsx(_components.code,{children:`region`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The term count per app is capped by `,_jsx(_components.code,{children:`APP_PLACEMENT_AFFINITY_MAX_TERMS`}),` (8 unless set). Invalid rules return `,_jsx(_components.code,{children:`400`}),` with the reason.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The same fields go under a service in `,_jsx(_components.code,{children:`app.yaml`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`services`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` web`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` tolerations`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` - {`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`key`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`dedicated`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`value`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`gpu`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`effect`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`NoSchedule`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` affinity`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` node_required`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` - {`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`key`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`disk`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`op`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`In`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`values`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`ssd`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`]}`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`API: `,_jsx(_components.code,{children:`PUT /api/v1/apps/{name}/placement`}),` takes `,_jsx(_components.code,{children:`node_selector`}),`, `,_jsx(_components.code,{children:`tolerations`}),` and `,_jsx(_components.code,{children:`affinity`}),` (databases take `,_jsx(_components.code,{children:`node_selector`}),`). Leaving `,_jsx(_components.code,{children:`tolerations`}),` or `,_jsx(_components.code,{children:`affinity`}),` out of the body keeps what is stored.`]}),`\n`,_jsx(Heading,{level:`2`,id:`score-mode-spread-or-bin-pack`,children:`Score mode: spread or bin-pack`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` settings`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` runtime`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` get`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` placement.score_mode`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` settings`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` runtime`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` set`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` placement.score_mode`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` binpack`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` settings`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` runtime`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` set`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` placement.score_mode`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` spread`})]}),`\n`]})})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`spread`}),` (default) picks the node that keeps the most headroom.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`binpack`}),` fills the fullest node that still fits, which leaves whole nodes free.`]}),`\n`,_jsxs(_components.li,{children:[`Failure-domain spread is applied before the score mode. When any node carries a zone label, a new replica goes to the zone with the fewest replicas first, and `,_jsx(_components.code,{children:`binpack`}),` only orders the nodes inside that zone. The decision output says so (“spread across failure domains”). Remove the zone labels to get pure bin-packing.`]}),`\n`,_jsxs(_components.li,{children:[`The setting is read on every placement and needs no restart. `,_jsx(_components.code,{children:`APP_PLACEMENT_SCORE_MODE`}),` only seeds the default. The dashboard has it under Settings, Runtime.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`see-why-a-node-was-picked-or-skipped`,children:`See why a node was picked or skipped`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`levelrail-cli`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` nodes`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` placement`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` app`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` web`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The output lists the eligible nodes, every rejected node with its reason (taint, affinity, selector, capacity) and the stored tolerations. `,_jsx(_components.code,{children:`GET /api/v1/apps/{name}/placement/decision`}),` returns the recorded placement decision for the app.`]}),`\n`,_jsx(Heading,{level:`2`,id:`not-built-yet`,children:`Not built yet`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`One instance per matching node (`,_jsx(_components.code,{children:`workload: per-node`}),` in `,_jsx(_components.code,{children:`app.yaml`}),`) is accepted by validation but not scheduled yet.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`NoExecute`}),` does not evict running workloads by itself. A drain does.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"Node scheduling: taints, tolerations, affinity and score mode","tag":"Beta","description":"Keep workloads off a node with taints, let chosen apps onto it with tolerations, place apps near or away from each other with affinity, and pick spread or bin-pack scoring live.","og:url":"https://docs.levelrail.com/node-scheduling","href":"/node-scheduling"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"How a node is chosen","slug":"how-a-node-is-chosen","depth":2,"children":[]},{"title":"Taints: reserve a node","slug":"taints-reserve-a-node","depth":2,"children":[]},{"title":"Tolerations: let an app onto a tainted node","slug":"tolerations-let-an-app-onto-a-tainted-node","depth":2,"children":[]},{"title":"Affinity: near, away, or on a kind of node","slug":"affinity-near-away-or-on-a-kind-of-node","depth":2,"children":[]},{"title":"Score mode: spread or bin-pack","slug":"score-mode-spread-or-bin-pack","depth":2,"children":[]},{"title":"See why a node was picked or skipped","slug":"see-why-a-node-was-picked-or-skipped","depth":2,"children":[]},{"title":"Not built yet","slug":"not-built-yet","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/levelrail/34332f0f5f6180ce/public/deploy.js"],"subdomain":"levelrail","siteName":"Levelrail","title":"Node scheduling: taints, tolerations, affinity and score mode - Levelrail","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-08T07:03:52.613Z","gitLastModified":"2026-11-08T07:03:02.000Z","originalFileLocation":"node-scheduling.md"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Keep workloads off a node with taints, let chosen apps onto it with tolerations, place apps near or away from each other with affinity, and pick spread or bin-pack scoring live.\">\u003cmeta data-mint-head name=\"keywords\" content=\"self-hosted PaaS, Coolify alternative, Docker deployment platform, self-hosted deploys, Levelrail\">\u003cmeta data-mint-head name=\"application-name\" content=\"Levelrail\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Node scheduling: taints, tolerations, affinity and score mode - Levelrail\">\u003cmeta data-mint-head property=\"og:description\" content=\"Keep workloads off a node with taints, let chosen apps onto it with tolerations, place apps near or away from each other with affinity, and pick spread or bin-pack scoring live.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Levelrail Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.levelrail.com/node-scheduling\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.levelrail.com/public/og/default.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Node scheduling: taints, tolerations, affinity and score mode - Levelrail\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Keep workloads off a node with taints, let chosen apps onto it with tolerations, place apps near or away from each other with affinity, and pick spread or bin-pack scoring live.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.levelrail.com/public/og/default.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/levelrail/sfnZeja47AHfK8h4/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Levelrail\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#107292\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.levelrail.com/node-scheduling\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/node-scheduling.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.levelrail.com/#organization\",\"name\":\"Levelrail\",\"url\":\"https://docs.levelrail.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/levelrail/56HjW70mOjUmjIrm/assets/brand/wordmark-light.svg?fit=max\u0026auto=format\u0026n=56HjW70mOjUmjIrm\u0026q=85\u0026s=cbe02b3c3d17b11f9cc5a18551a30782\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.levelrail.com#website\",\"name\":\"Levelrail\",\"url\":\"https://docs.levelrail.com\",\"publisher\":{\"@id\":\"https://docs.levelrail.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.levelrail.com/node-scheduling#webpage\",\"url\":\"https://docs.levelrail.com/node-scheduling\",\"name\":\"Node scheduling: taints, tolerations, affinity and score mode\",\"description\":\"Keep workloads off a node with taints, let chosen apps onto it with tolerations, place apps near or away from each other with affinity, and pick spread or bin-pack scoring live.\",\"dateModified\":\"2026-11-08T07:03:02.000Z\",\"isPartOf\":{\"@id\":\"https://docs.levelrail.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.levelrail.com/node-scheduling#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.levelrail.com/node-scheduling#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Networking and multi-node\",\"item\":\"https://docs.levelrail.com/domains-and-ingress\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node scheduling: taints, tolerations, affinity and score mode\",\"item\":\"https://docs.levelrail.com/node-scheduling\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.levelrail.com/node-scheduling#article\",\"headline\":\"Node scheduling: taints, tolerations, affinity and score mode\",\"name\":\"Node scheduling: taints, tolerations, affinity and score mode\",\"description\":\"Keep workloads off a node with taints, let chosen apps onto it with tolerations, place apps near or away from each other with affinity, and pick spread or bin-pack scoring live.\",\"url\":\"https://docs.levelrail.com/node-scheduling\",\"mainEntityOfPage\":{\"@id\":\"https://docs.levelrail.com/node-scheduling#webpage\"},\"image\":\"https://docs.levelrail.com/public/og/default.png\",\"dateModified\":\"2026-11-08T07:03:02.000Z\",\"publisher\":{\"@id\":\"https://docs.levelrail.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.levelrail.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Levelrail\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Levelrail","nav":{"global":null,"tabs":[{"tab":"Get started","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/rocket-launch.svg","pages":[{"title":"Get started","href":""}]},{"tab":"How-to guides","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/book-open.svg","groups":[{"group":"Essentials","pages":[{"title":"Troubleshooting","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/lifebuoy.svg","sidebarTitle":"Troubleshooting","href":"/troubleshooting"},{"title":"Doctor","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/lifebuoy.svg","sidebarTitle":"Doctor","href":"/doctor"},{"title":"Doctor and import from the command line","sidebarTitle":"Doctor and import CLI","href":"/doctor-and-import"},{"title":"Email notifications","href":"/email-notifications"},{"title":"Email templates and messages","href":"/email-templates"},{"title":"Alert inbox","href":"/alert-inbox"},{"title":"Event webhooks","href":"/event-webhooks"},{"title":"Off-host heartbeat","href":"/heartbeat"},{"title":"Attention center","href":"/attention-center"}]},{"group":"Deploying","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/cloud-arrow-up.svg","pages":[{"title":"Deploying and managing apps","sidebarTitle":"Deploying apps","href":"/deploying-apps"},{"title":"Deploy from your computer","sidebarTitle":"Deploy from CLI","href":"/deploy-from-cli"},{"title":"Drop deploy for static sites","sidebarTitle":"Drop deploy","href":"/drop-deploy"},{"title":"Compose apps","href":"/compose-apps"},{"title":"App files","href":"/app-files"},{"title":"UDP published ports","href":"/udp-ports"},{"title":"New app wizard","href":"/new-app-wizard"},{"title":"Importing apps","href":"/importing-apps"},{"title":"Static pages","sidebarTitle":"Pages","href":"/pages"},{"title":"Static site routing rules","sidebarTitle":"Static routing","href":"/static-routing"},{"title":"Deploy safety","href":"/deploy-safety"},{"title":"Publish lock","href":"/publish-lock"},{"title":"Deploy failures","href":"/deploy-failures"},{"title":"Status reasons","href":"/status-reasons"},{"title":"Deploying through git host outages","href":"/git-host-outages"},{"title":"Deploy trace","href":"/deploy-trace"},{"title":"Deploy event timeline","href":"/deploy-event-timeline"},{"title":"Build performance","href":"/build-performance"},{"title":"Build center","href":"/build-center"},{"title":"Scheduled deploys","href":"/scheduled-deploys"},{"title":"Pull request comment commands","href":"/pr-comment-commands"},{"title":"Scheduled jobs","href":"/scheduled-jobs"},{"title":"Scheduled and background functions","href":"/scheduled-functions"},{"title":"Jobs","href":"/jobs"},{"title":"Image auto-update","href":"/image-auto-update"},{"title":"Build hooks","href":"/build-hooks"},{"title":"Sleep when idle","href":"/sleep-when-idle"},{"title":"Functions","href":"/functions"},{"title":"Canary deploys","href":"/canary-deploys"},{"title":"Split testing","href":"/split-testing"},{"title":"Deployments page","href":"/deployments-page"},{"title":"Images","href":"/images"},{"title":"Deploy previews","href":"/deploy-previews"},{"title":"Framework presets","href":"/frameworks"},{"title":"Deploy a Next.js app","sidebarTitle":"Next.js","href":"/nextjs"},{"title":"Deploy URLs","href":"/deploy-urls"},{"title":"Deploy links and badge","href":"/deploy-link"},{"title":"Deploy timeline","href":"/deploy-timeline"},{"title":"Preview environments per pull request","sidebarTitle":"Preview environments","href":"/previews"},{"title":"Chat-interactive deploy approvals","sidebarTitle":"Chat approvals","href":"/chat-deploy-approvals"},{"title":"Supply chain visibility","href":"/supply-chain"},{"title":"Secret scanning","href":"/secret-scanning"},{"title":"Deploy status badge","href":"/deploy-status-badge"},{"title":"Dashboard screenshots","href":"/screenshots"},{"title":"Running Levelrail in Docker","href":"/docker"},{"title":"Zero-downtime deploys with Docker: readiness-gated cutover and rollback","href":"/zero-downtime-deploys"},{"title":"Rollout control","href":"/rollout-control"},{"title":"Preview environments","href":"/preview-environments"},{"title":"Deploy contexts: env and build settings per kind of deploy","href":"/deploy-contexts"}]},{"group":"Networking and multi-node","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/globe-hemisphere-west.svg","pages":[{"title":"Domains and ingress","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/globe-hemisphere-west.svg","sidebarTitle":"Add a domain and HTTPS","href":"/domains-and-ingress"},{"title":"Standalone domains","href":"/standalone-domains"},{"title":"Domain setup stepper","href":"/domains"},{"title":"Dynamic DNS","href":"/dynamic-dns"},{"title":"DNS zones and records","href":"/dns"},{"title":"DNS zones and nameserver delegation","href":"/dns-zones"},{"title":"Mail DNS","tag":"Experimental","href":"/mail-dns"},{"title":"Mail server template","tag":"Experimental","href":"/mail-template"},{"title":"Mailboxes, aliases and the mail queue","tag":"Experimental","href":"/mail-mailboxes"},{"title":"Mail backup and restore","href":"/mail-backup"},{"title":"Mail storage","href":"/mail-storage"},{"title":"Diagnose a domain","href":"/domain-diagnosis"},{"title":"Domain traffic controls","href":"/domain-traffic-controls"},{"title":"Ingress abuse defense","href":"/abuse-defense"},{"title":"CDN and caching","href":"/cdn-and-caching"},{"title":"Forms","tag":"Beta","href":"/forms"},{"title":"Firewall","href":"/firewall"},{"title":"Verifying real ACME issuance against a live domain","href":"/acme-verification-runbook"},{"title":"Multi-node: adding and managing nodes","tag":"Beta","href":"/multi-node"},{"title":"Multi-node quickstart","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/hard-drives.svg","tag":"Beta","sidebarTitle":"Add a second server","href":"/multi-node-quickstart"},{"title":"Add a node anywhere","tag":"Beta","sidebarTitle":"Add a node anywhere","href":"/add-node-anywhere"},{"title":"Run Levelrail on home hardware","sidebarTitle":"Home hardware","href":"/home-hardware"},{"title":"Resource-aware placement","tag":"Beta","description":"How new apps and databases are placed on nodes with room for them, how to read the \"why here\" explanation, and how to set the overcommit policy.","href":"/resource-aware-placement"},{"title":"Node scheduling: taints, tolerations, affinity and score mode","tag":"Beta","href":"/node-scheduling"},{"title":"Autoscaling","tag":"Beta","description":"Scale an app between a minimum and a maximum replica count on CPU, memory or request load, with cooldowns and a recorded reason for each decision.","href":"/autoscaling"},{"title":"Node provisioning","href":"/node-provisioning"},{"title":"Multi-cloud provisioning quickstart","href":"/multi-cloud-provisioning"},{"title":"Network topology view","href":"/network-topology"},{"title":"Private app tunnel","href":"/app-tunnel"},{"title":"Project topology graph","href":"/service-topology-graph"},{"title":"Canvas","href":"/canvas"},{"title":"Build node routing","href":"/build-node-routing"}]},{"group":"Databases and storage","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/database.svg","pages":[{"title":"Managing databases","href":"/managing-databases"},{"title":"Managed databases from the command line","sidebarTitle":"Managed databases","href":"/managed-databases"},{"title":"Postgres connection pooler","href":"/postgres-pooler"},{"title":"Database upgrades","href":"/database-upgrades"},{"title":"Database version catalog","href":"/database-version-catalog"},{"title":"External databases","href":"/external-databases"},{"title":"Connecting apps to databases","href":"/connecting-apps-to-databases"},{"title":"Backup targets, registry credentials, and app volume backups","sidebarTitle":"Backups and storage","href":"/backups-and-storage"},{"title":"Backup copies","href":"/backup-copies"},{"title":"Volume files","href":"/volume-files"},{"title":"Prove your backups work","href":"/prove-your-backups-work"},{"title":"Object storage","href":"/object-storage"},{"title":"Network shares","href":"/network-shares"},{"title":"Log explorer","href":"/log-explorer"},{"title":"Custom dashboards","href":"/custom-dashboards"},{"title":"Tracing","href":"/tracing"},{"title":"Error tracking","href":"/error-tracking"},{"title":"Loki-compatible log API","href":"/loki-api"},{"title":"Log pipelines","href":"/log-pipelines"},{"title":"Log volume budgets","href":"/log-budgets"},{"title":"Data export","href":"/data-export"},{"title":"Traffic export","href":"/traffic-export"},{"title":"Audit event schema","href":"/audit-event-schema"},{"title":"Audit log","href":"/audit-log"},{"title":"Control plane backup and restore","sidebarTitle":"Control plane backup","href":"/control-plane-backup"},{"title":"Whole-server recovery","href":"/whole-server-recovery"},{"title":"Archives","href":"/archives"},{"title":"Disaster recovery","href":"/disaster-recovery"},{"title":"Control plane recovery","href":"/control-plane-recovery"},{"title":"Upgrade safely","href":"/upgrade-safely"},{"title":"Database access and network","href":"/database-access"},{"title":"Private networks and allow rules","href":"/private-networks"},{"title":"Database explorer and fleet overview","href":"/database-explorer"},{"title":"Database viewer","href":"/database-viewer"}]},{"group":"CI/CD and automation","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/git-branch.svg","pages":[{"title":"Deploying from GitHub Actions","href":"/github-actions"},{"title":"Use any CI","href":"/use-any-ci"},{"title":"Pipelines","href":"/pipelines"},{"title":"Pipelines: OIDC federation","href":"/pipelines-oidc"},{"title":"Git integrations","href":"/git-integrations"},{"title":"Azure DevOps","href":"/azure-devops"},{"title":"Git reliability","href":"/git-reliability"},{"title":"Wait for CI before deploying","href":"/ci-gate"},{"title":"Deploy with git push","href":"/git-push-deploy"},{"title":"Import a repository","sidebarTitle":"Import a repo","href":"/import-a-repo"},{"title":"Monorepos","href":"/monorepos"}]},{"group":"Security and access","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/shield-check.svg","pages":[{"title":"Sign-in engine","href":"/auth-engine"},{"title":"Host firewall","href":"/host-firewall"},{"title":"Exposure audit","href":"/exposure-audit"},{"title":"Security center","href":"/security-center"},{"title":"Compliance evidence","href":"/compliance-evidence"},{"title":"Emergency access","href":"/emergency-access"},{"title":"Master key rotation","href":"/master-key-rotation"},{"title":"Secret rotation policies","href":"/secret-rotation"},{"title":"Vault and OpenBao secret references","href":"/vault-secret-references"},{"title":"Your account","href":"/account"},{"title":"Access control","href":"/access-control"},{"title":"Labels and namespaces","href":"/labels"},{"title":"Teams and roles","href":"/teams-and-roles"},{"title":"Team and project quotas","href":"/team-and-project-quotas"},{"title":"Environments","href":"/environments"},{"title":"Promotions and release notes","href":"/promotions-and-releases"},{"title":"Identity and access: users, roles, and IAM policies","href":"/identity-and-access"},{"title":"SAML single sign-on","href":"/sso-saml"},{"title":"OAuth and OIDC single sign-on","href":"/sso-oidc"},{"title":"SCIM provisioning","href":"/scim"},{"title":"Session policy","href":"/session-policy"},{"title":"Projects, organizations, and environments","href":"/projects-and-organizations"}]},{"group":"Scale and operations","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/chart-line-up.svg","pages":[{"title":"Managing apps at scale","href":"/managing-apps-at-scale"},{"title":"Tags","href":"/tags"},{"title":"Resource console","href":"/resource-console"},{"title":"Command palette","href":"/command-palette"},{"title":"Cost estimate","href":"/cost-estimate"},{"title":"Usage and cost","href":"/usage-and-cost"},{"title":"Cost explorer and budgets","href":"/cost-explorer"},{"title":"Spend caps","href":"/spend-caps"},{"title":"Integrations","href":"/integrations"},{"title":"Cloud integrations","href":"/cloud-integrations"},{"title":"Rolling back the control plane","href":"/rollback"},{"title":"Pre-deploy database snapshots","href":"/predeploy-snapshot"},{"title":"Resilience: what survives a control plane crash","href":"/resilience"},{"title":"Resilience, in short","href":"/resilience-summary"},{"title":"Chaos test coverage","href":"/chaos-coverage"},{"title":"Observability: metrics, logs, and alerts","href":"/observability"},{"title":"Traffic observability: rate, errors and duration","href":"/traffic-observability"},{"title":"Public status page","href":"/status-page"},{"title":"Monitors","href":"/monitors"},{"title":"External monitoring","href":"/external-monitoring"},{"title":"Scheduled maintenance","href":"/scheduled-maintenance"},{"title":"Deploy policies","href":"/deploy-policies"},{"title":"What's new panel","href":"/whats-new-panel"}]},{"group":"AI and agents","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/sparkle.svg","pages":[{"title":"Working with AI agents","href":"/agents"},{"title":"AI control","href":"/ai-control"}]},{"group":"Templates and catalog","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/squares-four.svg","pages":[{"title":"Service template catalog","tag":"Beta","href":"/templates-and-registry"},{"title":"Private registries","href":"/private-registries"},{"title":"Template upgrades","href":"/template-upgrades"},{"title":"Template catalog","href":"/template-catalog"},{"title":"Deploy button","href":"/deploy-button"},{"title":"Template status","href":"/templates-status"},{"title":"Catalog index","href":"/catalog-index"},{"title":"Add a template","href":"/add-a-template"},{"title":"Arm64 compatibility","href":"/arm-compatibility"},{"title":"Starter kit templates","href":"/templates"}]},{"group":"Migrate","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/arrows-left-right.svg","pages":[{"title":"Migrate to Levelrail","sidebarTitle":"Migration overview","href":"/migrate-to-levelrail"},{"title":"Migration wizard","sidebarTitle":"Migration wizard","href":"/migration-wizard"},{"title":"Migrate from Coolify","sidebarTitle":"From Coolify","href":"/migrate-from-coolify"},{"title":"Coolify exit gap report","sidebarTitle":"Coolify exit gaps","href":"/coolify-exit-gap-report"},{"title":"Move a Coolify one-click service to a Compose app","sidebarTitle":"Service to Compose","href":"/coolify-service-to-compose"},{"title":"Migrate from Dokploy","sidebarTitle":"From Dokploy","href":"/migrate-from-dokploy"},{"title":"Migrate from CapRover","sidebarTitle":"From CapRover","href":"/migrate-from-caprover"},{"title":"Migrate from Dokku","sidebarTitle":"From Dokku","href":"/migrate-from-dokku"},{"title":"Migrate from Docker Compose","sidebarTitle":"From Docker Compose","href":"/migrate-from-docker-compose"},{"title":"Import Kubernetes manifests","href":"/import-kubernetes"},{"title":"Migration reference","sidebarTitle":"Reference","href":"/migration-reference"},{"title":"Migrating from Coolify, Dokploy, or CapRover","sidebarTitle":"Moved: migration guides","href":"/migrating-from-coolify-dokploy-and-caprover"},{"title":"Migration agent threat model","sidebarTitle":"Migration agent threat model","href":"/migration-agent-threat-model"},{"title":"Migrate on the same server","href":"/migrate-same-server"},{"title":"Move a domain with no downtime","href":"/move-a-domain-with-no-downtime"},{"title":"Migrate over SSH","href":"/migrate-over-ssh"},{"title":"Migrating a Next.js app from Vercel","href":"/migrating-from-vercel"},{"title":"Migrating a static site from Netlify","href":"/migrating-from-netlify"},{"title":"Migrating a service from Cloud Run","href":"/migrating-from-cloud-run"}]},{"group":"Beta and experimental","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/flask.svg","pages":[{"title":"AI assistant integration: levelrail-mcp","tag":"Beta","href":"/ai-assistant"},{"title":"MCP tools, token budget and write mode","tag":"Beta","href":"/mcp"},{"title":"Connect an AI assistant safely","href":"/mcp-safe-setup"},{"title":"MCP recipes","tag":"Beta","href":"/mcp-recipes"},{"title":"In-app AI assistant chat","tag":"Experimental","href":"/ai-assistant-chat"},{"title":"AI models","tag":"Experimental","href":"/ai-models"},{"title":"Load balancing across replicas","tag":"Experimental","href":"/load-balancing"},{"title":"Platform as code","tag":"Experimental","href":"/platform-as-code"},{"title":"Leave anytime","sidebarTitle":"Leave anytime","href":"/leave-anytime"},{"title":"Stacks and GitOps","tag":"Experimental","href":"/stacks"},{"title":"Resource advisor (beta)","tag":"Beta","href":"/resource-advisor"},{"title":"CLI console (beta)","tag":"Beta","href":"/cli-console"},{"title":"Feature flags","href":"/feature-flags"},{"title":"Log archive","tag":"Beta","href":"/log-archive"},{"title":"Automatic cleanup","tag":"Beta","href":"/janitor"},{"title":"Cleanup center","tag":"Beta","href":"/cleanup-center"},{"title":"Unified search","tag":"Beta","href":"/search"}]}]},{"tab":"Reference","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/code.svg","pages":[{"title":"Reference","href":"/app-spec-reference"}]},{"tab":"Concepts","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/lightbulb.svg","pages":[{"title":"Concepts","href":"/product-tour"}]},{"tab":"Self-host gallery","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/squares-four.svg","pages":[{"title":"Self-host gallery","href":"/self-host"}]},{"tab":"Appendix","icon":"https://mintlify.s3.us-west-1.amazonaws.com/levelrail/assets/icons/books.svg","pages":[{"title":"Appendix","href":"/roadmap"}]}]},"basePath":"","title":"Node scheduling: taints, tolerations, affinity and score mode - Levelrail","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":[],"chunks":[]}