1
0
Fork 0
mirror of https://github.com/poseidon/typhoon synced 2024-05-11 18:16:10 +02:00
typhoon/topics/maintenance/index.html

2170 lines
54 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="A minimal and free Kubernetes distribution">
<meta name="author" content="Dalton Hubble">
<link rel="prev" href="../../flatcar-linux/google-cloud/">
<link rel="next" href="../hardware/">
<link rel="icon" href="../../img/favicon.ico">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.14">
<title>Maintenance - Typhoon</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.10ba22f1.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto+Slab:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto Slab";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@typhoon8s">
<meta name="twitter:creator" content="@dghubble">
<meta name="twitter:title" content="Minimal and free Kubernetes clusters">
<meta name="twitter:description" content="Kubernetes clusters for AWS, Azure, bare-metal, Google Cloud, and DigitalOcean">
<meta name="twitter:image" content="https://storage.googleapis.com/poseidon/typhoon-twitter-card.png">
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="blue" data-md-color-accent="pink">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#maintenance" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Typhoon" class="md-header__button md-logo" aria-label="Typhoon" data-md-component="logo">
<img src="../../img/spin.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Typhoon
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Maintenance
</span>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/poseidon/typhoon" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"/></svg>
</div>
<div class="md-source__repository">
poseidon/typhoon
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../announce/" class="md-tabs__link">
Announce
</a>
</li>
<li class="md-tabs__item">
<a href="../../architecture/concepts/" class="md-tabs__link">
Architecture
</a>
</li>
<li class="md-tabs__item">
<a href="../../fedora-coreos/aws/" class="md-tabs__link">
Fedora CoreOS
</a>
</li>
<li class="md-tabs__item">
<a href="../../flatcar-linux/aws/" class="md-tabs__link">
Flatcar Linux
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="./" class="md-tabs__link">
Topics
</a>
</li>
<li class="md-tabs__item">
<a href="../../advanced/overview/" class="md-tabs__link">
Advanced
</a>
</li>
<li class="md-tabs__item">
<a href="../../addons/overview/" class="md-tabs__link">
Addons
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Typhoon" class="md-nav__button md-logo" aria-label="Typhoon" data-md-component="logo">
<img src="../../img/spin.png" alt="logo">
</a>
Typhoon
</label>
<div class="md-nav__source">
<a href="https://github.com/poseidon/typhoon" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"/></svg>
</div>
<div class="md-source__repository">
poseidon/typhoon
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../announce/" class="md-nav__link">
<span class="md-ellipsis">
Announce
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Architecture
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Architecture
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../architecture/concepts/" class="md-nav__link">
<span class="md-ellipsis">
Concepts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/operating-systems/" class="md-nav__link">
<span class="md-ellipsis">
Operating Systems
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/aws/" class="md-nav__link">
<span class="md-ellipsis">
AWS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/azure/" class="md-nav__link">
<span class="md-ellipsis">
Azure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/bare-metal/" class="md-nav__link">
<span class="md-ellipsis">
Bare-Metal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/digitalocean/" class="md-nav__link">
<span class="md-ellipsis">
DigitalOcean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/google-cloud/" class="md-nav__link">
<span class="md-ellipsis">
Google Cloud
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
Fedora CoreOS
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Fedora CoreOS
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../fedora-coreos/aws/" class="md-nav__link">
<span class="md-ellipsis">
AWS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../fedora-coreos/azure/" class="md-nav__link">
<span class="md-ellipsis">
Azure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../fedora-coreos/bare-metal/" class="md-nav__link">
<span class="md-ellipsis">
Bare-Metal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../fedora-coreos/digitalocean/" class="md-nav__link">
<span class="md-ellipsis">
DigitalOcean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../fedora-coreos/google-cloud/" class="md-nav__link">
<span class="md-ellipsis">
Google Cloud
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Flatcar Linux
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Flatcar Linux
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../flatcar-linux/aws/" class="md-nav__link">
<span class="md-ellipsis">
AWS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../flatcar-linux/azure/" class="md-nav__link">
<span class="md-ellipsis">
Azure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../flatcar-linux/bare-metal/" class="md-nav__link">
<span class="md-ellipsis">
Bare-Metal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../flatcar-linux/digitalocean/" class="md-nav__link">
<span class="md-ellipsis">
DigitalOcean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../flatcar-linux/google-cloud/" class="md-nav__link">
<span class="md-ellipsis">
Google Cloud
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-ellipsis">
Topics
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Topics
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Maintenance
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Maintenance
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#best-practices" class="md-nav__link">
<span class="md-ellipsis">
Best Practices
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#versioning" class="md-nav__link">
<span class="md-ellipsis">
Versioning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#terraform-versions" class="md-nav__link">
<span class="md-ellipsis">
Terraform Versions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cluster-upgrades" class="md-nav__link">
<span class="md-ellipsis">
Cluster Upgrades
</span>
</a>
<nav class="md-nav" aria-label="Cluster Upgrades">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#bare-metal" class="md-nav__link">
<span class="md-ellipsis">
Bare-Metal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cloud" class="md-nav__link">
<span class="md-ellipsis">
Cloud
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#alternatives" class="md-nav__link">
<span class="md-ellipsis">
Alternatives
</span>
</a>
<nav class="md-nav" aria-label="Alternatives">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#in-place-edits" class="md-nav__link">
<span class="md-ellipsis">
In-place Edits
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#node-replacement" class="md-nav__link">
<span class="md-ellipsis">
Node Replacement
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#node-configuration-updates" class="md-nav__link">
<span class="md-ellipsis">
Node Configuration Updates
</span>
</a>
<nav class="md-nav" aria-label="Node Configuration Updates">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#aws" class="md-nav__link">
<span class="md-ellipsis">
AWS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#google-cloud" class="md-nav__link">
<span class="md-ellipsis">
Google Cloud
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#upgrade-poseidonct" class="md-nav__link">
<span class="md-ellipsis">
Upgrade poseidon/ct
</span>
</a>
<nav class="md-nav" aria-label="Upgrade poseidon/ct">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#aws_1" class="md-nav__link">
<span class="md-ellipsis">
AWS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#azure" class="md-nav__link">
<span class="md-ellipsis">
Azure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#bare-metal_1" class="md-nav__link">
<span class="md-ellipsis">
Bare-Metal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#digitalocean" class="md-nav__link">
<span class="md-ellipsis">
DigitalOcean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#google-cloud_1" class="md-nav__link">
<span class="md-ellipsis">
Google Cloud
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../hardware/" class="md-nav__link">
<span class="md-ellipsis">
Hardware
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../security/" class="md-nav__link">
<span class="md-ellipsis">
Security
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../performance/" class="md-nav__link">
<span class="md-ellipsis">
Performance
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../faq/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Advanced
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Advanced
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../advanced/overview/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced/arm64/" class="md-nav__link">
<span class="md-ellipsis">
ARM64
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced/customization/" class="md-nav__link">
<span class="md-ellipsis">
Customization
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced/nodes/" class="md-nav__link">
<span class="md-ellipsis">
Nodes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced/worker-pools/" class="md-nav__link">
<span class="md-ellipsis">
Worker Pools
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Addons
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Addons
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../addons/overview/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../addons/ingress/" class="md-nav__link">
<span class="md-ellipsis">
Nginx Ingress
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../addons/prometheus/" class="md-nav__link">
<span class="md-ellipsis">
Prometheus
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../addons/grafana/" class="md-nav__link">
<span class="md-ellipsis">
Grafana
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../addons/fleetlock/" class="md-nav__link">
<span class="md-ellipsis">
fleetlock
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#best-practices" class="md-nav__link">
<span class="md-ellipsis">
Best Practices
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#versioning" class="md-nav__link">
<span class="md-ellipsis">
Versioning
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#terraform-versions" class="md-nav__link">
<span class="md-ellipsis">
Terraform Versions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cluster-upgrades" class="md-nav__link">
<span class="md-ellipsis">
Cluster Upgrades
</span>
</a>
<nav class="md-nav" aria-label="Cluster Upgrades">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#bare-metal" class="md-nav__link">
<span class="md-ellipsis">
Bare-Metal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cloud" class="md-nav__link">
<span class="md-ellipsis">
Cloud
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#alternatives" class="md-nav__link">
<span class="md-ellipsis">
Alternatives
</span>
</a>
<nav class="md-nav" aria-label="Alternatives">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#in-place-edits" class="md-nav__link">
<span class="md-ellipsis">
In-place Edits
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#node-replacement" class="md-nav__link">
<span class="md-ellipsis">
Node Replacement
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#node-configuration-updates" class="md-nav__link">
<span class="md-ellipsis">
Node Configuration Updates
</span>
</a>
<nav class="md-nav" aria-label="Node Configuration Updates">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#aws" class="md-nav__link">
<span class="md-ellipsis">
AWS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#google-cloud" class="md-nav__link">
<span class="md-ellipsis">
Google Cloud
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#upgrade-poseidonct" class="md-nav__link">
<span class="md-ellipsis">
Upgrade poseidon/ct
</span>
</a>
<nav class="md-nav" aria-label="Upgrade poseidon/ct">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#aws_1" class="md-nav__link">
<span class="md-ellipsis">
AWS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#azure" class="md-nav__link">
<span class="md-ellipsis">
Azure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#bare-metal_1" class="md-nav__link">
<span class="md-ellipsis">
Bare-Metal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#digitalocean" class="md-nav__link">
<span class="md-ellipsis">
DigitalOcean
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#google-cloud_1" class="md-nav__link">
<span class="md-ellipsis">
Google Cloud
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="maintenance">Maintenance<a class="headerlink" href="#maintenance" title="Permanent link">&para;</a></h1>
<h2 id="best-practices">Best Practices<a class="headerlink" href="#best-practices" title="Permanent link">&para;</a></h2>
<ul>
<li>Run multiple Kubernetes clusters. Run across platforms. Plan for regional and cloud outages.</li>
<li>Require applications be platform agnostic. Moving an application between a Kubernetes AWS cluster and a Kubernetes bare-metal cluster should be normal.</li>
<li>Strive to make single-cluster outages tolerable. Practice performing failovers.</li>
<li>Strive to make single-cluster outages a non-event. Load balance applications between multiple clusters, automate failover behaviors, and adjust alerting behaviors.</li>
</ul>
<h2 id="versioning">Versioning<a class="headerlink" href="#versioning" title="Permanent link">&para;</a></h2>
<p>Typhoon provides tagged releases to allow clusters to be versioned using ordinary Terraform configs.</p>
<div class="highlight"><pre><span></span><code>module &quot;yavin&quot; {
source = &quot;git::https://github.com/poseidon/typhoon//google-cloud/fedora-coreos/kubernetes?ref=v1.29.3&quot;
...
}
module &quot;mercury&quot; {
source = &quot;git::https://github.com/poseidon/typhoon//bare-metal/flatcar-linux/kubernetes?ref=v1.29.3&quot;
...
}
</code></pre></div>
<p>Main is updated regularly, so it is recommended to <a href="https://www.terraform.io/docs/modules/sources.html">pin</a> modules to a <a href="https://github.com/poseidon/typhoon/releases">release tag</a> or <a href="https://github.com/poseidon/typhoon/commits/main">commit</a> hash. Pinning ensures <code>terraform get --update</code> only fetches the desired version.</p>
<h2 id="terraform-versions">Terraform Versions<a class="headerlink" href="#terraform-versions" title="Permanent link">&para;</a></h2>
<p>Typhoon modules support Terraform v0.13.x and higher. Poseidon publishes <a href="/topics/security/#terraform-providers">providers</a> to the Terraform Provider Registry for automatic install via <code>terraform init</code>.</p>
<table>
<thead>
<tr>
<th>Typhoon Release</th>
<th>Terraform version</th>
</tr>
</thead>
<tbody>
<tr>
<td>v1.21.2 - ?</td>
<td>v0.13.x, v0.14.4+, v0.15.x, v1.0.x</td>
</tr>
<tr>
<td>v1.21.1 - v1.21.1</td>
<td>v0.13.x, v0.14.4+, v0.15.x</td>
</tr>
<tr>
<td>v1.20.2 - v1.21.0</td>
<td>v0.13.x, v0.14.4+</td>
</tr>
<tr>
<td>v1.20.0 - v1.20.2</td>
<td>v0.13.x</td>
</tr>
<tr>
<td>v1.18.8 - v1.19.4</td>
<td>v0.12.26+, v0.13.x</td>
</tr>
<tr>
<td>v1.15.0 - v1.18.8</td>
<td>v0.12.x</td>
</tr>
<tr>
<td>v1.10.3 - v1.15.0</td>
<td>v0.11.x</td>
</tr>
<tr>
<td>v1.9.2 - v1.10.2</td>
<td>v0.10.4+ or v0.11.x</td>
</tr>
<tr>
<td>v1.7.3 - v1.9.1</td>
<td>v0.10.x</td>
</tr>
<tr>
<td>v1.6.4 - v1.7.2</td>
<td>v0.9.x</td>
</tr>
</tbody>
</table>
<h2 id="cluster-upgrades">Cluster Upgrades<a class="headerlink" href="#cluster-upgrades" title="Permanent link">&para;</a></h2>
<p>Typhoon recommends upgrading clusters using a blue-green replacement strategy and migrating workloads.</p>
<ol>
<li>Launch new (candidate) clusters from tagged releases</li>
<li>Apply workloads from existing cluster(s)</li>
<li>Evaluate application health and performance</li>
<li>Migrate application traffic to the new cluster</li>
<li>Compare metrics and delete old cluster when ready</li>
</ol>
<p>Blue-green replacement reduces risk for clusters running critical applications. Candidate clusters allow baseline properties of clusters to be assessed (e.g. pod-to-pod bandwidth). Applying application workloads allows health to be assessed before being subjected to traffic (e.g. detect any changes in Kubernetes behavior between versions). Migration to the new cluster can be controlled according to requirements. Migration may mean updating DNS records to resolve the new cluster's ingress or may involve a load balancer gradually shifting traffic to the new cluster "backend". Retain the old cluster for a time to compare metrics or for fallback if issues arise.</p>
<p>Blue-green replacement provides some subtler benefits as well:</p>
<ul>
<li>Encourages investment in tooling for traffic migration and failovers. When a cluster incident arises, shifting applications to a healthy cluster will be second nature.</li>
<li>Discourages reliance on in-place opaque state. Retain confidence in your ability to create infrastructure from scratch.</li>
<li>Allows Typhoon to make architecture changes between releases and eases the burden on Typhoon maintainers. By contrast, distros promising in-place upgrades get stuck with their mistakes or require complex and error-prone migrations.</li>
</ul>
<h3 id="bare-metal">Bare-Metal<a class="headerlink" href="#bare-metal" title="Permanent link">&para;</a></h3>
<p>Typhoon bare-metal clusters are provisioned by a PXE-enabled network boot environment and a <a href="https://github.com/poseidon/matchbox">Matchbox</a> service. To upgrade, re-provision machines into a new cluster.</p>
<p>Failover application workloads to another cluster (varies).</p>
<div class="highlight"><pre><span></span><code>kubectl config use-context other-context
kubectl apply -f mercury -R
# DNS or load balancer changes
</code></pre></div>
<p>Power off bare-metal machines and set their next boot device to PXE.</p>
<div class="highlight"><pre><span></span><code>ipmitool -H node1.example.com -U USER -P PASS power off
ipmitool -H node1.example.com -U USER -P PASS chassis bootdev pxe
</code></pre></div>
<p>Delete or comment the Terraform config for the cluster.</p>
<div class="highlight"><pre><span></span><code>- module &quot;mercury&quot; {
- source = &quot;git::https://github.com/poseidon/typhoon//bare-metal/flatcar-linux/kubernetes&quot;
- ...
-}
</code></pre></div>
<p>Apply to delete old provisioning configs from Matchbox.</p>
<div class="highlight"><pre><span></span><code>$ terraform apply
Apply complete! Resources: 0 added, 0 changed, 55 destroyed.
</code></pre></div>
<p>Re-provision a new cluster by following the bare-metal <a href="../../fedora-coreos/bare-metal/#cluster">tutorial</a>.</p>
<h3 id="cloud">Cloud<a class="headerlink" href="#cloud" title="Permanent link">&para;</a></h3>
<p>Create a new cluster following the tutorials. Failover application workloads to the new cluster (varies).</p>
<div class="highlight"><pre><span></span><code>kubectl config use-context other-context
kubectl apply -f mercury -R
# DNS or load balancer changes
</code></pre></div>
<p>Once you're confident in the new cluster, delete the Terraform config for the old cluster.</p>
<div class="highlight"><pre><span></span><code>- module &quot;yavin&quot; {
- source = &quot;git::https://github.com/poseidon/typhoon//google-cloud/flatcar-linux/kubernetes&quot;
- ...
-}
</code></pre></div>
<p>Apply to delete the cluster.</p>
<div class="highlight"><pre><span></span><code>$ terraform apply
Apply complete! Resources: 0 added, 0 changed, 55 destroyed.
</code></pre></div>
<h3 id="alternatives">Alternatives<a class="headerlink" href="#alternatives" title="Permanent link">&para;</a></h3>
<h4 id="in-place-edits">In-place Edits<a class="headerlink" href="#in-place-edits" title="Permanent link">&para;</a></h4>
<p>Typhoon uses a static pod Kubernetes control plane which allows certain manifest upgrades to be performed in-place. Components like <code>kube-apiserver</code>, <code>kube-controller-manager</code>, and <code>kube-scheduler</code> are run as static pods. Components <code>flannel</code>/<code>calico</code>, <code>coredns</code>, and <code>kube-proxy</code> are scheduled on Kubernetes and can be edited via <code>kubectl</code>.</p>
<p>In certain scenarios, in-place edits can be useful for quickly rolling out security patches (e.g. bumping <code>coredns</code>) or prioritizing speed over the safety of a proper cluster re-provision and transition.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Rarely, we may test certain security in-place edits and mention them as an option in release notes.</p>
</div>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Typhoon does not support or document in-place edits as an upgrade strategy. They involve inherent risks and we choose not to make recommendations or guarentees about the safety of different in-place upgrades. Its explicitly a non-goal.</p>
</div>
<h4 id="node-replacement">Node Replacement<a class="headerlink" href="#node-replacement" title="Permanent link">&para;</a></h4>
<p>Typhoon supports multi-controller clusters, so it is possible to upgrade a cluster by deleting and replacing nodes one by one.</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Typhoon does not support or document node replacement as an upgrade strategy. It limits Typhoon's ability to make infrastructure and architectural changes between tagged releases.</p>
</div>
<h2 id="node-configuration-updates">Node Configuration Updates<a class="headerlink" href="#node-configuration-updates" title="Permanent link">&para;</a></h2>
<p>Typhoon worker instance groups (default workers and <a href="../../advanced/worker-pools/">worker pools</a>) on AWS and Google Cloud gradually rolling replace worker instances when configuration changes are applied.</p>
<h3 id="aws">AWS<a class="headerlink" href="#aws" title="Permanent link">&para;</a></h3>
<p>On AWS, worker instances belong to an auto-scaling group. When an auto-scaling group's launch configuration changes, an AWS <a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-instance-refresh.html">Instance Refresh</a> gradually replaces worker instances.</p>
<p>Instance refresh creates surge instances, waits for a warm-up period, then deletes old instances.</p>
<div class="highlight"><pre><span></span><code>module &quot;tempest&quot; {
<span class="w"> </span> source = &quot;git::https://github.com/poseidon/typhoon//aws/VARIANT/kubernetes?ref=VERSION&quot;
<span class="w"> </span> # AWS
<span class="w"> </span> cluster_name = &quot;tempest&quot;
<span class="w"> </span> ...
<span class="w"> </span> # optional
<span class="w"> </span> worker_count = 2
<span class="gd">- worker_type = &quot;t3.small&quot;</span>
<span class="gi">+ worker_type = &quot;t3a.small&quot;</span>
<span class="w"> </span> # change from on-demand to spot
<span class="gi">+ worker_price = &quot;0.0309&quot;</span>
<span class="w"> </span> # default is 30GB
<span class="gi">+ disk_size = 50</span>
<span class="w"> </span> # change worker snippets
<span class="gi">+ worker_snippets = [</span>
<span class="gi">+ file(&quot;butane/feature.yaml&quot;),</span>
<span class="gi">+ ]</span>
}
</code></pre></div>
<p>Applying edits to most worker fields will start an instance refresh:</p>
<ul>
<li><code>worker_type</code></li>
<li><code>disk_*</code></li>
<li><code>worker_price</code> (i.e. spot)</li>
<li><code>worker_target_groups</code></li>
<li><code>worker_snippets</code></li>
</ul>
<p>However, changing <code>os_stream</code>/<code>os_channel</code> or new AMIs becoming available will NOT change the launch configuration or trigger an Instance Refresh. This allows Fedora CoreOS or Flatcar Linux to auto-update themselves via reboots and avoids unexpected terraform diffs for new AMIs.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Before Typhoon v1.29.3, worker nodes only used new launch configurations when replaced manually (or due to failure). If you must change node configuration manually, it's still possible. Create a new <a href="../../advanced/worker-pools/">worker pool</a>, then scale down the old worker pool as desired.</p>
</div>
<h3 id="google-cloud">Google Cloud<a class="headerlink" href="#google-cloud" title="Permanent link">&para;</a></h3>
<p>On Google Cloud, worker instances belong to a <a href="https://cloud.google.com/compute/docs/instance-groups#managed_instance_groups">managed instance group</a>. When a group's launch template changes, a <a href="https://cloud.google.com/compute/docs/instance-groups/rolling-out-updates-to-managed-instance-groups">rolling update</a> gradually replaces worker instances.</p>
<p>The rolling update creates surge instances, waits for instances to be healthy, then deletes old instances.</p>
<div class="highlight"><pre><span></span><code>module &quot;yavin&quot; {
<span class="w"> </span> source = &quot;git::https://github.com/poseidon/typhoon//google-cloud/VARIANT/kubernetes?ref=VERSION&quot;
<span class="w"> </span> # Google Cloud
<span class="w"> </span> cluster_name = &quot;yavin&quot;
<span class="w"> </span> ...
<span class="w"> </span> # optional
<span class="w"> </span> worker_count = 2
<span class="gi">+ worker_type = &quot;n2-standard-2&quot;</span>
<span class="gi">+ worker_preemptible = true</span>
<span class="w"> </span> # default is 30GB
<span class="gi">+ disk_size = 50</span>
<span class="w"> </span> # change worker snippets
<span class="gi">+ worker_snippets = [</span>
<span class="gi">+ file(&quot;butane/feature.yaml&quot;),</span>
<span class="gi">+ ]</span>
}
</code></pre></div>
<p>Applying edits to most worker fields will start an instance refresh:</p>
<ul>
<li><code>worker_type</code></li>
<li><code>disk_*</code></li>
<li><code>worker_preemptible</code> (i.e. spot)</li>
<li><code>worker_snippets</code></li>
</ul>
<p>However, changing <code>os_stream</code>/<code>os_channel</code> or new compute images becoming available will NOT change the launch template or update instances. This allows Fedora CoreOS or Flatcar Linux to auto-update themselves via reboots and avoids unexpected terraform diffs for new AMIs.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Before Typhoon v1.29.3, worker nodes only used new launch templates when replaced manually (or due to failure). If you must change node configuration manually, it's still possible. Create a new <a href="../../advanced/worker-pools/">worker pool</a>, then scale down the old worker pool as desired.</p>
</div>
<h2 id="upgrade-poseidonct">Upgrade poseidon/ct<a class="headerlink" href="#upgrade-poseidonct" title="Permanent link">&para;</a></h2>
<p>The <a href="https://github.com/poseidon/terraform-provider-ct">poseidon/ct</a> Terraform provider plugin parses, validates, and converts Butane Configs to Ignition user-data for provisioning instances. Since Typhoon v1.12.2+, the plugin can be updated in-place so that on apply, only workers will be replaced.</p>
<p>Update the version of the <code>ct</code> plugin in each Terraform working directory. Typhoon clusters managed in the working directory <strong>must</strong> be v1.12.2 or higher.</p>
<div class="highlight"><pre><span></span><code>provider &quot;ct&quot; {}
terraform {
<span class="w"> </span> required_providers {
<span class="w"> </span> ct = {
<span class="w"> </span> source = &quot;poseidon/ct&quot;
<span class="gd">- version = &quot;0.10.0&quot;</span>
<span class="gi">+ version = &quot;0.11.0&quot;</span>
<span class="w"> </span> }
<span class="w"> </span> ...
<span class="w"> </span> }
}
</code></pre></div>
<p>Run init and plan to check that no diff is proposed for the controller nodes (a diff would destroy cluster state).</p>
<div class="highlight"><pre><span></span><code>terraform init
terraform plan
</code></pre></div>
<p>Apply the change. If worker nodes' user-data is changed and workers will be replaced. Rollout happens slightly differently on each platform:</p>
<h4 id="aws_1">AWS<a class="headerlink" href="#aws_1" title="Permanent link">&para;</a></h4>
<p>See AWS node <a href="#aws">config updates</a>.</p>
<h4 id="azure">Azure<a class="headerlink" href="#azure" title="Permanent link">&para;</a></h4>
<p>Azure edits the worker scale set in-place instantly. Manually terminate workers to create replacement workers using the new user-data.</p>
<h4 id="bare-metal_1">Bare-Metal<a class="headerlink" href="#bare-metal_1" title="Permanent link">&para;</a></h4>
<p>No action is needed. Bare-Metal machines do not re-PXE unless explicitly made to do so.</p>
<h4 id="digitalocean">DigitalOcean<a class="headerlink" href="#digitalocean" title="Permanent link">&para;</a></h4>
<p>DigitalOcean destroys existing worker nodes and DNS records, then creates new workers and DNS records. DigitalOcean lacks a "managed group" notion. For worker droplets to join the cluster, you <strong>must</strong> taint the secret copying step to indicate it must be repeated to add the kubeconfig to new workers.</p>
<div class="highlight"><pre><span></span><code># old workers destroyed, new workers created
terraform apply
# add kubeconfig to new workers
terraform state list | grep null_resource
terraform taint module.nemo.null_resource.copy-worker-secrets[N]
terraform apply
</code></pre></div>
<p>Expect downtime.</p>
<h4 id="google-cloud_1">Google Cloud<a class="headerlink" href="#google-cloud_1" title="Permanent link">&para;</a></h4>
<p>See Google Cloud node <a href="#google-cloud">config updates</a>.</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Poseidon Laboratories
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://github.com/poseidon" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z"/></svg>
</a>
<a href="https://twitter.com/typhoon8s" target="_blank" rel="noopener" title="twitter.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.instant"], "search": "../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../assets/javascripts/bundle.bd41221c.min.js"></script>
</body>
</html>