3908 lines
156 KiB
HTML
3908 lines
156 KiB
HTML
<!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&v=2&port=1313&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>Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось · Олег Казанин</title>
|
||
<meta name="title" content="Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось · Олег Казанин">
|
||
|
||
|
||
|
||
|
||
<meta name="description" content="Сайт работал вчера, а сегодня 503. Алгоритм диагностики Kubernetes проблем за 5 минут - от DNS до пода, без паники и танцев с бубном.">
|
||
|
||
|
||
<meta name="keywords" content="kubernetes,k3s,traefik,debugging,nginx,troubleshooting,">
|
||
|
||
|
||
|
||
<link rel="canonical" href="http://192.168.11.190:1313/posts/blog-part-5-debugging/">
|
||
|
||
|
||
|
||
|
||
<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/blog-part-5-debugging/">
|
||
<meta property="og:site_name" content="Олег Казанин">
|
||
<meta property="og:title" content="Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось">
|
||
<meta property="og:description" content="Сайт работал вчера, а сегодня 503. Алгоритм диагностики Kubernetes проблем за 5 минут - от DNS до пода, без паники и танцев с бубном.">
|
||
<meta property="og:locale" content="ru">
|
||
<meta property="og:type" content="article">
|
||
<meta property="article:section" content="posts">
|
||
<meta property="article:published_time" content="2026-02-17T00:00:00+00:00">
|
||
<meta property="article:modified_time" content="2026-02-17T00:00:00+00:00">
|
||
<meta property="article:tag" content="Kubernetes">
|
||
<meta property="article:tag" content="K3s">
|
||
<meta property="article:tag" content="Traefik">
|
||
<meta property="article:tag" content="Debugging">
|
||
<meta property="article:tag" content="Nginx">
|
||
<meta property="article:tag" content="Troubleshooting">
|
||
<meta property="og:image" content="http://192.168.11.190:1313/posts/blog-part-5-debugging/featured.png">
|
||
<meta property="og:see_also" content="http://192.168.11.190:1313/posts/blog-part-6-namespace-migration/">
|
||
<meta property="og:see_also" content="http://192.168.11.190:1313/posts/blog-part-4-git-workflow/">
|
||
<meta property="og:see_also" content="http://192.168.11.190:1313/posts/blog-part-3-dev-environment/">
|
||
<meta property="og:see_also" content="http://192.168.11.190:1313/posts/blog-part-2-k8s-deployment/">
|
||
<meta property="og:see_also" content="http://192.168.11.190:1313/posts/blog-part-1-architecture/">
|
||
|
||
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<meta name="twitter:image" content="http://192.168.11.190:1313/posts/blog-part-5-debugging/featured.png">
|
||
<meta name="twitter:title" content="Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось">
|
||
<meta name="twitter:description" content="Сайт работал вчера, а сегодня 503. Алгоритм диагностики Kubernetes проблем за 5 минут - от DNS до пода, без паники и танцев с бубном.">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<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+kfJ6kKCJxQGC+8wm+Bz9JucDjDTGNew=="></script>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<script
|
||
defer
|
||
type="text/javascript"
|
||
id="script-bundle"
|
||
src="/js/main.bundle.min.858f7f82734cfae08d59fcf8d0eb186f01706a84e2f7d20d39edfd7bc8bed6166e02d5c65ecce1de82b1ac52d1e01d77bd1a82d19186fdae5fe6e12d867fcf68.js"
|
||
integrity="sha512-hY9/gnNM+uCNWfz40OsYbwFwaoTi99INOe39e8i+1hZuAtXGXszh3oKxrFLR4B13vRqC0ZGG/a5f5uEthn/PaA=="
|
||
data-copy="Копировать"
|
||
data-copied="Скопировано"></script>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<script type="module" src="/js/firebase.min.cad74e0625f72f359ec6d6fed579b87733749de70400e7614048050ed08832ee3f58983d5d139fb1ddc5f7f2f5047d45ed80ec923534a3660fc3a7965f936866.js" integrity="sha512-ytdOBiX3LzWextb+1Xm4dzN0necEAOdhQEgFDtCIMu4/WJg9XROfsd3F9/L1BH1F7YDskjU0o2YPw6eWX5NoZg=="></script>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<script id="firebase-config"
|
||
type="application/json"
|
||
data-views="views_posts/blog-part-5-debugging/index.md"
|
||
data-likes="likes_posts/blog-part-5-debugging/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": "Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось",
|
||
"headline": "Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось",
|
||
"description": "Сайт работал вчера, а сегодня 503. Алгоритм диагностики Kubernetes проблем за 5 минут - от DNS до пода, без паники и танцев с бубном.",
|
||
"inLanguage": "ru",
|
||
"url" : "http://192.168.11.190:1313/posts/blog-part-5-debugging/",
|
||
"author" : {
|
||
"@type": "Person",
|
||
"name": "Олег Казанин"
|
||
},
|
||
"copyrightYear": "2026",
|
||
"dateCreated": "2026-02-17T00:00:00\u002b00:00",
|
||
"datePublished": "2026-02-17T00:00:00\u002b00:00",
|
||
|
||
"dateModified": "2026-02-17T00:00:00\u002b00:00",
|
||
|
||
"keywords": ["kubernetes","k3s","traefik","debugging","nginx","troubleshooting"],
|
||
|
||
"mainEntityOfPage": "true",
|
||
"wordCount": "2201"
|
||
}]
|
||
</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">↓</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+5DcKnbOMMOI+f7IvMGNsVvUfj+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/blog-part-5-debugging/featured_hu_8a5d954c7f764b6f.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+5DcKnbOMMOI+f7IvMGNsVvUfj+ooJ13n6EqqcGEz2FKMVvHLGwWPQ=="
|
||
data-blur-id="background-blur"
|
||
data-image-id="background-image"
|
||
data-image-url="/posts/blog-part-5-debugging/featured_hu_8a5d954c7f764b6f.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">
|
||
Блог на Hugo в K3s: часть 5 - что делать когда всё внезапно сломалось
|
||
</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="2026-02-17T00:00:00+00:00">17 февраля 2026</time><span class="px-2 text-primary-500">·</span><span title="Время чтения">11 минут</span><span class="px-2 text-primary-500">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="views_posts/blog-part-5-debugging/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">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="likes_posts/blog-part-5-debugging/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">·</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"> 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/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/">
|
||
<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>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<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/traefik/">
|
||
<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">
|
||
Traefik
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/debugging/">
|
||
<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">
|
||
Debugging
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/nginx/">
|
||
<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">
|
||
Nginx
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/troubleshooting/">
|
||
<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">
|
||
Troubleshooting
|
||
</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="#анатомия-http-запроса-в-k3s">Анатомия HTTP запроса в K3s</a></li>
|
||
<li><a href="#шаг-1-dns---доходит-ли-домен-до-твоего-ip">Шаг 1: DNS - доходит ли домен до твоего IP</a>
|
||
<ul>
|
||
<li><a href="#проверка">Проверка</a></li>
|
||
<li><a href="#ожидаемый-результат">Ожидаемый результат</a></li>
|
||
<li><a href="#что-может-пойти-не-так">Что может пойти не так</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#шаг-2-внешний-доступ---доходит-ли-запрос-до-сервера">Шаг 2: Внешний доступ - доходит ли запрос до сервера</a>
|
||
<ul>
|
||
<li><a href="#проверка-1">Проверка</a></li>
|
||
<li><a href="#ситуация-а-connection-refused-или-timeout">Ситуация А: Connection refused или timeout</a></li>
|
||
<li><a href="#ситуация-б-tls-handshake-прошёл-но-503">Ситуация Б: TLS handshake прошёл, но 503</a></li>
|
||
<li><a href="#ситуация-в-ssl-certificate-problem">Ситуация В: SSL certificate problem</a></li>
|
||
<li><a href="#главное-запрос-доходит-до-traefik">Главное: Запрос доходит до Traefik</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#шаг-3-traefik---правильно-ли-маршрутизируется-трафик">Шаг 3: Traefik - правильно ли маршрутизируется трафик</a>
|
||
<ul>
|
||
<li><a href="#проверка-логов-traefik">Проверка логов Traefik</a></li>
|
||
<li><a href="#что-искать-в-логах">Что искать в логах</a></li>
|
||
<li><a href="#проверяем-список-ingressroute">Проверяем список IngressRoute</a></li>
|
||
<li><a href="#проверяем-синтаксис-match">Проверяем синтаксис match</a></li>
|
||
<li><a href="#главное-traefik-нашёл-роутер">Главное: Traefik нашёл роутер</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#шаг-4-service---видит-ли-он-поды">Шаг 4: Service - видит ли он поды</a>
|
||
<ul>
|
||
<li><a href="#проверка-endpoints">Проверка endpoints</a></li>
|
||
<li><a href="#причина-1-selector-не-совпадает-с-labels">Причина 1: Selector не совпадает с labels</a></li>
|
||
<li><a href="#причина-2-поды-не-running">Причина 2: Поды не Running</a></li>
|
||
<li><a href="#главное-service-видит-поды">Главное: Service видит поды</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#шаг-5-pod---что-происходит-внутри-контейнера">Шаг 5: Pod - что происходит внутри контейнера</a>
|
||
<ul>
|
||
<li><a href="#проверка-статуса-подов">Проверка статуса подов</a></li>
|
||
<li><a href="#createcontainererror">CreateContainerError</a></li>
|
||
<li><a href="#crashloopbackoff">CrashLoopBackOff</a></li>
|
||
<li><a href="#главное-под-работает">Главное: Под работает</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#шаг-6-контент---есть-ли-файлы-для-отдачи">Шаг 6: Контент - есть ли файлы для отдачи</a>
|
||
<ul>
|
||
<li><a href="#проверка-2">Проверка</a></li>
|
||
<li><a href="#главное-контент-на-месте">Главное: Контент на месте</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#быстрый-чеклист-для-любой-проблемы">Быстрый чеклист для любой проблемы</a></li>
|
||
<li><a href="#реальный-пример-503-через-раз">Реальный пример: 503 через раз</a></li>
|
||
<li><a href="#откат-и-cleanup">Откат и cleanup</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="#анатомия-http-запроса-в-k3s">Анатомия HTTP запроса в K3s</a></li>
|
||
<li><a href="#шаг-1-dns---доходит-ли-домен-до-твоего-ip">Шаг 1: DNS - доходит ли домен до твоего IP</a>
|
||
<ul>
|
||
<li><a href="#проверка">Проверка</a></li>
|
||
<li><a href="#ожидаемый-результат">Ожидаемый результат</a></li>
|
||
<li><a href="#что-может-пойти-не-так">Что может пойти не так</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#шаг-2-внешний-доступ---доходит-ли-запрос-до-сервера">Шаг 2: Внешний доступ - доходит ли запрос до сервера</a>
|
||
<ul>
|
||
<li><a href="#проверка-1">Проверка</a></li>
|
||
<li><a href="#ситуация-а-connection-refused-или-timeout">Ситуация А: Connection refused или timeout</a></li>
|
||
<li><a href="#ситуация-б-tls-handshake-прошёл-но-503">Ситуация Б: TLS handshake прошёл, но 503</a></li>
|
||
<li><a href="#ситуация-в-ssl-certificate-problem">Ситуация В: SSL certificate problem</a></li>
|
||
<li><a href="#главное-запрос-доходит-до-traefik">Главное: Запрос доходит до Traefik</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#шаг-3-traefik---правильно-ли-маршрутизируется-трафик">Шаг 3: Traefik - правильно ли маршрутизируется трафик</a>
|
||
<ul>
|
||
<li><a href="#проверка-логов-traefik">Проверка логов Traefik</a></li>
|
||
<li><a href="#что-искать-в-логах">Что искать в логах</a></li>
|
||
<li><a href="#проверяем-список-ingressroute">Проверяем список IngressRoute</a></li>
|
||
<li><a href="#проверяем-синтаксис-match">Проверяем синтаксис match</a></li>
|
||
<li><a href="#главное-traefik-нашёл-роутер">Главное: Traefik нашёл роутер</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#шаг-4-service---видит-ли-он-поды">Шаг 4: Service - видит ли он поды</a>
|
||
<ul>
|
||
<li><a href="#проверка-endpoints">Проверка endpoints</a></li>
|
||
<li><a href="#причина-1-selector-не-совпадает-с-labels">Причина 1: Selector не совпадает с labels</a></li>
|
||
<li><a href="#причина-2-поды-не-running">Причина 2: Поды не Running</a></li>
|
||
<li><a href="#главное-service-видит-поды">Главное: Service видит поды</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#шаг-5-pod---что-происходит-внутри-контейнера">Шаг 5: Pod - что происходит внутри контейнера</a>
|
||
<ul>
|
||
<li><a href="#проверка-статуса-подов">Проверка статуса подов</a></li>
|
||
<li><a href="#createcontainererror">CreateContainerError</a></li>
|
||
<li><a href="#crashloopbackoff">CrashLoopBackOff</a></li>
|
||
<li><a href="#главное-под-работает">Главное: Под работает</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#шаг-6-контент---есть-ли-файлы-для-отдачи">Шаг 6: Контент - есть ли файлы для отдачи</a>
|
||
<ul>
|
||
<li><a href="#проверка-2">Проверка</a></li>
|
||
<li><a href="#главное-контент-на-месте">Главное: Контент на месте</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a href="#быстрый-чеклист-для-любой-проблемы">Быстрый чеклист для любой проблемы</a></li>
|
||
<li><a href="#реальный-пример-503-через-раз">Реальный пример: 503 через раз</a></li>
|
||
<li><a href="#откат-и-cleanup">Откат и cleanup</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">
|
||
Блог на Hugo в K3s -
|
||
Эта статья — часть серии.
|
||
</summary>
|
||
|
||
|
||
|
||
<div
|
||
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
|
||
<a href="/posts/blog-part-1-architecture/">
|
||
Часть 1:
|
||
Блог на Hugo в K3s: часть 1 - архитектура и первый запуск
|
||
</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/blog-part-2-k8s-deployment/">
|
||
Часть 2:
|
||
Блог на Hugo в K3s: часть 2 - деплой в кластер
|
||
</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/blog-part-3-dev-environment/">
|
||
Часть 3:
|
||
Блог на Hugo в K3s: часть 3 - development окружение
|
||
</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/blog-part-4-git-workflow/">
|
||
Часть 4:
|
||
Блог на Hugo в K3s: часть 4 - выбор Git workflow
|
||
</a>
|
||
</div>
|
||
|
||
|
||
|
||
<div
|
||
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
|
||
Часть 5:
|
||
Ты уже здесь
|
||
</div>
|
||
|
||
|
||
|
||
<div
|
||
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
|
||
<a href="/posts/blog-part-6-namespace-migration/">
|
||
Часть 6:
|
||
Блог на Hugo в K3s: часть 6 - миграция между namespace
|
||
</a>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
</details>
|
||
|
||
|
||
<div class="article-content max-w-prose mb-20">
|
||
<p>В части 4 мы разобрались с Git workflow. Всё работает: пушишь в <code>dev</code> - видишь на тестовом окружении, мержишь в <code>main</code> - публикуется на production.</p>
|
||
<p>А потом в один прекрасный день открываешь свой сайт и видишь <code>503 Service Temporarily Unavailable</code>.</p>
|
||
<p>Вчера же все работало! Ты ничего не менял. Что произошло?</p>
|
||
<p>Добро пожаловать в мир эксплуатации Kubernetes, где проблемы тоже возникают и требуют системного подхода без паники.</p>
|
||
<p>Эта статья - алгоритм диагностики от DNS до пода. Проходишь по шагам сверху вниз, находишь проблему за 5 минут. Не гадаешь, не тыкаешь наугад - работаешь по системе.</p>
|
||
<hr>
|
||
|
||
<h2 class="relative group">Анатомия HTTP запроса в K3s
|
||
<div id="анатомия-http-запроса-в-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="#%d0%b0%d0%bd%d0%b0%d1%82%d0%be%d0%bc%d0%b8%d1%8f-http-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%b0-%d0%b2-k3s" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h2>
|
||
<p>Прежде чем искать проблему, нужно понять путь запроса от браузера до nginx:</p>
|
||
<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"> ↓ DNS запрос
|
||
</span></span><span class="line"><span class="cl">DNS сервер (провайдер или Cloudflare)
|
||
</span></span><span class="line"><span class="cl"> ↓ Возвращает IP адрес
|
||
</span></span><span class="line"><span class="cl">Роутер/Файрвол (OPNsense, MikroTik)
|
||
</span></span><span class="line"><span class="cl"> ↓ Port Forward 443 → K3s node
|
||
</span></span><span class="line"><span class="cl">MetalLB LoadBalancer
|
||
</span></span><span class="line"><span class="cl"> ↓ External IP
|
||
</span></span><span class="line"><span class="cl">Traefik Ingress Controller
|
||
</span></span><span class="line"><span class="cl"> ↓ IngressRoute matching
|
||
</span></span><span class="line"><span class="cl">Kubernetes Service
|
||
</span></span><span class="line"><span class="cl"> ↓ Endpoint selection
|
||
</span></span><span class="line"><span class="cl">Pod (Nginx контейнер)
|
||
</span></span><span class="line"><span class="cl"> ↓ Volume mount
|
||
</span></span><span class="line"><span class="cl">NFS хранилище</span></span></code></pre></div></div>
|
||
<p>Проблема может быть на любом из этих уровней. Секрет эффективной диагностики - проверять снаружи внутрь, последовательно исключая рабочие компоненты.</p>
|
||
<p>Когда тыкаешь наугад, проверяя сначала поды, потом DNS, потом снова поды - тратишь время. Когда идёшь по алгоритму - находишь проблему за минуты.</p>
|
||
<hr>
|
||
|
||
<h2 class="relative group">Шаг 1: DNS - доходит ли домен до твоего IP
|
||
<div id="шаг-1-dns---доходит-ли-домен-до-твоего-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="#%d1%88%d0%b0%d0%b3-1-dns---%d0%b4%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%bb%d0%b8-%d0%b4%d0%be%d0%bc%d0%b5%d0%bd-%d0%b4%d0%be-%d1%82%d0%b2%d0%be%d0%b5%d0%b3%d0%be-ip" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h2>
|
||
<p>Первым делом проверяем что домен резолвится в правильный IP. Без этого дальше проверять бессмысленно - браузер просто не знает куда направлять запрос.</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%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверяем DNS резолв (используй свой домен)</span>
|
||
</span></span><span class="line"><span class="cl">dig blog.example.com +short
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Альтернатива если dig не установлен</span>
|
||
</span></span><span class="line"><span class="cl">nslookup blog.example.com</span></span></code></pre></div></div>
|
||
|
||
<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%be%d0%b6%d0%b8%d0%b4%d0%b0%d0%b5%d0%bc%d1%8b%d0%b9-%d1%80%d0%b5%d0%b7%d1%83%d0%bb%d1%8c%d1%82%d0%b0%d1%82" 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">77.37.XXX.XXX</span></span></code></pre></div></div>
|
||
<p>Должен вернуться твой <strong>публичный IP адрес</strong> (тот который прописан в A-записи у DNS провайдера).</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%87%d1%82%d0%be-%d0%bc%d0%be%d0%b6%d0%b5%d1%82-%d0%bf%d0%be%d0%b9%d1%82%d0%b8-%d0%bd%d0%b5-%d1%82%d0%b0%d0%ba" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Симптом</th>
|
||
<th>Причина</th>
|
||
<th>Как проверить</th>
|
||
<th>Решение</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>Возвращается старый IP</td>
|
||
<td>DNS кеш не обновился</td>
|
||
<td><code>dig blog.example.com @8.8.8.8</code></td>
|
||
<td>Подожди TTL (обычно 300-3600 сек)</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>NXDOMAIN</code> ошибка</td>
|
||
<td>Домен не делегирован</td>
|
||
<td>Проверь NS записи у регистратора</td>
|
||
<td>Настрой DNS правильно</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Возвращается <code>127.0.0.1</code></td>
|
||
<td>Локальный override</td>
|
||
<td><code>cat /etc/hosts | grep blog</code></td>
|
||
<td>Удали строку из /etc/hosts</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Возвращается несколько IP</td>
|
||
<td>Round-robin DNS</td>
|
||
<td>Проверь все ли IP твои</td>
|
||
<td>Удали лишние A-записи</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>Если DNS правильный - идём дальше.</p>
|
||
<hr>
|
||
|
||
<h2 class="relative group">Шаг 2: Внешний доступ - доходит ли запрос до сервера
|
||
<div id="шаг-2-внешний-доступ---доходит-ли-запрос-до-сервера" 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%88%d0%b0%d0%b3-2-%d0%b2%d0%bd%d0%b5%d1%88%d0%bd%d0%b8%d0%b9-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf---%d0%b4%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%bb%d0%b8-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81-%d0%b4%d0%be-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80%d0%b0" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h2>
|
||
<p>Теперь проверяем что запрос физически доходит до сервера. DNS может быть правильным, но файрвол может блокировать трафик.</p>
|
||
|
||
<h3 class="relative group">Проверка
|
||
<div id="проверка-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%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-1" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Пробуем подключиться извне (важно - НЕ из локальной сети!)</span>
|
||
</span></span><span class="line"><span class="cl">curl -v https://blog.example.com 2><span class="p">&</span><span class="m">1</span> <span class="p">|</span> head -30</span></span></code></pre></div></div>
|
||
<p><strong>Важно:</strong> Запускай эту команду с <strong>внешнего</strong> сервера или используй мобильный интернет. Тест из локальной сети ничего не докажет - можешь обходить файрвол.</p>
|
||
|
||
<h3 class="relative group">Ситуация А: Connection refused или timeout
|
||
<div id="ситуация-а-connection-refused-или-timeout" 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%b8%d1%82%d1%83%d0%b0%d1%86%d0%b8%d1%8f-%d0%b0-connection-refused-%d0%b8%d0%bb%d0%b8-timeout" 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">curl: (7) Failed to connect to blog.example.com port 443: Connection refused</span></span></code></pre></div></div>
|
||
<p>Запрос вообще не дошёл до сервера. Проблема на сетевом уровне.</p>
|
||
<p><strong>Возможные причины:</strong></p>
|
||
<p><strong>1. Порт 443 закрыт на файрволе/роутере</strong></p>
|
||
<p>Проверь Port Forward правила на OPNsense/MikroTik. Должно быть:</p>
|
||
<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">WAN:443 → 192.168.X.X:443 (IP любой K3s ноды)</span></span></code></pre></div></div>
|
||
<p><strong>2. MetalLB не назначил External IP для Traefik</strong></p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверяем MetalLB</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get svc -n traefik traefik
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Ожидаемый результат</span>
|
||
</span></span><span class="line"><span class="cl">NAME TYPE EXTERNAL-IP PORT<span class="o">(</span>S<span class="o">)</span>
|
||
</span></span><span class="line"><span class="cl">traefik LoadBalancer 192.168.X.X 80:30080/TCP,443:30443/TCP</span></span></code></pre></div></div>
|
||
<p>Если <code>EXTERNAL-IP</code> показывает <code><pending></code> - MetalLB не работает или пул IP адресов не настроен.</p>
|
||
<p><strong>3. Traefik под не запущен</strong></p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверяем что Traefik работает</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get pods -n traefik
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Должны быть все Running</span>
|
||
</span></span><span class="line"><span class="cl">NAME READY STATUS
|
||
</span></span><span class="line"><span class="cl">traefik-xxxxxxxxxx-xxxxx 1/1 Running</span></span></code></pre></div></div>
|
||
|
||
<h3 class="relative group">Ситуация Б: TLS handshake прошёл, но 503
|
||
<div id="ситуация-б-tls-handshake-прошёл-но-503" 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%b8%d1%82%d1%83%d0%b0%d1%86%d0%b8%d1%8f-%d0%b1-tls-handshake-%d0%bf%d1%80%d0%be%d1%88%d1%91%d0%bb-%d0%bd%d0%be-503" 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">< HTTP/2 503
|
||
</span></span><span class="line"><span class="cl">< content-type: text/plain; charset=utf-8
|
||
</span></span><span class="line"><span class="cl">< content-length: 20
|
||
</span></span><span class="line"><span class="cl">no available server</span></span></code></pre></div></div>
|
||
<p>Отлично - наша ситуация! Traefik работает, SSL сертификат отдаёт, но дальше запрос упирается в стену.</p>
|
||
<p>Сообщение <code>no available server</code> означает что Traefik <strong>нашёл роутер</strong>, но <strong>не нашёл живой бэкенд</strong> за ним.</p>
|
||
<p>Проблема внутри кластера. Идём глубже.</p>
|
||
|
||
<h3 class="relative group">Ситуация В: SSL certificate problem
|
||
<div id="ситуация-в-ssl-certificate-problem" 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%b8%d1%82%d1%83%d0%b0%d1%86%d0%b8%d1%8f-%d0%b2-ssl-certificate-problem" 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">curl: (60) SSL certificate problem: unable to get local issuer certificate</span></span></code></pre></div></div>
|
||
<p>Сертификат невалидный или не выпущен.</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверяем Certificate объект (используй свой namespace)</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get certificate -n blog
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Должно быть READY=True</span>
|
||
</span></span><span class="line"><span class="cl">NAME READY SECRET AGE
|
||
</span></span><span class="line"><span class="cl">blog-tls True blog-tls 2d</span></span></code></pre></div></div>
|
||
<p>Если <code>READY=False</code> - cert-manager не смог выпустить сертификат.</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Смотрим что пошло не так</span>
|
||
</span></span><span class="line"><span class="cl">kubectl describe certificate blog-tls -n blog
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Ищем секцию Events внизу вывода - там описание проблемы</span></span></span></code></pre></div></div>
|
||
|
||
<h3 class="relative group">Главное: Запрос доходит до Traefik
|
||
<div id="главное-запрос-доходит-до-traefik" 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%b3%d0%bb%d0%b0%d0%b2%d0%bd%d0%be%d0%b5-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81-%d0%b4%d0%be%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b4%d0%be-traefik" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверка (с ВНЕШНЕГО сервера!)</span>
|
||
</span></span><span class="line"><span class="cl">curl -I https://blog.example.com
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Ожидаемый результат (любой из двух)</span>
|
||
</span></span><span class="line"><span class="cl">HTTP/2 <span class="m">200</span> <span class="c1"># Всё работает</span>
|
||
</span></span><span class="line"><span class="cl">HTTP/2 <span class="m">503</span> <span class="c1"># Traefik работает, но бэкенд недоступен</span>
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Если connection refused/timeout - проблема в сети (см. выше)</span></span></span></code></pre></div></div>
|
||
<hr>
|
||
|
||
<h2 class="relative group">Шаг 3: Traefik - правильно ли маршрутизируется трафик
|
||
<div id="шаг-3-traefik---правильно-ли-маршрутизируется-трафик" 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%88%d0%b0%d0%b3-3-traefik---%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d1%8c%d0%bd%d0%be-%d0%bb%d0%b8-%d0%bc%d0%b0%d1%80%d1%88%d1%80%d1%83%d1%82%d0%b8%d0%b7%d0%b8%d1%80%d1%83%d0%b5%d1%82%d1%81%d1%8f-%d1%82%d1%80%d0%b0%d1%84%d0%b8%d0%ba" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h2>
|
||
<p>Traefik получил запрос на твой домен. Что он с ним делает? Смотрим логи.</p>
|
||
|
||
<h3 class="relative group">Проверка логов Traefik
|
||
<div id="проверка-логов-traefik" 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%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-%d0%bb%d0%be%d0%b3%d0%be%d0%b2-traefik" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Смотрим последние 50 строк логов Traefik</span>
|
||
</span></span><span class="line"><span class="cl">kubectl logs -n traefik deployment/traefik --tail<span class="o">=</span><span class="m">50</span>
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Фильтруем только свой домен (убираем шум от других сервисов)</span>
|
||
</span></span><span class="line"><span class="cl">kubectl logs -n traefik deployment/traefik --tail<span class="o">=</span><span class="m">100</span> <span class="p">|</span> grep blog.example</span></span></code></pre></div></div>
|
||
|
||
<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%87%d1%82%d0%be-%d0%b8%d1%81%d0%ba%d0%b0%d1%82%d1%8c-%d0%b2-%d0%bb%d0%be%d0%b3%d0%b0%d1%85" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<p><strong>Нормальный запрос:</strong></p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
|
||
</span></span><span class="line"><span class="cl"> <span class="nt">"request"</span><span class="p">:</span> <span class="s2">"GET / HTTP/2.0"</span><span class="p">,</span>
|
||
</span></span><span class="line"><span class="cl"> <span class="nt">"status"</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
|
||
</span></span><span class="line"><span class="cl"> <span class="nt">"size"</span><span class="p">:</span> <span class="mi">8994</span><span class="p">,</span>
|
||
</span></span><span class="line"><span class="cl"> <span class="nt">"router"</span><span class="p">:</span> <span class="s2">"blog-blog-https-xxxxx@kubernetescrd"</span><span class="p">,</span>
|
||
</span></span><span class="line"><span class="cl"> <span class="nt">"service"</span><span class="p">:</span> <span class="s2">"blog-nginx-blog@kubernetescrd"</span><span class="p">,</span>
|
||
</span></span><span class="line"><span class="cl"> <span class="nt">"backend"</span><span class="p">:</span> <span class="s2">"http://10.42.2.40:80"</span><span class="p">,</span>
|
||
</span></span><span class="line"><span class="cl"> <span class="nt">"duration"</span><span class="p">:</span> <span class="mi">12</span>
|
||
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
|
||
<p>Ключевые поля:</p>
|
||
<ul>
|
||
<li><strong>router:</strong> Traefik нашёл нужный IngressRoute (<code>blog-blog-https</code>)</li>
|
||
<li><strong>backend:</strong> IP пода nginx куда проксируется запрос (<code>10.42.2.40:80</code>)</li>
|
||
<li><strong>status:</strong> HTTP код ответа от nginx (<code>200</code> = всё хорошо)</li>
|
||
</ul>
|
||
<p><strong>Проблемный запрос:</strong></p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
|
||
</span></span><span class="line"><span class="cl"> <span class="nt">"request"</span><span class="p">:</span> <span class="s2">"GET / HTTP/2.0"</span><span class="p">,</span>
|
||
</span></span><span class="line"><span class="cl"> <span class="nt">"status"</span><span class="p">:</span> <span class="mi">503</span><span class="p">,</span>
|
||
</span></span><span class="line"><span class="cl"> <span class="nt">"router"</span><span class="p">:</span> <span class="s2">"blog-blog-https-xxxxx@kubernetescrd"</span><span class="p">,</span>
|
||
</span></span><span class="line"><span class="cl"> <span class="nt">"error"</span><span class="p">:</span> <span class="s2">"no available server"</span>
|
||
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
|
||
<p>Traefik нашёл роутер, но поле <code>backend</code> отсутствует - под недоступен или не существует.</p>
|
||
|
||
<h3 class="relative group">Проверяем список IngressRoute
|
||
<div id="проверяем-список-ingressroute" 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%d1%80%d0%be%d0%b2%d0%b5%d1%80%d1%8f%d0%b5%d0%bc-%d1%81%d0%bf%d0%b8%d1%81%d0%be%d0%ba-ingressroute" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Смотрим все IngressRoute в кластере</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get ingressroute -A
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Фильтруем только свой домен</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get ingressroute -A <span class="p">|</span> grep blog.example</span></span></code></pre></div></div>
|
||
<p><strong>Важный момент:</strong> Если один и тот же домен прописан в <strong>двух разных IngressRoute</strong> из разных namespace - Traefik будет балансировать между ними.</p>
|
||
<p>Например:</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">NAMESPACE NAME AGE
|
||
</span></span><span class="line"><span class="cl">blog blog-https 10d <span class="c1"># СТАРЫЙ namespace</span>
|
||
</span></span><span class="line"><span class="cl">blog-new blog-https 2d <span class="c1"># НОВЫЙ namespace</span></span></span></code></pre></div></div>
|
||
<p>Оба IngressRoute имеют <code>match: Host('blog.example.com')</code>. Traefik видит оба, честно балансирует трафик 50/50.</p>
|
||
<p>Если один из бэкендов мёртв - половина запросов уходит в пустоту. 503 через раз.</p>
|
||
<p><strong>Решение:</strong> Удалить старый IngressRoute:</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Удаляем дубль из старого namespace</span>
|
||
</span></span><span class="line"><span class="cl">kubectl delete ingressroute blog-https blog-http -n blog</span></span></code></pre></div></div>
|
||
|
||
<h3 class="relative group">Проверяем синтаксис match
|
||
<div id="проверяем-синтаксис-match" 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%d1%80%d0%be%d0%b2%d0%b5%d1%80%d1%8f%d0%b5%d0%bc-%d1%81%d0%b8%d0%bd%d1%82%d0%b0%d0%ba%d1%81%d0%b8%d1%81-match" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<p>Traefik очень требователен к синтаксису. Частая ошибка - забыть backticks или скобки.</p>
|
||
<p><strong>Неправильно:</strong></p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">match</span><span class="p">:</span><span class="w"> </span><span class="l">Host(blog.example.com) </span><span class="w"> </span><span class="c"># Нет backticks</span><span class="w">
|
||
</span></span></span><span class="line"><span class="cl"><span class="nt">match</span><span class="p">:</span><span class="w"> </span><span class="l">Host `blog.example.com` </span><span class="w"> </span><span class="c"># Нет скобок вокруг Host</span><span class="w">
|
||
</span></span></span><span class="line"><span class="cl"><span class="nt">match</span><span class="p">:</span><span class="w"> </span><span class="l">Host("blog.example.com") </span><span class="w"> </span><span class="c"># Двойные кавычки вместо backticks</span></span></span></code></pre></div></div>
|
||
<p><strong>Правильно:</strong></p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">match</span><span class="p">:</span><span class="w"> </span><span class="l">Host(`blog.example.com`)</span></span></span></code></pre></div></div>
|
||
<p>Проверяем:</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Смотрим манифест IngressRoute</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get ingressroute blog-https -n blog -o yaml <span class="p">|</span> grep match:
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Должно быть со скобками и backticks</span>
|
||
</span></span><span class="line"><span class="cl">match: Host<span class="o">(</span><span class="sb">`</span>blog.example.com<span class="sb">`</span><span class="o">)</span></span></span></code></pre></div></div>
|
||
|
||
<h3 class="relative group">Главное: Traefik нашёл роутер
|
||
<div id="главное-traefik-нашёл-роутер" 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%b3%d0%bb%d0%b0%d0%b2%d0%bd%d0%be%d0%b5-traefik-%d0%bd%d0%b0%d1%88%d1%91%d0%bb-%d1%80%d0%be%d1%83%d1%82%d0%b5%d1%80" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверка</span>
|
||
</span></span><span class="line"><span class="cl">kubectl logs -n traefik deployment/traefik --tail<span class="o">=</span><span class="m">50</span> <span class="p">|</span> grep blog.example
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Ожидаемый результат - есть строки с "router": "blog-blog-https"</span>
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Если router не найден - проблема в IngressRoute match синтаксисе</span></span></span></code></pre></div></div>
|
||
<hr>
|
||
|
||
<h2 class="relative group">Шаг 4: Service - видит ли он поды
|
||
<div id="шаг-4-service---видит-ли-он-поды" 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%88%d0%b0%d0%b3-4-service---%d0%b2%d0%b8%d0%b4%d0%b8%d1%82-%d0%bb%d0%b8-%d0%be%d0%bd-%d0%bf%d0%be%d0%b4%d1%8b" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h2>
|
||
<p>Traefik нашёл роутер, проксирует трафик на Service. Но Service может не видеть поды если selector неправильный.</p>
|
||
|
||
<h3 class="relative group">Проверка endpoints
|
||
<div id="проверка-endpoints" 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%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-endpoints" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Смотрим endpoints для Service (используй своё имя Service)</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get endpoints nginx -n blog
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Ожидаемый результат - НЕ пустой список IP</span>
|
||
</span></span><span class="line"><span class="cl">NAME ENDPOINTS
|
||
</span></span><span class="line"><span class="cl">nginx 10.42.0.44:80,10.42.2.40:80</span></span></code></pre></div></div>
|
||
<p>Если видишь <code><none></code> - Service не нашёл ни одного пода. Две возможные причины.</p>
|
||
|
||
<h3 class="relative group">Причина 1: Selector не совпадает с labels
|
||
<div id="причина-1-selector-не-совпадает-с-labels" 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%d1%80%d0%b8%d1%87%d0%b8%d0%bd%d0%b0-1-selector-%d0%bd%d0%b5-%d1%81%d0%be%d0%b2%d0%bf%d0%b0%d0%b4%d0%b0%d0%b5%d1%82-%d1%81-labels" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Смотрим selector у Service</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get svc nginx -n blog -o yaml <span class="p">|</span> grep -A3 <span class="s2">"selector:"</span>
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Вывод</span>
|
||
</span></span><span class="line"><span class="cl">selector:
|
||
</span></span><span class="line"><span class="cl"> app: nginx
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Смотрим labels у подов</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get pods -n blog --show-labels <span class="p">|</span> grep nginx
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Вывод</span>
|
||
</span></span><span class="line"><span class="cl">nginx-xxxxxxxxxx-xxxxx 1/1 Running <span class="nv">app</span><span class="o">=</span>nginx-old</span></span></code></pre></div></div>
|
||
<p>Видишь проблему? Service ищет <code>app: nginx</code>, а под помечен <code>app: nginx-old</code>. Не совпадает.</p>
|
||
<p><strong>Решение:</strong> Исправить Deployment или Service чтобы labels совпадали.</p>
|
||
|
||
<h3 class="relative group">Причина 2: Поды не Running
|
||
<div id="причина-2-поды-не-running" 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%d1%80%d0%b8%d1%87%d0%b8%d0%bd%d0%b0-2-%d0%bf%d0%be%d0%b4%d1%8b-%d0%bd%d0%b5-running" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Смотрим статус подов</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get pods -n blog
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Видим</span>
|
||
</span></span><span class="line"><span class="cl">NAME READY STATUS
|
||
</span></span><span class="line"><span class="cl">nginx-xxxxxxxxxx-xxxxx 0/1 CreateContainerError</span></span></code></pre></div></div>
|
||
<p>Под существует, но не работает. Service правильно не включает его в endpoints. Идём в следующий шаг - разбираемся почему под не запускается.</p>
|
||
|
||
<h3 class="relative group">Главное: Service видит поды
|
||
<div id="главное-service-видит-поды" 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%b3%d0%bb%d0%b0%d0%b2%d0%bd%d0%be%d0%b5-service-%d0%b2%d0%b8%d0%b4%d0%b8%d1%82-%d0%bf%d0%be%d0%b4%d1%8b" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверка</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get endpoints nginx -n blog
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Ожидаемый результат - НЕ пустой</span>
|
||
</span></span><span class="line"><span class="cl">nginx 10.42.0.44:80,10.42.2.40:80
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Если <none> - проблема в селекторах или поды не Running</span></span></span></code></pre></div></div>
|
||
<hr>
|
||
|
||
<h2 class="relative group">Шаг 5: Pod - что происходит внутри контейнера
|
||
<div id="шаг-5-pod---что-происходит-внутри-контейнера" 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%88%d0%b0%d0%b3-5-pod---%d1%87%d1%82%d0%be-%d0%bf%d1%80%d0%be%d0%b8%d1%81%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b2%d0%bd%d1%83%d1%82%d1%80%d0%b8-%d0%ba%d0%be%d0%bd%d1%82%d0%b5%d0%b9%d0%bd%d0%b5%d1%80%d0%b0" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h2>
|
||
<p>Самый глубокий уровень. Под не запускается или падает в цикле перезапусков.</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%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-%d1%81%d1%82%d0%b0%d1%82%d1%83%d1%81%d0%b0-%d0%bf%d0%be%d0%b4%d0%be%d0%b2" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Смотрим все поды в namespace</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get pods -n blog
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Фильтруем только nginx</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get pods -n blog <span class="p">|</span> grep nginx</span></span></code></pre></div></div>
|
||
<p><strong>Возможные статусы проблем:</strong></p>
|
||
|
||
<h3 class="relative group">CreateContainerError
|
||
<div id="createcontainererror" 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="#createcontainererror" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<p>Контейнер вообще не может стартануть. Обычно проблема с volumes или образом.</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Смотрим детали пода (используй своё имя пода)</span>
|
||
</span></span><span class="line"><span class="cl">kubectl describe pod nginx-xxxxxxxxxx-xxxxx -n blog <span class="p">|</span> tail -30</span></span></code></pre></div></div>
|
||
<p>Ищем секцию <code>Events</code> внизу вывода. Там будет описание проблемы:</p>
|
||
<p><strong>Пример 1: PVC не примонтировался</strong></p>
|
||
<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">Events:
|
||
</span></span><span class="line"><span class="cl"> Warning FailedMount MountVolume.SetUp failed for volume "blog-public-pvc":
|
||
</span></span><span class="line"><span class="cl"> mount failed: mount.nfs: Connection timed out</span></span></code></pre></div></div>
|
||
<p>NFS хранилище недоступно. Возможные причины:</p>
|
||
<ul>
|
||
<li>NFS сервер выключен или перезагружается</li>
|
||
<li>Неправильный IP или путь в PersistentVolume</li>
|
||
<li>Файрвол блокирует NFS трафик (порт 2049)</li>
|
||
</ul>
|
||
<p><strong>Пример 2: Образ не скачался</strong></p>
|
||
<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">Events:
|
||
</span></span><span class="line"><span class="cl"> Warning Failed Failed to pull image "nginx:latest": rpc error: code = Unknown</span></span></code></pre></div></div>
|
||
<p>Контейнер не может скачать образ. Обычно это означает что <code>imagePullPolicy: Never</code>, а образ не импортирован на ноду.</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверяем что образ есть на ноде (используй IP своей worker ноды)</span>
|
||
</span></span><span class="line"><span class="cl">ssh user@192.168.X.X <span class="s2">"sudo k3s crictl images | grep nginx"</span></span></span></code></pre></div></div>
|
||
<p>Если образа нет - импортируй его через <code>k3s ctr images import</code>.</p>
|
||
<p><strong>Пример 3: ConfigMap не найден</strong></p>
|
||
<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">Events:
|
||
</span></span><span class="line"><span class="cl"> Warning FailedMount ConfigMap "nginx-config" not found</span></span></code></pre></div></div>
|
||
<p>Deployment ссылается на несуществующий ConfigMap.</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверяем что ConfigMap существует</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get configmap -n blog <span class="p">|</span> grep nginx-config</span></span></code></pre></div></div>
|
||
<p>Если нет - создай или исправь имя в Deployment.</p>
|
||
|
||
<h3 class="relative group">CrashLoopBackOff
|
||
<div id="crashloopbackoff" 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="#crashloopbackoff" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<p>Контейнер запускается, но сразу падает. Смотрим логи <strong>предыдущего</strong> запуска:</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Логи последнего упавшего контейнера</span>
|
||
</span></span><span class="line"><span class="cl">kubectl logs nginx-xxxxxxxxxx-xxxxx -n blog --previous</span></span></code></pre></div></div>
|
||
<p><strong>Пример: Nginx падает из-за неправильного конфига</strong></p>
|
||
<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">nginx: [emerg] unexpected "}" in /etc/nginx/nginx.conf:15
|
||
</span></span><span class="line"><span class="cl">nginx: configuration file /etc/nginx/nginx.conf test failed</span></span></code></pre></div></div>
|
||
<p>Синтаксическая ошибка в <code>nginx.conf</code>. Проверяем ConfigMap:</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Смотрим содержимое конфига</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get configmap nginx-config -n blog -o yaml</span></span></code></pre></div></div>
|
||
<p>Находим ошибку, исправляем, применяем. Под перезапустится автоматически.</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%b3%d0%bb%d0%b0%d0%b2%d0%bd%d0%be%d0%b5-%d0%bf%d0%be%d0%b4-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверка</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get pods -n blog <span class="p">|</span> grep nginx
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Ожидаемый результат - все Running</span>
|
||
</span></span><span class="line"><span class="cl">nginx-xxxxxxxxxx-xxxxx 1/1 Running <span class="m">0</span> 2d
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Если не Running - смотри troubleshooting выше</span></span></span></code></pre></div></div>
|
||
<hr>
|
||
|
||
<h2 class="relative group">Шаг 6: Контент - есть ли файлы для отдачи
|
||
<div id="шаг-6-контент---есть-ли-файлы-для-отдачи" 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%88%d0%b0%d0%b3-6-%d0%ba%d0%be%d0%bd%d1%82%d0%b5%d0%bd%d1%82---%d0%b5%d1%81%d1%82%d1%8c-%d0%bb%d0%b8-%d1%84%d0%b0%d0%b9%d0%bb%d1%8b-%d0%b4%d0%bb%d1%8f-%d0%be%d1%82%d0%b4%d0%b0%d1%87%d0%b8" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h2>
|
||
<p>Под работает, Service видит его, Traefik проксирует трафик. Но сайт отдаёт <code>404 Not Found</code> или пустую страницу.</p>
|
||
<p>Проблема: Hugo Builder не записал файлы на NFS или записал не туда.</p>
|
||
|
||
<h3 class="relative group">Проверка
|
||
<div id="проверка-2" 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%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0-2" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Заходим в под nginx (используй своё имя пода)</span>
|
||
</span></span><span class="line"><span class="cl">kubectl <span class="nb">exec</span> -it nginx-xxxxxxxxxx-xxxxx -n blog -- sh
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Внутри пода смотрим что примонтировалось</span>
|
||
</span></span><span class="line"><span class="cl">ls -la /usr/share/nginx/html/
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Должен быть index.html и папки posts, tags, etc</span></span></span></code></pre></div></div>
|
||
<p><strong>Если директория пустая</strong> - Hugo Builder не сработал. Проверяем его логи:</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Логи Hugo Builder</span>
|
||
</span></span><span class="line"><span class="cl">kubectl logs -n blog deployment/hugo-builder-prod --tail<span class="o">=</span><span class="m">50</span></span></span></code></pre></div></div>
|
||
<p>Ищем строку <code>Build successful!</code> и список созданных файлов. Если её нет:</p>
|
||
<ol>
|
||
<li><strong>Webhook не сработал</strong> - проверь настройки webhook в Gitea</li>
|
||
<li><strong>Hugo упал с ошибкой</strong> - читай логи выше, смотри на что ругается</li>
|
||
<li><strong>Собрал в другую директорию</strong> - проверь переменную <code>OUTPUT_DIR</code> в build.sh</li>
|
||
</ol>
|
||
|
||
<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%b3%d0%bb%d0%b0%d0%b2%d0%bd%d0%be%d0%b5-%d0%ba%d0%be%d0%bd%d1%82%d0%b5%d0%bd%d1%82-%d0%bd%d0%b0-%d0%bc%d0%b5%d1%81%d1%82%d0%b5" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h3>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверка (используй своё имя пода)</span>
|
||
</span></span><span class="line"><span class="cl">kubectl <span class="nb">exec</span> -it nginx-xxxxxxxxxx-xxxxx -n blog -- ls /usr/share/nginx/html/ <span class="p">|</span> head -5
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Ожидаемый результат</span>
|
||
</span></span><span class="line"><span class="cl">index.html
|
||
</span></span><span class="line"><span class="cl">posts/
|
||
</span></span><span class="line"><span class="cl">tags/
|
||
</span></span><span class="line"><span class="cl">categories/
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Если пусто - Hugo Builder не отработал (см. выше)</span></span></span></code></pre></div></div>
|
||
<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%b1%d1%8b%d1%81%d1%82%d1%80%d1%8b%d0%b9-%d1%87%d0%b5%d0%ba%d0%bb%d0%b8%d1%81%d1%82-%d0%b4%d0%bb%d1%8f-%d0%bb%d1%8e%d0%b1%d0%be%d0%b9-%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d1%8b" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h2>
|
||
<p>Сохрани эту последовательность - она работает для 95% проблем:</p>
|
||
<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">[ ] DNS: dig домен → правильный IP?
|
||
</span></span><span class="line"><span class="cl">[ ] Сеть: curl -v https://домен → доходит до Traefik?
|
||
</span></span><span class="line"><span class="cl">[ ] MetalLB: kubectl get svc -n traefik → External IP назначен?
|
||
</span></span><span class="line"><span class="cl">[ ] Traefik: kubectl get pods -n traefik → Running?
|
||
</span></span><span class="line"><span class="cl">[ ] IngressRoute: kubectl get ingressroute -A | grep домен → нет дублей?
|
||
</span></span><span class="line"><span class="cl">[ ] Match синтаксис: Host(`домен`) со скобками и backticks?
|
||
</span></span><span class="line"><span class="cl">[ ] Endpoints: kubectl get endpoints -n namespace → не пустые?
|
||
</span></span><span class="line"><span class="cl">[ ] Selector: labels подов совпадают с selector Service?
|
||
</span></span><span class="line"><span class="cl">[ ] Pods: kubectl get pods -n namespace → все Running?
|
||
</span></span><span class="line"><span class="cl">[ ] PVC: kubectl get pvc -n namespace → все Bound?
|
||
</span></span><span class="line"><span class="cl">[ ] Контент: kubectl exec ls /usr/share/nginx/html → файлы есть?</span></span></code></pre></div></div>
|
||
<p>Проходишь по списку сверху вниз. Останавливаешься на первом <code>[ ]</code> где что-то не так. Чинишь. Проверяешь снова.</p>
|
||
<p>Не прыгай хаотично между уровнями. Алгоритм экономит время.</p>
|
||
<hr>
|
||
|
||
<h2 class="relative group">Реальный пример: 503 через раз
|
||
<div id="реальный-пример-503-через-раз" 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%80%d0%b5%d0%b0%d0%bb%d1%8c%d0%bd%d1%8b%d0%b9-%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80-503-%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d1%80%d0%b0%d0%b7" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h2>
|
||
<p>Мой сайт отдавал <code>503</code> примерно в 50% запросов. Половина запросов работала, половина нет.</p>
|
||
<p>Прошёл по алгоритму:</p>
|
||
<ol>
|
||
<li>✅ DNS - правильный IP</li>
|
||
<li>✅ Сеть - Traefik отвечает</li>
|
||
<li>✅ MetalLB - External IP назначен</li>
|
||
<li>✅ Traefik - поды Running</li>
|
||
<li>❌ IngressRoute - <strong>два роутера на один домен</strong></li>
|
||
</ol>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl get ingressroute -A <span class="p">|</span> grep oakazanin
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl">NAMESPACE NAME
|
||
</span></span><span class="line"><span class="cl">blog blog-https <span class="c1"># СТАРЫЙ, бэкенд в CreateContainerError</span>
|
||
</span></span><span class="line"><span class="cl">oakazanin blog-https <span class="c1"># НОВЫЙ, работает</span></span></span></code></pre></div></div>
|
||
<p>Traefik видел два роутера, честно балансировал трафик 50/50. Каждый второй запрос улетал в мёртвый <code>blog/nginx</code>.</p>
|
||
<p>Диагноз поставлен за 3 минуты. Лечение - одна команда:</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Удаляем дубль из старого namespace</span>
|
||
</span></span><span class="line"><span class="cl">kubectl delete ingressroute blog-https blog-http -n blog</span></span></code></pre></div></div>
|
||
<p>Мораль: <strong>всегда чисти за собой</strong>. Старые namespace с нерабочими сервисами - источник неочевидных проблем.</p>
|
||
<hr>
|
||
|
||
<h2 class="relative group">Откат и cleanup
|
||
<div id="откат-и-cleanup" 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%be%d1%82%d0%ba%d0%b0%d1%82-%d0%b8-cleanup" aria-label="Якорь">#</a>
|
||
</span>
|
||
|
||
</h2>
|
||
<p>Если в процессе диагностики что-то сломал ещё больше - откатываемся:</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Восстанавливаем предыдущую версию манифеста</span>
|
||
</span></span><span class="line"><span class="cl">kubectl apply -f nginx-deployment.yaml
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Перезапускаем поды принудительно</span>
|
||
</span></span><span class="line"><span class="cl">kubectl rollout restart deployment/nginx -n blog
|
||
</span></span><span class="line"><span class="cl">
|
||
</span></span><span class="line"><span class="cl"><span class="c1"># Смотрим что изменения применились</span>
|
||
</span></span><span class="line"><span class="cl">kubectl rollout status deployment/nginx -n blog</span></span></code></pre></div></div>
|
||
<p><strong>Золотое правило:</strong> Перед экспериментами делай бэкапы манифестов:</p>
|
||
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Экспортируем текущее состояние с датой</span>
|
||
</span></span><span class="line"><span class="cl">kubectl get deployment,service,ingressroute -n blog -o yaml > backup-<span class="k">$(</span>date +%Y%m%d<span class="k">)</span>.yaml</span></span></code></pre></div></div>
|
||
<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>Ты умеешь диагностировать проблемы. Но лучше их вообще не создавать.</p>
|
||
<p>В следующей части покажу как правильно мигрировать сервисы между namespace - без даунтайма, дублей IngressRoute и других сюрпризов которые приводят к 503.</p>
|
||
<p>Разберём реальный пример: переносим Gitea между namespace с NFS данными, получаем новый SSL за 32 секунды, и удаляем старый namespace навсегда.</p>
|
||
<hr>
|
||
<p><strong>Стек этой части:</strong></p>
|
||
<ul>
|
||
<li>Traefik 2.11 IngressRoute</li>
|
||
<li>Kubernetes 1.30 (K3s)</li>
|
||
<li>kubectl CLI</li>
|
||
<li>curl для внешних проверок</li>
|
||
<li>dig для DNS диагностики</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">
|
||
Блог на Hugo в K3s -
|
||
Эта статья — часть серии.
|
||
</summary>
|
||
|
||
|
||
|
||
<div
|
||
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
|
||
<a href="/posts/blog-part-1-architecture/">
|
||
Часть 1:
|
||
Блог на Hugo в K3s: часть 1 - архитектура и первый запуск
|
||
</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/blog-part-2-k8s-deployment/">
|
||
Часть 2:
|
||
Блог на Hugo в K3s: часть 2 - деплой в кластер
|
||
</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/blog-part-3-dev-environment/">
|
||
Часть 3:
|
||
Блог на Hugo в K3s: часть 3 - development окружение
|
||
</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/blog-part-4-git-workflow/">
|
||
Часть 4:
|
||
Блог на Hugo в K3s: часть 4 - выбор Git workflow
|
||
</a>
|
||
</div>
|
||
|
||
|
||
|
||
<div
|
||
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
|
||
Часть 5:
|
||
Ты уже здесь
|
||
</div>
|
||
|
||
|
||
|
||
<div
|
||
class="py-1 border-dotted border-neutral-300 border-s-1 -ms-5 ps-5 dark:border-neutral-600">
|
||
<a href="/posts/blog-part-6-namespace-migration/">
|
||
Часть 6:
|
||
Блог на Hugo в K3s: часть 6 - миграция между namespace
|
||
</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="/posts/blog-part-3-dev-environment/featured_hu_66d6ec8965fc58f3.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="/posts/blog-part-3-dev-environment/"
|
||
|
||
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>
|
||
Блог на Hugo в K3s: часть 3 - development окружение
|
||
|
||
</h2>
|
||
</a>
|
||
</header>
|
||
<div class="text-sm text-neutral-500 dark:text-neutral-400">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex flex-row flex-wrap items-center">
|
||
|
||
|
||
<time datetime="2026-01-15T00:00:00+00:00">15 января 2026</time><span class="px-2 text-primary-500">·</span><span title="Время чтения">6 минут</span><span class="px-2 text-primary-500">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="views_posts/blog-part-3-dev-environment/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">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="likes_posts/blog-part-3-dev-environment/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>
|
||
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex flex-row flex-wrap items-center">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/categories/%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/">
|
||
<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">
|
||
Веб-Разработка
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/categories/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/">
|
||
<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>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/hugo/">
|
||
<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">
|
||
Hugo
|
||
</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/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/traefik/">
|
||
<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">
|
||
Traefik
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/basic-auth/">
|
||
<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">
|
||
Basic-Auth
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
<div class="px-6 pt-4 pb-2"></div>
|
||
</article>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<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="/posts/blog-part-2-k8s-deployment/featured_hu_2e32aa277ab6beef.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="/posts/blog-part-2-k8s-deployment/"
|
||
|
||
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>
|
||
Блог на Hugo в K3s: часть 2 - деплой в кластер
|
||
|
||
</h2>
|
||
</a>
|
||
</header>
|
||
<div class="text-sm text-neutral-500 dark:text-neutral-400">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex flex-row flex-wrap items-center">
|
||
|
||
|
||
<time datetime="2026-01-08T00:00:00+00:00">8 января 2026</time><span class="px-2 text-primary-500">·</span><span title="Время чтения">8 минут</span><span class="px-2 text-primary-500">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="views_posts/blog-part-2-k8s-deployment/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">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="likes_posts/blog-part-2-k8s-deployment/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>
|
||
|
||
|
||
|
||
|
||
|
||
</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/%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/">
|
||
<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">
|
||
Веб-Разработка
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/hugo/">
|
||
<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">
|
||
Hugo
|
||
</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/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/nfs/">
|
||
<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">
|
||
Nfs
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/traefik/">
|
||
<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">
|
||
Traefik
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/cert-manager/">
|
||
<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">
|
||
Cert-Manager
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
<div class="px-6 pt-4 pb-2"></div>
|
||
</article>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<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="/posts/k3s-part3-installation/featured_hu_cb63b79224e99ddd.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="/posts/k3s-part3-installation/"
|
||
|
||
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>
|
||
K3s HA для homelab: Ставим K3s HA кластер
|
||
|
||
</h2>
|
||
</a>
|
||
</header>
|
||
<div class="text-sm text-neutral-500 dark:text-neutral-400">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex flex-row flex-wrap items-center">
|
||
|
||
|
||
<time datetime="2025-11-02T00:00:00+00:00">2 ноября 2025</time><span class="px-2 text-primary-500">·</span><span title="Время чтения">10 минут</span><span class="px-2 text-primary-500">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="views_posts/k3s-part3-installation/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">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="likes_posts/k3s-part3-installation/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>
|
||
|
||
|
||
|
||
|
||
|
||
</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="/categories/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/">
|
||
<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>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<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/installation/">
|
||
<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">
|
||
Installation
|
||
</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/etcd/">
|
||
<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">
|
||
Etcd
|
||
</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>
|
||
<div class="px-6 pt-4 pb-2"></div>
|
||
</article>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<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="/posts/k3s-part1-architecture/featured_hu_93e9342ed126d912.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="/posts/k3s-part1-architecture/"
|
||
|
||
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>
|
||
K3s HA для homelab: архитектура без боли
|
||
|
||
</h2>
|
||
</a>
|
||
</header>
|
||
<div class="text-sm text-neutral-500 dark:text-neutral-400">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex flex-row flex-wrap items-center">
|
||
|
||
|
||
<time datetime="2025-10-14T00:00:00+00:00">14 октября 2025</time><span class="px-2 text-primary-500">·</span><span title="Время чтения">8 минут</span><span class="px-2 text-primary-500">·</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">·</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>
|
||
|
||
|
||
|
||
|
||
|
||
</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>
|
||
<div class="px-6 pt-4 pb-2"></div>
|
||
</article>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<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="/posts/k3s-part2-infrastructure/featured_hu_fa55fce8dafb1970.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="/posts/k3s-part2-infrastructure/"
|
||
|
||
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>
|
||
K3s HA для homelab: Готовим инфраструктуру в Proxmox
|
||
|
||
</h2>
|
||
</a>
|
||
</header>
|
||
<div class="text-sm text-neutral-500 dark:text-neutral-400">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex flex-row flex-wrap items-center">
|
||
|
||
|
||
<time datetime="2025-10-21T00:00:00+00:00">21 октября 2025</time><span class="px-2 text-primary-500">·</span><span title="Время чтения">10 минут</span><span class="px-2 text-primary-500">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="views_posts/k3s-part2-infrastructure/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">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="likes_posts/k3s-part2-infrastructure/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>
|
||
|
||
|
||
|
||
|
||
|
||
</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/infrastructure/">
|
||
<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">
|
||
Infrastructure
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/debian/">
|
||
<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">
|
||
Debian
|
||
</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>
|
||
<div class="px-6 pt-4 pb-2"></div>
|
||
</article>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<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="/posts/blog-part-4-git-workflow/featured_hu_131e00d8f221862c.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="/posts/blog-part-4-git-workflow/"
|
||
|
||
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>
|
||
Блог на Hugo в K3s: часть 4 - выбор Git workflow
|
||
|
||
</h2>
|
||
</a>
|
||
</header>
|
||
<div class="text-sm text-neutral-500 dark:text-neutral-400">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex flex-row flex-wrap items-center">
|
||
|
||
|
||
<time datetime="2026-02-16T00:00:00+00:00">16 февраля 2026</time><span class="px-2 text-primary-500">·</span><span title="Время чтения">7 минут</span><span class="px-2 text-primary-500">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="views_posts/blog-part-4-git-workflow/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">·</span><span>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<span
|
||
id="likes_posts/blog-part-4-git-workflow/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>
|
||
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
<div class="flex flex-row flex-wrap items-center">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/categories/%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/">
|
||
<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">
|
||
Веб-Разработка
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/categories/devops-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8/">
|
||
<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>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/git/">
|
||
<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">
|
||
Git
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/workflow/">
|
||
<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">
|
||
Workflow
|
||
</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>
|
||
|
||
<a class="relative mt-[0.5rem] me-2" href="/tags/hugo/">
|
||
<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">
|
||
Hugo
|
||
</span>
|
||
</span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
|
||
</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">
|
||
|
||
<a
|
||
class="flex text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400"
|
||
href="/posts/blog-part-4-git-workflow/">
|
||
<span class="leading-6">
|
||
<span class="inline-block rtl:rotate-180">←</span> Блог на Hugo в K3s: часть 4 - выбор Git workflow
|
||
</span>
|
||
</a>
|
||
|
||
<span class="ms-6 mt-1 text-xs text-neutral-500 dark:text-neutral-400">
|
||
<time datetime="2026-02-16T00:00:00+00:00">16 февраля 2026</time>
|
||
</span>
|
||
|
||
|
||
</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/blog-part-6-namespace-migration/">
|
||
<span class="leading-6">
|
||
Блог на Hugo в K3s: часть 6 - миграция между namespace <span class="inline-block rtl:rotate-180">→</span>
|
||
</span>
|
||
</a>
|
||
|
||
<span class="me-6 mt-1 text-xs text-neutral-500 dark:text-neutral-400">
|
||
<time datetime="2026-02-18T00:00:00+00:00">18 февраля 2026</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="Пролистать наверх">
|
||
↑
|
||
</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">
|
||
©
|
||
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> & <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>
|