oakazanin/public/posts/k3s-part1-architecture/index.html

2325 lines
92 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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>
<html
lang="ru"
dir="ltr"
class="scroll-smooth"
data-default-appearance="dark"
data-auto-appearance="false"><head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<meta charset="utf-8">
<meta http-equiv="content-language" content="ru">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="theme-color">
<title>K3s HA для homelab: архитектура без боли &middot; Олег Казанин</title>
<meta name="title" content="K3s HA для homelab: архитектура без боли &middot; Олег Казанин">
<meta name="description" content="Полноценный Kubernetes в бинарнике на 50MB вместо 1.5GB зависимостей. Разбираем архитектуру K3s HA кластера: почему именно 3 master ноды, зачем embedded etcd и сколько ресурсов закладывать.">
<meta name="keywords" content="kubernetes,k3s,homelab,proxmox,architecture,ha,devops,">
<link rel="canonical" href="http://192.168.11.190:1313/posts/k3s-part1-architecture/">
<meta name="author" content="Олег Казанин">
<link href="https://t.me/oa_msk" rel="me">
<link href="https://oakazanin.ru/" rel="me">
<link href="https://git.jn4.ru/astronit" rel="me">
<link href="https://obrtv.ru/a/chiefengineer" rel="me">
<meta property="og:url" content="http://192.168.11.190:1313/posts/k3s-part1-architecture/">
<meta property="og:site_name" content="Олег Казанин">
<meta property="og:title" content="K3s HA для homelab: архитектура без боли">
<meta property="og:description" content="Полноценный Kubernetes в бинарнике на 50MB вместо 1.5GB зависимостей. Разбираем архитектуру K3s HA кластера: почему именно 3 master ноды, зачем embedded etcd и сколько ресурсов закладывать.">
<meta property="og:locale" content="ru">
<meta property="og:type" content="article">
<meta property="article:section" content="posts">
<meta property="article:published_time" content="2025-10-14T00:00:00+00:00">
<meta property="article:modified_time" content="2025-10-14T00:00:00+00:00">
<meta property="article:tag" content="Kubernetes">
<meta property="article:tag" content="K3s">
<meta property="article:tag" content="Homelab">
<meta property="article:tag" content="Proxmox">
<meta property="article:tag" content="Architecture">
<meta property="article:tag" content="Ha">
<meta property="og:image" content="http://192.168.11.190:1313/posts/k3s-part1-architecture/featured.png">
<meta property="og:see_also" content="http://192.168.11.190:1313/posts/k3s-part3-installation/">
<meta property="og:see_also" content="http://192.168.11.190:1313/posts/k3s-part2-infrastructure/">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="http://192.168.11.190:1313/posts/k3s-part1-architecture/featured.png">
<meta name="twitter:title" content="K3s HA для homelab: архитектура без боли">
<meta name="twitter:description" content="Полноценный Kubernetes в бинарнике на 50MB вместо 1.5GB зависимостей. Разбираем архитектуру K3s HA кластера: почему именно 3 master ноды, зачем embedded etcd и сколько ресурсов закладывать.">
<link
type="text/css"
rel="stylesheet"
href="/css/main.bundle.min.f7f4ea4d52ba0bdbea7d2aa148eb5d7e983ff2cae72189d5c1559a358b6970345d94eaef53a263ed180a9af4efa0eaff8d1be71018580e0826e3cc5959a0a23d.css"
integrity="sha512-9/TqTVK6C9vqfSqhSOtdfpg/8srnIYnVwVWaNYtpcDRdlOrvU6Jj7RgKmvTvoOr/jRvnEBhYDggm48xZWaCiPQ==">
<script
type="text/javascript"
src="/js/appearance.min.a0c4d367419d691bf95fc98ffcaf55ce81db3412c3dfbd6c4fbe968f56f77347f5a8512b0916a65a5f496dbec1ef0590dbadcf2fbd0de3c919e525f11c32d0e3.js"
integrity="sha512-oMTTZ0GdaRv5X8mP/K9VzoHbNBLD371sT76Wj1b3c0f1qFErCRamWl9Jbb7B7wWQ263PL70N48kZ5SXxHDLQ4w=="></script>
<script src="/lib/zoom/zoom.min.umd.a527109b68c082a70f3697716dd72a9d5aa8b545cf800cecbbc7399f2ca6f6e0ce3e431f2062b48bbfa47c9ea42822714060bef309be073f49b9c0e30d318d7b.js" integrity="sha512-pScQm2jAgqcPNpdxbdcqnVqotUXPgAzsu8c5nyym9uDOPkMfIGK0i7&#43;kfJ6kKCJxQGC&#43;8wm&#43;Bz9JucDjDTGNew=="></script>
<script
defer
type="text/javascript"
id="script-bundle"
src="/js/main.bundle.min.858f7f82734cfae08d59fcf8d0eb186f01706a84e2f7d20d39edfd7bc8bed6166e02d5c65ecce1de82b1ac52d1e01d77bd1a82d19186fdae5fe6e12d867fcf68.js"
integrity="sha512-hY9/gnNM&#43;uCNWfz40OsYbwFwaoTi99INOe39e8i&#43;1hZuAtXGXszh3oKxrFLR4B13vRqC0ZGG/a5f5uEthn/PaA=="
data-copy="Копировать"
data-copied="Скопировано"></script>
<script type="module" src="/js/firebase.min.cad74e0625f72f359ec6d6fed579b87733749de70400e7614048050ed08832ee3f58983d5d139fb1ddc5f7f2f5047d45ed80ec923534a3660fc3a7965f936866.js" integrity="sha512-ytdOBiX3LzWextb&#43;1Xm4dzN0necEAOdhQEgFDtCIMu4/WJg9XROfsd3F9/L1BH1F7YDskjU0o2YPw6eWX5NoZg=="></script>
<script id="firebase-config"
type="application/json"
data-views="views_posts/k3s-part1-architecture/index.md"
data-likes="likes_posts/k3s-part1-architecture/index.md">
{
"config": {
"apiKey": "AIzaSyBBfzADrGgnwTIyW67gfZSrAtkoybxvmdI",
"authDomain": "oakazanin-hugo-blowfish.firebaseapp.com",
"projectId": "oakazanin-hugo-blowfish",
"storageBucket": "oakazanin-hugo-blowfish.firebasestorage.app",
"messagingSenderId": "945151844512",
"appId": "1:945151844512:web:22602cc010f5b7e0cca9c5",
"measurementId": ""
}
}
</script>
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<script type="application/ld+json">
[{
"@context": "https://schema.org",
"@type": "Article",
"articleSection": "Posts",
"name": "K3s HA для homelab: архитектура без боли",
"headline": "K3s HA для homelab: архитектура без боли",
"description": "Полноценный Kubernetes в бинарнике на 50MB вместо 1.5GB зависимостей. Разбираем архитектуру K3s HA кластера: почему именно 3 master ноды, зачем embedded etcd и сколько ресурсов закладывать.",
"inLanguage": "ru",
"url" : "http://192.168.11.190:1313/posts/k3s-part1-architecture/",
"author" : {
"@type": "Person",
"name": "Олег Казанин"
},
"copyrightYear": "2025",
"dateCreated": "2025-10-14T00:00:00\u002b00:00",
"datePublished": "2025-10-14T00:00:00\u002b00:00",
"dateModified": "2025-10-14T00:00:00\u002b00:00",
"keywords": ["kubernetes","k3s","homelab","proxmox","architecture","ha","devops"],
"mainEntityOfPage": "true",
"wordCount": "1634"
}]
</script>
</head>
<body class="flex flex-col h-screen m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32 text-lg bg-neutral text-neutral-900 dark:bg-neutral-800 dark:text-neutral bf-scrollbar">
<div id="the-top" class="absolute flex self-center">
<a
class="px-3 py-1 text-sm -translate-y-8 rounded-b-lg bg-primary-200 focus:translate-y-0 dark:bg-neutral-600"
href="#main-content">
<span class="font-bold text-primary-600 pe-2 dark:text-primary-400">&darr;</span>
Перейти к основному содержимому
</a>
</div>
<div class="min-h-[148px]"></div>
<div class="fixed inset-x-0 z-100">
<div
id="menu-blur"
class="absolute opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-2xl shadow-2xl bg-neutral/25 dark:bg-neutral-800/25"></div>
<div class="relative m-auto leading-7 max-w-7xl px-6 sm:px-14 md:px-24 lg:px-32">
<div class="main-menu flex items-center w-full gap-2 p-1 pl-0">
<div>
<a href="/" class="flex">
<span class="sr-only">Олег Казанин</span>
<img
src="/img/logo.png"
width="285"
height="175"
class="logo max-h-20 max-w-20 object-scale-down object-left nozoom"
alt="">
</a>
</div>
<div class="flex items-center ms-auto">
<div class="hidden md:flex">
<nav class="flex items-center gap-x-5 h-12">
<a
href="/about/"
class="flex items-center bf-icon-color-hover"
aria-label="Об авторе"
title="Кто это пишет и зачем">
<span class="text-base font-medium break-normal">
Об авторе
</span>
</a>
<button
id="search-button"
aria-label="Search"
class="text-base bf-icon-color-hover"
title="Поиск (/)">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</button>
<div class="flex items-center">
<button
id="appearance-switcher"
aria-label="Dark mode switcher"
type="button"
class="text-base bf-icon-color-hover">
<div class="flex items-center justify-center dark:hidden">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
</span>
</div>
<div class="items-center justify-center hidden dark:flex">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
</span>
</div>
</button>
</div>
</nav>
</div>
<div class="flex md:hidden">
<div class="flex items-center h-14 gap-4">
<button
id="search-button-mobile"
aria-label="Search"
class="flex items-center justify-center bf-icon-color-hover"
title="Поиск (/)">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</button>
<button
id="appearance-switcher-mobile"
type="button"
aria-label="Dark mode switcher"
class="flex items-center justify-center text-neutral-900 hover:text-primary-600 dark:text-neutral-200 dark:hover:text-primary-400">
<div class="dark:hidden">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
</span>
</div>
<div class="hidden dark:block">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
</span>
</div>
</button>
<input type="checkbox" id="mobile-menu-toggle" autocomplete="off" class="hidden peer">
<label for="mobile-menu-toggle" class="flex items-center justify-center cursor-pointer bf-icon-color-hover">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M0 96C0 78.33 14.33 64 32 64H416C433.7 64 448 78.33 448 96C448 113.7 433.7 128 416 128H32C14.33 128 0 113.7 0 96zM0 256C0 238.3 14.33 224 32 224H416C433.7 224 448 238.3 448 256C448 273.7 433.7 288 416 288H32C14.33 288 0 273.7 0 256zM416 448H32C14.33 448 0 433.7 0 416C0 398.3 14.33 384 32 384H416C433.7 384 448 398.3 448 416C448 433.7 433.7 448 416 448z"/></svg>
</span>
</label>
<div
role="dialog"
aria-modal="true"
style="scrollbar-gutter: stable;"
class="fixed inset-0 z-50 invisible overflow-y-auto px-6 py-20 opacity-0 transition-[opacity,visibility] duration-300 peer-checked:visible peer-checked:opacity-100 bg-neutral-50/97 dark:bg-neutral-900/99
bf-scrollbar">
<label
for="mobile-menu-toggle"
class="fixed end-8 top-5 flex items-center justify-center z-50 h-12 w-12 cursor-pointer select-none rounded-full bf-icon-color-hover border bf-border-color bf-border-color-hover bg-neutral-50 dark:bg-neutral-900">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
</span>
</label>
<nav class="mx-auto max-w-md space-y-6">
<div class="px-2">
<a
href="/about/"
aria-label="Об авторе"
class="flex items-center gap-4 group bf-icon-color-hover text-neutral-700 dark:text-neutral-200">
<span title="Кто это пишет и зачем" class="text-2xl font-bold tracking-tight">
Об авторе
</span>
</a>
</div>
</nav>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script
type="text/javascript"
src="/js/background-blur.min.605b3b942818f0ab5a717ae446135ec46b8ee5a2ad12ae56fb90dc2a76ce30c388f9fec8bcc18db15bd47e3fa8a09d779fa12aa9c184cf614a315bc72c6c163d.js"
integrity="sha512-YFs7lCgY8KtacXrkRhNexGuO5aKtEq5W&#43;5DcKnbOMMOI&#43;f7IvMGNsVvUfj&#43;ooJ13n6EqqcGEz2FKMVvHLGwWPQ=="
data-blur-id="menu-blur"></script>
<div class="relative flex flex-col grow">
<main id="main-content" class="grow">
<article>
<div id="hero" class="h-[150px] md:h-[200px]"></div>
<div class="fixed inset-x-0 top-0 h-[800px] single_hero_background nozoom">
<img
id="background-image"
src="/posts/k3s-part1-architecture/featured_hu_79735d97c46e93a6.png"
role="presentation"
loading="eager"
decoding="async"
fetchpriority="high"
class="absolute inset-0 w-full h-full object-cover"
>
<div
class="absolute inset-0 bg-gradient-to-t from-neutral dark:from-neutral-800 to-transparent mix-blend-normal"></div>
<div
class="absolute inset-0 opacity-60 bg-gradient-to-t from-neutral dark:from-neutral-800 to-neutral-100 dark:to-neutral-800 mix-blend-normal"></div>
</div>
<div
id="background-blur"
class="fixed opacity-0 inset-x-0 top-0 h-full single_hero_background nozoom backdrop-blur-xl bg-neutral-100/75 dark:bg-neutral-800/60"></div>
<script
type="text/javascript"
src="/js/background-blur.min.605b3b942818f0ab5a717ae446135ec46b8ee5a2ad12ae56fb90dc2a76ce30c388f9fec8bcc18db15bd47e3fa8a09d779fa12aa9c184cf614a315bc72c6c163d.js"
integrity="sha512-YFs7lCgY8KtacXrkRhNexGuO5aKtEq5W&#43;5DcKnbOMMOI&#43;f7IvMGNsVvUfj&#43;ooJ13n6EqqcGEz2FKMVvHLGwWPQ=="
data-blur-id="background-blur"
data-image-id="background-image"
data-image-url="/posts/k3s-part1-architecture/featured_hu_79735d97c46e93a6.png"></script>
<header id="single_header" class="mt-5 max-w-prose">
<h1 class="mt-0 text-4xl font-extrabold text-neutral-900 dark:text-neutral">
K3s HA для homelab: архитектура без боли
</h1>
<div class="mt-1 mb-6 text-base text-neutral-500 dark:text-neutral-400 print:hidden">
<div class="flex flex-row flex-wrap items-center">
<time datetime="2025-10-14T00:00:00&#43;00:00">14 октября 2025</time><span class="px-2 text-primary-500">&middot;</span><span title="Время чтения">8 минут</span><span class="px-2 text-primary-500">&middot;</span><span>
<span
id="views_posts/k3s-part1-architecture/index.md"
class="animate-pulse inline-block text-transparent max-h-3 rounded-full -mt-[2px] align-middle bg-neutral-300 dark:bg-neutral-400"
title="views"
>loading</span
>
<span class="inline-block align-text-bottom"><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512">
<path fill="currentColor" d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg></span></span>
</span>
<span class="px-2 text-primary-500">&middot;</span><span>
<span
id="likes_posts/k3s-part1-architecture/index.md"
class="animate-pulse inline-block text-transparent max-h-3 rounded-full -mt-[2px] align-middle bg-neutral-300 dark:bg-neutral-400"
title="likes"
>loading</span
>
<span class="inline-block align-text-bottom"><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M47.6 300.4L228.3 469.1c7.5 7 17.4 10.9 27.7 10.9s20.2-3.9 27.7-10.9L464.4 300.4c30.4-28.3 47.6-68 47.6-109.5v-5.8c0-69.9-50.5-129.5-119.4-141C347 36.5 300.6 51.4 268 84L256 96 244 84c-32.6-32.6-79-47.5-124.6-39.9C50.5 55.6 0 115.2 0 185.1v5.8c0 41.5 17.2 81.2 47.6 109.5z"/></svg></span></span>
</span>
<span class="px-2 text-primary-500">&middot;</span><span>
<button
id="button_likes"
class="rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400">
<span id="button_likes_heart" class="inline-block align-text-bottom hidden"
><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M47.6 300.4L228.3 469.1c7.5 7 17.4 10.9 27.7 10.9s20.2-3.9 27.7-10.9L464.4 300.4c30.4-28.3 47.6-68 47.6-109.5v-5.8c0-69.9-50.5-129.5-119.4-141C347 36.5 300.6 51.4 268 84L256 96 244 84c-32.6-32.6-79-47.5-124.6-39.9C50.5 55.6 0 115.2 0 185.1v5.8c0 41.5 17.2 81.2 47.6 109.5z"/></svg></span>
</span>
<span id="button_likes_emtpty_heart" class="inline-block align-text-bottom"
><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="currentColor" d="M244 84L255.1 96L267.1 84.02C300.6 51.37 347 36.51 392.6 44.1C461.5 55.58 512 115.2 512 185.1V190.9C512 232.4 494.8 272.1 464.4 300.4L283.7 469.1C276.2 476.1 266.3 480 256 480C245.7 480 235.8 476.1 228.3 469.1L47.59 300.4C17.23 272.1 0 232.4 0 190.9V185.1C0 115.2 50.52 55.58 119.4 44.1C164.1 36.51 211.4 51.37 244 84C243.1 84 244 84.01 244 84L244 84zM255.1 163.9L210.1 117.1C188.4 96.28 157.6 86.4 127.3 91.44C81.55 99.07 48 138.7 48 185.1V190.9C48 219.1 59.71 246.1 80.34 265.3L256 429.3L431.7 265.3C452.3 246.1 464 219.1 464 190.9V185.1C464 138.7 430.4 99.07 384.7 91.44C354.4 86.4 323.6 96.28 301.9 117.1L255.1 163.9z"/></svg></span></span
>
<span id="button_likes_text">&nbsp;Like</span>
</button>
</span>
</div>
<div class="flex flex-row flex-wrap items-center">
<a class="relative mt-[0.5rem] me-2" href="/categories/kubernetes/">
<span class="flex cursor-pointer">
<span
class="rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400">
Kubernetes
</span>
</span>
</a>
<a class="relative mt-[0.5rem] me-2" href="/categories/homelab/">
<span class="flex cursor-pointer">
<span
class="rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400">
Homelab
</span>
</span>
</a>
<a class="relative mt-[0.5rem] me-2" href="/tags/kubernetes/">
<span class="flex cursor-pointer">
<span
class="rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400">
Kubernetes
</span>
</span>
</a>
<a class="relative mt-[0.5rem] me-2" href="/tags/k3s/">
<span class="flex cursor-pointer">
<span
class="rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400">
K3s
</span>
</span>
</a>
<a class="relative mt-[0.5rem] me-2" href="/tags/homelab/">
<span class="flex cursor-pointer">
<span
class="rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400">
Homelab
</span>
</span>
</a>
<a class="relative mt-[0.5rem] me-2" href="/tags/proxmox/">
<span class="flex cursor-pointer">
<span
class="rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400">
Proxmox
</span>
</span>
</a>
<a class="relative mt-[0.5rem] me-2" href="/tags/architecture/">
<span class="flex cursor-pointer">
<span
class="rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400">
Architecture
</span>
</span>
</a>
<a class="relative mt-[0.5rem] me-2" href="/tags/ha/">
<span class="flex cursor-pointer">
<span
class="rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400">
Ha
</span>
</span>
</a>
<a class="relative mt-[0.5rem] me-2" href="/tags/devops/">
<span class="flex cursor-pointer">
<span
class="rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400">
Devops
</span>
</span>
</a>
</div>
</div>
<div class="flex author">
<img
class="!mt-0 !mb-0 h-24 w-24 rounded-full me-4"
width="96"
height="96"
alt="Олег Казанин"
src="/img/profile_hu_9cb3a1ec5563cd7f.png"
data-zoom-src="/img/profile_hu_1a9fbd8177a94ed5.png">
<div class="place-self-center">
<div class="text-[0.6rem] uppercase leading-3 text-neutral-500 dark:text-neutral-400">
Автор
</div>
<div class="font-semibold leading-6 text-neutral-800 dark:text-neutral-300">
Олег Казанин
</div>
<div class="text-sm text-neutral-700 dark:text-neutral-400">Строю полезную инфраструктуру на Open Source стеке. Документирую грабли, чтобы вы на них не наступали.</div>
<div class="text-2xl sm:text-lg">
<div class="flex flex-wrap text-neutral-400 dark:text-neutral-500">
<a
class="px-1 hover:text-primary-700 dark:hover:text-primary-400"
href="mailto:oakazanin@ya.ru"
target="_blank"
aria-label="Email"
title="Email"
rel="me noopener noreferrer"
><span class="inline-block align-text-bottom"><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M207.8 20.73c-93.45 18.32-168.7 93.66-187 187.1c-27.64 140.9 68.65 266.2 199.1 285.1c19.01 2.888 36.17-12.26 36.17-31.49l.0001-.6631c0-15.74-11.44-28.88-26.84-31.24c-84.35-12.98-149.2-86.13-149.2-174.2c0-102.9 88.61-185.5 193.4-175.4c91.54 8.869 158.6 91.25 158.6 183.2l0 16.16c0 22.09-17.94 40.05-40 40.05s-40.01-17.96-40.01-40.05v-120.1c0-8.847-7.161-16.02-16.01-16.02l-31.98 .0036c-7.299 0-13.2 4.992-15.12 11.68c-24.85-12.15-54.24-16.38-86.06-5.106c-38.75 13.73-68.12 48.91-73.72 89.64c-9.483 69.01 43.81 128 110.9 128c26.44 0 50.43-9.544 69.59-24.88c24 31.3 65.23 48.69 109.4 37.49C465.2 369.3 496 324.1 495.1 277.2V256.3C495.1 107.1 361.2-9.332 207.8 20.73zM239.1 304.3c-26.47 0-48-21.56-48-48.05s21.53-48.05 48-48.05s48 21.56 48 48.05S266.5 304.3 239.1 304.3z"/></svg>
</span></span></a
>
<a
class="px-1 hover:text-primary-700 dark:hover:text-primary-400"
href="https://t.me/oa_msk"
target="_blank"
aria-label="Telegram"
title="Telegram"
rel="me noopener noreferrer"
><span class="inline-block align-text-bottom"><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path fill="currentColor" d="M248,8C111.033,8,0,119.033,0,256S111.033,504,248,504,496,392.967,496,256,384.967,8,248,8ZM362.952,176.66c-3.732,39.215-19.881,134.378-28.1,178.3-3.476,18.584-10.322,24.816-16.948,25.425-14.4,1.326-25.338-9.517-39.287-18.661-21.827-14.308-34.158-23.215-55.346-37.177-24.485-16.135-8.612-25,5.342-39.5,3.652-3.793,67.107-61.51,68.335-66.746.153-.655.3-3.1-1.154-4.384s-3.59-.849-5.135-.5q-3.283.746-104.608,69.142-14.845,10.194-26.894,9.934c-8.855-.191-25.888-5.006-38.551-9.123-15.531-5.048-27.875-7.717-26.8-16.291q.84-6.7,18.45-13.7,108.446-47.248,144.628-62.3c68.872-28.647,83.183-33.623,92.511-33.789,2.052-.034,6.639.474,9.61,2.885a10.452,10.452,0,0,1,3.53,6.716A43.765,43.765,0,0,1,362.952,176.66Z"/></svg>
</span></span></a
>
<a
class="px-1 hover:text-primary-700 dark:hover:text-primary-400"
href="https://oakazanin.ru/"
target="_blank"
aria-label="Link"
title="Link"
rel="me noopener noreferrer"
><span class="inline-block align-text-bottom"><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M172.5 131.1C228.1 75.51 320.5 75.51 376.1 131.1C426.1 181.1 433.5 260.8 392.4 318.3L391.3 319.9C381 334.2 361 337.6 346.7 327.3C332.3 317 328.9 297 339.2 282.7L340.3 281.1C363.2 249 359.6 205.1 331.7 177.2C300.3 145.8 249.2 145.8 217.7 177.2L105.5 289.5C73.99 320.1 73.99 372 105.5 403.5C133.3 431.4 177.3 435 209.3 412.1L210.9 410.1C225.3 400.7 245.3 404 255.5 418.4C265.8 432.8 262.5 452.8 248.1 463.1L246.5 464.2C188.1 505.3 110.2 498.7 60.21 448.8C3.741 392.3 3.741 300.7 60.21 244.3L172.5 131.1zM467.5 380C411 436.5 319.5 436.5 263 380C213 330 206.5 251.2 247.6 193.7L248.7 192.1C258.1 177.8 278.1 174.4 293.3 184.7C307.7 194.1 311.1 214.1 300.8 229.3L299.7 230.9C276.8 262.1 280.4 306.9 308.3 334.8C339.7 366.2 390.8 366.2 422.3 334.8L534.5 222.5C566 191 566 139.1 534.5 108.5C506.7 80.63 462.7 76.99 430.7 99.9L429.1 101C414.7 111.3 394.7 107.1 384.5 93.58C374.2 79.2 377.5 59.21 391.9 48.94L393.5 47.82C451 6.731 529.8 13.25 579.8 63.24C636.3 119.7 636.3 211.3 579.8 267.7L467.5 380z"/></svg>
</span></span></a
>
<a
class="px-1 hover:text-primary-700 dark:hover:text-primary-400"
href="https://git.jn4.ru/astronit"
target="_blank"
aria-label="Gitea"
title="Gitea"
rel="me noopener noreferrer"
><span class="inline-block align-text-bottom"><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="5.67 143.05 628.65 387.55"><path fill="currentColor" d="M115.912 143.075c-6.462 0-13.762.525-22.012 2.325-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.267.3-26.433.597-39.5.697l.1 117.002s57.4 24.202 83.1 40.102c3.7 2.3 10.2 6.798 12.9 14.398 2.1 6.1 2 13.101-1 19.301l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8a5290.322 5290.322 0 0 0 27 12.954c0-36.449-.1-109.053-.1-109.053-29 .4-89.2-2.201-89.2-2.201s-141.4-7.1-156.8-8.5c-4.9-.3-10.525-.825-16.988-.825zm12.188 48.026s7.1 59.399 15.7 94.199c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1z"/><path fill="currentColor" d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8-1.9 8 2 16.3 9.1 20 7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3 7.8 4 17.4 1.7 22.5-5.3 5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8l-24.6 50.4z"/></svg></span></span></a
>
<a
class="px-1 hover:text-primary-700 dark:hover:text-primary-400"
href="https://obrtv.ru/a/chiefengineer"
target="_blank"
aria-label="Peertube"
title="Peertube"
rel="me noopener noreferrer"
><span class="inline-block align-text-bottom"><span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 365 486.53"><path fill="currentColor" d="M0,243.26V0l182.5,121.63L0,243.26Z"/><path fill="currentColor" d="M0,486.53v-243.26l182.5,121.63L0,486.53Z"/><path fill="currentColor" d="M182.5,364.9V121.63l182.5,121.63-182.5,121.63Z"/></svg></span></span></a
>
</div>
</div>
</div>
</div>
<div class="mb-5"></div>
</header>
<section class="flex flex-col max-w-full mt-0 prose dark:prose-invert lg:flex-row">
<div class="order-first lg:ms-auto px-0 lg:order-last lg:ps-8 lg:max-w-2xs">
<div class="toc ps-5 print:hidden lg:sticky lg:top-[140px]">
<details
open
id="TOCView"
class="toc-right mt-0 overflow-y-auto overscroll-contain bf-scrollbar rounded-lg -ms-5 ps-5 pe-2 hidden lg:block">
<summary
class="block py-1 text-lg font-semibold cursor-pointer bg-neutral-100 text-neutral-800 -ms-5 ps-5 dark:bg-neutral-700 dark:text-neutral-100 lg:hidden">
Оглавление
</summary>
<div
class="min-w-[220px] py-2 border-dotted border-s-1 -ms-5 ps-5 dark:border-neutral-600">
<nav id="TableOfContents">
<ul>
<li><a href="#для-кого-это">Для кого это</a></li>
<li><a href="#k3s-vs-kubernetes-в-чём-разница">K3s vs Kubernetes: в чём разница</a>
<ul>
<li><a href="#сравнение-в-цифрах">Сравнение в цифрах</a></li>
</ul>
</li>
<li><a href="#что-такое-high-availability-и-зачем-оно-вам">Что такое High Availability и зачем оно вам</a>
<ul>
<li><a href="#без-ha-single-node">Без HA (single node)</a></li>
<li><a href="#с-ha-3-master-nodes">С HA (3+ master nodes)</a></li>
<li><a href="#сколько-master-нод-нужно">Сколько master нод нужно</a></li>
<li><a href="#почему-2-master-ноды-хуже-чем-1">Почему 2 master ноды хуже, чем 1</a></li>
</ul>
</li>
<li><a href="#embedded-etcd-vs-external-etcd">Embedded etcd vs External etcd</a>
<ul>
<li><a href="#external-etcd-классический-kubernetes">External etcd (классический Kubernetes)</a></li>
<li><a href="#embedded-etcd-k3s">Embedded etcd (K3s)</a></li>
<li><a href="#сравнение-подходов">Сравнение подходов</a></li>
</ul>
</li>
<li><a href="#зачем-отдельные-worker-ноды">Зачем отдельные worker ноды</a></li>
<li><a href="#архитектура-нашего-кластера">Архитектура нашего кластера</a></li>
<li><a href="#планирование-ресурсов">Планирование ресурсов</a>
<ul>
<li><a href="#таблица-vm">Таблица VM</a></li>
<li><a href="#почему-именно-такие-ресурсы">Почему именно такие ресурсы</a></li>
<li><a href="#можно-ли-меньше">Можно ли меньше?</a></li>
</ul>
</li>
<li><a href="#сетевая-схема">Сетевая схема</a>
<ul>
<li><a href="#ip-адреса-адаптируй-под-свою-сеть">IP-адреса (адаптируй под свою сеть)</a></li>
<li><a href="#kubernetes-внутренние-сети-создаются-автоматически">Kubernetes внутренние сети (создаются автоматически)</a></li>
<li><a href="#порты-между-нодами">Порты между нодами</a></li>
</ul>
</li>
<li><a href="#требования-к-железу-и-софту">Требования к железу и софту</a>
<ul>
<li><a href="#железо-proxmox-хост">Железо (Proxmox хост)</a></li>
<li><a href="#софт">Софт</a></li>
</ul>
</li>
<li><a href="#итог">Итог</a></li>
<li><a href="#что-дальше">Что дальше</a></li>
</ul>
</nav>
</div>
</details>
<details class="toc-inside mt-0 overflow-hidden rounded-lg -ms-5 ps-5 lg:hidden">
<summary
class="py-1 text-lg font-semibold cursor-pointer bg-neutral-100 text-neutral-800 -ms-5 ps-5 dark:bg-neutral-700 dark:text-neutral-100 lg:hidden">
Оглавление
</summary>
<div
class="py-2 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
<nav id="TableOfContents">
<ul>
<li><a href="#для-кого-это">Для кого это</a></li>
<li><a href="#k3s-vs-kubernetes-в-чём-разница">K3s vs Kubernetes: в чём разница</a>
<ul>
<li><a href="#сравнение-в-цифрах">Сравнение в цифрах</a></li>
</ul>
</li>
<li><a href="#что-такое-high-availability-и-зачем-оно-вам">Что такое High Availability и зачем оно вам</a>
<ul>
<li><a href="#без-ha-single-node">Без HA (single node)</a></li>
<li><a href="#с-ha-3-master-nodes">С HA (3+ master nodes)</a></li>
<li><a href="#сколько-master-нод-нужно">Сколько master нод нужно</a></li>
<li><a href="#почему-2-master-ноды-хуже-чем-1">Почему 2 master ноды хуже, чем 1</a></li>
</ul>
</li>
<li><a href="#embedded-etcd-vs-external-etcd">Embedded etcd vs External etcd</a>
<ul>
<li><a href="#external-etcd-классический-kubernetes">External etcd (классический Kubernetes)</a></li>
<li><a href="#embedded-etcd-k3s">Embedded etcd (K3s)</a></li>
<li><a href="#сравнение-подходов">Сравнение подходов</a></li>
</ul>
</li>
<li><a href="#зачем-отдельные-worker-ноды">Зачем отдельные worker ноды</a></li>
<li><a href="#архитектура-нашего-кластера">Архитектура нашего кластера</a></li>
<li><a href="#планирование-ресурсов">Планирование ресурсов</a>
<ul>
<li><a href="#таблица-vm">Таблица VM</a></li>
<li><a href="#почему-именно-такие-ресурсы">Почему именно такие ресурсы</a></li>
<li><a href="#можно-ли-меньше">Можно ли меньше?</a></li>
</ul>
</li>
<li><a href="#сетевая-схема">Сетевая схема</a>
<ul>
<li><a href="#ip-адреса-адаптируй-под-свою-сеть">IP-адреса (адаптируй под свою сеть)</a></li>
<li><a href="#kubernetes-внутренние-сети-создаются-автоматически">Kubernetes внутренние сети (создаются автоматически)</a></li>
<li><a href="#порты-между-нодами">Порты между нодами</a></li>
</ul>
</li>
<li><a href="#требования-к-железу-и-софту">Требования к железу и софту</a>
<ul>
<li><a href="#железо-proxmox-хост">Железо (Proxmox хост)</a></li>
<li><a href="#софт">Софт</a></li>
</ul>
</li>
<li><a href="#итог">Итог</a></li>
<li><a href="#что-дальше">Что дальше</a></li>
</ul>
</nav>
</div>
</details>
</div>
</div>
<div class="min-w-0 min-h-0 max-w-fit">
<details
class="mt-2 mb-5 overflow-hidden rounded-lg ms-0 ps-5"
open>
<summary
class="py-1 text-lg font-semibold cursor-pointer bg-primary-200 text-neutral-800 -ms-5 ps-5 dark:bg-primary-800 dark:text-neutral-100">
K3s HA кластер для homelab -
Эта статья — часть серии.
</summary>
<div
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
Часть 1:
Ты уже здесь
</div>
<div
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
<a href="/posts/k3s-part2-infrastructure/">
Часть 2:
K3s HA для homelab: Готовим инфраструктуру в Proxmox
</a>
</div>
<div
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
<a href="/posts/k3s-part3-installation/">
Часть 3:
K3s HA для homelab: Ставим K3s HA кластер
</a>
</div>
</details>
<div class="article-content max-w-prose mb-20">
<p>Kubernetes слишком тяжёлый, Docker Swarm мёртв, а хочется нормальный кластер для экспериментов. Знакомо? K3s решает эту проблему - полноценный Kubernetes в бинарнике на 50MB вместо 1.5GB зависимостей. Но без правильного планирования вы получите нестабильную конструкцию, которая падает в самый неподходящий момент.</p>
<p>В этой статье разберём архитектуру K3s HA кластера: почему именно 3 master ноды, зачем embedded etcd и сколько ресурсов закладывать. В конце - готовый план для установки.</p>
<p><strong>Результат:</strong> понимание архитектуры + таблица ресурсов + сетевая схема. Всё, что нужно перед тем, как создавать VM.</p>
<hr>
<h2 class="relative group">Для кого это
<div id="для-кого-это" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d0%b4%d0%bb%d1%8f-%d0%ba%d0%be%d0%b3%d0%be-%d1%8d%d1%82%d0%be" aria-label="Якорь">#</a>
</span>
</h2>
<p><strong>Подходит:</strong></p>
<ul>
<li>Знаком с базовыми концепциями Kubernetes (pod, service, deployment)</li>
<li>Есть Proxmox с 14+ vCPU и 56GB+ RAM</li>
<li>Хочешь понять <em>что</em> устанавливать, прежде чем устанавливать</li>
</ul>
<p><strong>Не подходит:</strong></p>
<ul>
<li>Нужна одна нода для экспериментов - достаточно docker-compose или K3s single-node</li>
<li>Ищешь managed Kubernetes для бизнеса - смотри в сторону Yandex Cloud или VK Cloud</li>
<li>Хочешь сразу команды без теории - переходи к статье 2</li>
</ul>
<hr>
<h2 class="relative group">K3s vs Kubernetes: в чём разница
<div id="k3s-vs-kubernetes-в-чём-разница" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#k3s-vs-kubernetes-%d0%b2-%d1%87%d1%91%d0%bc-%d1%80%d0%b0%d0%b7%d0%bd%d0%b8%d1%86%d0%b0" aria-label="Якорь">#</a>
</span>
</h2>
<p><strong>Kubernetes (K8s)</strong> - оркестратор контейнеров, стандарт индустрии. Добро пожаловать в enterprise, где для запуска трёх контейнеров нужно поддерживать шесть виртуальных машин.</p>
<p><strong>K3s</strong> - тот же Kubernetes, но кто-то в Rancher (теперь SUSE) задумался: &ldquo;А что если выкинуть всё, что нужно только Сберу и Yandex Cloud?&rdquo;</p>
<p><figure><img
class="my-0 rounded-md"
loading="lazy"
decoding="async"
fetchpriority="low"
alt="Kubernetes"
src="/posts/k3s-part1-architecture/k8s-architecture.svg"
><figcaption><strong>Kubernetes</strong></figcaption></figure>
<figure><img
class="my-0 rounded-md"
loading="lazy"
decoding="async"
fetchpriority="low"
alt="K3s"
src="/posts/k3s-part1-architecture/k3s-architecture.svg"
><figcaption><strong>K3s</strong></figcaption></figure>
</p>
<p><strong>Что выкинули:</strong></p>
<ul>
<li>Интеграции с облачными провайдерами (вы же не в VK Cloud)</li>
<li>Legacy API (вы же не мигрируете кластер 2016 года)</li>
<li>Встроенные драйверы хранилищ на все случаи жизни (вы же не используете 47 типов СХД)</li>
<li>Альфа/бета-функции (нестабильные эксперименты)</li>
</ul>
<p><strong>Что осталось:</strong> полноценный Kubernetes, сертифицированный CNCF (Cloud Native Computing Foundation - организация, которая решает, что считать &ldquo;настоящим&rdquo; Kubernetes). Все манифесты работают. Helm работает. kubectl работает. Ответы со StackOverflow работают.</p>
<h3 class="relative group">Сравнение в цифрах
<div id="сравнение-в-цифрах" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d1%81%d1%80%d0%b0%d0%b2%d0%bd%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b2-%d1%86%d0%b8%d1%84%d1%80%d0%b0%d1%85" aria-label="Якорь">#</a>
</span>
</h3>
<table>
<thead>
<tr>
<th>Характеристика</th>
<th>Kubernetes</th>
<th>K3s</th>
</tr>
</thead>
<tbody>
<tr>
<td>Размер</td>
<td>~1.5GB образы</td>
<td>50MB бинарник</td>
</tr>
<tr>
<td>RAM на control plane</td>
<td>~2GB на ноду</td>
<td>~500MB на ноду</td>
</tr>
<tr>
<td>Установка</td>
<td>kubeadm, 10+ шагов</td>
<td>один curl-скрипт</td>
</tr>
<tr>
<td>etcd</td>
<td>Отдельный кластер (3+ VM)</td>
<td>Встроенный</td>
</tr>
<tr>
<td>CNI</td>
<td>Нужно устанавливать</td>
<td>Flannel из коробки</td>
</tr>
<tr>
<td>Совместимость</td>
<td>100%</td>
<td>100%</td>
</tr>
</tbody>
</table>
<p><em>&ldquo;Но я потеряю гибкость!&rdquo;</em> - скажете вы. Да, вы не сможете заменить сетевой плагин Flannel без пересборки. Это критично примерно для одного проекта из тысячи, и ваш homelab в их число не входит.</p>
<p><strong>Вердикт:</strong> для homelab K3s - очевидный выбор. Теряем 5% гибкости, получаем 90% простоты.</p>
<hr>
<h2 class="relative group">Что такое High Availability и зачем оно вам
<div id="что-такое-high-availability-и-зачем-оно-вам" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-high-availability-%d0%b8-%d0%b7%d0%b0%d1%87%d0%b5%d0%bc-%d0%be%d0%bd%d0%be-%d0%b2%d0%b0%d0%bc" aria-label="Якорь">#</a>
</span>
</h2>
<p><strong>HA (High Availability)</strong> - способность системы продолжать работу при отказе компонентов. Звучит как enterprise-термин для больших компаний? На практике это разница между &ldquo;кластер упал в субботу, но я починил в понедельник&rdquo; и &ldquo;кластер сам пережил падение ноды, пока я спал&rdquo;.</p>
<h3 class="relative group">Без HA (single node)
<div id="без-ha-single-node" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d0%b1%d0%b5%d0%b7-ha-single-node" aria-label="Якорь">#</a>
</span>
</h3>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">┌─────────────────┐
</span></span><span class="line"><span class="cl">│ K3s Master │ ← Единственная точка отказа
</span></span><span class="line"><span class="cl">│ + Worker │
</span></span><span class="line"><span class="cl">└─────────────────┘
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Нода упала → кластер мёртв → ваши сервисы недоступны</span></span></code></pre></div></div>
<h3 class="relative group">С HA (3+ master nodes)
<div id="с-ha-3-master-nodes" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d1%81-ha-3-master-nodes" aria-label="Якорь">#</a>
</span>
</h3>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">┌──────────┐ ┌──────────┐ ┌──────────┐
</span></span><span class="line"><span class="cl">│ Master 1 │ │ Master 2 │ │ Master 3 │
</span></span><span class="line"><span class="cl">│ + etcd │ │ + etcd │ │ + etcd │
</span></span><span class="line"><span class="cl">└──────────┘ └──────────┘ └──────────┘
</span></span><span class="line"><span class="cl"> ↓ ↓ ↓
</span></span><span class="line"><span class="cl">┌──────────┐ ┌──────────┐
</span></span><span class="line"><span class="cl">│ Worker 1 │ │ Worker 2 │
</span></span><span class="line"><span class="cl">└──────────┘ └──────────┘
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Одна master упала → кластер работает
</span></span><span class="line"><span class="cl">Один worker упал → поды переехали на другой</span></span></code></pre></div></div>
<h3 class="relative group">Сколько master нод нужно
<div id="сколько-master-нод-нужно" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d1%81%d0%ba%d0%be%d0%bb%d1%8c%d0%ba%d0%be-master-%d0%bd%d0%be%d0%b4-%d0%bd%d1%83%d0%b6%d0%bd%d0%be" aria-label="Якорь">#</a>
</span>
</h3>
<p>Вот тут начинается интересное. Интуиция подсказывает: одна нода - плохо, две - уже лучше. Логично? Логично. И неправильно.</p>
<table>
<thead>
<tr>
<th>Master нод</th>
<th>Выдержит отказов</th>
<th>Кворум</th>
<th>Вердикт</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>0</td>
<td>1/1</td>
<td>Нет HA, но честно</td>
</tr>
<tr>
<td>2</td>
<td>0</td>
<td><strong>Ловушка!</strong></td>
<td>⛔ Хуже, чем 1</td>
</tr>
<tr>
<td>3</td>
<td>1</td>
<td>2/3</td>
<td>✅ Минимум для HA</td>
</tr>
<tr>
<td>5</td>
<td>2</td>
<td>3/5</td>
<td>Для критичных систем</td>
</tr>
</tbody>
</table>
<h3 class="relative group">Почему 2 master ноды хуже, чем 1
<div id="почему-2-master-ноды-хуже-чем-1" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83-2-master-%d0%bd%d0%be%d0%b4%d1%8b-%d1%85%d1%83%d0%b6%d0%b5-%d1%87%d0%b5%d0%bc-1" aria-label="Якорь">#</a>
</span>
</h3>
<p>etcd (база данных кластера, где хранится вообще всё) работает по принципу голосования. Чтобы записать данные, нужно согласие большинства нод. Не &ldquo;хотя бы одной&rdquo; - именно большинства.</p>
<p>Считаем:</p>
<ul>
<li><strong>1 нода:</strong> большинство = 1. Упала - кластер мёртв. Честная игра, вы знали на что шли.</li>
<li><strong>2 ноды:</strong> большинство = 2. Упала одна - кворума нет, кластер мёртв. Сюрприз!</li>
<li><strong>3 ноды:</strong> большинство = 2. Одна упала - две оставшиеся продолжают работать.</li>
</ul>
<p>Это как договор, требующий подписи обоих директоров - заболел один, и компания парализована.</p>
<p>С двумя нодами вы не получили отказоустойчивость. Вы удвоили количество точек отказа и назвали это &ldquo;высокой доступностью&rdquo;.</p>
<figure><img
class="my-0 rounded-md"
loading="lazy"
decoding="async"
fetchpriority="low"
alt="High Availability"
src="/posts/k3s-part1-architecture/k3s-ha.svg"
></figure>
<p><strong>Правило:</strong> или 1 нода (и честное понимание рисков), или 3+ (и настоящий HA). Двойка - ловушка для тех, кто не дочитал документацию.</p>
<hr>
<h2 class="relative group">Embedded etcd vs External etcd
<div id="embedded-etcd-vs-external-etcd" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#embedded-etcd-vs-external-etcd" aria-label="Якорь">#</a>
</span>
</h2>
<p><strong>etcd</strong> - распределённое key-value хранилище. Единственный источник истины для всего состояния Kubernetes: все объекты (поды, сервисы, секреты), конфигурации, сетевые политики. Без etcd кластер не работает. Точка.</p>
<p>Есть два варианта архитектуры:</p>
<h3 class="relative group">External etcd (классический Kubernetes)
<div id="external-etcd-классический-kubernetes" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#external-etcd-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b9-kubernetes" aria-label="Якорь">#</a>
</span>
</h3>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Control Plane (3 VM) etcd кластер (3 VM)
</span></span><span class="line"><span class="cl">┌────────────────┐ ┌──────────────┐
</span></span><span class="line"><span class="cl">│ API Server │ │ etcd-1 │
</span></span><span class="line"><span class="cl">│ Scheduler │ ──────────────&gt;│ (только etcd)│
</span></span><span class="line"><span class="cl">│ Controller │ └──────────────┘
</span></span><span class="line"><span class="cl">└────────────────┘ ┌──────────────┐
</span></span><span class="line"><span class="cl">┌────────────────┐ │ etcd-2 │
</span></span><span class="line"><span class="cl">│ API Server │ ──────────────&gt;│ (только etcd)│
</span></span><span class="line"><span class="cl">│ Scheduler │ └──────────────┘
</span></span><span class="line"><span class="cl">│ Controller │ ┌──────────────┐
</span></span><span class="line"><span class="cl">└────────────────┘ │ etcd-3 │
</span></span><span class="line"><span class="cl">┌────────────────┐ │ (только etcd)│
</span></span><span class="line"><span class="cl">│ API Server │ ──────────────&gt;└──────────────┘
</span></span><span class="line"><span class="cl">│ Scheduler │
</span></span><span class="line"><span class="cl">│ Controller │
</span></span><span class="line"><span class="cl">└────────────────┘
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Итого: 6 виртуальных машин</span></span></code></pre></div></div>
<h3 class="relative group">Embedded etcd (K3s)
<div id="embedded-etcd-k3s" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#embedded-etcd-k3s" aria-label="Якорь">#</a>
</span>
</h3>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">┌─────────────────────────┐
</span></span><span class="line"><span class="cl">│ K3s Master 1 │
</span></span><span class="line"><span class="cl">│ ┌───────────────────┐ │
</span></span><span class="line"><span class="cl">│ │ API + Scheduler │ │
</span></span><span class="line"><span class="cl">│ │ + Controller │ │
</span></span><span class="line"><span class="cl">│ └───────────────────┘ │
</span></span><span class="line"><span class="cl">│ ┌───────────────────┐ │
</span></span><span class="line"><span class="cl">│ │ etcd (встроенный) │◄─┼──┐
</span></span><span class="line"><span class="cl">│ └───────────────────┘ │ │
</span></span><span class="line"><span class="cl">└─────────────────────────┘ │ Raft protocol
</span></span><span class="line"><span class="cl">┌─────────────────────────┐ │ (синхронизация)
</span></span><span class="line"><span class="cl">│ K3s Master 2 │ │
</span></span><span class="line"><span class="cl">│ etcd ◄────────────────────┤
</span></span><span class="line"><span class="cl">└─────────────────────────┘ │
</span></span><span class="line"><span class="cl">┌─────────────────────────┐ │
</span></span><span class="line"><span class="cl">│ K3s Master 3 │ │
</span></span><span class="line"><span class="cl">│ etcd ◄────────────────────┘
</span></span><span class="line"><span class="cl">└─────────────────────────┘
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Итого: 3 виртуальные машины</span></span></code></pre></div></div>
<figure><img
class="my-0 rounded-md"
loading="lazy"
decoding="async"
fetchpriority="low"
alt="etcd"
src="/posts/k3s-part1-architecture/etcd.svg"
></figure>
<h3 class="relative group">Сравнение подходов
<div id="сравнение-подходов" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d1%81%d1%80%d0%b0%d0%b2%d0%bd%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d0%be%d0%b4%d1%85%d0%be%d0%b4%d0%be%d0%b2" aria-label="Якорь">#</a>
</span>
</h3>
<table>
<thead>
<tr>
<th>Критерий</th>
<th>External etcd</th>
<th>Embedded etcd</th>
</tr>
</thead>
<tbody>
<tr>
<td>Количество VM</td>
<td>6 (3 master + 3 etcd)</td>
<td>3 (всё вместе)</td>
</tr>
<tr>
<td>Сложность настройки</td>
<td>Высокая</td>
<td>Один флаг <code>--cluster-init</code></td>
</tr>
<tr>
<td>Сложность обновления</td>
<td>Отдельно etcd и K8s</td>
<td>Одна команда</td>
</tr>
<tr>
<td>Производительность</td>
<td>Чуть лучше</td>
<td>Достаточно для homelab</td>
</tr>
<tr>
<td>Масштаб</td>
<td>&gt;500 нод</td>
<td>До 100-200 нод</td>
</tr>
</tbody>
</table>
<p><strong>Для homelab embedded etcd - очевидный выбор.</strong> Теряем 5-10% производительности etcd, экономим 3 VM и часы настройки.</p>
<p><em>&ldquo;А если мне понадобится масштаб?&rdquo;</em> - официально embedded etcd поддерживает до 100 нод и 5000 подов. Для homelab это как ограничение скорости 300 км/ч на велосипеде.</p>
<hr>
<h2 class="relative group">Зачем отдельные worker ноды
<div id="зачем-отдельные-worker-ноды" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d0%b7%d0%b0%d1%87%d0%b5%d0%bc-%d0%be%d1%82%d0%b4%d0%b5%d0%bb%d1%8c%d0%bd%d1%8b%d0%b5-worker-%d0%bd%d0%be%d0%b4%d1%8b" aria-label="Якорь">#</a>
</span>
</h2>
<p><strong>Worker ноды</strong> - машины для запуска ваших приложений (подов). На них не запускаются компоненты control plane.</p>
<p><em>&ldquo;А можно запускать приложения прямо на master нодах?&rdquo;</em></p>
<p>Технически - да. K3s не ставит ограничений на master ноды (в отличие от обычного Kubernetes). Но это плохая идея:</p>
<ul>
<li><strong>Control plane должен быть стабильным.</strong> Ваше приложение съело всю память → API server упал → кластер недоступен.</li>
<li><strong>etcd чувствителен к диску.</strong> База данных на той же ноде создаёт I/O нагрузку → etcd тормозит → весь кластер тормозит.</li>
<li><strong>Изоляция отказов.</strong> Проблема с приложением не должна убивать control plane.</li>
</ul>
<p><strong>2 worker ноды - минимум для HA приложений:</strong></p>
<ul>
<li>Можно запускать 2 реплики (на разных нодах)</li>
<li>При падении одного worker&rsquo;а второй держит нагрузку</li>
<li>Легко добавить третью, четвёртую ноду потом</li>
</ul>
<hr>
<h2 class="relative group">Архитектура нашего кластера
<div id="архитектура-нашего-кластера" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d0%b0%d1%80%d1%85%d0%b8%d1%82%d0%b5%d0%ba%d1%82%d1%83%d1%80%d0%b0-%d0%bd%d0%b0%d1%88%d0%b5%d0%b3%d0%be-%d0%ba%d0%bb%d0%b0%d1%81%d1%82%d0%b5%d1%80%d0%b0" aria-label="Якорь">#</a>
</span>
</h2>
<p>Вот что мы будем строить:</p>
<figure><img
class="my-0 rounded-md"
loading="lazy"
decoding="async"
fetchpriority="low"
alt="Архитектура нашего кластера"
src="/posts/k3s-part1-architecture/final_arch.svg"
></figure>
<p><strong>Ключевые моменты:</strong></p>
<ol>
<li><strong>Все master ноды равны</strong> - нет &ldquo;главной&rdquo;, kubectl подключается к любой.</li>
<li><strong>etcd синхронизируется через Raft</strong> - алгоритм консенсуса, гарантирует согласованность данных.</li>
<li><strong>Workers знают только про API</strong> - они не подключаются к etcd напрямую.</li>
<li><strong>Flannel создаёт overlay-сеть</strong> - все поды получают IP из 10.42.0.0/16, видят друг друга.</li>
</ol>
<hr>
<h2 class="relative group">Планирование ресурсов
<div id="планирование-ресурсов" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d0%bf%d0%bb%d0%b0%d0%bd%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d1%80%d0%b5%d1%81%d1%83%d1%80%d1%81%d0%be%d0%b2" aria-label="Якорь">#</a>
</span>
</h2>
<h3 class="relative group">Таблица VM
<div id="таблица-vm" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d1%82%d0%b0%d0%b1%d0%bb%d0%b8%d1%86%d0%b0-vm" aria-label="Якорь">#</a>
</span>
</h3>
<table>
<thead>
<tr>
<th>Hostname</th>
<th>VM ID</th>
<th>IP</th>
<th>vCPU</th>
<th>RAM</th>
<th>Disk</th>
<th>Роль</th>
</tr>
</thead>
<tbody>
<tr>
<td>k3s-master-1</td>
<td>201</td>
<td>192.168.11.201</td>
<td>2</td>
<td>8GB</td>
<td>32GB</td>
<td>Control Plane + etcd</td>
</tr>
<tr>
<td>k3s-master-2</td>
<td>202</td>
<td>192.168.11.202</td>
<td>2</td>
<td>8GB</td>
<td>32GB</td>
<td>Control Plane + etcd</td>
</tr>
<tr>
<td>k3s-master-3</td>
<td>203</td>
<td>192.168.11.203</td>
<td>2</td>
<td>8GB</td>
<td>32GB</td>
<td>Control Plane + etcd</td>
</tr>
<tr>
<td>k3s-worker-1</td>
<td>210</td>
<td>192.168.11.210</td>
<td>4</td>
<td>16GB</td>
<td>50GB</td>
<td>Workloads</td>
</tr>
<tr>
<td>k3s-worker-2</td>
<td>211</td>
<td>192.168.11.211</td>
<td>4</td>
<td>16GB</td>
<td>50GB</td>
<td>Workloads</td>
</tr>
<tr>
<td><strong>Итого</strong></td>
<td>-</td>
<td>-</td>
<td><strong>14</strong></td>
<td><strong>56GB</strong></td>
<td><strong>196GB</strong></td>
<td>-</td>
</tr>
</tbody>
</table>
<h3 class="relative group">Почему именно такие ресурсы
<div id="почему-именно-такие-ресурсы" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d0%bf%d0%be%d1%87%d0%b5%d0%bc%d1%83-%d0%b8%d0%bc%d0%b5%d0%bd%d0%bd%d0%be-%d1%82%d0%b0%d0%ba%d0%b8%d0%b5-%d1%80%d0%b5%d1%81%d1%83%d1%80%d1%81%d1%8b" aria-label="Якорь">#</a>
</span>
</h3>
<p><strong>Master ноды (2 vCPU / 8GB RAM / 32GB Disk):</strong></p>
<p>Реальное потребление в idle:</p>
<ul>
<li>API server: ~200-300MB RAM</li>
<li>etcd: ~100-200MB RAM (растёт со временем)</li>
<li>Scheduler + Controller: ~150MB RAM</li>
<li>Системные поды: ~100-200MB RAM</li>
<li><strong>Итого:</strong> ~600-900MB используется</li>
</ul>
<p><em>&ldquo;Зачем тогда 8GB?&rdquo;</em> - запас для burst-нагрузки. Когда вы деплоите 50 подов одновременно, API server временно съедает больше. etcd при большом кластере может вырасти до 1-2GB. Golang GC работает лучше с запасом памяти.</p>
<p><strong>Worker ноды (4 vCPU / 16GB RAM / 50GB Disk):</strong></p>
<p>Здесь будут ваши приложения. При 16GB можно запустить:</p>
<ul>
<li>5-10 средних приложений (256MB-2GB каждое)</li>
<li>Или 2-3 базы данных (PostgreSQL любит память)</li>
<li>Или комбинацию</li>
</ul>
<p>50GB диска - под образы контейнеров (10-20GB), логи (5-10GB), временные данные.</p>
<h3 class="relative group">Можно ли меньше?
<div id="можно-ли-меньше" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d0%bc%d0%be%d0%b6%d0%bd%d0%be-%d0%bb%d0%b8-%d0%bc%d0%b5%d0%bd%d1%8c%d1%88%d0%b5" aria-label="Якорь">#</a>
</span>
</h3>
<p><strong>Минимальная конфигурация (для экспериментов):</strong></p>
<ul>
<li>Master: 1 vCPU / 4GB RAM / 20GB Disk</li>
<li>Worker: 2 vCPU / 8GB RAM / 30GB Disk</li>
<li><strong>Итого:</strong> 9 vCPU / 36GB RAM</li>
</ul>
<p><strong>Риски:</strong></p>
<ul>
<li>Медленная работа API server</li>
<li>OOM killer при нагрузке</li>
<li>Нет запаса для burst</li>
</ul>
<p>Для production-like homelab рекомендую таблицу выше. Комфортный запас стоит дешевле, чем отладка странных падений.</p>
<hr>
<h2 class="relative group">Сетевая схема
<div id="сетевая-схема" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d1%81%d0%b5%d1%82%d0%b5%d0%b2%d0%b0%d1%8f-%d1%81%d1%85%d0%b5%d0%bc%d0%b0" aria-label="Якорь">#</a>
</span>
</h2>
<h3 class="relative group">IP-адреса (адаптируй под свою сеть)
<div id="ip-адреса-адаптируй-под-свою-сеть" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#ip-%d0%b0%d0%b4%d1%80%d0%b5%d1%81%d0%b0-%d0%b0%d0%b4%d0%b0%d0%bf%d1%82%d0%b8%d1%80%d1%83%d0%b9-%d0%bf%d0%be%d0%b4-%d1%81%d0%b2%d0%be%d1%8e-%d1%81%d0%b5%d1%82%d1%8c" aria-label="Якорь">#</a>
</span>
</h3>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">192.168.11.0/24 - Локальная сеть
</span></span><span class="line"><span class="cl"> 192.168.11.1 - Gateway (роутер)
</span></span><span class="line"><span class="cl"> 192.168.11.201-203 - Master ноды
</span></span><span class="line"><span class="cl"> 192.168.11.210-211 - Worker ноды
</span></span><span class="line"><span class="cl"> 192.168.11.220-230 - Резерв для MetalLB (статья 2)</span></span></code></pre></div></div>
<h3 class="relative group">Kubernetes внутренние сети (создаются автоматически)
<div id="kubernetes-внутренние-сети-создаются-автоматически" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#kubernetes-%d0%b2%d0%bd%d1%83%d1%82%d1%80%d0%b5%d0%bd%d0%bd%d0%b8%d0%b5-%d1%81%d0%b5%d1%82%d0%b8-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d1%8e%d1%82%d1%81%d1%8f-%d0%b0%d0%b2%d1%82%d0%be%d0%bc%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8" aria-label="Якорь">#</a>
</span>
</h3>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">10.42.0.0/16 - Pod network (Flannel VXLAN overlay)
</span></span><span class="line"><span class="cl">10.43.0.0/16 - Service network (ClusterIP)
</span></span><span class="line"><span class="cl">10.43.0.10 - CoreDNS</span></span></code></pre></div></div>
<figure><img
class="my-0 rounded-md"
loading="lazy"
decoding="async"
fetchpriority="low"
alt="Сети"
src="/posts/k3s-part1-architecture/k3s_network.svg"
></figure>
<h3 class="relative group">Порты между нодами
<div id="порты-между-нодами" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d0%bf%d0%be%d1%80%d1%82%d1%8b-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-%d0%bd%d0%be%d0%b4%d0%b0%d0%bc%d0%b8" aria-label="Якорь">#</a>
</span>
</h3>
<table>
<thead>
<tr>
<th>Порт</th>
<th>Протокол</th>
<th>Направление</th>
<th>Назначение</th>
</tr>
</thead>
<tbody>
<tr>
<td>6443</td>
<td>TCP</td>
<td>Master ← Worker</td>
<td>Kubernetes API</td>
</tr>
<tr>
<td>2379-2380</td>
<td>TCP</td>
<td>Master ↔ Master</td>
<td>etcd (client + peer)</td>
</tr>
<tr>
<td>10250</td>
<td>TCP</td>
<td>Master ↔ All</td>
<td>Kubelet API</td>
</tr>
<tr>
<td>8472</td>
<td>UDP</td>
<td>All ↔ All</td>
<td>Flannel VXLAN</td>
</tr>
</tbody>
</table>
<hr>
<h2 class="relative group">Требования к железу и софту
<div id="требования-к-железу-и-софту" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d1%82%d1%80%d0%b5%d0%b1%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f-%d0%ba-%d0%b6%d0%b5%d0%bb%d0%b5%d0%b7%d1%83-%d0%b8-%d1%81%d0%be%d1%84%d1%82%d1%83" aria-label="Якорь">#</a>
</span>
</h2>
<h3 class="relative group">Железо (Proxmox хост)
<div id="железо-proxmox-хост" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d0%b6%d0%b5%d0%bb%d0%b5%d0%b7%d0%be-proxmox-%d1%85%d0%be%d1%81%d1%82" aria-label="Якорь">#</a>
</span>
</h3>
<p><strong>Минимум:</strong></p>
<ul>
<li>CPU: 14 vCPU свободных</li>
<li>RAM: 56GB свободных</li>
<li>Disk: 200GB на SSD</li>
<li>Network: 1 Gbit</li>
</ul>
<p><strong>Рекомендуется:</strong></p>
<ul>
<li>CPU: 18+ vCPU (запас для приложений)</li>
<li>RAM: 64GB+ (базы данных прожорливые)</li>
<li>Disk: NVMe для etcd</li>
<li>Network: 2.5 Gbit (для NFS, если будете использовать)</li>
</ul>
<h3 class="relative group">Софт
<div id="софт" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d1%81%d0%be%d1%84%d1%82" aria-label="Якорь">#</a>
</span>
</h3>
<table>
<thead>
<tr>
<th>Компонент</th>
<th>Версия</th>
</tr>
</thead>
<tbody>
<tr>
<td>Proxmox VE</td>
<td>7.x или 8.x</td>
</tr>
<tr>
<td>K3s</td>
<td>v1.31+ (stable)</td>
</tr>
<tr>
<td>ОС на нодах</td>
<td>Debian 12 или Ubuntu 22.04+</td>
</tr>
<tr>
<td>Kernel</td>
<td>5.15+ (для cgroup v2)</td>
</tr>
</tbody>
</table>
<h2 class="relative group">Итог
<div id="итог" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d0%b8%d1%82%d0%be%d0%b3" aria-label="Якорь">#</a>
</span>
</h2>
<p><strong>Что мы спроектировали:</strong></p>
<ul>
<li>5 VM: 3 master + 2 worker</li>
<li>K3s с embedded etcd (HA без лишних VM)</li>
<li>Отказоустойчивость: выдерживает падение 1 master и любого worker</li>
<li>Ресурсы: 14 vCPU / 56GB RAM / 196GB Disk</li>
</ul>
<p><strong>Что НЕ входит в эту серию</strong> (отдельные статьи):</p>
<ul>
<li>LoadBalancer (MetalLB)</li>
<li>Ingress (Traefik)</li>
<li>SSL (cert-manager)</li>
<li>Мониторинг (Prometheus/Grafana)</li>
</ul>
<hr>
<h2 class="relative group">Что дальше
<div id="что-дальше" class="anchor"></div>
<span
class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
<a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%d1%87%d1%82%d0%be-%d0%b4%d0%b0%d0%bb%d1%8c%d1%88%d0%b5" aria-label="Якорь">#</a>
</span>
</h2>
<p><strong>👉 &ldquo;Подготовить инфраструктуру для K3s в Proxmox&rdquo;</strong></p>
<p>Там мы:</p>
<ul>
<li>Создадим template VM с Debian 12</li>
<li>Склонируем 5 VM с правильными ресурсами</li>
<li>Настроим статические IP</li>
<li>Подготовим ОС (swap, cgroup v2, firewall)</li>
</ul>
</div>
<details class="mt-2 mb-5 overflow-hidden rounded-lg ms-0 ps-5">
<summary
class="py-1 text-lg font-semibold cursor-pointer bg-primary-200 text-neutral-800 -ms-5 ps-5 dark:bg-primary-800 dark:text-neutral-100">
K3s HA кластер для homelab -
Эта статья — часть серии.
</summary>
<div
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
Часть 1:
Ты уже здесь
</div>
<div
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
<a href="/posts/k3s-part2-infrastructure/">
Часть 2:
K3s HA для homelab: Готовим инфраструктуру в Proxmox
</a>
</div>
<div
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
<a href="/posts/k3s-part3-installation/">
Часть 3:
K3s HA для homelab: Ставим K3s HA кластер
</a>
</div>
</details>
<h2 class="mt-8 text-2xl font-extrabold mb-10">Статьи по теме</h2>
<section class="w-full grid gap-4 sm:grid-cols-2 md:grid-cols-3">
<article
class="article-link--related relative min-h-full min-w-full overflow-hidden rounded-lg border border-neutral-300 dark:border-neutral-600">
<div class="flex-none relative overflow-hidden thumbnail_card_related">
<img
src="/img/background_hu_7658a5e11b3ad5f2.png"
role="presentation"
loading="lazy"
decoding="async"
fetchpriority="low"
class="not-prose absolute inset-0 w-full h-full object-cover">
</div>
<div class="p-4">
<header>
<a
href="/about/"
class="not-prose before:absolute before:inset-0 decoration-primary-500 dark:text-neutral text-xl font-bold text-neutral-800 hover:underline hover:underline-offset-2">
<h2>
Кто это пишет и зачем
</h2>
</a>
</header>
<div class="text-sm text-neutral-500 dark:text-neutral-400">
<div class="flex flex-row flex-wrap items-center">
</div>
</div>
</div>
<div class="px-6 pt-4 pb-2"></div>
</article>
</section>
</div>
</section>
<footer class="pt-8 max-w-prose print:hidden">
<div class="pt-8">
<hr class="border-dotted border-neutral-300 dark:border-neutral-600">
<div class="flex justify-between pt-3">
<span class="flex flex-col">
</span>
<span class="flex flex-col items-end">
<a
class="flex text-right text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400"
href="/posts/k3s-part2-infrastructure/">
<span class="leading-6">
K3s HA для homelab: Готовим инфраструктуру в Proxmox&ensp;<span class="inline-block rtl:rotate-180">&rarr;</span>
</span>
</a>
<span class="me-6 mt-1 text-xs text-neutral-500 dark:text-neutral-400">
<time datetime="2025-10-21T00:00:00&#43;00:00">21 октября 2025</time>
</span>
</span>
</div>
</div>
</footer>
</article>
<div
id="scroll-to-top"
class="fixed bottom-6 end-6 z-50 transform translate-y-4 opacity-0 duration-200">
<a
href="#the-top"
class="pointer-events-auto flex h-12 w-12 items-center justify-center rounded-full bg-neutral/50 text-xl text-neutral-700 hover:text-primary-600 dark:bg-neutral-800/50 dark:text-neutral dark:hover:text-primary-400"
aria-label="Пролистать наверх"
title="Пролистать наверх">
&uarr;
</a>
</div>
</main><footer id="site-footer" class="py-10 print:hidden">
<nav class="flex flex-row pb-4 text-base font-medium text-neutral-500 dark:text-neutral-400 ">
<ul class="flex list-none flex-col sm:flex-row">
<li class=" flex mb-1 text-end sm:mb-0 sm:me-7 sm:last:me-0 ">
<a
class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2 flex items-center"
href="/tags/"
title="Tags">
Теги
</a>
</li>
<li class=" flex mb-1 text-end sm:mb-0 sm:me-7 sm:last:me-0 ">
<a
class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2 flex items-center"
href="/categories/"
title="Categories">
Категории
</a>
</li>
</ul>
</nav>
<div class="flex items-center justify-between">
<p class="text-sm text-neutral-500 dark:text-neutral-400">
&copy;
2026
Олег Казанин
</p>
<p class="text-xs text-neutral-500 dark:text-neutral-400">
Работает на <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo</a> &amp; <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
href="https://blowfish.page/" target="_blank" rel="noopener noreferrer">Blowfish</a>
</p>
</div>
<script>
mediumZoom(document.querySelectorAll("img:not(.nozoom)"), {
margin: 24,
background: "rgba(0,0,0,0.5)",
scrollOffset: 0,
});
</script>
</footer>
<div
id="search-wrapper"
class="invisible fixed inset-0 flex h-screen w-screen cursor-default flex-col bg-neutral-500/50 p-4 backdrop-blur-sm dark:bg-neutral-900/50 sm:p-6 md:p-[10vh] lg:p-[12vh] z-500"
data-url="http://192.168.11.190:1313/">
<div
id="search-modal"
class="flex flex-col w-full max-w-3xl min-h-0 mx-auto border rounded-md shadow-lg top-20 border-neutral-200 bg-neutral dark:border-neutral-700 dark:bg-neutral-800">
<header class="relative z-10 flex items-center justify-between flex-none px-2">
<form class="flex items-center flex-auto min-w-0">
<div class="flex items-center justify-center w-8 h-8 text-neutral-400">
<span class="relative block icon"><svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</div>
<input
type="search"
id="search-query"
class="flex flex-auto h-12 mx-1 bg-transparent appearance-none focus:outline-dotted focus:outline-2 focus:outline-transparent"
placeholder="Поиск"
tabindex="0">
</form>
<button
id="close-search-button"
class="flex items-center justify-center w-8 h-8 text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400"
title="Закрыть (Esc)">
<span class="relative block icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
</span>
</button>
</header>
<section class="flex-auto px-2 overflow-auto">
<ul id="search-results">
</ul>
</section>
</div>
</div>
</div>
</body>
</html>