How Porter manages automated Kubernetes version upgrades for your cluster, including the shared responsibility model and prerequisites
Keeping your Kubernetes clusters up-to-date is essential for ensuring security, stability, and access to the latest features built by the wider Kubernetes community as well as the underlying public cloud. To that end, we take care of managed Kubernetes upgrades for all clusters provisioned through our platform. Our automated upgrade process ensures your clusters remain current without disrupting your workloads, so you can focus on building and deploying your applications while we handle the complexities of cluster maintenance.
We’ve endeavoured to build a world-class cluster management system which is able to manage and upgrade customer infrastructure without causing disruption to customer workloads. To that end, we’ve defined a shared responsibility model which maps out the roles played by Porter’s engineering/SRE teams as well as customers to ensure the best possible experience with upgrades.
If your app doesn’t have a minimum of three replicas / doesn’t use healthchecks or graceful shutdowns, then an upgrade can cause significant disruption. During an upgrade, your cluster’s nodes are refreshed and workloads are gradually rescheduled and the absence of these prerequisites will lead to a scenario where your cluster may not have ready replicas to serve production traffic.
More documentation around zero-downtime deployments may be found here.
Testing each upgrade release extensively to ensure new versions and system components work together cohesively.
Executing upgrades in a blue-green deployment fashion, where older components and nodes are gradually replaced with newer versions without compromising customer workload uptime.
Maintaining a constant stream of communication around upgrade timelines and statuses.
Kubernetes follows a release cycle where there are - approximately - three minor version releases a year. Every release is followed by a period where public clouds integrate the new version into their managed Kubernetes offerings and run tests to ensure compatibility with the underlying cloud. Our upgrade calendar is thus dependent on both release cycles. To account for that, we carry out cluster upgrades twice a year, where we “leapfrog” over versions to ensure customer clusters are running the latest stable version of Kubernetes. These are typically carried out once towards the end of Q1/beginning of Q2 and then later towards the end of Q3.
When a new version of upstream Kubernetes is released, we closely track the corresponding release on public clouds in conjunction with the wider community as well as our public cloud partners (AWS, Google Cloud, Azure).
Whilst waiting for public clouds to launch the new version on their managed versions, we start conducting initial compatibility tests with upstream Kubernetes against our systems, to catch any potential issues.
Once public clouds have announced support for the new version, more extensive tests are conducted around the following themes:a. System components responsible for managing your cluster’s functionality - Ingress, certificate management, autoscaling, telemetry and so on. All system components are upgraded to the latest stable versions from their upstream repos, and validated against both the current stable version and the new version of Kubernetes.b. App templates powering customer workloads for web, worker and job services.c. Additional addons - these include telemetry addons like Datadog/New Relic.
After our tests are successful, we announce a timeline for upgrades over our comms channels. At this point, while we typically announce a window during low-traffic hours when upgrades are conducted, customers have the option of scheduling a specific slot.
When a cluster is upgraded, we upgrade system components, all app templates, the managed cluster control plane as well as all nodegroups. While this operation is meant to be non-disruptive, there are certain prerequisites on the customers’ end to ensure zero downtime (see the section below for more details).
Cluster nodes are typically a shared responsibility between Porter and the underlying cloud provider. Patches usually fall into two categories:
Regular machine image patches issued by the underlying cloud provider. These are typically applied automatically by the cloud provider every few weeks, although this can be manually overriden by running a simple update on your cluster; at that point if a fresh machine image is present in the underlying cloud provider’s image stores, every node will be refreshed.
One-off patches pushed by Porter, in case of high / critical CVEs. In these cases, the underlying cloud provider releases a patched machine image, and Porter ensures it’s deployed to every cluster.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Porter","colors":{"primary":"#5B63B2","light":"#AAB6FF","dark":"#3C4189"},"logo":{"light":"https://mintcdn.com/porter/CtQBkRh1tKAcCdoJ/logo/light.png?fit=max\u0026auto=format\u0026n=CtQBkRh1tKAcCdoJ\u0026q=85\u0026s=5de59d319dc29230f06a5cc0d54518de","dark":"https://mintcdn.com/porter/CtQBkRh1tKAcCdoJ/logo/dark.png?fit=max\u0026auto=format\u0026n=CtQBkRh1tKAcCdoJ\u0026q=85\u0026s=20a106f87d62ff1c1d1cba53466fce37","href":"https://porter.run"},"favicon":"https://mintcdn.com/porter/hk4qFrcZwgdgi3c0/favicon.ico?fit=max\u0026auto=format\u0026n=hk4qFrcZwgdgi3c0\u0026q=85\u0026s=3be3d80413884bb3dc66089aaa7eb018","appearance":{"default":"dark"},"navbar":{"primary":{"type":"button","label":"Get Started","href":"https://porter.run"}},"footer":{"socials":{"twitter":"https://twitter.com/porterdotrun","github":"https://github.com/porter-dev","linkedin":"https://www.linkedin.com/company/porterrun"}},"seo":{"metatags":{"description":"Documentation for Porter, the platform as a service that deploys and manages applications in your own AWS, GCP, or Azure account."},"organization":{"id":"https://porter.run/#organization","name":"Porter","legalName":"Porter Technologies Inc","url":"https://porter.run","logo":"https://docs.porter.run/logo/light.png","sameAs":["https://github.com/porter-dev","https://www.linkedin.com/company/porterrun","https://www.ycombinator.com/companies/porter"]}},"fonts":{"heading":{"family":"Riforma LL","weight":500,"source":"fonts/RiformaLLWeb-Medium.woff2","format":"woff2"},"body":{"family":"Riforma LL","source":"fonts/RiformaLLWeb-Regular.woff2","format":"woff2"}},"integrations":{"gtm":{"tagId":"GTM-P8D92VJ"},"intercom":{"appId":"gq56g49i"}},"errors":{"404":{"redirect":false,"title":"Page not found","description":"This page does not exist. Start from the [documentation home](/), the [machine-readable index](/llms.txt), the [sitemap](https://docs.porter.run/sitemap.xml), or the [introduction](/getting-started/introduction)."}},"markdown":{"instructions":"When helping a user operate an existing Porter project (deploying, updating, debugging, or inspecting applications and clusters) connect to [Porter's remote MCP server](https://mcp.porter.run) first and use its tools before falling back to the Porter CLI, `porter.yaml`, or dashboard workflows. If the Porter tools are not available in your session, `curl -fsSL https://agents.porter.run | sh` installs the CLI, registers the MCP server with your client, and installs Porter's skills; the client must be restarted afterward. If the user asks for the CLI, `porter apply`, configuration-as-code, or the dashboard, use that instead — a stated preference wins. Before inspecting or building a GitHub repository or calling any deployment tool, call `connect_github` with the repository. Proceed only when it returns `next_step: none`; otherwise, give the user the returned URL and stop. If the requested application or cluster workflow is not directly supported, inspect the relevant state with MCP tools before explaining the limitation or recommending a fallback. The server signs in through a browser using OAuth, so it cannot be used in headless environments such as CI pipelines; use the CLI or `porter.yaml` there."},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"porter","hasAudioNarration":false,"actualSubdomain":"porter","customDomains":["docs.porter.run"],"gitSource":{"type":"github","owner":"porter-dev","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aeeea06c526d2ff3f058005","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"Documentation","count":104},{"language":"default","tag":"Applications","count":35},{"language":"default","tag":"Command Line Interface (CLI)","count":14},{"language":"default","tag":"Sandboxes","count":14},{"language":"default","tag":"Command Reference","count":12},{"language":"default","tag":"Deploy","count":11},{"language":"default","tag":"Configuration as Code","count":9},{"language":"default","tag":"Security and Compliance","count":9},{"language":"default","tag":"Cloud Accounts","count":8},{"language":"default","tag":"Sandbox SDK","count":8}]},"assistantConfig":{},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"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":false},"customCss":[{"filePath":"style.css","content":"@font-face{font-family:\"Riforma LL\";font-style:normal;font-weight:400;font-display:swap;src:url(\"/fonts/RiformaLLWeb-Regular.woff2\") format(\"woff2\")}@font-face{font-family:\"Riforma LL\";font-style:normal;font-weight:500;font-display:swap;src:url(\"/fonts/RiformaLLWeb-Medium.woff2\") format(\"woff2\")}@font-face{font-family:\"Riforma LL\";font-style:normal;font-weight:600 700;font-display:swap;src:url(\"/fonts/RiformaLLWeb-Bold.woff2\") format(\"woff2\")}@font-face{font-family:\"Riforma Mono\";font-style:normal;font-weight:400;font-display:swap;src:url(\"/fonts/RiformaMonoLLWeb-Regular.woff2\") format(\"woff2\")}@font-face{font-family:\"Riforma Mono\";font-style:normal;font-weight:600 700;font-display:swap;src:url(\"/fonts/RiformaMonoLLWeb-Bold.woff2\") format(\"woff2\")}:root{--font-weight-bold: 500;--font-weight-semibold: 500;--font-family-mono-custom: \"Riforma Mono\"}strong,b,th{font-weight:500}a{font-weight:inherit}"}],"page":{"pagePath":"cloud-accounts/cluster-upgrades","slug":"/cloud-accounts/cluster-upgrades","pageMetadata":{"title":"Cluster upgrades","sidebarTitle":"Cluster Upgrades","description":"How Porter manages automated Kubernetes version upgrades for your cluster, including the shared responsibility model and prerequisites","href":"/cloud-accounts/cluster-upgrades"},"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: \"How Porter manages automated Kubernetes version upgrades for your cluster, including the shared responsibility model and prerequisites\"\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`,em:`em`,li:`li`,ol:`ol`,p:`p`,..._provideComponents(),...props.components},{Heading,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Keeping your Kubernetes clusters up-to-date is essential for ensuring security, stability, and access to the latest features built by the wider Kubernetes community as well as the underlying public cloud. To that end, we take care of managed Kubernetes upgrades for all clusters provisioned through our platform. Our automated upgrade process ensures your clusters remain current without disrupting your workloads, so you can focus on building and deploying your applications while we handle the complexities of cluster maintenance.`}),`\n`,_jsx(Heading,{level:`2`,id:`shared-responsibility-model`,children:`Shared Responsibility Model`}),`\n`,_jsx(_components.p,{children:`We’ve endeavoured to build a world-class cluster management system which is able to manage and upgrade customer infrastructure without causing disruption to customer workloads. To that end, we’ve defined a shared responsibility model which maps out the roles played by Porter’s engineering/SRE teams as well as customers to ensure the best possible experience with upgrades.`}),`\n`,_jsx(Heading,{level:`3`,id:`customers’-responsibilities`,children:`Customers’ responsibilities`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Ensuring all production workloads are running with `,_jsx(_components.a,{href:`/applications/configure/zero-downtime-deployments#high-availability-applications`,children:`a minimum of 3 replicas`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Adding `,_jsx(_components.a,{href:`/applications/configure/zero-downtime-deployments#health-checks`,children:`functional healthchecks`}),` to all production workloads.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`Adding `,_jsx(_components.a,{href:`/applications/configure/zero-downtime-deployments#graceful-shutdown`,children:`support for graceful shutdowns`}),` to all production workloads.`]}),`\n`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`If your app doesn’t have a minimum of three replicas / doesn’t use healthchecks or graceful shutdowns, then an upgrade can cause significant disruption. During an upgrade, your cluster’s nodes are refreshed and workloads are gradually rescheduled and the absence of these prerequisites will lead to a scenario where your cluster may not have ready replicas to serve production traffic.`})}),`\n`,_jsxs(_components.p,{children:[`More documentation around zero-downtime deployments may be found `,_jsx(_components.a,{href:`/applications/configure/zero-downtime-deployments`,children:`here`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`porter’s-responsibilities`,children:`Porter’s responsibilities`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Testing each upgrade release extensively to ensure new versions and system components work together cohesively.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Executing upgrades in a blue-green deployment fashion, where older components and nodes are gradually replaced with newer versions without compromising customer workload uptime.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Maintaining a constant stream of communication around upgrade timelines and statuses.`}),`\n`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`upgrade-calendar`,children:`Upgrade Calendar`}),`\n`,_jsxs(_components.p,{children:[`Kubernetes follows a release cycle where there are - approximately - three minor version releases a year. Every release is followed by a period where public clouds integrate the new version into their managed Kubernetes offerings and run tests to ensure compatibility with the underlying cloud. Our upgrade calendar is thus dependent on both release cycles. To account for that, we carry out cluster upgrades twice a year, where we “leapfrog” over versions to ensure customer clusters are running the `,_jsx(_components.em,{children:`latest stable`}),` version of Kubernetes. These are typically carried out once towards the end of Q1/beginning of Q2 and then later towards the end of Q3.`]}),`\n`,_jsx(Heading,{level:`2`,id:`upgrade-path`,children:`Upgrade Path`}),`\n`,_jsx(_components.p,{children:`When a new version of upstream Kubernetes is released, we closely track the corresponding release on public clouds in conjunction with the wider community as well as our public cloud partners (AWS, Google Cloud, Azure).`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Whilst waiting for public clouds to launch the new version on their managed versions, we start conducting initial compatibility tests with upstream Kubernetes against our systems, to catch any potential issues.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Once public clouds have announced support for the new version, more extensive tests are conducted around the following themes:`}),`\n`,_jsx(_components.p,{children:`a. System components responsible for managing your cluster’s functionality - Ingress, certificate management, autoscaling, telemetry and so on. All system components are upgraded to the latest stable versions from their upstream repos, and validated against both the current stable version and the new version of Kubernetes.`}),`\n`,_jsx(_components.p,{children:`b. App templates powering customer workloads for web, worker and job services.`}),`\n`,_jsx(_components.p,{children:`c. Additional addons - these include telemetry addons like Datadog/New Relic.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`After our tests are successful, we announce a timeline for upgrades over our comms channels. At this point, while we typically announce a window during low-traffic hours when upgrades are conducted, customers have the option of scheduling a specific slot.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`When a cluster is upgraded, we upgrade system components, all app templates, the managed cluster control plane as well as all nodegroups. While this operation is meant to be non-disruptive, there are certain prerequisites on the customers’ end to ensure zero downtime (see the section below for more details).`}),`\n`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`node-patches`,children:`Node Patches`}),`\n`,_jsx(_components.p,{children:`Cluster nodes are typically a shared responsibility between Porter and the underlying cloud provider. Patches usually fall into two categories:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Regular machine image patches issued by the underlying cloud provider. These are typically applied automatically by the cloud provider every few weeks, although this can be manually overriden by running a simple update on your cluster; at that point if a fresh machine image is present in the underlying cloud provider’s image stores, every node will be refreshed.`}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`One-off patches pushed by Porter, in case of high / critical CVEs. In these cases, the underlying cloud provider releases a patched machine image, and Porter ensures it’s deployed to every cluster.`}),`\n`]}),`\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":{"config":{},"pageMetadata":{"title":"Cluster upgrades","sidebarTitle":"Cluster Upgrades","description":"How Porter manages automated Kubernetes version upgrades for your cluster, including the shared responsibility model and prerequisites","href":"/cloud-accounts/cluster-upgrades"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Shared Responsibility Model","slug":"shared-responsibility-model","depth":2,"children":[{"title":"Customers’ responsibilities","slug":"customers’-responsibilities","depth":3,"children":[]},{"title":"Porter’s responsibilities","slug":"porter’s-responsibilities","depth":3,"children":[]}]},{"title":"Upgrade Calendar","slug":"upgrade-calendar","depth":2,"children":[]},{"title":"Upgrade Path","slug":"upgrade-path","depth":2,"children":[]},{"title":"Node Patches","slug":"node-patches","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"porter","siteName":"Porter","title":"Cluster upgrades - Porter","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-10T05:10:09.485Z","originalFileLocation":"cloud-accounts/cluster-upgrades.mdx"},"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=\"How Porter manages automated Kubernetes version upgrades for your cluster, including the shared responsibility model and prerequisites\">\u003cmeta data-mint-head name=\"application-name\" content=\"Porter\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/porter/NTslyGGtUJjpK6WT/_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/porter/NTslyGGtUJjpK6WT/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/porter/NTslyGGtUJjpK6WT/_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/porter/NTslyGGtUJjpK6WT/_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/porter/NTslyGGtUJjpK6WT/_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/porter/NTslyGGtUJjpK6WT/_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/porter/NTslyGGtUJjpK6WT/_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/porter/NTslyGGtUJjpK6WT/_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/porter/NTslyGGtUJjpK6WT/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Cluster upgrades - Porter\">\u003cmeta data-mint-head property=\"og:description\" content=\"How Porter manages automated Kubernetes version upgrades for your cluster, including the shared responsibility model and prerequisites\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Porter\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.porter.run/cloud-accounts/cluster-upgrades\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://porter.mintlify.site/_mintlify/api/og/v2?division=Cloud+Accounts\u0026amp;title=Cluster+upgrades\u0026amp;description=How+Porter+manages+automated+Kubernetes+version+upgrades+for+your+cluster%2C+including+the+shared+responsibility+model+and+prerequisites\u0026amp;theme=fec401156b3cb50700eb4d3f\u0026amp;signature=546c1592fbdf9d0024fec0a1cab225e06a190d3e30595b544ec60b7f6b97e802\">\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=\"Cluster upgrades - Porter\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How Porter manages automated Kubernetes version upgrades for your cluster, including the shared responsibility model and prerequisites\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://porter.mintlify.site/_mintlify/api/og/v2?division=Cloud+Accounts\u0026amp;title=Cluster+upgrades\u0026amp;description=How+Porter+manages+automated+Kubernetes+version+upgrades+for+your+cluster%2C+including+the+shared+responsibility+model+and+prerequisites\u0026amp;theme=fec401156b3cb50700eb4d3f\u0026amp;signature=546c1592fbdf9d0024fec0a1cab225e06a190d3e30595b544ec60b7f6b97e802\">\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/porter/NTslyGGtUJjpK6WT/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Porter\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#5B63B2\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.porter.run/cloud-accounts/cluster-upgrades\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/cloud-accounts/cluster-upgrades.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://porter.run/#organization\",\"name\":\"Porter\",\"legalName\":\"Porter Technologies Inc\",\"url\":\"https://porter.run\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://docs.porter.run/logo/light.png\"},\"sameAs\":[\"https://github.com/porter-dev\",\"https://www.linkedin.com/company/porterrun\",\"https://www.ycombinator.com/companies/porter\"]},{\"@type\":\"WebSite\",\"@id\":\"https://docs.porter.run#website\",\"name\":\"Porter\",\"url\":\"https://docs.porter.run\",\"publisher\":{\"@id\":\"https://porter.run/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.porter.run/cloud-accounts/cluster-upgrades#webpage\",\"url\":\"https://docs.porter.run/cloud-accounts/cluster-upgrades\",\"name\":\"Cluster upgrades\",\"description\":\"How Porter manages automated Kubernetes version upgrades for your cluster, including the shared responsibility model and prerequisites\",\"dateModified\":\"2026-07-10T05:10:09.485Z\",\"isPartOf\":{\"@id\":\"https://docs.porter.run#website\"},\"breadcrumb\":{\"@id\":\"https://docs.porter.run/cloud-accounts/cluster-upgrades#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.porter.run/cloud-accounts/cluster-upgrades#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Documentation\",\"item\":\"https://docs.porter.run/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cloud Accounts\",\"item\":\"https://docs.porter.run/cloud-accounts/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Cluster upgrades\",\"item\":\"https://docs.porter.run/cloud-accounts/cluster-upgrades\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.porter.run/cloud-accounts/cluster-upgrades#article\",\"headline\":\"Cluster upgrades\",\"name\":\"Cluster upgrades\",\"description\":\"How Porter manages automated Kubernetes version upgrades for your cluster, including the shared responsibility model and prerequisites\",\"url\":\"https://docs.porter.run/cloud-accounts/cluster-upgrades\",\"mainEntityOfPage\":{\"@id\":\"https://docs.porter.run/cloud-accounts/cluster-upgrades#webpage\"},\"dateModified\":\"2026-07-10T05:10:09.485Z\",\"publisher\":{\"@id\":\"https://porter.run/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.porter.run#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Porter\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Porter","nav":{"global":null,"groups":[{"group":"Documentation","pages":[{"title":"Overview","sidebarTitle":"Overview","href":"/index"},{"group":"Getting Started","pages":[{"title":"Introduction","href":"/getting-started/introduction"},{"title":"Concepts","href":"/getting-started/concepts"},{"title":"Quickstart","href":"/getting-started/quickstart"}]},{"group":"AI Agents \u0026 MCP","pages":[{"title":"MCP Server","sidebarTitle":"MCP Server","href":"/mcp/overview"},{"title":"MCP Server Tools","sidebarTitle":"Tools","href":"/mcp/tools"}]},{"group":"Cloud Accounts","pages":[{"title":"Cloud accounts","sidebarTitle":"Overview","href":"/cloud-accounts/overview"},{"title":"Connecting a cloud account","sidebarTitle":"Connecting a Cloud Account","href":"/cloud-accounts/connecting-a-cloud-account"},{"title":"Creating a cluster","sidebarTitle":"Creating a Cluster","href":"/cloud-accounts/creating-a-cluster"},{"title":"Node groups","sidebarTitle":"Node Groups","description":"Configure node groups with custom instance types, enable cost optimization with smart instance selection, and manage compute capacity","href":"/cloud-accounts/node-groups"},{"title":"Cluster upgrades","sidebarTitle":"Cluster Upgrades","href":"/cloud-accounts/cluster-upgrades"},{"title":"Advanced Cluster Settings","description":"Enable ECR scanning, GuardDuty, private clusters, KMS encryption, and custom networking options for your AWS, GCP, and Azure Porter clusters","href":"/cloud-accounts/advanced-cluster-settings"},{"title":"Cluster observability","sidebarTitle":"Cluster Observability","href":"/cloud-accounts/cluster-observability"},{"title":"Deleting a cluster","sidebarTitle":"Deleting a Cluster","href":"/cloud-accounts/deleting-a-cluster"}]},{"group":"Applications","pages":[{"group":"Deploy","pages":[{"title":"Deploying applications","href":"/applications/deploy/overview"},{"title":"Connect GitHub","href":"/applications/deploy/connect-github"},{"title":"Types of services","href":"/applications/deploy/types-of-services"},{"title":"Deploy from a GitHub repository","href":"/applications/deploy/deploy-from-github-repo"},{"title":"Deploy from a Docker registry","href":"/applications/deploy/deploy-from-docker-registry"},{"title":"Configuring application services","href":"/applications/deploy/configuring-application-services"},{"title":"Building your application","href":"/applications/deploy/builds"},{"title":"Deploy multiple apps from one build","href":"/applications/deploy/multiple-deploys-from-same-build"},{"title":"Pre-deploy jobs","href":"/applications/deploy/pre-deploy-jobs"},{"title":"Rollbacks","href":"/applications/deploy/rollbacks"},{"title":"Using other CI tools","href":"/applications/deploy/using-other-ci-tools"},{"title":"Cloning an application","hidden":true,"href":"/applications/deploy/duplicating-apps"}]},{"group":"Configuration as Code","pages":[{"title":"Configuration as code with porter.yaml","sidebarTitle":"Overview","href":"/applications/configuration-as-code/overview"},{"title":"porter.yaml reference","sidebarTitle":"Reference","href":"/applications/configuration-as-code/reference"},{"title":"Deploying multiple apps with porter.yaml","href":"/applications/configuration-as-code/addons-porter-yaml"},{"group":"Service Configuration","pages":[{"title":"Web services in porter.yaml","href":"/applications/configuration-as-code/services/web-service"},{"title":"Worker services in porter.yaml","href":"/applications/configuration-as-code/services/worker-service"},{"title":"Job services in porter.yaml","href":"/applications/configuration-as-code/services/job-service"},{"title":"Predeploy in porter.yaml","href":"/applications/configuration-as-code/services/predeploy"},{"title":"Autoscaling in porter.yaml","sidebarTitle":"Autoscaling","href":"/applications/configuration-as-code/services/autoscaling"},{"title":"Connections in porter.yaml","sidebarTitle":"Connections","href":"/applications/configuration-as-code/services/connections"}]}]},{"group":"Environment Groups","pages":[{"title":"Environment groups","href":"/applications/configure/environment-groups"}]},{"group":"Configure","pages":[{"title":"Basic configuration","href":"/applications/configure/basic-configuration"},{"title":"Autoscaling","href":"/applications/configure/autoscaling"},{"title":"Temporal autoscaling","href":"/applications/configure/temporal-autoscaling"},{"title":"HTTPS certificates and custom domains","href":"/applications/configure/custom-domains"},{"title":"Zero-downtime deployments","href":"/applications/configure/zero-downtime-deployments"},{"title":"Advanced networking","href":"/applications/configure/advanced-networking"},{"title":"Secure cloud access","href":"/applications/configure/secure-cloud-access"}]},{"group":"Observability","pages":[{"title":"Monitoring","href":"/applications/observability/monitoring"},{"title":"Logging","href":"/applications/observability/logging"},{"title":"Alerts","href":"/applications/observability/alerts"},{"title":"App metadata environment variables","href":"/applications/observability/app-metadata"},{"title":"Custom metrics autoscaling","href":"/applications/observability/custom-metrics-and-autoscaling"},{"title":"DevOps Agent","sidebarTitle":"DevOps Agent","href":"/applications/observability/devops-agent"}]},{"group":"Debug","pages":[{"title":"Common errors","href":"/applications/debug/common-errors"}]}]},{"group":"Sandboxes","pages":[{"title":"Sandboxes Overview","href":"/sandboxes/overview"},{"title":"Sandboxes Getting Started","href":"/sandboxes/getting-started"},{"title":"Volumes","href":"/sandboxes/volumes"},{"title":"Sandbox Networking","href":"/sandboxes/networking"},{"title":"Sandbox Capacity","href":"/sandboxes/capacity"},{"group":"Sandbox SDK","pages":[{"group":"Python","pages":[{"title":"Python Sandbox SDK quickstart","href":"/sandboxes/sdk/python/quickstart"},{"title":"Python Sandbox SDK volumes","href":"/sandboxes/sdk/python/volumes"},{"title":"Python Sandbox SDK reference","href":"/sandboxes/sdk/python/reference"},{"title":"Python Sandbox SDK errors","href":"/sandboxes/sdk/python/errors"}]},{"group":"TypeScript","pages":[{"title":"TypeScript Sandbox SDK quickstart","href":"/sandboxes/sdk/typescript/quickstart"},{"title":"TypeScript Sandbox SDK volumes","href":"/sandboxes/sdk/typescript/volumes"},{"title":"TypeScript Sandbox SDK reference","href":"/sandboxes/sdk/typescript/reference"},{"title":"TypeScript Sandbox SDK errors","href":"/sandboxes/sdk/typescript/errors"}]}]},{"title":"Sandboxes CLI","href":"/sandboxes/cli"}]},{"group":"Add-ons","pages":[{"title":"Add-ons","sidebarTitle":"Overview","href":"/addons/overview"},{"group":"QM","root":{"title":"QM","sidebarTitle":"QM","href":"/addons/qm"},"pages":[{"title":"QM Use Cases","sidebarTitle":"Use cases","href":"/addons/qm/use-cases"}]},{"title":"Datastores","sidebarTitle":"Datastores","href":"/addons/datastores"},{"title":"Custom Helm Charts","sidebarTitle":"Custom Helm Charts","href":"/addons/custom-helm-charts"},{"title":"Third-party observability","sidebarTitle":"Third-party Observability","href":"/addons/third-party-observability"},{"title":"Persistent storage","sidebarTitle":"Storage","href":"/addons/storage"}]},{"group":"Integrations","pages":[{"title":"Doppler","href":"/integrations/doppler"},{"title":"Infisical","href":"/integrations/infisical"}]},{"group":"Command Line Interface (CLI)","pages":[{"title":"CLI installation","href":"/cli/installation"},{"title":"CLI basic usage","href":"/cli/basic-usage"},{"group":"Command Reference","pages":[{"title":"porter apply","sidebarTitle":"porter apply","href":"/standard/cli/command-reference/porter-apply"},{"title":"porter auth","href":"/standard/cli/command-reference/porter-auth"},{"title":"porter clusters","href":"/standard/cli/command-reference/porter-clusters"},{"title":"porter cloud-accounts","href":"/standard/cli/command-reference/porter-cloud-accounts"},{"title":"porter config","href":"/standard/cli/command-reference/porter-config"},{"title":"porter project","href":"/standard/cli/command-reference/porter-project"},{"title":"porter app","href":"/standard/cli/command-reference/porter-app"},{"title":"porter job","href":"/standard/cli/command-reference/porter-job"},{"title":"porter datastore connect","href":"/standard/cli/command-reference/porter-datastore-connect"},{"title":"porter env","href":"/standard/cli/command-reference/porter-env"},{"title":"porter registry","href":"/standard/cli/command-reference/porter-registry"},{"title":"porter target","href":"/standard/cli/command-reference/porter-target"}]}]},{"group":"Preview Environments","pages":[{"title":"Preview environments","href":"/preview-environments/overview"},{"title":"Preview environment overrides","href":"/preview-environments/defining-overrides"},{"title":"Custom preview environment workflows","href":"/preview-environments/custom-workflows"}]},{"group":"Security and Compliance","pages":[{"title":"Role-based access control","href":"/security-and-compliance/role-based-access-control"},{"title":"Audit logs","href":"/security-and-compliance/audit-logs"},{"title":"AWS permissions required for Porter","sidebarTitle":"AWS Roles \u0026 Permissions","href":"/security-and-compliance/aws-permissions"},{"title":"Static egress IPs","href":"/security-and-compliance/static-egress-ip"},{"title":"Configuring AWS ALB on Porter","sidebarTitle":"Configuring AWS ALB","href":"/security-and-compliance/configuring-alb"},{"title":"Using Cloudflare DNS with Porter","sidebarTitle":"Cloudflare DNS","href":"/security-and-compliance/cloudflare-dns"},{"title":"SOC 2 and HIPAA compliance","href":"/security-and-compliance/soc2-hipaa"},{"title":"Porter IP ranges","sidebarTitle":"Porter's IP Ranges","href":"/security-and-compliance/porter-ip-ranges"},{"title":"Tailscale VPN","sidebarTitle":"Tailscale VPN","href":"/security-and-compliance/tailscale"}]},{"group":"Other Guides","pages":[{"title":"Running GPU workloads","href":"/other/gpu-workloads"},{"title":"Deleting dangling resources","href":"/other/deleting-dangling-resources"},{"title":"AWS VPC peering","sidebarTitle":"AWS VPC Peering","href":"/other/aws-vpc-peering"},{"title":"Kubernetes 101","href":"/other/kubernetes-101"},{"title":"Migrate from Heroku","href":"/other/migrate-from-heroku"}]},{"group":"Terms \u0026 Privacy","pages":[{"title":"Terms of service","href":"/terms-and-privacy/terms-of-service"},{"title":"Privacy policy","href":"/terms-and-privacy/privacy-policy"}]}]}]},"basePath":"","title":"Cluster upgrades - Porter","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":[],"chunks":[]}