Files
nexus/sreweekly/articles/534/06-managing-kubernetes-node-drains-with-pod-disruption-budgets.html

1942 lines
152 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><!-- Last Published: Thu Sep 24 2026 20:22:00 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="www.gremlin.com" data-wf-page="65a84319e1dd4b961519e9c6" data-wf-site="64a5291e7847ac04fe1531ad" lang="en-US" data-wf-collection="65a84319e1dd4b961519e961" data-wf-item-slug="managing-kubernetes-node-drains-with-pod-disruption-budgets"><head><meta charset="utf-8"/><link href="https://cdn.prod.website-files.com" rel="preconnect" crossorigin="anonymous"/><title>Managing Kubernetes node drains with Pod Disruption Budgets</title><meta content="A missing PodDisruptionBudget lets a routine node drain take your service offline. Learn how to set minAvailable, find gaps, and test that your PDB holds." name="description"/><meta content="Managing Kubernetes node drains with Pod Disruption Budgets" property="og:title"/><meta content="A missing PodDisruptionBudget lets a routine node drain take your service offline. Learn how to set minAvailable, find gaps, and test that your PDB holds." property="og:description"/><meta content="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8efb5f686b131da1610434_Linkedin.avif" property="og:image"/><meta content="Managing Kubernetes node drains with Pod Disruption Budgets" name="twitter:title"/><meta content="A missing PodDisruptionBudget lets a routine node drain take your service offline. Learn how to set minAvailable, find gaps, and test that your PDB holds." name="twitter:description"/><meta content="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8efb5f686b131da1610434_Linkedin.avif" name="twitter:image"/><meta property="og:type" content="website"/><meta content="summary_large_image" name="twitter:card"/><meta content="width=device-width, initial-scale=1" name="viewport"/><meta content="3TY0J0C2xRyc5irMQjPr7cO903_hqKgVYAyJ9pi5PAw" name="google-site-verification"/><link href="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/css/gremlin-x-flowninja.shared.2d9db0cae.min.css" rel="stylesheet" type="text/css" integrity="sha384-LZ2wyu/cyYWIEy/fMJVqFmEQrzu9jP0b5vd1YqkP75k9QBS9GDYgLMUBEp2KG4sb" crossorigin="anonymous"/><link href="https://fonts.googleapis.com" rel="preconnect"/><link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous"/><script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script><script type="text/javascript">WebFont.load({ google: { families: ["Inconsolata:400,700","PT Sans:400,400italic,700,700italic","Inter:100,200,300,400,500,600,700,800,900","Merriweather Sans:300,400,500,600,700"] }});</script><script src="https://use.typekit.net/fue3lxw.js" type="text/javascript"></script><script type="text/javascript">try{Typekit.load();}catch(e){}</script><script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script><link href="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6a315e8c629e5960bd06ad35_Gremlin-Favicon.png" rel="icon" type="image/png" sizes="32x32" media="(prefers-color-scheme: light)"/><link href="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6a315e8c629e5960bd06ad35_Gremlin-Favicon.png" rel="icon" type="image/png" sizes="32x32" media="(prefers-color-scheme: dark)"/><link href="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6a315e8c8a07d15517714ef1_Gremlin-Favicon.png" rel="icon" type="image/png" sizes="48x48"/><link href="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6a315e8c30848854c24efc6e_Gremlin-Favicon.png" rel="apple-touch-icon" sizes="180x180"/><link href="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6a315e8c6dd1f7a54e8b58c3_Gremlin-Favicon.png" rel="icon" type="image/png" sizes="192x192"/><link href="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6a315e8c104c9aec66dc48e9_Gremlin-Favicon.png" rel="icon" type="image/png" sizes="512x512"/><link href="https://www.gremlin.com/blog/managing-kubernetes-node-drains-with-pod-disruption-budgets" rel="canonical"/><script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Managing Kubernetes node drains with Pod Disruption Budgets",
"description": "A missing PodDisruptionBudget lets a routine node drain take your service offline. Learn how to set minAvailable, find gaps, and test that your PDB holds.",
"image": "https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8efb6546201600cab0e6e1_Blog%20Headers.avif",
"datePublished": "2026-09-04T20:22:35.749Z",
"dateModified": "2026-09-04T16:06:33.911Z",
"author": {
"@type": "Person",
"name": "Andre Newman",
"jobTitle": "Sr. Reliability Specialist",
"image": "https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/64edd73857be946ecb73f6ca_AndreNewman-Author2.avif",
"url": "/author/andre-newman"
},
"publisher": {
"@type": "Organization",
"name": "Gremlin",
"logo": {
"@type": "ImageObject",
"url": "https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/669a939943dcf0b320304fc9_Gremlin-Logo-Primary.svg"
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "/blog/managing-kubernetes-node-drains-with-pod-disruption-budgets"
},
"articleBody": "A missing PodDisruptionBudget lets a routine node drain take your service offline. Learn how to set minAvailable, find gaps, and test that your PDB holds.",
"keywords": "Features",
"articleSection": "Features",
"timeRequired": "8 min read",
"inLanguage": "en-US"
}
</script><link href="rss.xml" rel="alternate" title="RSS Feed" type="application/rss+xml"/><script>(function(w,i,g){w[g]=w[g]||[];if(typeof w[g].push=='function')w[g].push.apply(w[g],Array.isArray(i)?i:[i]);})(window,['G-NZ4G1TPB4T'],'google_tags_first_party');</script><script async="" src="/haqt6iy0yx2eNjRhNTI5MWU3ODQ3YWMwNGZlMTUzMWFk/36riEIY-B4IyzlmLxr3ke3O1gaE"></script><script type="text/javascript">window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('set', 'developer_id.dZGVlNj', true);gtag('set', 'developer_id.dYWYxNW', true);gtag('js', new Date());gtag('config', 'G-NZ4G1TPB4T');</script><script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"url": "https://www.gremlin.com/",
"logo": "https://res.cloudinary.com/gremlin/image/upload/v1667411425/AWS%20re:Invent%20GameDay%202022/Gremlin-Logo-Primary_2x.png",
"image": "https://res.cloudinary.com/gremlin/image/upload/v1667411425/AWS%20re:Invent%20GameDay%202022/Gremlin-Logo-Primary_2x.png",
"name": "Gremlin",
"description": "Gremlin helps engineering teams proactively manage reliability at scale.",
"email": "hello@gremlin.com",
"telephone": "+1-408-214-9885",
"address": {
"@type": "PostalAddress",
"streetAddress": "440 N Barranca Ave #3101",
"addressLocality": "Covina",
"addressCountry": "US",
"addressRegion": "CA",
"postalCode": "91723"
}
}
</script>
<!-- Algolia -->
<script src="https://cdn.jsdelivr.net/npm/@algolia/autocomplete-js"></script>
<script async src="https://cdn.jsdelivr.net/npm/preact/dist/preact.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/algoliasearch@4.24.0/dist/algoliasearch-lite.umd.js" integrity="sha256-b2n6oSgG4C1stMT/yc/ChGszs9EY/Mhs6oltEjQbFCQ=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/instantsearch.js@4.78.0/dist/instantsearch.production.min.js" integrity="sha256-TgmjIYtuCzPUUGlHWyK8k1xVPlvPHUAGU7gLz8jwIi0=" crossorigin="anonymous"></script>
<script>
const appId = 'TQAWOMSD2N';
const apiKey = '519937be570c720e9d09591cee9d20bf';
const searchClient = algoliasearch(appId, apiKey);
const indexName = (indexNames = 'webflow');
</script>
<!-- End Algolia -->
<!-- Finsweet modules -->
<script defer type="module" src="https://cdn.jsdelivr.net/npm/@finsweet/attributes@2/attributes.js" fs-socialshare fs-toc fs-list fs-queryparam></script>
<script defer src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-richtext@1/richtext.js"></script>
<!-- Global CSS Styles -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/themes/prism-tomorrow.min.css" integrity="sha512-vswe+cgvic/XBoF1OcM/TeJ2FW0OofqAVdCZiEYkd6dwGXthvkSFWOoGGJgS2CW70VK5dQM5Oh+7ne47s74VTg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<style>
/* Fixing Font Weight for Browsers */
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* Brand cards on gremlin.com/kit */
.brand-asset {
box-shadow: 0 15px 35px -15px rgba(47, 34, 86, 0.1);
}
/* Blog cards */
.blog-description {
display: -webkit-box;
-webkit-line-clamp: 5;
line-clamp: 5;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* Style Navattic popups */
.navattic-popup {
background: none;
background-color: transparent;
color: transparent;
border: none;
padding: 0;
}
/* Misc styles */
.comma-list .comma-item:last-child .comma {
display: none;
}
.hidden {
display: none !important;
}
/* tables */
table {
font-weight: 400;
font-size: 18px;
line-height: 1.4;
border: 1px solid #6633cc;
width: 100%;
overflow-x: auto;
border-radius: 4px;
box-shadow: 0 3px 8px -1px rgba(47, 34, 86, 0.1);
display: block;
table-layout: fixed;
max-width: max-content;
}
table code {
padding-top: 2px;
padding-right: 4px;
padding-bottom: 2px;
padding-left: 4px;
background-color: #f8f8f8;
color: var(--pink);
}
thead {
background-color: #ccc0fd;
display: table-header-group;
}
th {
font-weight: 600;
font-size: 14px;
line-height: 1.2;
text-align: left;
background-color: #ccc0fd;
border-bottom: 1px solid #6633cc;
}
th,
td {
padding: 12px;
vertical-align: top;
}
tr:not(:first-of-type) {
border-top: 1px solid #6633cc;
}
tr:nth-child(odd) {
background-color: #fafafa;
}
tr:nth-child(even) {
background-color: #ffffff;
}
/* Navigation buttons */
.fs_prevnext_empty {
flex-direction: column;
align-items: flex-start;
display: flex;
pointer-events: none;
[fs-cmsprevnext-element='next'] .hover-name.previous,
[fs-cmsprevnext-element='previous'] .hover-name.next {
display: none;
}
}
/* Inline code */
pre {
position: relative;
counter-reset: linenumber;
}
pre:not(.w-code-block) {
padding-left: 3.5rem !important;
}
pre > code {
position: relative;
}
pre .line-numbers-rows {
position: absolute;
pointer-events: none;
top: 0;
font-size: 100%;
left: -3.8em;
width: 3em; /* works for line-numbers below 1000 lines */
letter-spacing: -1px;
border-right: 1px solid #999;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.token-function {
color: red !important;
}
.line-numbers-rows > span {
pointer-events: none;
display: block;
counter-increment: linenumber;
}
.line-numbers-rows > span:before {
content: counter(linenumber);
color: #999;
display: block;
padding-right: 0.8em;
text-align: right;
}
/* Chaos Monkey microsite */
/* This removes all list styling, including numbers */
:is(.chaos-monkey-post-rich-text, .docs-rich-text, .w-richtext) ol {
list-style-type: none;
position: relative;
margin-top: 0.2rem;
line-height: 1.4em;
}
/* This forces the step counter below to start incrementing */
:is(.chaos-monkey-post-rich-text, .docs-rich-text, .w-richtext) ol li {
margin-left: 0.5rem;
padding: 4px 0px 4px 0px;
counter-increment: step-counter;
font-size: 1.125rem;
margin-bottom: 0.5rem;
line-height: 1.3em;
}
.docs-rich-text ol li {
margin-left: 2.5rem;
}
:is(.chaos-monkey-post-rich-text, .docs-rich-text, .w-richtext) ol ol {
counter-reset: step-counter 0; /* Reset the counter for nested ordered lists */
}
.docs-rich-text ol ol {
margin-top: 0.75rem;
}
:is(.chaos-monkey-post-rich-text, .docs-rich-text, .w-richtext) ol ul {
counter-reset: step-counter 0; /* Reset the counter for nested ordered lists */
}
.docs-rich-text ol ul {
margin-top: 0.75rem;
}
:is(.chaos-monkey-post-rich-text, .docs-rich-text, .w-richtext) ol.reset-counter {
counter-reset: step-counter 0; /* Reset the counter for nested ordered lists */
}
/* This adds a step counter before each list item in a numbered list. Also includes styling for the numbers */
:is(.chaos-monkey-post-rich-text, .docs-rich-text, .w-richtext) ol li::before {
content: counter(step-counter);
position: absolute;
left: 0;
width: 28px;
height: 28px;
font-size: 12px;
color: white;
font-weight: 500;
background-color: #63c;
border-radius: 99px;
text-align: center;
line-height: 28px;
}
/* This removes all list styling, including numbers */
:is(.chaos-monkey-post-rich-text, .docs-rich-text, .w-richtext) ul {
list-style-type: none;
position: relative;
margin-top: 0.2rem;
line-height: 1.4em;
}
:is(.chaos-monkey-post-rich-text, .docs-rich-text, .w-richtext) ul li {
padding: 4px 0px 4px 0px;
margin-bottom: 0.5rem;
}
.docs-rich-text ul li {
margin-left: 2rem;
}
/* This adds a step counter before each list item in a numbered list. Also includes styling for the numbers */
:is(.chaos-monkey-post-rich-text, .docs-rich-text, .w-richtext) ul li::before {
display: inline-block;
content: url('https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6924dbfee26732cfc86aa648_Ellipse-filled.svg');
position: absolute;
left: 0;
width: 8px;
height: 8px;
}
.native-list-bullets ul {
list-style-type: disc !important;
}
.native-list-bullets ol {
list-style-type: decimal !important;
}
.native-list-bullets li::before {
content: none !important;
}
.native-list-bullets li::marker {
color: currentColor;
}
</style>
<!-- Prism.js for code formatting -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/prism.min.js" integrity="sha512-HiD3V4nv8fcjtouznjT9TqDNDm1EXngV331YGbfVGeKUoH+OLkRTCMzA34ecjlgSQZpdHZupdSrqHY+Hz3l6uQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/plugins/autoloader/prism-autoloader.min.js" integrity="sha512-SkmBfuA2hqjzEVpmnMt/LINrjop3GKWqsuLSSB3e7iBmYK7JuWw4ldmmxwD9mdm2IRTTi0OxSAfEGvgEi0i2Kw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/components/prism-markup-templating.min.js" integrity="sha512-+8BiRfWso6waiFDv6tEmWF8yfPGgxAtOYLDUB0rRISLwtpxkJ9lpPNUhxwWlikn3qSO+4RQyzDppi62o3ON/AA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- Prism customizations -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/plugins/normalize-whitespace/prism-normalize-whitespace.min.js" integrity="sha512-Kit4oPSAREacS6LEF4LGcL6MMlG3O1GqRFDGSX1Vg4JrozGU7hHoMKFkiMWevWq/xmNq8pzMhO2PcZCPHe/gmQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/plugins/unescaped-markup/prism-unescaped-markup.min.css" integrity="sha512-g33HCZ23fueSK96JEeoy9DelAlu7Ry5mtxqLk+zlEiPj7NIpFI6T9mybOvQxjBN50FALFDCviMXiLqWJcFwzaA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.30.0/plugins/unescaped-markup/prism-unescaped-markup.min.js" integrity="sha512-QaQkFkE1LvUW6IaC7zLY4EsrNHuMWwepQv2RWyg4q/3+KI7K2WwtNEe6IPuYE7ZWkNxdKEnLJRuyuSnvbTUB3Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>
((Prism.languages.bash = Prism.languages.extend('clike', {
comment: { pattern: /(^|[^"{\\])(#.*?(\r?\n|$))/, lookbehind: !0 },
string: {
pattern: /("|')(\\?[\s\S])*?\1/,
inside: { property: /\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^\}]+\})/ },
},
number: {
pattern: /([^\w\.])-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/,
lookbehind: !0,
},
function: /\b(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|cut|date|dc|dd|ddrescue|declare|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|echo|egrep|eject|enable|env|ethtool|eval|exec|exit|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|select|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|until|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)\b/,
keyword: /\b(if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)\b/,
})),
(Prism.languages.shell = Prism.languages.bash));
(Prism.languages.insertBefore('bash', 'keyword', {
property: /\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^}]+\})/,
}),
Prism.languages.insertBefore('bash', 'comment', {
important: /(^#!\s*\/bin\/bash)|(^#!\s*\/bin\/sh)/,
}));
Prism.languages.json = {
property: {
pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,
lookbehind: true,
greedy: true,
},
string: {
pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,
lookbehind: true,
greedy: true,
},
comment: {
pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
greedy: true,
},
number: /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
punctuation: /[{}[\],]/,
operator: /:/,
boolean: /\b(?:false|true)\b/,
null: {
pattern: /\bnull\b/,
alias: 'keyword',
},
};
Prism.languages.webmanifest = Prism.languages.json;
Prism.hooks.add('after-highlight', function (e) {
var t = e.element.parentNode;
// Check if this is an XML block. If so, un-escape escaped characters
var eCls = e.element.classList;
if (e.element.nodeName.toLowerCase() === 'code' && (eCls.contains('language-xml') || eCls.contains('language-markup'))) {
e.element.textContent = e.element.textContent
.replace('&lt;', '<')
.replace('&gt;', '>')
.replace('&quot;', '"')
.replace('&apos;', '\'')
.replace('&amp;', '&')
}
// Check if the parent is a <pre> element and not a Webflow code element
if (t && t.nodeName.toLowerCase() === 'pre' && !t.className.toLowerCase().includes('w-code-block')) {
var a,
n = 1 + e.code.split('\n').length, // Remove the "+ 1" here
l = new Array(n);
l = l.join('<span></span>');
a = document.createElement('span');
a.className = 'line-numbers-rows';
a.innerHTML = l;
t.hasAttribute('data-start') && (t.style.counterReset = 'linenumber ' + (parseInt(t.getAttribute('data-start'), 10) - 1));
e.element.appendChild(a);
}
});
/* Add event listener for copying code */
document.addEventListener('DOMContentLoaded', function () {
// Get all elements with the class "copy-icon"
var copyIcons = document.querySelectorAll('.copy-icon');
copyIcons.forEach(function (copyIcon) {
var copyFeedback = document.createElement('span');
copyFeedback.className = 'copy-feedback';
copyFeedback.innerText = 'Copied!';
copyIcon.appendChild(copyFeedback);
copyIcon.addEventListener('click', function () {
var parentWrapper = copyIcon.closest('.code-higlight-wrapper');
if (!parentWrapper) {
console.error('Parent wrapper not found');
return;
}
var codeElement = parentWrapper.querySelector('code[class*="language-"]');
if (!codeElement) {
console.error('Code element not found');
return;
}
var textToCopy = codeElement.innerText || codeElement.textContent;
var tempTextarea = document.createElement('textarea');
tempTextarea.value = textToCopy;
document.body.appendChild(tempTextarea);
tempTextarea.select();
tempTextarea.setSelectionRange(0, 99999);
document.execCommand('copy');
document.body.removeChild(tempTextarea);
copyFeedback.style.opacity = 1;
setTimeout(function () {
copyFeedback.style.opacity = 0;
}, 1000);
});
});
});
/* End cody copying code */
/* Addtl. event listeners */
window.addEventListener('hs-form-event:on-submission:success', function (event) {
var form = HubSpotFormsV4.getFormFromEvent(event);
window.signals.identify({
email: form.getFieldValue('0-1/email'),
});
});
</script>
<style>
.language-unknown * {
font-size: 1em !important;
color: #ccc !important;
}
.language-docker * {
font-size: 1em !important;
color: #ccc !important;
}
.code-highlight-simple {
padding-left: 0rem !important;
padding-right: 0rem !important;
}
.hover-name {
pointer-events: none;
}
.button-variant-docs:hover ~ .hover-name {
opacity: 1;
}
.copy-feedback {
position: absolute;
font-size: 12px;
color: #2f2356;
padding: 0.25rem 0.5rem;
background-color: white;
border-radius: 0.5rem;
left: -34px;
top: 27px;
transition: all 0.3s ease;
opacity: 0;
z-index: 10;
}
.margin-both-two {
margin-top: 10px;
margin-bottom: 10px;
}
</style>
<!-- End Prism.js -->
<!-- Format inline code -->
<style>
code:not([class*='language-']) {
color: var(--pink);
font-family: 'Inconsolata', monospace;
}
</style>
<!-- End inline code -->
<!-- Navattic tours -->
<style>
.navattic-popup {
background: none;
background-color: transparent;
color: transparent;
border: none;
padding: 0;
}
.tour-preview {
border-radius: 40px;
filter: brightness(70%);
}
.tour-button {
color: #2F2256;
background-color: #FFFFFF;
padding: 10px;
border-radius: 20px;
border: 1px solid #2F2256;
font-weight: 600;
position: absolute;
top: 45%;
left: 45%;
/* transform: translate(-50%, -50%); */
z-index: 9999;
transition: all 0.2s ease-in-out;
}
.tour-button:hover {
transform: scale(1.2);
};
</style>
<!-- End Navattic tours -->
<!-- Finsweet Cookie Consent -->
<script async src="https://cdn.jsdelivr.net/npm/@finsweet/cookie-consent@1/fs-cc.js" fs-cc-mode="opt-out"></script><style>
/* This removes all list styling, including numbers */
.blog-rich-text ol {
list-style-type: none;
position: relative;
}
/* This forces the step counter below to start incrementing */
.blog-rich-text ol li {
counter-increment: step-counter;
margin-left: 0.5rem;
}
/* This adds a step counter before each list item in a numbered list. Also includes styling for the numbers */
.blog-rich-text ol li::before {
content: counter(step-counter);
position: absolute;
left: 0;
width: 28px;
height: 28px;
font-size: 12px;
color: white;
font-weight: 500;
background-color: #6633CC;
border-radius: 99px;
text-align: center;
line-height: 28px;
}
.blog-rich-text li {
margin-bottom: 1rem;
}
/* This removes all list styling, including numbers */
.blog-rich-text ul {
list-style-type: none;
position: relative;
}
/* This forces the step counter below to start incrementing */
.blog-rich-text ul li {
margin-left: 24px;
}
/* This adds a step counter before each list item in a numbered list. Also includes styling for the numbers */
.blog-rich-text ul li::before {
display: inline-block;
content: url('https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/64ff1347b5fa37c0eb12ec7e_Ellipse%2015.svg');
position: absolute;
left: 0;
width: 8px;
height: 8px;
}
/* This styles tables */
table {
font-weight: 400;
font-size: 18px;
line-height: 1.4;
border: 1px solid #6633CC;
width: 100%;
overflow-x: auto;
border-radius: 4px;
box-shadow: 0 3px 8px -1px rgba(47, 34, 86, 0.1);
display: block;
table-layout: fixed;
max-width: max-content;
}
thead {
background-color: #f8f8f8;
display: table-header-group;
}
th {
font-weight: 600;
font-size: 14px;
line-height: 1.2;
text-align: left;
}
th, td {
padding: 12px;
vertical-align: top;
}
tr:not(:first-of-type) {
border-top: 1px solid #6633CC;
}
/* pre {
padding: 0 !important;
padding-left: 1rem !Important;
margin: 0 !important;
}
pre code.hljs {
margin: 0 !Important;
padding: 0 !Important;
} */
.copy-feedback {
position: absolute;
font-size: 12px;
color: #2f2356;
padding: 0.25rem 0.5rem;
background-color: white;
border-radius: 0.5rem;
left: -34px;
top: 27px;
transition: all 0.3s ease;
opacity: 0;
z-index: 10;
}
.token-function {
color: red !important;
}
.line-numbers-rows > span {
pointer-events: none;
display: block;
counter-increment: linenumber;
}
.line-numbers-rows > span:before {
content: counter(linenumber);
color: #999;
display: block;
padding-right: 0.8em;
text-align: right;
}
</style><script src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad%2F6544eda5f000985a163a8687%2F69c496533c06033214e943aa%2Ffinsweetcomponentsconfig-1.0.1.js" type="module" async="" siteId="64a5291e7847ac04fe1531ad" finsweet="components"></script><script src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad%2F66ba5a08efe71070f98dd10a%2F66ed9e169fc0a24dfe528dc8%2Fmrkz93t-1.1.1.js" type="text/javascript"></script></head><body><div data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9bfef" data-animation="default" data-collapse="medium" data-duration="400" data-easing="ease" data-easing2="ease" role="banner" class="nav-updated v2 shadow-md w-nav"><div class="hidden w-embed"><style>
/* Hide Elelemnt in Designer */
.wf-design-mode .hide-in-designer {
display: none !important;
}
</style></div><div class="nav-container-wrap"><div class="nav-container-updated v2"><a href="/" class="nav-brand-updated w-nav-brand"><div class="nav-logo-updated w-embed"><svg width="auto" height="100%" viewBox="0 0 113 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_789_7)">
<path d="M21.474 6.5602L17.4082 9.1514C17.2289 8.9226 17.068 8.7386 16.9303 8.5394C15.3632 6.2602 13.1718 5.2842 10.4594 5.8122C7.69812 6.3498 5.93491 8.1066 5.23779 10.7962C4.46304 13.7906 5.70681 16.905 8.22876 18.5058C10.1857 19.7482 12.2778 19.8546 14.406 19.0682C15.9075 18.513 16.8495 17.3906 17.401 15.7298H12.1426V11.6626H22.6122C22.8274 13.1874 22.7162 14.6674 22.344 16.1242C21.005 21.3746 16.2941 24.5898 10.7195 24.0794C5.42908 23.5946 1.19514 19.7906 0.207489 14.6314C-1.16274 7.4826 4.63512 0.7962 12.0033 1.0202C15.6882 1.1322 18.6391 2.6258 20.8409 5.5498C21.0618 5.8434 21.2331 6.1738 21.4732 6.561L21.474 6.5602ZM78.3937 23.6746H73.7908C73.7708 23.3138 73.7372 22.9834 73.7372 22.653C73.7324 20.1522 73.7404 17.6506 73.7292 15.1498C73.7268 14.7162 73.7019 14.2706 73.6003 13.8514C73.3138 12.6698 72.4878 11.9954 71.3321 11.937C70.1179 11.8754 69.1174 12.4546 68.7373 13.5738C68.5308 14.1834 68.4363 14.8554 68.4251 15.5018C68.3867 17.8458 68.4043 20.1898 68.4011 22.5338V23.6394H63.7414C63.7246 23.3122 63.6934 22.9818 63.6918 22.6514C63.6878 20.1506 63.6966 17.649 63.6814 15.1482C63.679 14.6842 63.6429 14.2066 63.5229 13.7602C63.2163 12.6162 62.424 11.9986 61.2835 11.9386C60.1133 11.8762 59.1025 12.4226 58.7247 13.4882C58.4902 14.1522 58.3885 14.8882 58.3749 15.5962C58.3309 17.9082 58.3541 20.2226 58.3509 22.5354V23.6394H53.72V8.2258H58.2781L58.4237 9.8162C59.79 8.4298 61.2651 7.7154 63.0803 7.7618C64.9131 7.8082 66.373 8.5298 67.5007 10.0418C67.9457 9.7018 68.3411 9.405 68.7301 9.1026C70.3908 7.8146 72.2885 7.513 74.2942 7.9226C76.8034 8.4354 78.3897 10.4402 78.4329 13.1698C78.4865 16.4826 78.4545 19.797 78.4561 23.1106C78.4561 23.2634 78.4233 23.4162 78.3937 23.6746ZM42.9014 20.041C41.5648 19.625 40.8269 18.6306 40.3987 17.2042H52.1297C52.028 16.0898 52.032 15.1194 51.8399 14.1882C50.681 8.5802 45.9052 6.8386 41.5616 8.1866C38.2105 9.2266 35.9967 12.3962 35.9927 15.9938C35.9887 19.4362 38.2121 22.4914 41.5384 23.6178C45.0496 24.8074 48.8442 23.725 50.9939 20.9138C51.138 20.7266 51.2405 20.509 51.3885 20.2618L48.099 18.0242C46.808 20.0026 45.088 20.721 42.9014 20.0402V20.041ZM44.1596 11.5394C45.9476 11.5258 47.1722 12.4722 47.4723 14.1674H40.7356C40.9742 12.6634 42.4372 11.553 44.1596 11.5394ZM111.98 23.6618H107.398C107.379 23.3394 107.343 23.0114 107.342 22.6842C107.337 20.1858 107.342 17.6874 107.336 15.1882C107.335 14.8154 107.329 14.4346 107.257 14.0714C107.006 12.825 106.222 12.085 105.052 11.9474C103.74 11.7922 102.6 12.365 102.131 13.5394C101.906 14.1026 101.803 14.7474 101.794 15.3562C101.756 17.7602 101.778 20.1658 101.778 22.5706V23.6498H97.1303V8.2234H101.7L101.84 9.7354C102.168 9.4818 102.409 9.3042 102.639 9.1146C104.434 7.6314 106.472 7.4146 108.61 8.1202C110.739 8.8226 112.021 10.7738 112.042 13.2338C112.07 16.4818 112.051 19.7298 112.048 22.9778C112.048 23.189 112.007 23.3994 111.98 23.6618ZM81.592 1.4922H86.1685V23.6626H81.592V1.493V1.4922ZM24.8036 23.6242V8.2002C26.3138 8.0898 27.8065 8.1378 29.3777 8.1826V23.553C28.7494 23.7562 26.205 23.8082 24.8036 23.6242ZM89.3587 23.6602V8.2202H93.9368V23.6602H89.3587ZM94.4434 3.825C94.4298 5.3962 93.1709 6.605 91.5821 6.5746C90.0454 6.545 88.8153 5.321 88.8041 3.8098C88.7921 2.2714 90.0718 1.0106 91.6438 1.0138C93.2341 1.0162 94.4578 2.245 94.4434 3.825ZM33.3299 7.7802C34.9138 7.789 36.1343 9.009 36.1263 10.5746C36.1243 10.9432 36.0491 11.3078 35.9053 11.6472C35.7615 11.9866 35.5518 12.2942 35.2883 12.5522C35.0249 12.8102 34.7129 13.0134 34.3705 13.1502C34.028 13.2869 33.6618 13.3545 33.293 13.349C31.7379 13.337 30.4734 12.0722 30.4838 10.5378C30.4942 8.9962 31.7579 7.7706 33.3299 7.7802Z" fill="currentColor"/>
</g>
<defs>
<clipPath id="clip0_789_7">
<rect width="112.062" height="24" fill="white" transform="translate(0 0.5)"/>
</clipPath>
</defs>
</svg></div></a><nav role="navigation" class="nav-menu-mask-updated w-nav-menu"><div class="nav-menu-mask-inner"><div class="menu-wrap-left"><div data-hover="false" data-delay="0" class="nav-dropdown-updated w-dropdown"><div class="nav-dropdown-toggle-updated w-dropdown-toggle"><div>Solutions</div><div class="dropdown-arrow-wrap"><div class="dropdown-arrow w-embed"><svg width="8" height="8" viewBox="0 0 8 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 3L4 6L7 3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
</svg></div></div></div><nav class="nav-dropdown-list-updated w-dropdown-list"><div class="nav-dropdown-list-inner"><div class="nav-list-cta"><div class="column gap-8px"><div class="nav-list-cta-heading max-custom-copy">Solving reliability in the modern enterprise</div><p class="nav-cta-paragraph">See how Gremlin helps organizations modernize their approach to reliability.</p><a href="/product" class="nav-cta-button top-1rem w-button">PLATFORM OVERVIEW</a></div><div class="w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="collection-item-5 w-dyn-item"><a href="https://www.gremlin.com/webinars/speed-and-resilience-how-to-build-reliability-guardrails-for-ai-driven-development" class="cta-card-link-wrap w-inline-block"><div class="card-base card-small card-shadow card-gradient-soft nav-cta"><div class="card-title nav-bar-title">On-Demand</div><p class="card-body cta">How to Build Reliability Guardrails for AI-Driven Development</p><div class="card-link">Watch Now</div></div></a></div></div></div></div><div class="nav-list-link-wrapper"><div class="nav-link-block-holder"><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c05a-70c9bfef" class="nav-link-label"><div>Industry</div></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c05d-70c9bfef" class="solutions-nav-industry-collection w-dyn-list"><div role="list" class="solutions-nav-industry-list w-dyn-items"><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c05f-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c060" href="/solutions/retail" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/664202c6b77f24c4b1e8f28a_Reatil%20Icon.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/664202ca0f5fc4079134d90c_Retail%20Hover%20Icon.svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Retail</div></div><p class="nav-link-block-paragraph">Eliminate revenue-impacting downtime.</p></a></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c05f-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c060" href="/solutions/saas" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6642026fcd4cfc1723363b2b_SaaS%20Icon.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/66420275a1bb6e3828d24921_SaaS%20Hover%20Icon.svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">SaaS</div></div><p class="nav-link-block-paragraph">Improve reliability without slowing down.</p></a></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c05f-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c060" href="/solutions/finserve" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/66420299af4784af848762fa_Finance%20Icon.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6642029e515616c67f9972c7_Finance%20Hover%20Icon.svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Finance</div></div><p class="nav-link-block-paragraph">Modernize resilience practices and manage cloud compliance.</p></a></div></div></div></div><div class="nav-link-block-holder"><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c06b-70c9bfef" class="nav-link-label"><div>Use Case</div></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c06e-70c9bfef" class="solutions-nav-industry-collection w-dyn-list"><div role="list" class="solutions-nav-industry-list w-dyn-items"><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c070-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c071" href="/solutions/build-a-reliability-program" class="nav-link-block-updated-variant w-inline-block"><div>Build a Reliability Program</div></a></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c070-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c071" href="/solutions/it-governance-and-compliance" class="nav-link-block-updated-variant w-inline-block"><div>IT Governance &amp; Compliance</div></a></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c070-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c071" href="/solutions/shift-left-reliability-testing" class="nav-link-block-updated-variant w-inline-block"><div>Shift-Left Reliability Testing</div></a></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c070-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c071" href="/solutions/tune-observability" class="nav-link-block-updated-variant w-inline-block"><div>Fine-Tune Monitors &amp; Alerts</div></a></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c070-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c071" href="/solutions/cloud-migrations" class="nav-link-block-updated-variant w-inline-block"><div>De-Risk Cloud Migrations</div></a></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c070-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c071" href="/solutions/validate-runbooks-and-dr" class="nav-link-block-updated-variant w-inline-block"><div>Validate Runbooks &amp; DR Plans</div></a></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c070-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c071" href="/solutions/aws" class="nav-link-block-updated-variant w-inline-block"><div>Resiliency on AWS</div></a></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c070-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c071" href="/solutions/recreate-incidents-and-outages" class="nav-link-block-updated-variant w-inline-block"><div>Recreate Incidents and Outages</div></a></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c070-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c071" href="/solutions/find-outages-before-they-happen" class="nav-link-block-updated-variant w-inline-block"><div>Find Outages Before They Happen</div></a></div><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c070-70c9bfef" role="listitem" class="solutions-nav-industry-item w-dyn-item"><a data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c071" href="/solutions/improve-ai-reliability" class="nav-link-block-updated-variant w-inline-block"><div>Improve AI Reliability</div></a></div></div></div></div></div></div><div class="nav-devider-line-bot"></div><div class="nav-devider-line-top"></div></nav></div><div data-hover="false" data-delay="0" class="nav-dropdown-updated w-dropdown"><div class="nav-dropdown-toggle-updated w-dropdown-toggle"><div>Product</div><div class="dropdown-arrow-wrap"><div class="dropdown-arrow w-embed"><svg width="8" height="8" viewBox="0 0 8 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 3L4 6L7 3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
</svg></div></div></div><nav class="nav-dropdown-list-updated w-dropdown-list"><div class="nav-dropdown-list-inner"><div class="nav-list-cta"><div class="column gap-8px"><div class="nav-list-cta-heading max-custom">The Enterprise Reliability Platform</div><p class="nav-cta-paragraph">See how Gremlin helps organizations modernize their approach to reliability.</p><a href="/product" class="nav-cta-button top-1rem w-button">PLATFORM OVERVIEW</a></div><div class="hide w-embed"><style>
@media only screen and (min-width: 768px) {
.nav-list-cta {
background: radial-gradient(100% 400% at 0% 33.19%, #1F1638 0%, #311173 100%);
}
}
</style></div><div class="w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="collection-item-5 w-dyn-item"><a href="https://www.gremlin.com/webinars/speed-and-resilience-how-to-build-reliability-guardrails-for-ai-driven-development" class="cta-card-link-wrap w-inline-block"><div class="card-base card-small card-shadow card-gradient-soft nav-cta"><div class="card-title nav-bar-title">On-Demand</div><p class="card-body cta">How to Build Reliability Guardrails for AI-Driven Development</p><div class="card-link">Watch Now</div></div></a></div></div></div></div><div class="nav-list-link-wrapper"><div class="nav-link-block-holder size"><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c009-70c9bfef" class="nav-link-label"><div>Product &amp; Services</div></div><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c00c-70c9bfef" href="/product/reliability-management" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661fef557e3b3fdcf81d55fe_Sheet.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/66195ba7ce8e67a898602c2f_Group%205%20(1).png" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Reliability Management</div></div><p class="nav-link-block-paragraph max-custom-desktop">Find and fix reliability risks at enterprise scale.</p></a><a id="w-node-_1f86783c-1863-9d47-ffc6-16cb63221f83-70c9bfef" data-w-id="1f86783c-1863-9d47-ffc6-16cb63221f83" href="/product/foresight" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6a60da550591a810dcf4fab9_65a9d1f430f841ac1facbc252849cbfc_icon-foresight-inactive.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6a60da6ce9c99e473db2167a_72c0403ea1257cfe88a01318728d911e_icon-foresight-active.svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">NEW: Foresight AI</div></div><p class="nav-link-block-paragraph max-custom-desktop">Build resilience at AI speed across everything you ship and run.</p></a><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c015-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c015" href="/product/chaos-engineering" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661fef555f2c92051be1ea03_Bottle.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6619607b58b636bc4d5bbe54_Group%204%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Chaos Engineering</div></div><p class="nav-link-block-paragraph max-custom-desktop">Build trust in complex systems with safe and secure Chaos Engineering.</p></a><a id="w-node-_81fbc26b-fcfa-8033-2095-d4e0604bec12-70c9bfef" data-w-id="81fbc26b-fcfa-8033-2095-d4e0604bec12" href="/product/professional-services" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6ab566276ade4e30c2860b51_professional-services.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6ab56627d0b0acf36a41c75c_professional-services-hover.svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Professional Services</div></div><p class="nav-link-block-paragraph max-custom-desktop">Deploy experts for proven reliability results.<br/></p></a></div><div class="nav-link-block-holder size fix"><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c01f-70c9bfef" class="nav-link-label"><div>Core Technologies</div></div></div><div class="nav-product-collection w-dyn-list"><div role="list" class="nav-link-block-holder size-copy w-dyn-items"><div role="listitem" class="nav-link-collection-item w-dyn-item"><a data-w-id="0a2e360a-35b0-96d4-18f7-4c9082721085" href="/technologies/fault-injection" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3d98fcd70a64b68117f3_661fef55af548c793e7d81e1_syring.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3d9bb971690c33b5c90b_6619607cef9ad6800af719ce_syringe%402x%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Fault Injection</div></div><p class="nav-link-block-paragraph max-custom-desktop">Safely and securely test system robustness by injecting failures.</p></a></div><div role="listitem" class="nav-link-collection-item w-dyn-item"><a data-w-id="0a2e360a-35b0-96d4-18f7-4c9082721085" href="/technologies/reliability-scoring" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3e8a2fcb7fb4beeecc64_661fef56a618d30954d52bf9_%5Bicon%5D%20%20Scoring.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3e86a67aa40dcb219ad8_6619607240f5a77804f29ec1_%5Bicon%5D%20Reliability%20Scoring%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Reliability Scoring</div></div><p class="nav-link-block-paragraph max-custom-desktop">Define, measure, and monitor service reliability across the enterprise.</p></a></div><div role="listitem" class="nav-link-collection-item w-dyn-item"><a data-w-id="0a2e360a-35b0-96d4-18f7-4c9082721085" href="/technologies/detected-risks" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3df851b8fb28feef5b6b_661fef5540a826e1844e3647_exclamation.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3dfb7da02da09c8d529f_66196071ce8e67a8986423a2_exclamation-circle%402x%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Detected Risks</div></div><p class="nav-link-block-paragraph max-custom-desktop">Continuously monitor systems for critical reliability risks.</p></a></div><div role="listitem" class="nav-link-collection-item w-dyn-item"><a data-w-id="0a2e360a-35b0-96d4-18f7-4c9082721085" href="/technologies/dependency-discovery" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3f06199615571bb04f94_661fef5579870fd1603efde8_%5Bicon%5D%20.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3f003a925e1d5a3783e6_661960717509e38ef59e24bd_%5Bicon%5D%20Dependency%20Discovery%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Dependency Discovery</div></div><p class="nav-link-block-paragraph max-custom-desktop">Automatically identify and test your system dependencies.</p></a></div><div role="listitem" class="nav-link-collection-item w-dyn-item"><a data-w-id="0a2e360a-35b0-96d4-18f7-4c9082721085" href="/technologies/failure-flags" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3e442359533f0f3a18c9_66a150c719a52270e832d774_%5Bicon%5D%20code-static.avif" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3e4570e6c7b6f37c4dea_66a150d6c101c63481bf1d44_%5Bicon%5D%20code-hover.avif" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Failure Flags</div></div><p class="nav-link-block-paragraph max-custom-desktop">Test the resiliency of applications and serverless functions.</p></a></div><div role="listitem" class="nav-link-collection-item w-dyn-item"><a data-w-id="0a2e360a-35b0-96d4-18f7-4c9082721085" href="/technologies/gremlin-private-edition" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3f39699f42b165b61843_67ab7992db38684d97e1c827_b7358ef14c18faac313fff5d66594939_server%402x.png" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/67be3f3b7245561c49f200a0_67ab79ad3b7564303b4cba33_server%402x-hover.png" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Private Edition</div></div><p class="nav-link-block-paragraph max-custom-desktop">Deploy a private Gremlin instance in your private network.</p></a></div><div role="listitem" class="nav-link-collection-item w-dyn-item"><a data-w-id="0a2e360a-35b0-96d4-18f7-4c9082721085" href="/technologies/reliability-intelligence" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/689259dd49953af6f9524efc_nav-ri-nohover.png" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/689259e0b88ac6941a66065f_nav-ri-hover.png" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Reliability Intelligence</div></div><p class="nav-link-block-paragraph max-custom-desktop">Empower your teams with custom-tailored reliability analyses, recommendations, and insights.</p></a></div><div role="listitem" class="nav-link-collection-item w-dyn-item"><a data-w-id="0a2e360a-35b0-96d4-18f7-4c9082721085" href="/technologies/disaster-recovery-testing" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6977d6006a9ea4e73c2465e5_nav-drt-nohover.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6977d602ff60ebb670bece53_nav-drt-hover.svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Disaster Recovery Testing</div></div><p class="nav-link-block-paragraph max-custom-desktop">Validate region failover processes, disaster recovery plans, incident response procedures, and more.</p></a></div></div></div></div></div><div class="nav-devider-line-bot"></div><div class="nav-devider-line-top"></div></nav></div><a href="/pricing" class="nav-link-updated w-nav-link">Pricing</a><a href="/customers" class="nav-link-updated w-nav-link">Customers</a><div data-hover="false" data-delay="0" class="nav-dropdown-updated w-dropdown"><div class="nav-dropdown-toggle-updated w-dropdown-toggle"><div>Resources</div><div class="dropdown-arrow-wrap"><div class="dropdown-arrow w-embed"><svg width="8" height="8" viewBox="0 0 8 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 3L4 6L7 3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
</svg></div></div></div><nav class="nav-dropdown-list-updated w-dropdown-list"><div class="nav-dropdown-list-inner"><div class="nav-list-cta"><div class="column gap-8px"><div class="nav-list-cta-heading max-custom">Looking for something?</div><p class="nav-cta-paragraph">Learn how to build and manage more reliable systems with our latest whitepapers, webinars, blogs and more. All Gremlin resources, right here.</p><a href="/resources" class="nav-cta-button top-1rem w-button">RESOURCE HUB</a></div><div class="w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="collection-item-5 w-dyn-item"><a href="https://www.gremlin.com/webinars/speed-and-resilience-how-to-build-reliability-guardrails-for-ai-driven-development" class="cta-card-link-wrap w-inline-block"><div class="card-base card-small card-shadow card-gradient-soft nav-cta"><div class="card-title nav-bar-title">On-Demand</div><p class="card-body cta">How to Build Reliability Guardrails for AI-Driven Development</p><div class="card-link">Watch Now</div></div></a></div></div></div></div><div class="nav-list-link-wrapper"><div class="nav-link-block-holder"><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c08c-70c9bfef" class="nav-link-label"><div>Our resources</div></div><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c08f-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c08f" href="/blog" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661ff094b019617172373e94_%5Bicon%5D%20Blog-2.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6619632c01898085360325ae_%5Bicon%5D%20Blog%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Blog</div></div><p class="nav-link-block-paragraph">Get the latest Gremlin news and reliability best practices.</p></a><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c098-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c098" href="/docs" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661ff094c03f25a6ee3536a3_%5Bicon%5D%20Docs-2.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6619632c82bd247fa7b16d65_%5Bicon%5D%20Docs%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Documentation</div></div><p class="nav-link-block-paragraph">Gremlin&#x27;s software documentation.</p></a><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c0aa-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c0aa" href="/resources?webflow%5BrefinementList%5D%5BarticleLabel%5D%5B0%5D=Webinars" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6925f377ebf8982c392b6d6d_22c086110e014298d7e448c84aa916a9_webinar-static.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6925f3a1183523aa51be8ae7_2208aa01a50a5da4b6f6bceedc1a460a_webinar-active.svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Webinars</div></div><p class="nav-link-block-paragraph">Expert-led webinars with reliability guidance, tips, and insights.</p></a><a id="w-node-dd454d92-ea88-2368-52a4-842ef54b0da5-70c9bfef" data-w-id="dd454d92-ea88-2368-52a4-842ef54b0da5" href="/community/tutorials" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661ff0940f7c60773272d708_%5Bicon%5D%20Tutorials-2.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6619632c58f3010cd07a6c26_%5Bicon%5D%20Tutorials%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">How-to guides</div></div><p class="nav-link-block-paragraph">Step-by-step guides to help you become a reliability expert.</p></a><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c0b3-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c0b3" href="https://support-site.gremlin.com/" target="_blank" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661ff094999e60987533e9dd_%5Bicon%5D%20Support%20Center-2.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6619632c3e1bcee0b41808d7_%5Bicon%5D%20Support%20Center%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Support Center</div></div><p class="nav-link-block-paragraph">Initiate and manage support requests.</p></a><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c0bc-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c0bc" href="/demo" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661ff094c88d3676eb86bd66_%5Bicon%5D%20Request%20a%20Demo-2.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661963332264205a73706ac6_%5Bicon%5D%20Request%20a%20Demo%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Request demo</div></div><p class="nav-link-block-paragraph">Book a live demo with a Gremlin reliability expert.</p></a><a id="w-node-_63bd6b3f-f208-d81e-dc09-2937e0db161a-70c9bfef" data-w-id="63bd6b3f-f208-d81e-dc09-2937e0db161a" href="/tools/recommended-scenarios" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661fef557e3b3fdcf81d55fe_Sheet.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/66195ba7ce8e67a898602c2f_Group%205%20(1).png" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Recommended Scenarios</div></div><p class="nav-link-block-paragraph">Prebuilt ready-to-run tests for common failure modes.</p></a><a id="w-node-_47383b12-702b-921b-0726-c44a58f53964-70c9bfef" data-w-id="47383b12-702b-921b-0726-c44a58f53964" href="/demo-center" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/67b78ffce6e16ff1d114c6dd_cce96963e82c33a11118cc586afdfa3d_%5Bicon%5D%20product%20tour%20-%20default.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/67b790522a5b21aad7274d81_6b30a8b7d80f9982b6adca431c0a15e4_%5Bicon%5D%20product%20tour%20-%20highlighted.svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Self-guided tours</div></div><p class="nav-link-block-paragraph">Experience Gremlin through interactive, self-guided product tours.</p></a><a id="w-node-f3b5feef-f209-754a-497b-055c7044d23d-70c9bfef" data-w-id="f3b5feef-f209-754a-497b-055c7044d23d" href="/environments" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661960724e5a129a603737ab_%5Bicon%5D%20Dependency%20Discovery.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661960717509e38ef59e24bd_%5Bicon%5D%20Dependency%20Discovery%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Testable Environments</div></div><p class="nav-link-block-paragraph">Learn how Gremlin helps you build resilient workloads on cloud services.</p></a></div></div></div><div class="nav-devider-line-top"></div><div class="nav-devider-line-bot"></div></nav></div><div data-hover="false" data-delay="0" class="nav-dropdown-updated w-dropdown"><div class="nav-dropdown-toggle-updated w-dropdown-toggle"><div>Company</div><div class="dropdown-arrow-wrap"><div class="dropdown-arrow w-embed"><svg width="8" height="8" viewBox="0 0 8 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 3L4 6L7 3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
</svg></div></div></div><nav class="nav-dropdown-list-updated w-dropdown-list"><div class="nav-dropdown-list-inner"><div class="nav-list-cta"><div class="column gap-8px _100"><div class="nav-list-cta-heading max-custom">Check us out</div><p class="nav-cta-paragraph">We&#x27;re on a mission to help every company build more reliable software.</p><div class="nav-button-wrap-list"><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c0d6-70c9bfef" href="/about" class="nav-cta-button w-button">COMPANY OVERVIEW</a></div></div><div class="w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="collection-item-5 w-dyn-item"><a href="https://www.gremlin.com/webinars/speed-and-resilience-how-to-build-reliability-guardrails-for-ai-driven-development" class="cta-card-link-wrap w-inline-block"><div class="card-base card-small card-shadow card-gradient-soft nav-cta"><div class="card-title nav-bar-title">On-Demand</div><p class="card-body cta">How to Build Reliability Guardrails for AI-Driven Development</p><div class="card-link">Watch Now</div></div></a></div></div></div></div><div class="nav-list-link-wrapper-horizontal"><div class="nav-link-block-holder-horizontal"><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c0da-70c9bfef" class="nav-link-label"><div>Get to know us</div></div><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c0dd-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c0dd" href="/media" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661ff168a52f869965dba6eb_%5Bicon%5D%20Media%20News%20%26%20Resources-2.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661964d388dc7bf83f49df4f_%5Bicon%5D%20Media%20News%20%26%20Resources%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Media news &amp; resources</div></div><p class="nav-link-block-paragraph">News, coverage, and resources.</p></a><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c0ef-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c0ef" href="/contact" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661ff094ff224116c7c8625c_%5Bicon%5D%20Office%20Hours-2.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6619632c32d34f3039b34b2d_%5Bicon%5D%20Office%20Hours%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Contact us</div></div><p class="nav-link-block-paragraph">Get in touch with Gremlin.</p></a><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c0f8-70c9bfef" href="#" class="button hide w-button">CONTACT US</a></div><div class="nav-link-block-holder-horizontal"><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c0fb-70c9bfef" class="nav-link-label"><div>Connect with us</div></div><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c0fe-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c0fe" href="/resources?events=true" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661ff168bab2f334d912edc8_Group%205-2.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661964d3dc909f4e3664082a_Group%204.svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Events</div></div><p class="nav-link-block-paragraph">Workshops, meetups, webinars and more.</p></a><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c107-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c107" href="https://join.slack.com/t/gremlinusercommunity/shared_invite/zt-2ie2f4fyo-DvVaHh8CgGfxJgJwrAUWSQ" target="_blank" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661ff1686663f4ac5413928a_%5Bicon%5D%20Gremlin%20User%20Community-2.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661964d3fb73fe1b7bcac3cd_%5Bicon%5D%20Gremlin%20User%20Community%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Gremlin User Community</div></div><p class="nav-link-block-paragraph">Join our Slack community of Gremlin users and builders.</p></a></div><div class="nav-link-block-holder-horizontal"><div id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c111-70c9bfef" class="nav-link-label"><div>Join us</div></div><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c114-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c114" href="/partners" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661ff168eb6b66a8939aa7c4_%5Bicon%5D%20Partners-2.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661964d3d56be8530456ebe0_%5Bicon%5D%20Partners%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Partners</div></div><p class="nav-link-block-paragraph">Help make the internet more reliable, together.</p></a><a id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c11d-70c9bfef" data-w-id="e644ad4c-2d1f-3e0d-6a23-c35170c9c11d" href="/team" class="nav-link-block-updated w-inline-block"><div class="nav-link-block-title"><div class="nav-link-icon-wrapper"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661ff169bad09ffbc2bed048_%5Bicon%5D%20Careers-2.svg" loading="lazy" alt="" class="nav-link-icon-static"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/661964d2adcffd50847a63e9_%5Bicon%5D%20Careers%20(1).svg" loading="lazy" alt="" class="nav-link-icon-hover"/></div><div class="nav-link-block-title-text">Careers</div></div><p class="nav-link-block-paragraph">Join the team that makes Gremlin.</p></a></div></div></div><div class="nav-devider-line-bot"></div><div class="nav-devider-line-top"></div></nav></div></div><div class="menu-wrap-right"><div id="autocomplete" class="nav-search-2 hide-on-mobile hide-in-designer"><div class="absolute-embed-2 w-embed"><svg width="100%" height="100%" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.16667 15.8333C12.8486 15.8333 15.8333 12.8486 15.8333 9.16667C15.8333 5.48477 12.8486 2.5 9.16667 2.5C5.48477 2.5 2.5 5.48477 2.5 9.16667C2.5 12.8486 5.48477 15.8333 9.16667 15.8333Z" stroke="currentcolor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M17.5 17.5L13.875 13.875" stroke="currentcolor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg></div><div class="w-embed w-script"><link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@algolia/autocomplete-theme-classic"
/>
<style>
:root {
--aa-icon-size: 80px;
}
</style>
<script>
let timerId;
let timeout = 400;
function debouncePromise(fn, time) {
let timer = undefined;
return function debounced(...args) {
if (timer) {
clearTimeout(timer); // Clear the timeout first if it's already defined.
}
return new Promise((resolve) => {
timer = setTimeout(() => resolve(fn(...args)), time);
});
};
}
const debounced = debouncePromise((items) => Promise.resolve(items), 400);
const { autocomplete, getAlgoliaResults } = window["@algolia/autocomplete-js"];
const { setIsOpen } = autocomplete({
container: "#autocomplete",
placeholder: "Start typing to search resources...",
detachedMediaQuery: "",
openOnFocus: true,
getSources({ query, state }) {
if (!query) {
return [];
}
return debounced([
{
sourceId: "webflow",
getItems() {
return getAlgoliaResults({
searchClient,
queries: [
{
indexName: indexNames,
query,
params: {
attributesToSnippet: ["name:100", "shortDescription:100"],
snippetEllipsisText: "…",
hitsPerPage: 100,
},
},
],
});
},
templates: {
header() {
return "SEARCH RESULTS";
},
item({ item, components, html }) {
return html`<a class="aa-ItemLink" href="${item.slug}">
<div class="return-link-class">
<div class="aa-ItemContentBody">
<div class="return-image-holder">
<div class="hide">
${components.Highlight({
hit: item,
attribute: "articleLabel",
})}
</div>
<div class="return-heading-class">
${components.Highlight({
hit: item,
attribute: "name",
})}
</div>
<div class="return-image-image"></div>
</div>
<div class="return-paragraph-class">
${components.Highlight({
hit: item,
attribute: "shortDescription",
})}
</div>
</div>
</div>
</a>`;
},
noResults() {
return "No posts for this query.";
},
},
getItemUrl({ item }) {
return "/" + item.slug;
},
},
]);
},
});
document.addEventListener('keydown', (event) => {
if (event.metaKey && event.key.toLowerCase() === 'k') {
setIsOpen(true);
}
});
</script>
<script>
// Function to check for the existence of the element and add class if found
function checkAndAddClass() {
var detachedContainer = document.querySelector('.aa-DetachedContainer');
// Check if the element exists
if (detachedContainer) {
// Add the class if the element exists
detachedContainer.classList.add('aa-DetachedContainer--modal');
clearInterval(checkInterval); // Stop the interval once the class is added
addClassOnResize(); // Call the function to check on every resize
}
}
// Function to check on every resize with a delay of 100ms
function addClassOnResize() {
window.addEventListener('resize', function() {
setTimeout(function() {
var detachedContainer = document.querySelector('.aa-DetachedContainer');
// Check if the element exists and if it does not have the class
if (detachedContainer && !detachedContainer.classList.contains('aa-DetachedContainer--modal')) {
// Add the class on resize if the condition is met
detachedContainer.classList.add('aa-DetachedContainer--modal');
}
}, 100);
});
}
// Set up an interval to check for the existence of the element
var checkInterval = setInterval(checkAndAddClass, 100);
</script></div><div class="hide w-embed w-script"><script>
// Wrap the code inside an event listener for 'DOMContentLoaded'
document.addEventListener('DOMContentLoaded', function() {
// Get the responsive-clicker element
var responsiveClicker = document.getElementById('responsive-click');
// Add a click event listener to the responsive-clicker element
responsiveClicker.addEventListener('click', function() {
// Get the element with classname aa-DetachedSearchButton
var detachedSearchButton = document.querySelector('.aa-DetachedSearchButton');
// Check if the element is found
if (detachedSearchButton) {
// Click the element with classname aa-DetachedSearchButton
detachedSearchButton.click();
} else {
console.error('Element with classname aa-DetachedSearchButton not found');
}
});
});
</script>
<style>
.aa-DetachedSearchButtonQuery{
display:none !important;
}
.aa-DetachedSearchButtonPlaceholder{
display:none !important;
}
.aa-SubmitIcon{
display: none !important;
}
.aa-DetachedSearchButtonIcon{
display:none !important;
}
.aa-DetachedSearchButton{
width: 32px !important;
height: 32px !important;
background: transparent !important;
border: none !important;
}
.aa-DetachedCancelButton{
display: none !important;
}
.aa-Label{
display: none !important;
}
.aa-Input{
padding-left: 12px !important;
}
.aa-DetachedContainer.aa-DetachedContainer--modal{
max-width: 95vw;
width: 600px;
margin-top: 64px;
padding: 32px;
left: 0px;
}
.aa-DetachedContainer{
width: 600px;
margin-top: 64px;
padding: 32px;
top: 0px;
max-width: 95vw;
left: 2.5vw;
}
.aa-DetachedFormContainer{
padding: 0px
}
.aa-Form{
border: 0 !important;
box-shadow: none !important;
outline: none !important;
}
.aa-SourceHeader{
width: 100% !important;
text-align: center !important;
background: black !important;
color: white !important;
font-weight: 500 !important;
height: 28px !important;
line-height: 28px !important;
font-size: 12px !important;
margin: 0px !important;
position: absolute !important;
top: 0px !important;
z-index: 3 !important;
}
.aa-DetachedOverlay{
background: rgba(19, 19, 19, 0.75);
z-index: 9999;
}
.aa-ClearIcon{
width: 24px;
height: 24px;
}
.aa-ClearButton{
width: 24px !important;
padding: 0 !important;
height: 24px !important;
}
/* Original CSS Code */
.aa-Panel--scrollable {
overflow: hidden !important;
padding: 0px !important;
}
.aa-List{
max-height: 500px !important;
overflow-x: hidden;
overflow-y: auto;
padding-top: 28px !important;
}
.aa-Source{
max-height:500px;
border: 1px solid var(--deep-purple);
border-radius: 6px;
overflow: hidden;
}
.aa-DetachedFormContainer{
border: 0 !important;
}
.aa-Item{
padding: 0;
margin: 0px;
}
.return-link-class {
width: 100% !important;
padding: 8px !important;
border-bottom: 1px solid var(--dark-purple-bg) !important;
text-decoration: none !important;
}
.return-link-item:hover {
background-color: hsla(255, 43.33%, 23.53%, 0.15) !important;
}
.return-paragraph-class {
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden;
-webkit-line-clamp: 2; /* Change the number to the desired line limit */
line-height: 1.3em;
}
.aa-ItemLink{
display: flex !important;
width:100% !important;
}
.aa-InputWrapperPrefix{
display: none !important;
}
</style>
<style>
.return-link-class:hover .return-image-image {
opacity: 1;
}
.return-link-class .return-image-image {
opacity: 0;
transition: 0.3s;
}
.aa-GradientBottom{
display: none !important;
}
.aa-Item{
padding: 0px !important;
}
.aa-SourceNoResults {
position: relative;
background: white;
z-index: 3 !important;
}
</style></div></div><div class="nav-button-wrap"><a href="https://app.gremlin.com/login" target="_blank" class="nav-button variant w-button">Log In</a><a href="/demo" id="w-node-e644ad4c-2d1f-3e0d-6a23-c35170c9c130-70c9bfef" class="nav-button w-button">GET A DEMO</a></div></div></div></nav><div class="responsive-nav-button-wrap"><div class="nav-search-wrap"><a id="responsive-click" href="#" class="nav-search w-inline-block"><div class="w-embed"><svg width="100%" height="100%" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.16667 15.8333C12.8486 15.8333 15.8333 12.8486 15.8333 9.16667C15.8333 5.48477 12.8486 2.5 9.16667 2.5C5.48477 2.5 2.5 5.48477 2.5 9.16667C2.5 12.8486 5.48477 15.8333 9.16667 15.8333Z" stroke="currentcolor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M17.5 17.5L13.875 13.875" stroke="currentcolor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg></div></a></div><div class="nav-menu-button-holder"><div scroll="both" class="nav-menu-button-2 w-nav-button"><div class="nav-menu-button-wrap-2"><div class="nav-lines-new nav-line-1"></div><div class="nav-lines-new nav-line-2"></div><div class="nav-lines-new nav-line-3"></div></div></div></div></div></div></div><div class="nav-divider-line---animated"></div><div class="banner-code"><div class="hidden w-embed w-script"><script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"url": "https://www.gremlin.com/",
"logo": "https://res.cloudinary.com/gremlin/image/upload/v1667411425/AWS%20re:Invent%20GameDay%202022/Gremlin-Logo-Primary_2x.png",
"name": "Gremlin",
"description": "Gremlin helps engineering teams proactively manage reliability at scale.",
"email": "hello@gremlin.com",
"telephone": "+1-408-214-9885",
"address": {
"@type": "PostalAddress",
"streetAddress": "440 N Barranca Ave #3101",
"addressLocality": "Covina",
"addressCountry": "US",
"addressRegion": "CA",
"postalCode": "91723"
}
}
</script>
<style>
.top-announcement-bar {
background: radial-gradient(46.77% 147.55% at 69.9% 62.72%, #311173 0%, #1F1638 100%);
}
</style>
<script defer>
// Script to hide announcement banner and store its state in localStorage
var banner = document.getElementById("announcement-banner");
var bannerCloseButton = document.getElementById("announcement-banner-close-button");
var bannerCTA = document.getElementById("announcement-banner-cta").innerText;
var storedBannerHidden = localStorage.getItem("announcement_banner_hidden");
var storedBannerCTA = localStorage.getItem("announcement_banner_cta");
if (storedBannerHidden === "true" && bannerCTA === storedBannerCTA) {
banner.classList.add("hidden");
}
else {
localStorage.setItem("announcement_banner_hidden", "false");
banner.classList.remove("hidden");
}
bannerCloseButton.addEventListener("click", function(e) {
localStorage.setItem("announcement_banner_hidden", "true");
localStorage.setItem("announcement_banner_cta", bannerCTA);
banner.classList.add("hidden");
});
// Script to adjust padding-top of .section and .nav-menu-mask-inner if #announcement-banner is displayed
document.addEventListener('DOMContentLoaded', function() {
// Check if #announcement-banner exists
var topBanner = document.getElementById('announcement-banner');
if (topBanner && getComputedStyle(topBanner).getPropertyValue('display') === 'flex') {
// Calculate the height of the banner
var topBannerHeight = topBanner.offsetHeight;
// Find the first .section element in a row
var topFirstSection = document.querySelector('.section:first-child');
if (topFirstSection) {
// Increase the top padding of the first section by the height value of the banner
var topCurrentSectionPadding = parseInt(window.getComputedStyle(topFirstSection).paddingTop);
topFirstSection.style.paddingTop = (topCurrentSectionPadding + topBannerHeight) + 'px';
}
// Check if screen width is smaller than or equal to 991 pixels
if (window.innerWidth <= 991) {
// Find .nav-menu-mask-inner element
var topNavMenuMaskInner = document.querySelector('.nav-menu-mask-inner');
if (topNavMenuMaskInner) {
// Increase the top padding of .nav-menu-mask-inner by the height value of the banner
var topCurrentNavMenuPadding = parseInt(window.getComputedStyle(topNavMenuMaskInner).paddingTop);
topNavMenuMaskInner.style.paddingTop = (topCurrentNavMenuPadding + topBannerHeight) + 'px';
}
}
}
});
// MutationObserver to revert changes if #announcement-banner is hidden
var topTargetElement = document.getElementById('announcement-banner');
var topObserver = new MutationObserver(function(mutationsList, observer) {
for(var mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
var topTarget = mutation.target;
if (topTarget.classList.contains('hidden')) {
// Revert the changes made by the second script
var topFirstSection = document.querySelector('.section:first-child');
if (topFirstSection) {
topFirstSection.style.paddingTop = '';
}
// Check if screen width is smaller than or equal to 991 pixels
if (window.innerWidth <= 991) {
var topNavMenuMaskInner = document.querySelector('.nav-menu-mask-inner');
if (topNavMenuMaskInner) {
topNavMenuMaskInner.style.paddingTop = '';
}
}
}
}
}
});
var topConfig = { attributes: true, attributeFilter: ['class'] };
topObserver.observe(topTargetElement, topConfig);
</script></div></div></div><div class="main-wrapper"><section data-w-id="65ced934-b2d2-964b-66af-2c794ea7409e" class="section featured-blog-hero"><div class="container featured-hero-container"><img alt="" loading="lazy" src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8efb6546201600cab0e6e1_Blog%20Headers.avif" sizes="100vw" srcset="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8efb6546201600cab0e6e1_Blog%20Headers-p-500.avif 500w, https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8efb6546201600cab0e6e1_Blog%20Headers-p-800.avif 800w, https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8efb6546201600cab0e6e1_Blog%20Headers-p-1080.avif 1080w, https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8efb6546201600cab0e6e1_Blog%20Headers-p-1600.avif 1600w, https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8efb6546201600cab0e6e1_Blog%20Headers-p-2000.avif 2000w, https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8efb6546201600cab0e6e1_Blog%20Headers.avif 3000w" class="featured-blog-cover-image"/><div class="column featured-blog"><div class="blog-info-wrap"><div>August 27, 2026</div><div>-</div><div class="read-time">8 min read</div></div><div class="featured-hero post"><h1 class="heading-xl-blog text-neutral">Managing Kubernetes node drains with Pod Disruption Budgets</h1></div><div class="devider-line"></div><div class="flex-vertical grid-auto-sm w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="margin-bottom-xs w-dyn-item"><a href="https://www.gremlin.com/blog?webflow%5Bmenu%5D%5BcategoriesWebflow%5D=Kubernetes" class="eyebrow-pill no-underline-link w-inline-block"><div class="eyebrow-text">Kubernetes</div></a></div><div role="listitem" class="margin-bottom-xs w-dyn-item"><a href="https://www.gremlin.com/blog?webflow%5Bmenu%5D%5BcategoriesWebflow%5D=Gremlin" class="eyebrow-pill no-underline-link w-inline-block"><div class="eyebrow-text">Gremlin</div></a></div></div></div></div></div></section><section class="section blog-body"><div class="container grid blog-post"><div id="w-node-_6dcab4aa-f84a-8226-2f56-0aad6204d960-1519e9c6" class="rich-text-wrap"><div id="single-article" fs-richtext-element="rich-text" class="blog-rich-text w-richtext"><p>Kubernetes normally excels at preserving uptime during maintenance tasks, but it’s not always perfect. Even something as benign as consolidating nodes after a traffic spike could take your application offline if not done carefully. This is where PodDisruptionBudgets (PDBs) come in.</p><p>In this blog, we’ll explain why PDBs are important, what the risks are of not implementing them, and how you can find out which of your own deployments are missing PDB definitions.</p><p>‍</p><h2>What is a pod disruption?</h2><p>A <a href="https://kubernetes.io/docs/concepts/workloads/pods/disruptions/">disruption</a> is any event that interrupts a pod’s ability to run. Hardware failures, out-of-memory evictions, and cloud provider outages might come to mind: these are <em>involuntary</em> disruptions, which you have little to no control over. But if a pod goes down because someone or something took deliberate action, that’s a <em>voluntary</em> disruption. Voluntary disruptions include:</p><ul role="list"><li>Draining nodes for replacement, upgrading, or downscaling.</li><li>The cluster autoscaler consolidating workloads onto fewer nodes.</li><li>Migrating pods to make room for other pods that need a resource on the node.</li></ul><p>A common misconception is that PDBs govern rolling updates to Deployments or StatefulSets. Pods removed during a rolling update count against a PDB, but the Deployment and StatefulSet controllers aren’t limited by PDBs. PDBs work through Kubernetes’ <a href="https://kubernetes.io/docs/concepts/scheduling-eviction/">eviction API</a>, while these controllers delete pods directly. The same applies to <a href="/community/tutorials/validating-horizontal-pod-autoscaling-on-eks-with-gremlin">Horizontal Pod Autoscalers</a> (HPAs).</p><p>‍</p><h2>What is a pod disruption budget, and why is it important for reliability?</h2><p>A PDB restricts the number of pods that can be unavailable simultaneously for a given deployment during a voluntary disruption.</p><p>Kubernetes has no way of knowing which of your pods are load-bearing. If you ask it to drain a node, it will evict <em>everything</em> on the node. If your pod replicas happen to be spread evenly across the cluster, this isn’t a problem. But if your replicas happen to be consolidated on a single node, you can lose the entire service. PDBs help catch scenarios like these and prevent evictions from proceeding until your pods can migrate to other nodes.</p><p>For example, imagine we’re hosting a web application in an Nginx pod with four replicas for redundancy:</p><div class="w-embed w-script"><gr-code lang="yaml">
<script type="text/plain">
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.31.3
ports:
- containerPort: 80
</script>
</gr-code></div><p>‍</p><p>We want to ensure that we always have at least three replicas in order to meet our latency service level objective (SLO), so we’ll create a PDB:</p><div class="w-embed w-script"><gr-code lang="yaml">
<script type="text/plain">
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: nginx-pdb
spec:
maxUnavailable: 1
unhealthyPodEvictionPolicy: IfHealthyBudget
selector:
matchLabels:
app: nginx-web
</script>
</gr-code></div><p>‍</p><p>Let’s break down each of these fields:</p><ul role="list"><li><code>maxUnavailable</code> caps the number of pods that can be unavailable during a voluntary disruption. Alternatively, you can use <code>minAvailable</code> to set the minimum number of pods that must be available. Both properties also accept percentages in the form of strings (e.g. <code>maxUnavailable: &quot;50%&quot;</code>).</li><li><code>selector</code> determines which pods the PDB will apply to. An empty selector matches every pod in the namespace, so scope this carefully.</li><li><code>unhealthyPodEvictionPolicy</code> determines when Kubernetes considers unhealthy pods for eviction. <code>IfHealthyBudget</code> (the default) only allows an eviction if <code>currentHealthy</code> is at or above <code>desiredHealthy</code>. The other option, <code>AlwaysAllow</code>, permits it regardless.</li></ul><p>After applying the PDB, you can validate it by running <code>kubectl get pdb nginx-pdb</code>:</p><div class="w-embed w-script"><gr-code lang="shell">
<script type="text/plain">
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
nginx-pdb N/A 1 1 10m
</script>
</gr-code></div><p>‍</p><h3>Validating your pod disruption budget</h3><p>Imagine our deployment is running on a four-node cluster. Since we didn’t use <a href="https://www.gremlin.com/blog/optimizing-kubernetes-pod-deployments-for-reliability-with-topology-spread-constraints">topology spread constraints</a> to control where and how our pods should be distributed, the Kubernetes scheduler placed three of them on the same node.</p><figure style="max-width:1200pxpx" class="w-richtext-align-fullwidth w-richtext-figure-type-image"><div><img alt="" src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8ef7d2adf523b4cf0d4357_Diagram%201%20%E2%80%94%20Pod%20concentration%20before%20drain.svg" loading="lazy"/></div></figure><p>‍</p><p>For details about the PDB, run <code>kubectl get pdb nginx-pdb -o yaml</code>:</p><div class="w-embed w-script"><gr-code lang="yaml">
<script type="text/plain">
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
creationTimestamp: "2026-08-19T15:44:24Z"
generation: 1
name: nginx-pdb
namespace: default
resourceVersion: "27164741"
uid: 3b153722-9d4d-4899-b73e-14d4807ada9b
spec:
maxUnavailable: 1
selector:
matchLabels:
app: nginx
status:
conditions:
- lastTransitionTime: "2026-08-19T15:45:46Z"
message: ""
observedGeneration: 1
reason: SufficientPods
status: "True"
type: DisruptionAllowed
currentHealthy: 4
desiredHealthy: 3
disruptionsAllowed: 1
expectedPods: 4
</script>
</gr-code></div><p>‍</p><p>Under status:</p><ul role="list"><li><code>conditions</code> maps out changes in the PDB’s state.</li><li><code>currentHealthy</code> is the number of healthy pods matching the selector.</li><li><code>desiredHealthy</code> is the minimum desired number of healthy pods.</li><li><code>disruptionsAllowed</code> is the number of pods that can be disrupted while still satisfying this PDB. Since <code>currentHealthy</code> and <code>desiredHealthy</code> are the same number, this leaves room for zero disruptions.</li><li><code>expectedPods</code> is the number of pods matched by the PDB’s selector.</li></ul><p>If we drain the node without a PDB, we’d lose 3/4 of our deployment. But since we defined <code>maxUnavailable: 2</code>, the PDB will evict one pod and stall on the second while Kubernetes deploys replicas onto another node. <code>currentHealthy</code> drops to 3, <code>disruptionsAllowed</code> drops to 0, and the node drain waits for the replacements to become Ready before continuing.</p><figure style="max-width:1200pxpx" class="w-richtext-align-fullwidth w-richtext-figure-type-image"><div><img alt="" src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a8ef83378ca3b03fe2c10e8_Diagram%202%20%E2%80%94%20Drain%20paced%20by%20the%20budget.svg" loading="lazy"/></div></figure><p>‍</p><p>After the new replica becomes available, the PDB allows the eviction to proceed.</p><p>‍</p><h2>How do you decide the parameters for a PDB?</h2><p>Creating a PDB only takes a few lines; the hard part is choosing the right number of unavailable pods. What’s the smallest replica count that your service can run at while still doing its job? It comes down to three factors: <strong>capacity</strong>, <strong>service level objective (SLO) tolerance</strong>, and <strong>operational throughput</strong>.</p><p>Start with capacity. What’s the minimum number of replicas needed to serve your baseline traffic? That becomes your floor. If your normal traffic could be served by two pods, two is your floor. The exception is services that require a certain number of replicas for quorum, like distributed databases and message queues. For those, keep the floor at or above quorum size, and remember that node count isn’t the whole story: for example, a Kafka cluster with three surviving brokers can still refuse writes if a partition drops below its minimum in-sync replicas.</p><p>Next, consider your service level objectives (SLOs). If dropping your floor pushes p99 latency past your SLO, the floor is too low. Keep in mind that <code>desiredHealthy</code> guarantees nothing about the remaining pods: they can still crash, get out-of-memory (OOM) killed, or go offline due to a failed node. A PDB only constrains voluntary disruptions. Involuntary disruptions stack on top of whatever the budget already permits.</p><p>Last is operational throughput, which is the cost side of the tradeoff. A narrow budget means longer maintenance cycles, since Kubernetes will need to migrate the same number of pods in fewer batches. For example, draining four pods off a node with <code>maxUnavailable: 2</code> only requires two eviction cycles (two pods per cycle), but <code>maxUnavailable: 1</code> doubles this to four cycles (one pod per cycle). On large clusters with slow containers, this can be the difference between several minutes and several hours.</p><p>‍</p><h3>How to test that your PDB holds</h3><p>Choosing a value for a PDB is one thing, and verifying that it works as expected is another. The question isn’t whether the mechanism works (that’s the job of the Kubernetes developers), but <strong>whether your service can reliably survive a voluntary disruption</strong>.</p><p>Start by scaling your deployment to the <code>desiredHealthy</code> target, then <a href="https://www.gremlin.com/blog/how-reliability-testing-and-load-testing-are-complementary">perform a load test</a> to replicate peak traffic. If you can maintain your SLOs at that level, then your budget is acceptable. You can also use Gremlin’s <a href="https://www.gremlin.com/docs/fault-injection/experiments/blackhole">blackhole experiment</a> to make pods unreachable, simulating reduced capacity so you can test without modifying your cluster.</p><p>‍</p><h3>Common hurdles when creating PDBs</h3><p>There are some unexpected “gotchas” when creating PDBs.</p><p><strong>Never allow <code>disruptionsAllowed</code> to equal 0 in steady state</strong>. If <code>minAvailable</code> equals your replica count, or <code>maxUnavailable</code> is zero, the budget permits nothing. Node drains hang, cluster upgrades stall, and the cluster autoscaler stops consolidating. The failure is silent until the next maintenance window, or an admin checks manually.</p><p><strong>Both <code>minAvailable</code> and <code>maxUnavailable</code> round up when using percentages</strong>. Rounding up a maximum makes it more permissive, not less. For example, <code>maxUnavailable: &quot;30%&quot;</code> on four replicas allows two evictions rather than one. Calculate the integer equivalent for your minimum, steady, and peak replica counts before committing to a percentage.</p><p><strong>Don’t use PDBs for single-replica deployments</strong>. A <code>minAvailable: 1</code> or <code>maxUnavailable: 0</code> budget on one replica pins <code>disruptionsAllowed</code> to zero. Expect a missing PDB audit to flag every single-replica deployment. The solution, rather than using a PDB, is to add more replicas.</p><p><strong>Broken pods can block a drain</strong>. With the default <code>IfHealthyBudget</code> policy, a pod that is <code>Running</code> but not <code>Ready</code> can only be evicted while <code>currentHealthy</code> is at or above <code>desiredHealthy</code>. Once the budget is spent, a pod in <a href="/blog/how-to-fix-kubernetes-crashloopbackoff">CrashLoopBackOff</a> can block the drain indefinitely. Setting <code>unhealthyPodEvictionPolicy: AlwaysAllow</code> lets Kubernetes evict these blocking pods. This is best used for stateless services, as stateful services may need the time to catch up on tasks such as replication.</p><p><strong>Scope your PDB selector to one service</strong>. The broader your selector, the harder it is to calculate your budget. Remember that an empty selector covers every pod in the namespace. Create separate PDBs for each service, even if their rules are identical.</p><p>‍</p><h2>How do you find deployments with missing PDBs?</h2><p>PDBs bind by label selector, so there’s no direct way to identify pods without them. Instead, you can work backwards by collecting every PDB selector in the namespace, then listing pods that match none of them:</p><div class="w-embed w-script"><gr-code lang="shell">
<script type="text/plain">
NAMESPACE="default"
# Collect the selectors we can evaluate.
# Explicitly skip matchExpressions.
SELECTORS=$(kubectl get pdb -n "$NAMESPACE" -o json | jq -c '
[ .items[]
| .spec.selector
| select(has("matchExpressions") | not)
| .matchLabels // {} ]')
# Report any PDBs this script could not evaluate
kubectl get pdb -n "$NAMESPACE" -o json | jq -r '
.items[]
| select(.spec.selector | has("matchExpressions"))
| "skipped (matchExpressions): \(.metadata.name)"' >&2
# List every pod that matches none of those selectors
kubectl get pods -n "$NAMESPACE" -o json \
| jq -r --argjson selectors "$SELECTORS" '
.items[]
| select(
(.metadata.labels // {}) as $pod
| ( $selectors
| map( to_entries | all(.[]; $pod[.key] == .value) )
| any ) | not
)
| .metadata.name'
</script>
</gr-code></div><p>‍</p><p>There are two things to note with this script: </p><ol role="list"><li>It only evaluates <code>matchLabels</code> selectors, not <code>matchExpressions</code>. Any PDB using <code>matchExpressions</code> gets skipped and its pods will show as uncovered.</li><li>It lists pods rather than workloads, so each replica appears separately alongside Job and DaemonSet pods.</li></ol><p>Once you’ve applied your PDBs, re-run this script to confirm your pods no longer appear in the output.</p><p>Manually running this script is fine for starting out, but running this per namespace or per service doesn’t scale. Gremlin includes a Detected Risk that automatically scans your cluster for deployments without a PDB. Gremlin surfaces this risk, along with <a href="/technologies/detected-risks">many other reliability risks</a>, in one report so you can see exactly which services are exposed.</p><p>‍</p><h2>Other Kubernetes risks to watch for</h2><p>PDBs are just one part of a resilient Kubernetes deployment. Pods that are <a href="/blog/optimizing-kubernetes-pod-deployments-for-reliability-with-topology-spread-constraints">unevenly distributed</a>, <a href="/blog/managing-slow-container-starts-kubernetes-readiness-probes">slow to start</a>, or <a href="/blog/how-to-set-cpu-requests-kubernetes-pods">missing resource requests</a> carry more hidden risks. To learn how to protect against these, check out our comprehensive ebook, <a href="/whitepapers/kubernetes-reliability-at-scale-how-to-improve-uptime-with-resiliency-management">Kubernetes Reliability at Scale</a>.</p><p>In the meantime, if you&#x27;d like a free report of your reliability risks in just a few minutes, you can sign up for a <a href="/trial">free 30-day Gremlin trial</a>, or use Gremlin&#x27;s <a href="/technologies/detected-risks">Detected Risks</a> feature to automatically scan your existing Kubernetes deployments for missing pod disruption budgets.</p></div><div class="full-width w-condition-invisible"><div class="w-dyn-list"><div class="empty-state w-dyn-empty"><div>No items found.</div></div></div></div><div class="blog-cta"><div class="card-base card-dark"><h4 class="card-title">K8s Reliability at Scale</h4><div class="card-content"><p class="card-body">To learn more about Kubernetes failure modes and how to prevent them at scale, download a copy of our comprehensive ebook</p><a id="blog-cta-btn" href="https://www.gremlin.com/whitepapers/kubernetes-reliability-at-scale-how-to-improve-uptime-with-resiliency-management?utm_source=cta&amp;utm_medium=webpage&amp;utm_campaign=on_page_cta_kub_rel_at_scale+" class="button button-small w-button">Get the Ultimate Guide</a></div></div></div></div><a id="w-node-_13747476-58dd-03d7-bf18-130f777d9ef7-1519e9c6" href="/author/andre-newman" target="_blank" class="author-wrap-blog text-link column-center w-inline-block"><img loading="lazy" alt="Andre Newman" src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/64edd73857be946ecb73f6ca_AndreNewman-Author2.avif" class="tutorial-author-image"/><div class="author-name">Andre Newman</div><div class="author-role">Sr. Reliability Specialist</div></a><div id="w-node-c13246f8-4fa4-9949-2201-df9fe219b78d-1519e9c6" class="blog-sidebar"><div class="flex-vertical-center"><div class="heading-h4">Related Posts</div></div><div class="spacer---quarter-height"></div><div class="w-dyn-list"><div role="list" class="grid-auto-sm w-dyn-items"><div role="listitem" class="w-dyn-item"><a href="/blog/optimizing-kubernetes-pod-deployments-for-reliability-with-topology-spread-constraints" class="sg-box border-color-default radius-sm no-underline-link sg-s100 w-inline-block"><div class="card-content"><div class="card-subtitle">Optimizing Kubernetes pod deployments for reliability with topology spread constraints</div><div class="card-body"><div class="text-body-small">August 13, 2026</div></div></div></a></div><div role="listitem" class="w-dyn-item"><a href="/blog/managing-slow-container-starts-kubernetes-readiness-probes" class="sg-box border-color-default radius-sm no-underline-link sg-s100 w-inline-block"><div class="card-content"><div class="card-subtitle">Managing slow container starts with Kubernetes readiness probes</div><div class="card-body"><div class="text-body-small">August 4, 2026</div></div></div></a></div><div role="listitem" class="w-dyn-item"><a href="/blog/how-to-set-cpu-requests-kubernetes-pods" class="sg-box border-color-default radius-sm no-underline-link sg-s100 w-inline-block"><div class="card-content"><div class="card-subtitle">How to ensure your Kubernetes Pods have enough CPU</div><div class="card-body"><div class="text-body-small">September 5, 2023</div></div></div></a></div></div></div><div class="spacer---quarter-height"></div><div class="spacer---quarter-height"></div><div class="w-dyn-list"><div class="empty-state w-dyn-empty"></div></div><div class="cta-section"></div></div></div></section><div class="hidden"><div id="w-node-bd4cc08e-79ed-2521-5785-aba8c36c9a72-c36c9a72" class="toc-sticky-wrapper"><div data-w-id="bd4cc08e-79ed-2521-5785-aba8c36c9a73" class="toc-toggle"><div class="text-style-label text-size-medium text-color-subtle">On this page</div><div class="toc-toggle-arrow w-embed"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.82733 6.91076C10.1528 6.58533 10.6804 6.58533 11.0058 6.91076L16.0058 11.9108C16.3313 12.2362 16.3313 12.7638 16.0058 13.0893C15.6804 13.4147 15.1528 13.4147 14.8273 13.0893L10.4166 8.67853L6.00584 13.0893C5.6804 13.4147 5.15277 13.4147 4.82733 13.0893C4.50189 12.7638 4.50189 12.2362 4.82733 11.9108L9.82733 6.91076Z" fill="#686868"/>
</svg></div><a href="#single-article" class="back-to-top-link w-inline-block"><div class="text-size-small">Back to top</div><div class="back-to-top-arrow w-embed"><svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 8L6 5L9 8" stroke="#6533CB" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg></div></a></div><div id="toc" data-w-id="bd4cc08e-79ed-2521-5785-aba8c36c9a7c" class="define-id-for-toc-conyainer"></div><div class="w-embed w-script"><script>
setTimeout(function() {
var dropdowns = document.querySelector("#toc");
const headings = document.querySelectorAll("#single-article h2:not(.w-condition-invisible), #single-article h3:not(.w-condition-invisible), #single-article h4:not(.w-condition-invisible)");
const tocWrapper = document.querySelector("#toc");
let offsetAdjustmentScroll = 90; // Default offset for larger viewports
if (window.innerWidth <= 768) { // Adjust the offset for viewports with width less than or equal to 768 pixels
offsetAdjustmentScroll = 70;
}
function isInViewport(element) {
if (!element) return false;
const rect = element.getBoundingClientRect();
return (
rect.bottom > 0 &&
rect.top < (window.innerHeight || document.documentElement.clientHeight)
);
}
function setActiveLink(headingText) {
const linkElement = tocWrapper.querySelector(`[href="#${headingText}"]`);
if (linkElement) {
tocWrapper.querySelectorAll(".legal-toc-link.active").forEach(link => {
link.classList.remove("active");
});
linkElement.classList.add("active");
}
}
headings.forEach((heading, index) => {
const headingText = heading.textContent.trim(); // No need to replace characters here
const idText = `toc-${headingText.replace(/[^\w\s]/gi, '').replace(/\s+/g, "-").toLowerCase()}`; // Remove special characters and numbers
const linkText = headingText.replace(/:$/, ""); // Remove colon if it appears at the end of the sentence
const link = document.createElement("a");
// URLs to ignore when adding links to headings
const exclude_from_linking = [
"/docs/api-reference-overview"
]
link.textContent = linkText;
link.setAttribute("href", `#${idText}`);
link.classList.add("legal-toc-link");
const headingLevel = heading.tagName.toLowerCase().replace('h', ''); // Extract heading level from tag name
link.classList.add(`h${headingLevel}-toc`);
tocWrapper.appendChild(link);
heading.setAttribute("id", idText);
if (!exclude_from_linking.includes(window.location.pathname)) {
heading.innerHTML = `<a style="color: var(--deep-purple); text-decoration: none;" href="#${idText}">${headingText}</a>`
};
link.addEventListener("click", function(event) {
if ($(window).width() < 768) {
setTimeout(function() {
console.log("close")
$(".toc-toggle").click()
}, 500)
}
event.preventDefault();
event.stopPropagation();
event.stopImmediatePropagation();
const targetHeading = document.querySelector(this.getAttribute("href"));
let offsetAdjustment = 70; // Default offset for larger viewports
if (window.innerWidth <= 768) { // Adjust the offset for viewports with width less than or equal to 768 pixels
offsetAdjustment = 70;
}
const offsetTop = targetHeading.getBoundingClientRect().top;
const scrollPosition = window.pageYOffset + offsetTop - offsetAdjustment;
window.scrollTo({
top: scrollPosition,
behavior: "smooth"
});
});
});
window.addEventListener("scroll", () => {
const scrollPosition = window.pageYOffset;
let activeHeading = null;
for (let i = headings.length - 1; i >= 0; i--) {
const heading = headings[i];
const offsetTop = heading.getBoundingClientRect().top;
const targetScrollPosition = window.pageYOffset + offsetTop - offsetAdjustmentScroll; // Adjust the offset as needed
if (scrollPosition >= targetScrollPosition) {
activeHeading = heading;
break;
}
}
if (activeHeading) {
const headingText = activeHeading.getAttribute("id");
setActiveLink(headingText);
}
});
function scrollActiveLinkIntoView() {
const activeLink = tocWrapper.querySelector(".legal-toc-link.active");
if (activeLink) {
const containerRect = tocWrapper.getBoundingClientRect();
const linkRect = activeLink.getBoundingClientRect();
const offset = linkRect.top - containerRect.top;
if (offset >= 0 && offset <= tocWrapper.clientHeight - activeLink.clientHeight) {
return;
}
let scrollPosition;
if (offset < 0) {
scrollPosition = activeLink.offsetTop;
} else {
scrollPosition = activeLink.offsetTop - tocWrapper.clientHeight + activeLink.clientHeight;
}
tocWrapper.scrollTo({
top: scrollPosition,
behavior: 'smooth',
});
}
}
function debounce(func, delay) {
let timer;
return function() {
const context = this;
const args = arguments;
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(context, args);
}, delay);
};
}
const debouncedScrollActiveLinkIntoView = debounce(scrollActiveLinkIntoView, 40); // Adjust the delay time as needed
window.addEventListener("scroll", debouncedScrollActiveLinkIntoView);
}, 200);
document.addEventListener('DOMContentLoaded', function() {
var tocElement = document.querySelector('.table-of-content-wrap');
if (tocElement) {
setTimeout(function() {
tocElement.classList.add('visible');
}, 500);
}
});
</script>
<script>
setTimeout(() => {
// Assuming tocLink is a variable containing the text
var tocLink = "Example H2";
// Get the element with the class 'table-of-content-wrap'
var tocElement = document.querySelector('.table-of-content-wrap');
// Check if tocLink is present in the text content of tocElement
if (tocElement && tocElement.textContent.includes(tocLink)) {
// Hide the element
tocElement.style.display = 'none';
const lazar1 = document.querySelector('#lazar-1');
lazar1.style.gridColumn = 'span 7';
const lazar2 = document.querySelector('#lazar-2');
lazar2.style.gridColumn = 'span 7';
}
}, 300);
</script></div><div><div class="toc-devider"></div><div class="text-style-label text-size-medium text-color-muted">RELATED PAGES</div><div class="spacer---quarter-height"></div><div class="w-dyn-list"><div role="list" class="flex-vertical gap-s w-dyn-items"><div role="listitem" class="w-dyn-item"><a href="/docs/fault-injection-experiments-processkiller" class="no-underline-link w-inline-block"><div class="text-style-label">Process Killer Experiment</div><div class="text-body-small">The Process Killer experiment sends an IPC signal to kill, stop, or run any other signal on targeted processes.</div></a></div><div role="listitem" class="w-dyn-item"><a href="/docs/getting-started-helm-additional-configuration" class="no-underline-link w-inline-block"><div class="text-style-label">Additional Configuration for Helm</div><div class="text-body-small">Some environments require additional configuration. Review the following sections to find the best configuration for…</div></a></div><div role="listitem" class="w-dyn-item"><a href="/docs/getting-started-install-kubernetes-helm" class="no-underline-link w-inline-block"><div class="text-style-label">Installing Gremlin on Kubernetes with Helm</div><div class="text-body-small">The Gremlin Helm Chart is the easiest way to install the Gremlin Agent on Kubernetes.</div></a></div></div></div></div></div></div><div class="recommended-wrapper"><div class="recommended-collection w-dyn-list"><div id="recommended-wrapper" role="list" class="recommended-collection-list w-dyn-items"><div role="listitem" class="recommended-collection-item w-dyn-item"><section class="section---compact relative gradient"><div class="container"><div class="column featured-blog-copy"><div class="blog-info-wrap"><div>August 13, 2026</div><div>-</div><div>7 min read</div></div><a href="/blog/optimizing-kubernetes-pod-deployments-for-reliability-with-topology-spread-constraints" class="featured-hero w-inline-block"><h2 class="heading-xl-blog text-neutral">Optimizing Kubernetes pod deployments for reliability with topology spread constraints</h2></a><p class="bfeatured-blog-description text-neutral">Topology spread constraints control how Kubernetes replicates pods across failure domains, like zones and regions. Learn how they work in this blog post.</p><div class="devider-line"></div><div class="flex-vertical w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="margin-bottom-xs w-dyn-item"><a href="https://www.gremlin.com/blog?webflow%5Bmenu%5D%5BcategoriesWebflow%5D=Kubernetes" class="eyebrow-pill no-underline-link w-inline-block"><div class="eyebrow-text">Kubernetes</div></a></div><div role="listitem" class="margin-bottom-xs w-dyn-item"><a href="https://www.gremlin.com/blog?webflow%5Bmenu%5D%5BcategoriesWebflow%5D=Gremlin" class="eyebrow-pill no-underline-link w-inline-block"><div class="eyebrow-text">Gremlin</div></a></div><div role="listitem" class="margin-bottom-xs w-dyn-item"><a href="https://www.gremlin.com/blog?webflow%5Bmenu%5D%5BcategoriesWebflow%5D=Features" class="eyebrow-pill no-underline-link w-inline-block"><div class="eyebrow-text">Features</div></a></div></div></div></div><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a7dd87b9fbd815435905ea9_Blog%20Headers.avif" loading="eager" alt="Optimizing Kubernetes pod deployments for reliability with topology spread constraints" class="recommended-articles-cover-image-copy"/></div></section><section class="section recommended-cta"><div class="container grid"><div id="w-node-bd3097a1-ce57-f191-ae4c-3ebd44508355-1519e9c6" class="recommended-article-author"><img loading="lazy" alt="Andre Newman" src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/64edd73857be946ecb73f6ca_AndreNewman-Author2.avif" class="tutorial-author-image"/><div class="author-name">Andre Newman</div><div class="author-role">Sr. Reliability Specialist</div></div><div id="w-node-ca955902-ec30-e070-4dc6-86bdf56ce3f1-1519e9c6" class="column gap-2rem"><p class="recommended-description">Topology spread constraints let you determine how Kubernetes spreads pod replicas across failure domains, such as availability zones and regions. This blog explains how they work, how to configure them, and how to scan for missing constraints.</p><a href="/blog/optimizing-kubernetes-pod-deployments-for-reliability-with-topology-spread-constraints" class="button-variant w-button">Read more</a></div></div></section></div><div role="listitem" class="recommended-collection-item w-dyn-item"><section class="section---compact relative gradient"><div class="container"><div class="column featured-blog-copy"><div class="blog-info-wrap"><div>August 4, 2026</div><div>-</div><div>6 min read</div></div><a href="/blog/managing-slow-container-starts-kubernetes-readiness-probes" class="featured-hero w-inline-block"><h2 class="heading-xl-blog text-neutral">Managing slow container starts with Kubernetes readiness probes</h2></a><p class="bfeatured-blog-description text-neutral">Pods without readiness probes are like engineers without coffee. Learn how readiness probes work, why they’re important, and how to configure them correctly.</p><div class="devider-line"></div><div class="flex-vertical w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="margin-bottom-xs w-dyn-item"><a href="https://www.gremlin.com/blog?webflow%5Bmenu%5D%5BcategoriesWebflow%5D=Kubernetes" class="eyebrow-pill no-underline-link w-inline-block"><div class="eyebrow-text">Kubernetes</div></a></div></div></div></div><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6a70debb40f15c68d7190eb0_Blog%20Headers.avif" loading="eager" alt="Managing slow container starts with Kubernetes readiness probes" class="recommended-articles-cover-image-copy"/></div></section><section class="section recommended-cta"><div class="container grid"><div id="w-node-bd3097a1-ce57-f191-ae4c-3ebd44508355-1519e9c6" class="recommended-article-author"><img loading="lazy" alt="Andre Newman" src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/64edd73857be946ecb73f6ca_AndreNewman-Author2.avif" class="tutorial-author-image"/><div class="author-name">Andre Newman</div><div class="author-role">Sr. Reliability Specialist</div></div><div id="w-node-ca955902-ec30-e070-4dc6-86bdf56ce3f1-1519e9c6" class="column gap-2rem"><p class="recommended-description">Pods without readiness probes are like engineers without coffee. Learn how readiness probes work, why they’re important, and how to configure them correctly.</p><a href="/blog/managing-slow-container-starts-kubernetes-readiness-probes" class="button-variant w-button">Read more</a></div></div></section></div><div role="listitem" class="recommended-collection-item w-dyn-item"><section class="section---compact relative gradient"><div class="container"><div class="column featured-blog-copy"><div class="blog-info-wrap"><div>September 5, 2023</div><div>-</div><div>3 min read</div></div><a href="/blog/how-to-set-cpu-requests-kubernetes-pods" class="featured-hero w-inline-block"><h2 class="heading-xl-blog text-neutral">How to ensure your Kubernetes Pods have enough CPU</h2></a><p class="bfeatured-blog-description text-neutral">How much CPU should you reserve for your Pod containers? Read this blog to learn how Gremlin can detect underprovisioned or missing CPU requests in your Kubernetes clusters.</p><div class="devider-line"></div><div class="flex-vertical w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="margin-bottom-xs w-dyn-item"><a href="https://www.gremlin.com/blog?webflow%5Bmenu%5D%5BcategoriesWebflow%5D=Kubernetes" class="eyebrow-pill no-underline-link w-inline-block"><div class="eyebrow-text">Kubernetes</div></a></div><div role="listitem" class="margin-bottom-xs w-dyn-item"><a href="https://www.gremlin.com/blog?webflow%5Bmenu%5D%5BcategoriesWebflow%5D=Features" class="eyebrow-pill no-underline-link w-inline-block"><div class="eyebrow-text">Features</div></a></div></div></div></div><img src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/6576e6812d83e2dbd5195740_Chaos_Engineering_Tools__Build_vs_Buy.webp" loading="eager" alt="How to ensure your Kubernetes Pods have enough CPU" class="recommended-articles-cover-image-copy"/></div></section><section class="section recommended-cta"><div class="container grid"><div id="w-node-bd3097a1-ce57-f191-ae4c-3ebd44508355-1519e9c6" class="recommended-article-author"><img loading="lazy" alt="Andre Newman" src="https://cdn.prod.website-files.com/64a52fe92f1fc7debc3007b0/64edd73857be946ecb73f6ca_AndreNewman-Author2.avif" class="tutorial-author-image"/><div class="author-name">Andre Newman</div><div class="author-role">Sr. Reliability Specialist</div></div><div id="w-node-ca955902-ec30-e070-4dc6-86bdf56ce3f1-1519e9c6" class="column gap-2rem"><p class="recommended-description">A common risk is deploying Pods without setting a CPU request. While it may seem like a low-impact, low-severity issue, not using CPU requests can have a big impact, including preventing your Pod from running. In this blog, we explain why missing CPU requests is a risk, how you can detect it using Gremlin, and how you can address it.</p><a href="/blog/how-to-set-cpu-requests-kubernetes-pods" class="button-variant w-button">Read more</a></div></div></section></div></div></div></div></div><footer data-wf--footer--variant="base" class="footer-section"><div class="container grid footer"><div id="w-node-bb321875-f31f-ed58-6286-722404cebaa9-654d2164" class="container grid-newsletter-form card-base card-gradient-deep"><div id="w-node-efa20e27-2b30-0e54-ff0c-cfb834f5c6b4-654d2164" class="column"><p class="text-subtitle-large text-neutral">Join the Gremlin newsletter</p><div class="spacer---quarter-height"></div><p class="paragraph-small---dark">Sign up for news and best practices from Gremlin</p></div><div id="w-node-_95554617-738a-6869-adb4-9833a7cf7759-654d2164" class="spacer"></div><div id="w-node-_3ee85ca3-854c-3d8e-ebf4-5f81294b57e1-654d2164" class="footer-form-wrapper"><div class="footer-subscribe-form hide w-form"><form id="email-form" name="email-form" data-name="Email Form" method="get" data-wf-page-id="65a84319e1dd4b961519e9c6" data-wf-element-id="7f0bc1d4-fc49-a36b-81ab-3a2d124d5de7" data-turnstile-sitekey="0x4AAAAAAAQTptj2So4dx43e"><label for="email" class="input-label">Email Address:</label><div class="input-wrap"><input class="input-field w-input" maxlength="256" name="email" data-name="Email" placeholder="" type="email" id="email" required=""/><a id="fake-submit" data-w-id="cf1268f9-2989-2e1e-b2cf-9b8324b6bb4f" href="#" class="submit-button w-inline-block"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/64e839658c74f4adb98c1249_SVG%20copy.svg" loading="lazy" alt="Arrow Icon" class="submit-icon"/></a></div><input type="submit" data-wait="Please wait..." id="submit" class="button hide w-button" value="Submit"/></form><div class="success-message w-form-done"><div>Email confirmation sent!</div></div><div class="w-form-fail"><div>Oops! Something went wrong while submitting the form.</div></div></div><div class="full-width w-embed"><div class="hs-form-frame" data-region="na1" data-form-id="8f0825b7-224f-4dd6-8701-f9f162661c57" data-portal-id="48295595"></div></div></div></div><div class="cookies hide-in-designer"><div id="consentPopup" fs-cc="banner" class="fs-cookie-popup-prod shadow"><div class="cookie-text-wrap"><p class="rich-text-small text-color-dark">We use cookies to analyze website traffic, serve personalized content, and improve your browsing experience. By clicking &quot;Accept&quot;, you consent to our use of cookies. See our <a href="/privacy" target="_blank">Privacy Policy</a> for more information.</p></div><div id="w-node-ce2a821c-5c62-d312-7328-6097d9074ba5-654d2164" class="button-wrapper-3"><a fs-cc="open-preferences" id="w-node-ce2a821c-5c62-d312-7328-6097d9074baa-654d2164" href="#" class="preferences-link-2">Preferences</a><a fs-cc="deny" id="w-node-ce2a821c-5c62-d312-7328-6097d9074ba8-654d2164" href="#" class="nav-button variant w-button">Reject</a><a fs-cc="allow" id="w-node-ce2a821c-5c62-d312-7328-6097d9074ba6-654d2164" href="#" class="button w-button">Accept</a></div></div><div fs-cc="preferences" class="fs-preferences-manager-wrapper"><div class="preferences-container"><a fs-cc="close" href="#" class="close-top-bar-icon w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/68b8510ed3e434954be8c87a_np_close_25798_27313D.svg" alt="" class="image-3"/></a><div class="blog-card-heading">Preferences</div><p class="paragraph-xxs">You have the option to disable cookies that are not essential for the website&#x27;s basic functionality. Please note that disabling these may negatively impact your browsing experience. See our <a href="/privacy" target="_blank">privacy policy</a> for more information.</p><div class="consents-form w-form"><form id="wf-form-Consent-Form" name="wf-form-Consent-Form" data-name="Consent Form" method="get" data-wf-page-id="65a84319e1dd4b961519e9c6" data-wf-element-id="ce2a821c-5c62-d312-7328-6097d9074bba" data-turnstile-sitekey="0x4AAAAAAAQTptj2So4dx43e"><div class="grid"><div class="text-div"><label for="name" class="paragraph-small">Essential</label><p class="paragraph-xxs">These are required for basic website functionality.<br/></p></div><p id="w-node-ce2a821c-5c62-d312-7328-6097d9074bc2-654d2164" class="bold">Required</p></div><div class="grid"><div class="text-div"><label for="name" class="paragraph-small">Marketing</label><p class="paragraph-xxs">These allow us to provide you with more relevant content and a more personalized experience.<br/></p></div><label id="w-node-ce2a821c-5c62-d312-7328-6097d9074bcc-654d2164" class="w-checkbox"><div class="w-checkbox-input w-checkbox-input--inputType-custom checkbox-2 w--redirected-checked"></div><input type="checkbox" name="checkbox-4" id="checkbox-4" data-name="Checkbox 4" fs-cc-checkbox="marketing" style="opacity:0;position:absolute;z-index:-1" checked=""/><span class="checkbox-label-2 w-form-label" for="checkbox-4"></span></label></div><div fs-cc-checkbox="analytics" class="grid"><div class="text-div"><label for="name" class="paragraph-small">Analytics</label><p class="paragraph-xxs">These help us understand how our website is performing, how visitors are using it, and what (if any) technical issues are affecting usability.</p></div><label id="w-node-ce2a821c-5c62-d312-7328-6097d9074be0-654d2164" class="w-checkbox"><div class="w-checkbox-input w-checkbox-input--inputType-custom checkbox-2 w--redirected-checked"></div><input type="checkbox" name="checkbox-3" id="checkbox-3" data-name="Checkbox 3" fs-cc-checkbox="analytics" style="opacity:0;position:absolute;z-index:-1" checked=""/><span class="checkbox-label-2 w-form-label" for="checkbox-3"></span></label></div><div class="cta-button-wrapper align-right"><input type="submit" data-wait="Please wait..." fs-cc="submit" class="button w-button" value="Confirm"/></div></form><div class="success-message w-form-done"><div>Your preferences have been saved.</div></div><div class="w-form-fail"><div>Oops! Something went wrong while submitting the form.</div></div></div></div></div></div><div id="w-node-bee6ded2-a5b3-e226-6e52-b0da0e7ea06f-654d2164" class="column _0-5rem-gap mobile"><div class="footer-label">COMPANY</div><a href="/demo" class="footer-link">Get a demo</a><a href="/about" class="footer-link">About Gremlin</a><a href="/team" class="footer-link">Careers</a><a href="/contact" class="footer-link">Contact Us</a><a href="/customers" class="footer-link">Customers</a><a href="/partners" class="footer-link">Partners</a><a href="/product" class="footer-link">Product</a></div><div id="w-node-ff7a35de-38a5-810d-0fef-2b16f0086175-654d2164" class="column _0-5rem-gap mobile"><div class="footer-label">RESOURCES</div><a href="/resources" class="footer-link">All Resources</a><a href="/blog" class="footer-link">Blog</a><a href="/docs" class="footer-link">Docs</a><a href="/demo-center" class="footer-link">Demo Center</a><a href="/certification" class="footer-link">Certification</a><a href="/security" class="footer-link">Security</a><a href="https://support-site.gremlin.com/" target="_blank" class="footer-link">Support Center</a></div><div id="w-node-c609f962-9467-af7f-8067-052de34a7e9f-654d2164" class="column _0-5rem-gap mobile"><div class="footer-label">Solutions</div><div class="w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="footer-collection-item w-dyn-item"><a href="/solutions/retail" target="_blank" class="footer-link">Retail</a></div><div role="listitem" class="footer-collection-item w-dyn-item"><a href="/solutions/finserve" target="_blank" class="footer-link">FinServ</a></div><div role="listitem" class="footer-collection-item w-dyn-item"><a href="/solutions/saas" target="_blank" class="footer-link">SaaS</a></div></div></div></div><div id="w-node-_32e5999e-541b-d8a5-9fef-2d0d70c8749f-654d2164" class="column _0-5rem-gap mobile"><div class="footer-label">Technologies</div><div class="w-dyn-list"><div role="list" class="collection-list w-dyn-items"><div role="listitem" class="footer-collection-item w-dyn-item"><a href="/technologies/dependency-discovery" target="_blank" class="footer-link">Dependency Discovery</a></div><div role="listitem" class="footer-collection-item w-dyn-item"><a href="/technologies/detected-risks" target="_blank" class="footer-link">Detected Risks</a></div><div role="listitem" class="footer-collection-item w-dyn-item"><a href="/technologies/disaster-recovery-testing" target="_blank" class="footer-link">Disaster Recovery Testing</a></div><div role="listitem" class="footer-collection-item w-dyn-item"><a href="/technologies/failure-flags" target="_blank" class="footer-link">Failure Flags</a></div><div role="listitem" class="footer-collection-item w-dyn-item"><a href="/technologies/fault-injection" target="_blank" class="footer-link">Fault Injection</a></div><div role="listitem" class="footer-collection-item w-dyn-item"><a href="/technologies/gremlin-private-edition" target="_blank" class="footer-link">Gremlin Private Edition</a></div><div role="listitem" class="footer-collection-item w-dyn-item"><a href="/technologies/reliability-intelligence" target="_blank" class="footer-link">Reliability Intelligence</a></div><div role="listitem" class="footer-collection-item w-dyn-item"><a href="/technologies/reliability-scoring" target="_blank" class="footer-link">Reliability Scoring</a></div></div></div></div><div id="w-node-_93dabfc0-1c9c-bc82-7b83-0c3b0e662253-654d2164" class="column _0-5rem-gap mobile"><div class="footer-label">FEATURED</div><a href="/webinars/speed-and-resilience-how-to-build-reliability-guardrails-for-ai-driven-development" class="footer-link">Building reliability guardrails for AI-driven development</a><a href="/whitepapers/close-the-reliability-gap" class="footer-link">Ebook: Closing the Reliability Gap</a><a href="/blog/what-is-reliability-management/" class="footer-link">What is Reliability Management?</a><a href="/blog/how-gremlins-reliability-score-works/" class="footer-link">How Gremlin&#x27;s Reliability Score Works</a><a href="/whitepapers/how-to-scale-chaos-engineering" class="footer-link">How to scale Chaos Engineering</a></div><div id="w-node-bfc22755-c42f-6cf8-482d-25a7a23deefb-654d2164" class="column _0-5rem-gap mobile"><div class="footer-label">COMPARE</div><div class="w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="w-dyn-item"><div class="w-embed"><a class="footer-link" href="/compare/gremlin-vs-steadybit">Gremlin vs. Steadybit</a></div></div><div role="listitem" class="w-dyn-item"><div class="w-embed"><a class="footer-link" href="/compare/gremlin-vs-harness-resilience-testing">Gremlin vs. Harness Resilience Testing</a></div></div><div role="listitem" class="w-dyn-item"><div class="w-embed"><a class="footer-link" href="/compare/gremlin-vs-aws-fis">Gremlin vs. AWS FIS & Resilience Hub</a></div></div></div></div></div><div id="w-node-be7d47bf-f3bc-7c73-82ca-5a623cb658fc-654d2164" class="column"><div class="footer-label">LEGAL</div><a href="/terms" class="footer-link">Terms</a><a href="/privacy" class="footer-link">Privacy</a><a fs-cc="open-preferences" href="#" class="footer-link">Preferences</a></div><div id="w-node-f56878db-d23d-0c23-f576-64c323bd3988-654d2164" class="column"><div class="w-dyn-list"><div role="list" class="w-dyn-items"><div role="listitem" class="w-dyn-item"><a href="https://secure-stats.pingdom.com/xf7vwkfqygcb" class="flex-horizontal no-underline-link w-inline-block"><div id="pd-indicator" class="dot"></div><div> </div><div id="pd-status" class="footer-label">Loading...</div><div class="w-condition-invisible w-embed w-script"><script>
const status_success = {
message: "99.999% uptime, thanks to Gremlin",
indicator: "lime"
};
const status_fail = {
message: "Service disruption",
indicator: "red"
};
const status_unknown = {
message: "Service status unavailable",
indicator: "lightgray"
};
let status = {};
switch("up") {
case "up":
status = status_success;
break;
case "down":
status = status_fail;
break;
default:
status = status_unknown;
};
const el = document.getElementById("pd-status");
el.textContent = status.message;
const ind = document.getElementById("pd-indicator");
ind.style = "background-color: " + status.indicator + ";";
</script></div></a></div></div></div></div><div id="w-node-e7f1b365-5303-fc07-24fc-6b6ff08bd583-654d2164" class="column grid-4-col"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/6851897825de2cd24cf2caaf_21972-312_SOC_NonCPA-min.png" loading="lazy" alt="The SOC logo" class="card-icon-image"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/655b36e11dd80a8c48ad3245_gdpr.svg" loading="lazy" alt="" class="card-icon-image"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/655b36e1557a0a7fd6df93df_owasp.svg" loading="lazy" alt="" class="card-icon-image"/><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/655b36e127bb0b39f6666b7f_nist.svg" loading="lazy" alt="" class="card-icon-image"/></div><div id="w-node-fd83409d-0f8f-fa9f-84e6-b0d7663fceb0-654d2164" class="footer-devider"></div><div id="w-node-_73c87ccf-69c8-d53d-9241-241543a429d2-654d2164" class="column _0-25rem-gap mobile"><a href="/" class="nav-brand-footer w-nav-brand"><div class="w-embed"><svg viewBox="0 0 140 30" fill="currentColor" xmlns="http://www.w3.org/2000/svg" class="css-gea78w"><path d="M26.823 7.575l-5.08 3.239c-.224-.286-.425-.516-.597-.765C19.188 7.2 16.45 5.98 13.061 6.64c-3.45.672-5.653 2.868-6.524 6.23-.968 3.743.586 7.636 3.737 9.637 2.445 1.553 5.059 1.686 7.718.703 1.876-.694 3.053-2.097 3.742-4.173h-6.57v-5.084h13.081c.269 1.906.13 3.756-.335 5.577-1.673 6.563-7.559 10.582-14.524 9.944-6.61-.606-11.9-5.361-13.134-11.81C-1.46 8.728 5.784.37 14.99.65c4.604.14 8.291 2.007 11.042 5.662.276.367.49.78.79 1.264zM97.94 28.968h-5.751c-.025-.451-.067-.864-.067-1.277-.006-3.126.004-6.253-.01-9.379-.003-.542-.034-1.099-.161-1.623-.358-1.477-1.39-2.32-2.834-2.393-1.517-.077-2.767.647-3.242 2.046-.258.762-.376 1.602-.39 2.41-.048 2.93-.026 5.86-.03 8.79v1.382h-5.822c-.021-.409-.06-.822-.062-1.235-.005-3.126.006-6.253-.013-9.379-.003-.58-.048-1.177-.198-1.735-.383-1.43-1.373-2.202-2.798-2.277-1.462-.078-2.725.605-3.197 1.937-.293.83-.42 1.75-.437 2.635-.055 2.89-.026 5.783-.03 8.674v1.38h-5.786V9.657h5.695l.182 1.988c1.707-1.733 3.55-2.626 5.818-2.568 2.29.058 4.114.96 5.523 2.85.556-.425 1.05-.796 1.536-1.174 2.075-1.61 4.446-1.987 6.952-1.475 3.135.641 5.117 3.147 5.171 6.559.067 4.141.027 8.284.029 12.426 0 .191-.041.382-.078.705zM53.595 24.426c-1.67-.52-2.592-1.763-3.127-3.546h14.657c-.127-1.393-.122-2.606-.362-3.77-1.448-7.01-7.415-9.187-12.842-7.502-4.187 1.3-6.953 5.262-6.958 9.759-.005 4.303 2.773 8.122 6.929 9.53 4.387 1.487 9.128.134 11.814-3.38.18-.234.308-.506.493-.815l-4.11-2.797c-1.613 2.473-3.762 3.371-6.494 2.52zm1.572-10.627c2.234-.017 3.764 1.166 4.139 3.285h-8.417c.298-1.88 2.125-3.268 4.277-3.285zM139.904 28.952h-5.725c-.024-.403-.069-.813-.07-1.222-.006-3.123 0-6.246-.008-9.37-.001-.466-.008-.942-.099-1.396-.313-1.558-1.293-2.483-2.754-2.655-1.64-.194-3.064.522-3.65 1.99-.281.704-.41 1.51-.421 2.271-.047 3.005-.02 6.012-.02 9.018v1.349h-5.807V9.654h5.71l.175 1.89c.409-.317.71-.539.998-.776 2.242-1.854 4.789-2.125 7.46-1.243 2.66.878 4.262 3.317 4.288 6.392.035 4.06.011 8.12.007 12.18 0 .264-.051.527-.084.855zM101.936 1.24h5.718v27.713h-5.718V1.241zM30.983 28.905V9.625c1.887-.138 3.752-.078 5.715-.022v19.213c-.785.254-3.964.32-5.715.09zM111.64 28.95V9.65h5.72v19.3h-5.72zM117.993 4.156c-.017 1.964-1.59 3.475-3.575 3.437-1.92-.037-3.457-1.567-3.471-3.456-.015-1.923 1.584-3.499 3.548-3.495 1.987.003 3.516 1.539 3.498 3.514zM41.636 9.1c1.979.011 3.504 1.536 3.494 3.493a3.488 3.488 0 01-3.54 3.468c-1.943-.015-3.523-1.596-3.51-3.514.013-1.927 1.592-3.459 3.556-3.447z" fill="currentColor"></path></svg></div></a><div class="copyright-label">© 2026 Gremlin Inc. Claymont, DE 19703</div></div><div id="w-node-ea526ae5-63c3-248c-0936-225f79bf9094-654d2164" class="social-wrap"><a href="https://www.linkedin.com/company/gremlin-inc./" target="_blank" class="social-link w-inline-block"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/64e82bfcf4507a268c7b46fd_Vector%20copy%202.svg" loading="lazy" alt="Linkedin Icon" class="social-icon"/></a><a href="https://twitter.com/GremlinInc" target="_blank" class="social-link w-inline-block"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/658036aba175ab06e0f8409d_x-social-media-white-icon.webp" loading="lazy" alt="X icon for the social media site" class="social-icon"/></a><a href="https://www.facebook.com/gremlininc/" target="_blank" class="social-link w-inline-block"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/64e82bfc43656941aba4fa2e_Vector%20copy.svg" loading="lazy" alt="Facebook Icon" height="Auto" class="social-icon"/></a><a href="https://www.instagram.com/thegremlininc/" target="_blank" class="social-link hidden w-inline-block"><img src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/64e82bfc43656941aba4fa67_SVG.svg" loading="lazy" alt="Instagram Icon" class="social-icon"/></a></div></div><div class="container grid"></div><div class="hide w-embed"><style>
.bg-blue-gradient {
background: linear-gradient(to right, #2F2256,#2f285e,#2f2e67,#2f3470,#2f3b79,#304182,#30478b,#304d94,#30549d,#305aa6,#3160ae,#3166b7,#316dc0,#3173c9,#3179d2,#327fdb,#3286e4,#328ced,#3292f6,#39f);
}
html.wf-design-mode .fs-preferences-manager-wrapper {
display: none;
}
</style></div></footer><script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=64a5291e7847ac04fe1531ad" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script><script src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/js/gremlin-x-flowninja.schunk.f2efb3c5440a81cf.js" type="text/javascript" integrity="sha384-VK02VJvMib7ytrF5M2joPWNtDQs366FZgEQ5B+Iwnjx0WBnwQXfootyziSYxdrmS" crossorigin="anonymous"></script><script src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/js/gremlin-x-flowninja.schunk.9bd8518a76d24464.js" type="text/javascript" integrity="sha384-oBilCcrz+7t5MeSfBFMLkYxHml+atiLZ6oY9eQgEifU+2BeTqYJjo/BugX8bPxDF" crossorigin="anonymous"></script><script src="https://cdn.prod.website-files.com/64a5291e7847ac04fe1531ad/js/gremlin-x-flowninja.8c917dbe.c16cc5ea4227a54d.js" type="text/javascript" integrity="sha384-VKApN6OmYx9+M5TszQQC5UDjZzpE1A3jZdVOv+1YwBIqY0UhDwtZA3QKlwJ2Fy1K" crossorigin="anonymous"></script><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MRKZ93T" height="0" width="0" style="display: none; visibility: hidden" aria-hidden="true"></iframe></noscript>
<!-- Disable Scroll Script -->
<script>
var Webflow = Webflow || [];
Webflow.push(function () {
var $body = $(document.body);
var scrollPosition = 0;
$('[scroll="disable"]').on('click', function () {
var oldWidth = $body.innerWidth();
scrollPosition = window.pageYOffset;
$body.css('overflow', 'hidden');
$body.css('position', 'fixed');
$body.css('top', `-${scrollPosition}px`);
$body.width(oldWidth);
});
$('[scroll="enable"]').on('click', function () {
if ($body.css('overflow') != 'hidden') {
scrollPosition = window.pageYOffset;
}
$body.css('overflow', '');
$body.css('position', '');
$body.css('top', '');
$body.width('');
$(window).scrollTop(scrollPosition);
});
$('[scroll="both"]').on('click', function () {
if ($body.css('overflow') !== 'hidden') {
var oldWidth = $body.innerWidth();
scrollPosition = window.pageYOffset;
$body.css('overflow', 'hidden');
$body.css('position', 'fixed');
$body.css('top', `-${scrollPosition}px`);
$body.width(oldWidth);
} else {
$body.css('overflow', '');
$body.css('position', '');
$body.css('top', '');
$body.width('');
$(window).scrollTop(scrollPosition);
}
});
});
</script>
<!-- Custom popout component -->
<script>
class Popout extends HTMLElement {
connectedCallback() {
let type = this.getAttribute('type') || 'note';
const title = this.getAttribute('title') || 'Note';
const body = this.innerHTML;
// Identify note type using title for backwards compatability. All future notes should use the type field
const types = ["note", "warning", "important"];
const lowerTitle = title.toLowerCase();
if (lowerTitle !== type && types.includes(lowerTitle)){
type = lowerTitle;
}
// Get color scheme
let colorscheme = "card-base card-small card-shadow";
switch(type) {
case "warning":
colorscheme += " card-highlight";
break;
case "important":
colorscheme += " card-gradient-deep";
break;
default:
colorscheme += " card-gradient-orchid";
break;
}
this.innerHTML = `
<div class="${colorscheme}">
${title ? `<div class="card-title">${title}</div>` : ''}
<div class="card-body">${body}</div>
</div>`;
/*
this.innerHTML = `
<div fs-richtext-component="block-content" class="block-in-rich-text">
${title ? `<div class="tip-card-title green-tip">${title}</div>` : ''}
<div>${body}</div>
</div>`;
*/
}
}
customElements.define('gr-popout', Popout);
</script>
<style>
gr-popout { display: block; } /* unknown elements are inline by default */
gr-popout:not(:defined) { visibility: hidden; } /* avoids a flash of unstyled text */
</style>
<!-- End custom popout component -->
<!-- Custom code block component -->
<script>
(function () {
const COPY_SVG = '<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round" class="CK__Icon css-1ea9lxr"><g stroke="currentColor" fill-rule="evenodd" stroke-width="1.5"><path d="M10.9 8.7h9.9c1.2 0 2.2 1 2.2 2.2v9.9c0 1.2-1 2.2-2.2 2.2h-9.9c-1.2 0-2.2-1-2.2-2.2v-9.9c0-1.2 1-2.2 2.2-2.2z"></path><path d="M4.3 15.3H3.2c-1.2 0-2.2-1-2.2-2.2V3.2C1 2 2 1 3.2 1h9.9c1.2 0 2.2 1 2.2 2.2v1.1"></path></g></svg>';
const LABELS = {
js: 'JavaScript', javascript: 'JavaScript', ts: 'TypeScript',
py: 'Python', python: 'Python', yaml: 'YAML', yml: 'YAML',
shell: 'Shell', bash: 'Shell', sh: 'Shell', json: 'JSON',
go: 'Go', hcl: 'HCL', kubernetes: 'Kubernetes'
};
let instance = 0;
function dedent(src) {
const lines = src.replace(/\t/g, ' ').split('\n');
while (lines.length && !lines[0].trim()) lines.shift();
while (lines.length && !lines[lines.length - 1].trim()) lines.pop();
if (!lines.length) return '';
const pad = Math.min(...lines.filter(l => l.trim())
.map(l => l.match(/^ */)[0].length));
return lines.map(l => l.slice(pad)).join('\n');
}
function div(className) {
const el = document.createElement('div');
if (className) el.className = className;
return el;
}
class CodeBlock extends HTMLElement {
connectedCallback() {
const raw = this.querySelector('script[type="text/plain"]');
const source = dedent(raw ? raw.textContent : this.textContent);
const lang = (this.getAttribute('lang') || 'plaintext').toLowerCase();
const label = this.getAttribute('label') || LABELS[lang] || lang;
const n = ++instance;
const suffix = n === 1 ? '' : '-' + n;
const wrapper = div('code-higlight-wrapper'); // sic — matches your class
const header = div('code-highlight-header');
const langWrap = div('code-language-wrapper');
const langText = div();
langText.textContent = label.toUpperCase();
langWrap.append(langText);
const copyWrap = div('copy-icon-wrapper');
const copyIcon = div('copy-icon w-embed');
copyIcon.setAttribute('fs-copyclip-element', 'click' + suffix);
copyIcon.setAttribute('fs-copyclip-message', 'Copied!');
copyIcon.setAttribute('role', 'button');
copyIcon.setAttribute('tabindex', '0');
copyIcon.setAttribute('aria-label', 'Copy code');
copyIcon.innerHTML = COPY_SVG;
copyWrap.append(copyIcon);
header.append(langWrap, copyWrap);
const body = div('code-highlight w-embed');
const pre = document.createElement('pre');
pre.className = 'language-' + lang;
const code = document.createElement('code');
code.className = 'language-' + lang;
code.setAttribute('fs-copyclip-element', 'copy-this' + suffix);
code.textContent = source; // no parsing, no escaping bugs
pre.append(code); // no stray whitespace
body.append(pre);
wrapper.append(header, body);
this.replaceChildren(wrapper);
if (window.Prism) Prism.highlightElement(code);
}
}
customElements.define('gr-code', CodeBlock);
})();
</script>
<style>
gr-code { display: block; }
gr-code:not(:defined) { display: none; }
</style>
<!-- End custom code block component -->
<!-- Custom RBAC table component -->
<script type="text/javascript">
/*
* ---------------------------------------------------------------------------
* Expands a short authoring tag into the full RBAC table markup: the heading,
* the linked .rbac-feature-table wrapper, the table element and its header row.
* Authors supply only the <tr> rows.
*
* Usage (preferred — mirrors <gr-code>):
*
* <gr-rbac>
* <script type="text/plain">
* <tr><td>CLIENTS_READ</td><td>Allows reading all client information within the team</td></tr>
* <tr><td>CLIENTS_WRITE</td><td>Allows editing all client information within the team</td></tr>
* <\/script>
* </gr-rbac>
*
* (The backslash above is only there so this comment can itself live inside a
* <script> block — drop it when you write the real thing.)
*
* Also accepted, if you would rather not use a script tag: wrap the rows in a
* plain <table>, which the parser does keep.
*
* <gr-rbac><table>
* <tr><td>CLIENTS_READ</td><td>Allows reading all client information within the team</td></tr>
* </table></gr-rbac>
*
* Attributes (all optional):
* heading Heading text. Default: "Privileges required"
* level Heading level, 2-6. Default: 3
* href Link target for the table wrapper.
* Default: /docs/platform-role-based-access-control
* columns Comma-separated header cells.
* Default: "Privilege,Description"
*
* Supply your own <th> row as the first row and it is used as the header
* instead of the default, and the columns attribute is ignored.
*/
(function () {
'use strict';
if (!('customElements' in window) || customElements.get('gr-rbac')) return;
var DEFAULTS = {
heading: 'Privileges required',
level: '2',
href: '/docs/platform-role-based-access-control',
columns: 'Privilege,Description'
};
var INLINE_TAGS = ['A', 'CODE', 'STRONG', 'B', 'EM', 'I', 'SPAN', 'SUP', 'SUB', 'BR'];
var CELL_ATTRS = ['colspan', 'rowspan'];
function isSafeUrl(url) {
return !/^\s*(javascript|data|vbscript):/i.test(url);
}
/* Copy a cell's contents across, keeping simple inline markup and dropping
* everything else (unwrapping it rather than deleting its text). */
function copyInto(target, source) {
Array.prototype.forEach.call(source.childNodes, function (node) {
if (node.nodeType === 3) {
target.appendChild(document.createTextNode(node.nodeValue));
return;
}
if (node.nodeType !== 1) return;
if (INLINE_TAGS.indexOf(node.tagName) === -1) {
copyInto(target, node);
return;
}
if (node.tagName === 'A' && !isSafeUrl(node.getAttribute('href') || '')) {
copyInto(target, node);
return;
}
var el = document.createElement(node.tagName.toLowerCase());
if (node.tagName === 'A') {
el.setAttribute('href', node.getAttribute('href') || '');
if (node.getAttribute('target')) el.setAttribute('target', node.getAttribute('target'));
}
copyInto(el, node);
target.appendChild(el);
});
}
function buildRow(sourceRow) {
var row = document.createElement('tr');
Array.prototype.forEach.call(sourceRow.children, function (cell) {
if (cell.tagName !== 'TD' && cell.tagName !== 'TH') return;
var out = document.createElement(cell.tagName.toLowerCase());
CELL_ATTRS.forEach(function (attr) {
if (cell.hasAttribute(attr)) out.setAttribute(attr, cell.getAttribute(attr));
});
copyInto(out, cell);
row.appendChild(out);
});
return row;
}
/* Rows can arrive as raw text (from the script tag) or as live DOM (from a
* nested table). Parsing the text inside a table context is what keeps the
* <tr> tags intact. */
function readRows(host) {
var script = host.querySelector('script[type="text/plain"]');
var markup = script ? script.textContent : null;
if (markup === null && host.querySelector('tr')) {
markup = host.innerHTML;
}
if (markup === null) {
markup = /<tr[\s>]/i.test(host.innerHTML) ? host.innerHTML : '';
}
if (!markup.trim()) return [];
var doc = new DOMParser().parseFromString(
'<table><tbody>' + markup + '</tbody></table>', 'text/html'
);
return Array.prototype.slice.call(doc.querySelectorAll('tr'));
}
function attr(host, name) {
var value = host.getAttribute(name);
return value && value.trim() ? value.trim() : DEFAULTS[name];
}
function expand(host) {
var rows = readRows(host);
if (!rows.length) {
console.warn(
'[gr-rbac] No <tr> rows found. Put the rows inside ' +
'<script type="text/plain"> — a bare <tr> is dropped by the HTML parser ' +
'before this script runs.', host
);
return;
}
var level = attr(host, 'level').replace(/[^2-6]/g, '') || DEFAULTS.level;
var heading = document.createElement('h' + level);
heading.textContent = host.getAttribute('heading') || host.getAttribute('title') || DEFAULTS.heading;
var link = document.createElement('a');
link.className = 'rbac-feature-table';
link.setAttribute('target', '_blank');
var href = attr(host, 'href');
link.setAttribute('href', isSafeUrl(href) ? href : DEFAULTS.href);
var table = document.createElement('table');
var thead = document.createElement('thead');
/* An author-supplied <th> row wins over the columns attribute. */
if (rows[0].querySelector('th')) {
thead.appendChild(buildRow(rows.shift()));
} else {
var headRow = document.createElement('tr');
attr(host, 'columns').split(',').forEach(function (label) {
var th = document.createElement('th');
th.textContent = label.trim();
headRow.appendChild(th);
});
thead.appendChild(headRow);
}
table.appendChild(thead);
var body = document.createElement('tbody');
rows.forEach(function (row) {
body.appendChild(buildRow(row));
});
table.appendChild(body);
link.appendChild(table);
var frag = document.createDocumentFragment();
frag.appendChild(heading);
frag.appendChild(link);
host.replaceWith(frag);
}
function GrRbac() {
return Reflect.construct(HTMLElement, [], GrRbac);
}
GrRbac.prototype = Object.create(HTMLElement.prototype);
GrRbac.prototype.constructor = GrRbac;
Object.setPrototypeOf(GrRbac, HTMLElement);
/* connectedCallback can fire before the element's children have been parsed,
* so wait for the document if it is still loading. */
GrRbac.prototype.connectedCallback = function () {
var host = this;
if (host.dataset.grExpanding) return;
host.dataset.grExpanding = '1';
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function () { expand(host); }, { once: true });
} else {
expand(host);
}
};
customElements.define('gr-rbac', GrRbac);
})();
</script>
<!-- Custom RBAC table component --><script>
(() => {
const unordered_lists = document.querySelectorAll(".w-richtext > ul");
const ordered_lists = document.querySelectorAll(".w-richtext > ol");
function replaceChild(newItem, oldItem) {
oldItem.parentNode.replaceChild(newItem, oldItem);
newItem.appendChild(oldItem);
}
function createUnorderedList(item) {
const list = document.createElement("ul");
replaceChild(list, item);
}
function createOrderedList(item, start) {
const list = document.createElement("ol");
list.type = "a";
list.start = start;
for (const li of item.querySelectorAll('li')) {
const newLi = document.createElement('li');
newLi.textContent = li.textContent;
newLi.setAttribute('start', start);
list.appendChild(newLi);
}
replaceChild(list, item);
}
function parseUnorderedList(item) {
const nest_level = item.innerText.split("^").length - 1;
item.innerHTML = item.innerHTML.replaceAll("^", "");
if (nest_level === 0) return;
new Array(nest_level).fill(0).map(() => createUnorderedList(item));
}
for (const list of unordered_lists) {
for (const item of list.children) {
parseUnorderedList(item);
}
}
function parseOrderedList(item, queue) {
const nest_level = item.innerText.split("^").length;
item.innerHTML = item.innerHTML.replaceAll("^", "");
if (nest_level === queue.length) {
queue[nest_level - 1]++;
}
if (nest_level > queue.length) {
queue[queue.length] = 1;
}
if (nest_level < queue.length) {
queue.splice(nest_level);
queue[nest_level - 1]++;
}
if (queue.length > 1) {
new Array(queue.length - 1)
.fill(0)
.map(() => createOrderedList(item, queue[queue.length - 1]));
}
}
let queue = [0];
for (const list of ordered_lists) {
for (const item of list.children) {
parseOrderedList(item, queue);
}
}
})();
var x = document.querySelectorAll('[type="a"]')
x.forEach(y =>{
var pp = y.getAttribute("start")
var k = y.querySelectorAll("li")
k.forEach(l =>{
l.setAttribute("start", pp)
})
})
</script><script src="https://hubspotv2.use1-marketplace-1p-apps-prod-red.if.webflow.services/static/disable-hubspot-chatbot.js" type="text/javascript" async="" defer=""></script><script src="https://js.hs-scripts.com/48295595.js" type="text/javascript" async="" defer=""></script></body></html>