1
0
Fork 0
mirror of https://github.com/poseidon/typhoon synced 2024-05-08 08:36:12 +02:00
typhoon/flatcar-linux/azure/index.html
2022-07-27 16:54:22 -07:00

1733 lines
52 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="icon" href="../../img/favicon.ico">
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.6">
<title>Azure - Typhoon</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.4a0965b7.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.cbb835fc.min.css">
<meta name="theme-color" content="#2094f3">
<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_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="" 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="#azure" 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">
Azure
</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" 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"></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.1.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 2022 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-tabs__inner 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="../aws/" class="md-tabs__link md-tabs__link--active">
Flatcar Linux
</a>
</li>
<li class="md-tabs__item">
<a href="../../topics/maintenance/" 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.1.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 2022 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">
Home
</a>
</li>
<li class="md-nav__item">
<a href="../../announce/" class="md-nav__link">
Announce
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3">
Architecture
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Architecture" data-md-level="1">
<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">
Concepts
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/operating-systems/" class="md-nav__link">
Operating Systems
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/aws/" class="md-nav__link">
AWS
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/azure/" class="md-nav__link">
Azure
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/bare-metal/" class="md-nav__link">
Bare-Metal
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/digitalocean/" class="md-nav__link">
DigitalOcean
</a>
</li>
<li class="md-nav__item">
<a href="../../architecture/google-cloud/" class="md-nav__link">
Google Cloud
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4">
Fedora CoreOS
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Fedora CoreOS" data-md-level="1">
<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">
AWS
</a>
</li>
<li class="md-nav__item">
<a href="../../fedora-coreos/azure/" class="md-nav__link">
Azure
</a>
</li>
<li class="md-nav__item">
<a href="../../fedora-coreos/bare-metal/" class="md-nav__link">
Bare-Metal
</a>
</li>
<li class="md-nav__item">
<a href="../../fedora-coreos/digitalocean/" class="md-nav__link">
DigitalOcean
</a>
</li>
<li class="md-nav__item">
<a href="../../fedora-coreos/google-cloud/" class="md-nav__link">
Google Cloud
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" checked>
<label class="md-nav__link" for="__nav_5">
Flatcar Linux
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Flatcar Linux" data-md-level="1">
<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="../aws/" class="md-nav__link">
AWS
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
Azure
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
Azure
</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="#requirements" class="md-nav__link">
Requirements
</a>
</li>
<li class="md-nav__item">
<a href="#terraform-setup" class="md-nav__link">
Terraform Setup
</a>
</li>
<li class="md-nav__item">
<a href="#provider" class="md-nav__link">
Provider
</a>
</li>
<li class="md-nav__item">
<a href="#flatcar-linux-images" class="md-nav__link">
Flatcar Linux Images
</a>
</li>
<li class="md-nav__item">
<a href="#cluster" class="md-nav__link">
Cluster
</a>
</li>
<li class="md-nav__item">
<a href="#ssh-agent" class="md-nav__link">
ssh-agent
</a>
</li>
<li class="md-nav__item">
<a href="#apply" class="md-nav__link">
Apply
</a>
</li>
<li class="md-nav__item">
<a href="#verify" class="md-nav__link">
Verify
</a>
</li>
<li class="md-nav__item">
<a href="#going-further" class="md-nav__link">
Going Further
</a>
</li>
<li class="md-nav__item">
<a href="#variables" class="md-nav__link">
Variables
</a>
<nav class="md-nav" aria-label="Variables">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#required" class="md-nav__link">
Required
</a>
<nav class="md-nav" aria-label="Required">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#dns-zone" class="md-nav__link">
DNS Zone
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#optional" class="md-nav__link">
Optional
</a>
<nav class="md-nav" aria-label="Optional">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#spot-priority" class="md-nav__link">
Spot Priority
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../bare-metal/" class="md-nav__link">
Bare-Metal
</a>
</li>
<li class="md-nav__item">
<a href="../digitalocean/" class="md-nav__link">
DigitalOcean
</a>
</li>
<li class="md-nav__item">
<a href="../google-cloud/" class="md-nav__link">
Google Cloud
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_6" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6">
Topics
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Topics" data-md-level="1">
<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">
<a href="../../topics/maintenance/" class="md-nav__link">
Maintenance
</a>
</li>
<li class="md-nav__item">
<a href="../../topics/hardware/" class="md-nav__link">
Hardware
</a>
</li>
<li class="md-nav__item">
<a href="../../topics/security/" class="md-nav__link">
Security
</a>
</li>
<li class="md-nav__item">
<a href="../../topics/performance/" class="md-nav__link">
Performance
</a>
</li>
<li class="md-nav__item">
<a href="../../topics/faq/" class="md-nav__link">
FAQ
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_7" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7">
Advanced
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Advanced" data-md-level="1">
<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">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced/arm64/" class="md-nav__link">
ARM64
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced/customization/" class="md-nav__link">
Customization
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced/nodes/" class="md-nav__link">
Nodes
</a>
</li>
<li class="md-nav__item">
<a href="../../advanced/worker-pools/" class="md-nav__link">
Worker Pools
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_8" type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8">
Addons
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" aria-label="Addons" data-md-level="1">
<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">
Overview
</a>
</li>
<li class="md-nav__item">
<a href="../../addons/ingress/" class="md-nav__link">
Nginx Ingress
</a>
</li>
<li class="md-nav__item">
<a href="../../addons/prometheus/" class="md-nav__link">
Prometheus
</a>
</li>
<li class="md-nav__item">
<a href="../../addons/grafana/" class="md-nav__link">
Grafana
</a>
</li>
<li class="md-nav__item">
<a href="../../addons/fleetlock/" class="md-nav__link">
fleetlock
</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="#requirements" class="md-nav__link">
Requirements
</a>
</li>
<li class="md-nav__item">
<a href="#terraform-setup" class="md-nav__link">
Terraform Setup
</a>
</li>
<li class="md-nav__item">
<a href="#provider" class="md-nav__link">
Provider
</a>
</li>
<li class="md-nav__item">
<a href="#flatcar-linux-images" class="md-nav__link">
Flatcar Linux Images
</a>
</li>
<li class="md-nav__item">
<a href="#cluster" class="md-nav__link">
Cluster
</a>
</li>
<li class="md-nav__item">
<a href="#ssh-agent" class="md-nav__link">
ssh-agent
</a>
</li>
<li class="md-nav__item">
<a href="#apply" class="md-nav__link">
Apply
</a>
</li>
<li class="md-nav__item">
<a href="#verify" class="md-nav__link">
Verify
</a>
</li>
<li class="md-nav__item">
<a href="#going-further" class="md-nav__link">
Going Further
</a>
</li>
<li class="md-nav__item">
<a href="#variables" class="md-nav__link">
Variables
</a>
<nav class="md-nav" aria-label="Variables">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#required" class="md-nav__link">
Required
</a>
<nav class="md-nav" aria-label="Required">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#dns-zone" class="md-nav__link">
DNS Zone
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#optional" class="md-nav__link">
Optional
</a>
<nav class="md-nav" aria-label="Optional">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#spot-priority" class="md-nav__link">
Spot Priority
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<a href="https://github.com/poseidon/typhoon/edit/master/docs/flatcar-linux/azure.md" title="Edit this page" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25Z"/></svg>
</a>
<h1 id="azure">Azure<a class="headerlink" href="#azure" title="Permanent link">&para;</a></h1>
<p>In this tutorial, we'll create a Kubernetes v1.24.3 cluster on Azure with Flatcar Linux.</p>
<p>We'll declare a Kubernetes cluster using the Typhoon Terraform module. Then apply the changes to create a resource group, virtual network, subnets, security groups, controller availability set, worker scale set, load balancer, and TLS assets.</p>
<p>Controller hosts are provisioned to run an <code>etcd-member</code> peer and a <code>kubelet</code> service. Worker hosts run a <code>kubelet</code> service. Controller nodes run <code>kube-apiserver</code>, <code>kube-scheduler</code>, <code>kube-controller-manager</code>, and <code>coredns</code>, while <code>kube-proxy</code> and <code>calico</code> (or <code>flannel</code>) run on every node. A generated <code>kubeconfig</code> provides <code>kubectl</code> access to the cluster.</p>
<h2 id="requirements">Requirements<a class="headerlink" href="#requirements" title="Permanent link">&para;</a></h2>
<ul>
<li>Azure account</li>
<li>Azure DNS Zone (registered Domain Name or delegated subdomain)</li>
<li>Terraform v0.13.0+</li>
</ul>
<h2 id="terraform-setup">Terraform Setup<a class="headerlink" href="#terraform-setup" title="Permanent link">&para;</a></h2>
<p>Install <a href="https://www.terraform.io/downloads.html">Terraform</a> v0.13.0+ on your system.</p>
<div class="highlight"><pre><span></span><code>$ terraform version
Terraform v1.0.0
</code></pre></div>
<p>Read <a href="/architecture/concepts/">concepts</a> to learn about Terraform, modules, and organizing resources. Change to your infrastructure repository (e.g. <code>infra</code>).</p>
<div class="highlight"><pre><span></span><code>cd infra/clusters
</code></pre></div>
<h2 id="provider">Provider<a class="headerlink" href="#provider" title="Permanent link">&para;</a></h2>
<p><a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest">Install</a> the Azure <code>az</code> command line tool to <a href="https://www.terraform.io/docs/providers/azurerm/authenticating_via_azure_cli.html">authenticate with Azure</a>.</p>
<div class="highlight"><pre><span></span><code>az login
</code></pre></div>
<p>Configure the Azure provider in a <code>providers.tf</code> file.</p>
<div class="highlight"><pre><span></span><code><span class="kr">provider</span><span class="w"> </span><span class="nv">&quot;azurerm&quot;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="nb">features</span><span class="w"> </span><span class="p">{}</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
<span class="kr">provider</span><span class="w"> </span><span class="nv">&quot;ct&quot;</span><span class="w"> </span><span class="p">{}</span><span class="w"></span>
<span class="nb">terraform</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="nb">required_providers</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="nb">ct</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="na">source</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;poseidon/ct&quot;</span><span class="w"></span>
<span class="w"> </span><span class="na">version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;0.10.0&quot;</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="nb">azurerm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="na">source</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;hashicorp/azurerm&quot;</span><span class="w"></span>
<span class="w"> </span><span class="na">version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;3.14.0&quot;</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>Additional configuration options are described in the <code>azurerm</code> provider <a href="https://www.terraform.io/docs/providers/azurerm/">docs</a>.</p>
<h2 id="flatcar-linux-images">Flatcar Linux Images<a class="headerlink" href="#flatcar-linux-images" title="Permanent link">&para;</a></h2>
<p>Flatcar Linux publishes images to the Azure Marketplace and requires accepting terms.</p>
<div class="highlight"><pre><span></span><code>az vm image terms show --publish kinvolk --offer flatcar-container-linux-free --plan stable
az vm image terms accept --publish kinvolk --offer flatcar-container-linux-free --plan stable
</code></pre></div>
<h2 id="cluster">Cluster<a class="headerlink" href="#cluster" title="Permanent link">&para;</a></h2>
<p>Define a Kubernetes cluster using the module <code>azure/flatcar-linux/kubernetes</code>.</p>
<div class="highlight"><pre><span></span><code><span class="kr">module</span><span class="w"> </span><span class="nv">&quot;ramius&quot;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="na">source</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;git::https://github.com/poseidon/typhoon//azure/flatcar-linux/kubernetes?ref=v1.24.3&quot;</span><span class="c1"></span>
<span class="c1"> # Azure</span>
<span class="w"> </span><span class="na">cluster_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;ramius&quot;</span><span class="w"></span>
<span class="w"> </span><span class="na">region</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;centralus&quot;</span><span class="w"></span>
<span class="w"> </span><span class="na">dns_zone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;azure.example.com&quot;</span><span class="w"></span>
<span class="w"> </span><span class="na">dns_zone_group</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;example-group&quot;</span><span class="c1"></span>
<span class="c1"> # configuration</span>
<span class="w"> </span><span class="na">ssh_authorized_key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;ssh-rsa AAAAB3Nz...&quot;</span><span class="c1"></span>
<span class="c1"> # optional</span>
<span class="w"> </span><span class="na">worker_count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="w"></span>
<span class="w"> </span><span class="na">host_cidr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;10.0.0.0/20&quot;</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>Reference the <a href="#variables">variables docs</a> or the <a href="https://github.com/poseidon/typhoon/blob/master/azure/flatcar-linux/kubernetes/variables.tf">variables.tf</a> source.</p>
<h2 id="ssh-agent">ssh-agent<a class="headerlink" href="#ssh-agent" title="Permanent link">&para;</a></h2>
<p>Initial bootstrapping requires <code>bootstrap.service</code> be started on one controller node. Terraform uses <code>ssh-agent</code> to automate this step. Add your SSH private key to <code>ssh-agent</code>.</p>
<div class="highlight"><pre><span></span><code>ssh-add ~/.ssh/id_rsa
ssh-add -L
</code></pre></div>
<h2 id="apply">Apply<a class="headerlink" href="#apply" title="Permanent link">&para;</a></h2>
<p>Initialize the config directory if this is the first use with Terraform.</p>
<div class="highlight"><pre><span></span><code>terraform init
</code></pre></div>
<p>Plan the resources to be created.</p>
<div class="highlight"><pre><span></span><code>$ terraform plan
Plan: <span class="m">86</span> to add, <span class="m">0</span> to change, <span class="m">0</span> to destroy.
</code></pre></div>
<p>Apply the changes to create the cluster.</p>
<div class="highlight"><pre><span></span><code>$ terraform apply
...
module.ramius.null_resource.bootstrap: Still creating... <span class="o">(</span>6m50s elapsed<span class="o">)</span>
module.ramius.null_resource.bootstrap: Still creating... <span class="o">(</span>7m0s elapsed<span class="o">)</span>
module.ramius.null_resource.bootstrap: Creation <span class="nb">complete</span> after 7m8s <span class="o">(</span>ID: <span class="m">3961816482286168143</span><span class="o">)</span>
Apply complete! Resources: <span class="m">69</span> added, <span class="m">0</span> changed, <span class="m">0</span> destroyed.
</code></pre></div>
<p>In 4-8 minutes, the Kubernetes cluster will be ready.</p>
<h2 id="verify">Verify<a class="headerlink" href="#verify" title="Permanent link">&para;</a></h2>
<p><a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/">Install kubectl</a> on your system. Obtain the generated cluster <code>kubeconfig</code> from module outputs (e.g. write to a local file).</p>
<div class="highlight"><pre><span></span><code>resource &quot;local_file&quot; &quot;kubeconfig-ramius&quot; {
content = module.ramius.kubeconfig-admin
filename = &quot;/home/user/.kube/configs/ramius-config&quot;
}
</code></pre></div>
<p>List nodes in the cluster.</p>
<div class="highlight"><pre><span></span><code>$ export KUBECONFIG=/home/user/.kube/configs/ramius-config
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ramius-controller-0 Ready &lt;none&gt; 24m v1.24.3
ramius-worker-000001 Ready &lt;none&gt; 25m v1.24.3
ramius-worker-000002 Ready &lt;none&gt; 24m v1.24.3
</code></pre></div>
<p>List the pods.</p>
<div class="highlight"><pre><span></span><code>$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7c6fbb4f4b-b6qzx 1/1 Running 0 26m
kube-system coredns-7c6fbb4f4b-j2k3d 1/1 Running 0 26m
kube-system calico-node-1m5bf 2/2 Running 0 26m
kube-system calico-node-7jmr1 2/2 Running 0 26m
kube-system calico-node-bknc8 2/2 Running 0 26m
kube-system kube-apiserver-ramius-controller-0 1/1 Running 0 26m
kube-system kube-controller-manager-ramius-controller-0 1/1 Running 0 26m
kube-system kube-proxy-j4vpq 1/1 Running 0 26m
kube-system kube-proxy-jxr5d 1/1 Running 0 26m
kube-system kube-proxy-lbdw5 1/1 Running 0 26m
kube-system kube-scheduler-ramius-controller-0 1/1 Running 0 26m
</code></pre></div>
<h2 id="going-further">Going Further<a class="headerlink" href="#going-further" title="Permanent link">&para;</a></h2>
<p>Learn about <a href="/topics/maintenance/">maintenance</a> and <a href="/addons/overview/">addons</a>.</p>
<h2 id="variables">Variables<a class="headerlink" href="#variables" title="Permanent link">&para;</a></h2>
<p>Check the <a href="https://github.com/poseidon/typhoon/blob/master/azure/flatcar-linux/kubernetes/variables.tf">variables.tf</a> source.</p>
<h3 id="required">Required<a class="headerlink" href="#required" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th align="left">Name</th>
<th align="left">Description</th>
<th align="left">Example</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">cluster_name</td>
<td align="left">Unique cluster name (prepended to dns_zone)</td>
<td align="left">"ramius"</td>
</tr>
<tr>
<td align="left">region</td>
<td align="left">Azure region</td>
<td align="left">"centralus"</td>
</tr>
<tr>
<td align="left">dns_zone</td>
<td align="left">Azure DNS zone</td>
<td align="left">"azure.example.com"</td>
</tr>
<tr>
<td align="left">dns_zone_group</td>
<td align="left">Resource group where the Azure DNS zone resides</td>
<td align="left">"global"</td>
</tr>
<tr>
<td align="left">ssh_authorized_key</td>
<td align="left">SSH public key for user 'core'</td>
<td align="left">"ssh-rsa AAAAB3NZ..."</td>
</tr>
</tbody>
</table>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>Regions are shown in <a href="https://azure.microsoft.com/en-us/global-infrastructure/regions/">docs</a> or with <code>az account list-locations --output table</code>.</p>
</div>
<h4 id="dns-zone">DNS Zone<a class="headerlink" href="#dns-zone" title="Permanent link">&para;</a></h4>
<p>Clusters create a DNS A record <code>${cluster_name}.${dns_zone}</code> to resolve a load balancer backed by controller instances. This FQDN is used by workers and <code>kubectl</code> to access the apiserver(s). In this example, the cluster's apiserver would be accessible at <code>ramius.azure.example.com</code>.</p>
<p>You'll need a registered domain name or delegated subdomain on Azure DNS. You can set this up once and create many clusters with unique names.</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Azure resource group for DNS zone</span>
<span class="kr">resource</span><span class="w"> </span><span class="nc">&quot;azurerm_resource_group&quot;</span><span class="w"> </span><span class="nv">&quot;global&quot;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;global&quot;</span><span class="w"></span>
<span class="w"> </span><span class="na">location</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;centralus&quot;</span><span class="w"></span>
<span class="p">}</span><span class="c1"></span>
<span class="c1"># DNS zone for clusters</span>
<span class="kr">resource</span><span class="w"> </span><span class="nc">&quot;azurerm_dns_zone&quot;</span><span class="w"> </span><span class="nv">&quot;clusters&quot;</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w"> </span><span class="na">resource_group_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">azurerm_resource_group.global.name</span><span class="w"></span>
<span class="w"> </span><span class="na">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;azure.example.com&quot;</span><span class="w"></span>
<span class="w"> </span><span class="na">zone_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;Public&quot;</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>Reference the DNS zone with <code>azurerm_dns_zone.clusters.name</code> and its resource group with <code>"azurerm_resource_group.global.name</code>.</p>
<div class="admonition tip">
<p>If you have an existing domain name with a zone file elsewhere, just delegate a subdomain that can be managed on Azure DNS (e.g. azure.mydomain.com) and <a href="https://docs.microsoft.com/en-us/azure/dns/dns-delegate-domain-azure-dns">update nameservers</a>.</p>
</div>
<h3 id="optional">Optional<a class="headerlink" href="#optional" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th align="left">Name</th>
<th align="left">Description</th>
<th align="left">Default</th>
<th align="left">Example</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">controller_count</td>
<td align="left">Number of controllers (i.e. masters)</td>
<td align="left">1</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">worker_count</td>
<td align="left">Number of workers</td>
<td align="left">1</td>
<td align="left">3</td>
</tr>
<tr>
<td align="left">controller_type</td>
<td align="left">Machine type for controllers</td>
<td align="left">"Standard_B2s"</td>
<td align="left">See below</td>
</tr>
<tr>
<td align="left">worker_type</td>
<td align="left">Machine type for workers</td>
<td align="left">"Standard_DS1_v2"</td>
<td align="left">See below</td>
</tr>
<tr>
<td align="left">os_image</td>
<td align="left">Channel for a Container Linux derivative</td>
<td align="left">"flatcar-stable"</td>
<td align="left">flatcar-stable, flatcar-beta, flatcar-alpha</td>
</tr>
<tr>
<td align="left">disk_size</td>
<td align="left">Size of the disk in GB</td>
<td align="left">30</td>
<td align="left">100</td>
</tr>
<tr>
<td align="left">worker_priority</td>
<td align="left">Set priority to Spot to use reduced cost surplus capacity, with the tradeoff that instances can be deallocated at any time</td>
<td align="left">Regular</td>
<td align="left">Spot</td>
</tr>
<tr>
<td align="left">controller_snippets</td>
<td align="left">Controller Container Linux Config snippets</td>
<td align="left">[]</td>
<td align="left"><a href="/advanced/customization/#usage">example</a></td>
</tr>
<tr>
<td align="left">worker_snippets</td>
<td align="left">Worker Container Linux Config snippets</td>
<td align="left">[]</td>
<td align="left"><a href="/advanced/customization/#usage">example</a></td>
</tr>
<tr>
<td align="left">networking</td>
<td align="left">Choice of networking provider</td>
<td align="left">"cilium"</td>
<td align="left">"calico" or "cilium" or "flannel"</td>
</tr>
<tr>
<td align="left">host_cidr</td>
<td align="left">CIDR IPv4 range to assign to instances</td>
<td align="left">"10.0.0.0/16"</td>
<td align="left">"10.0.0.0/20"</td>
</tr>
<tr>
<td align="left">pod_cidr</td>
<td align="left">CIDR IPv4 range to assign to Kubernetes pods</td>
<td align="left">"10.2.0.0/16"</td>
<td align="left">"10.22.0.0/16"</td>
</tr>
<tr>
<td align="left">service_cidr</td>
<td align="left">CIDR IPv4 range to assign to Kubernetes services</td>
<td align="left">"10.3.0.0/16"</td>
<td align="left">"10.3.0.0/24"</td>
</tr>
<tr>
<td align="left">worker_node_labels</td>
<td align="left">List of initial worker node labels</td>
<td align="left">[]</td>
<td align="left">["worker-pool=default"]</td>
</tr>
</tbody>
</table>
<p>Check the list of valid <a href="https://azure.microsoft.com/en-us/pricing/details/virtual-machines/linux/">machine types</a> and their <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/linux/sizes-general">specs</a>. Use <code>az vm list-skus</code> to get the identifier.</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Unlike AWS and GCP, Azure requires its <em>virtual</em> networks to have non-overlapping IPv4 CIDRs (yeah, go figure). Instead of each cluster just using <code>10.0.0.0/16</code> for instances, each Azure cluster's <code>host_cidr</code> must be non-overlapping (e.g. 10.0.0.0/20 for the 1<sup>st</sup> cluster, 10.0.16.0/20 for the 2<sup>nd</sup> cluster, etc).</p>
</div>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Do not choose a <code>controller_type</code> smaller than <code>Standard_B2s</code>. Smaller instances are not sufficient for running a controller.</p>
</div>
<h4 id="spot-priority">Spot Priority<a class="headerlink" href="#spot-priority" title="Permanent link">&para;</a></h4>
<p>Add <code>worker_priority=Spot</code> to use <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/linux/spot-vms">Spot Priority</a> workers that run on Azure's surplus capacity at lower cost, but with the tradeoff that they can be deallocated at random. Spot priority VMs are Azure's analog to AWS spot instances or GCP premptible instances.</p>
</article>
</div>
</div>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="Footer" >
<a href="../aws/" class="md-footer__link md-footer__link--prev" aria-label="Previous: AWS" rel="prev">
<div class="md-footer__button md-icon">
<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>
</div>
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Previous
</span>
AWS
</div>
</div>
</a>
<a href="../bare-metal/" class="md-footer__link md-footer__link--next" aria-label="Next: Bare-Metal" rel="next">
<div class="md-footer__title">
<div class="md-ellipsis">
<span class="md-footer__direction">
Next
</span>
Bare-Metal
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
</div>
</a>
</nav>
<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.1.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 2022 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.1.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 2022 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.85cb4492.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "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.title": "Select version"}}</script>
<script src="../../assets/javascripts/bundle.a877e258.min.js"></script>
</body>
</html>