TGViewer
Channel Public Channel
Андрей с кубами | K8s

Андрей с кубами | K8s

@k8s_and_experts

Subscribers
36
Photos
13
Videos
3
Links
1
Recent Posts 19 shown
Post #30 44
#глоссарий

"Под работает стабильно, потом его убивает с OOMKilled, а в логах ничего нет. И что тогда случилось?" - распространенная боль в проде, но в 80% случаев всему виной неправильно выставленные resources.
Это ооочень важная тема для понимания, чтобы в последствии понимать настройки любого пода (сорри за тавтологию, но лучше и не скажешь👍). Сегодня разберемся, как это всё работает

В spec.containers[ ].resources мы описываем два параметра для CPU и памяти:


resources:
requests:
cpu: "250m" # 0.25 ядра
memory: "128Mi"
limits:
cpu: "500m" # 0.5 ядра
memory: "256Mi"


Requests - объём ресурсов, который Scheduler учитывает при размещении пода на ноде. Планировщик не запустит под, если на ноде недостаточно свободных ресурсов с учётом requests всех уже работающих подов. Реальное потребление контейнера может отличаться от requests

Пример: а ноде 4 CPU и 8 GiB памяти. Если там уже запущено подов с `requests: cpu=3, memory=6Gi`, то Scheduler пустит на неё новый под только если его `requests` ≤ 1 CPU и ≤ 2 GiB


Limits - максимальный объём ресурсов, который ядро Linux разрешает потреблять контейнеру через механизм cgroups. При превышении limits.cpu контейнер подвергается троттлингу (то есть к искусственному замедлению). При превышении limits.memory контейнер принудительно завершается через OOM-killer

Если говорить конкретней, что происходит с CPU и Memory при превышении Limits, то:

CPU (измеряется в миллиядрах: 100m = 0.1 ядра):
• Превышение limits.cpu, следовательно троттлинг
• Под не убивается, ему просто искусственно замедляют выполнение
• Реализовано через `cgroups` и CFS (Completely Fair Scheduler) ядра Linux
• Приложение начинает работать медленнее, но остаётся живым
• Признак проблемы в метриках, то есть растёт `container_cpu_cfs_throttled_periods_total`

Memory (измеряется в Mi/Gi):
• Превышение `limits.memory`, следовательно OOMKill (Out Of Memory Kill)
• Под убивается мгновенно ядром Linux, без предупреждения, без graceful shutdown (если не настроен `preStop hook`)
• Kubelet видит смерть и перезапускает контейнер (если restartPolicy: Always)
• Признак проблемы: в `kubectl describe` pod видно `OOMKilled` в состоянии `Last State`


Такие разные последствия превышения лимита обосновываются тем, что CPU - возобновляемый ресурс (такты процессора делятся между всеми). А вот память - невозобновляемый (то есть если её не хватит, ядру придётся кого-то убить, иначе упадёт вся нода). Linux выбирает «жертву» через OOM-killer

Ещё важно разобраться в том, что на основе requests и limits Kubernetes автоматически присваивает каждому поду класс качества обслуживания (QoS Class). Это напрямую диктует приоритет при нехватке ресурсов на ноде (Node Pressure) или при её восстановлении после сбоя 💻

• Guaranteed (requests == limits для CPU и памяти), высший приоритет. Планировщик старается разместить такие поды первыми. При критической нехватке ресурсов на ноде они умирают последними

• Burstable (заданы requests, но limits выше или не заданы), средний приоритет

• BestEffort (ресурсы не заданы вообще), низший приоритет, эдакое«пушечное мясо» кластера


ВАЖНО! Если у пода не заданы ограничения, при дефиците ресурсов на ноде он будет принудительно остановлен (evicted) в первую очередь, чтобы спасти поды с гарантированными ресурсами. При восстановлении ноды он также будет запущен в последнюю очередь.
Post #29 36
#морнинг_рутин

Юпи-йоу, дорогие подписчики 😎

Отпуск Андрея пролетел незаметно, пора возвращаться в рабочий режим

Делимся планами Андрея на ближайшую неделю:

"Всееем привееет!

Сюда о моих планах на неделю я стал писать чаще, чем у меня интересуется этим вопросом моя мама

Чтож! Я бы хотел сказать, что это будет моя полноценная рабочая неделя после отпуска, но не тут то было — в пятницу я уезжаю на свадьбу к Jointime! Думаю некоторым айтишным ребятам знаком этот мужчина, основатель сообщества ITxХОЗЯЕВА. Вернулся на Кавказ быстрее чем я ожидал честно говоря

Но это я немного вперед забежал, а надо бы и о сегодняшнем дне рассказать. Я поставил рекорд по созвонам — их было порядка одиннадцати штук у меня за сегодня, пока я такого еще не видел 💀

Следующие дни пройдут у меня в учебном ритме: магистратура дает о себе знать и пора бы делать лабораторные (боже храни codex). И нужно будет сделать реферат на тему «Инфраструктура в IT», вот и пригодился ваш квадранетес или как его там

Короче я пока кайфую от осеннего вайба среди дел и учебы, осталось все успеть (такой хоа-хоа-хоа вайб присутствует👍)

Из планов у меня еще глава курса базового кубернетеса и интенсива по чистой архитектуре, который я взял для повторения, уж слишком давно я ручками не писал

На самом деле все это может прозвучать круто и продуктивненько, но главное успевать и отдыхать в таком темпе и суматохе, иначе вы быстро кончитесь!

Всем хорошей осени, пусть за окном будет rain,но на душе не будет pain🥰"
Post #26 36
#итоги_недели

Добрый вечер, пацаноиды🥳

Уже создали своего битубисаса? Надеемся, что ваши выходные прошли так же хорошо, как и отпуск Андрея😎

Небольшой отчет за прошедшую неделю:

"Всем привет!

Чтож, вернуться домой получилось, поэтому, отмазок почему я сделал не все что хотел, становится меньше

Пройдемся же по пунктам:

• Вещи разобраны, стилус куплен и опробован (хочу рассказать о методе, который начал тестить при обучении), надеюсь скоро поделюсь с Вами!

• В горы не съездил, на даче не был, но впереди выходные — шашлычок под коньячок без города Сочи (употребление алкоголя вредит вашем здоровью, пацаноиды, так что пейте лучше чай с вареньем Бабы Жули и Деда Чени)

Рабочий день не прошел, а пролетел: пока разобрался день уже и закончился, вернулся и увидел много 500-ых ошибок, но вроде все починил. Пятничные релизы успешные же обычно

Сейчас сижу и жду пару — ведь я теперь вечерний магистр, не знаю радоваться этому или нет, время покажет

Всем хороших выходных!"
Post #25 38
#глоссарий

Ооочень распространенная боль новичков:

Я скопировал YAML из документации, поменял пару строк — и получил ошибку mapping values are not allowed here. Что не так?


Спойлер: в 90% случаев - лишний пробел. Но за такой мелочью стоит целая философия работы с Kubernetes. Сегодня разберемся с этим😎

YAML (YAML Ain't Markup Language) - формат сериализации данных, человекочитаемая альтернатива JSON. Kubernetes использует его как основной способ описания желаемого состояния кластера

Когда мы пишем kubectl apply -f deployment.yaml, то мы передаем кластеру: «Вот какое состояние я хочу видеть», а Kubernetes, в свою очередь, сам разбирается, как к этому состоянию прийти

Любой YAML-файл в Kubernetes имеет строго определённую структуру. Примерно вот такую:


apiVersion: apps/v1 # Версия API, в которой описан объект
kind: Deployment # Тип объекта (Pod, Service, Deployment...)
metadata: # Метаданные: имя, namespace, лейблы
name: my-app
namespace: production
labels:
app: backend
spec: # Спецификация — "что мы хотим"
replicas: 3
selector: ...
template: ...
status: # Статус — "что есть на самом деле" (только для чтения)
availableReplicas: 3


Ооочень важно! После status мы ничего никогда не пишем сами. Его заполняет контроллер на основе реального состояния. А вот нам нужно заполнить только spec, то есть желаемое состояние

Более того, у YAML есть две ключевые концепции: декларативность и идемпотентность

Декларативность: ты описываешь что ты хочешь, а не как это сделать. Не «создай 3 пода», а «пусть всегда будет 3 пода»

Идемпотентность: `kubectl apply -f file.yaml ` можно запустить 1 раз, 10 раз или 1000 раз - результат будет одинаковым. Если состояние уже соответствует желаемому, Kubernetes ничего не изменит


А теперь к подводным камням:
• Отступы - синтаксис. В YAML нельзя использовать табы, только пробелы (обычно 2). Один лишний пробел и весь документ поломался

• Регистр имеет значение. `apiVersion `и `apiversion `- это разные вещи

• Многострочные строки. Используй `|` для сохранения переносов или `>` для схлопывания в одну строку
Post #23 44
#морнинг_рутин

У нашего пацаноида Андрея идет последняя неделя отпуска, но он не отчаивается и делится своими амбициозными планами:

"Аййоу!

Чтож, от моего отпуска кроме приятных воспоминаний уже почти ничего не остается, но на этой неделе работа начинается только в пятницу поэтому абонент еще чуть кайфует🔄

Но по планам:

1. Вернуться домой (в целом если это не получится дальше можете не читать)
2. Разобрать вещи — есть ли люди кому это вообще нравится? Для меня собрать и разобрать чемодан мука (хорошо что жена это любит)
3. Забрать стилус для айпада и начать проходить базовый курс слермика по куберу + опробовать новую систему обучения — как раз делать конспекты почти от руки (для этого, собственно, стилус и нужен)
4. Съездить в микрогоры в Воронежской области — Дивногорье, проводить так этот отпуск
5. Собрать на даче скошенную траву (да, я когда-то чуть шизанулся и купили участок вместе с супругой). Честно говоря, пока я там только шашлык пожарил 1 раз за год и все, больше ничего особо и не сделал

В общем, как-то так друзья, если хотя бы 3 пункта сделаю — посчитаю эту неделю продуктивной

Всем удачной недели!"
  • 🎉 4
  • 🔥 2
  • 🏆 2
Post #22 61
Андрей передает всем пламенный привет (такой же яркий и тёплый, как и костры рябин в это 3 сентября 🌊)

Желаем Андрею зарядиться как можно большим количеством сииил и энееергии для продуктивной работы
  • 👏 6
  • 🏆 2
Post #21 63
#глоссарий

Service - это объект Kubernetes, который определяет селектор, порты и тип. Сам по себе Service - просто запись в etcd. Трафик он не обрабатывает🔧

Если чууууть детальней раскрывать определение, то:

Селектор (selector) - набор лейблов, по которым находятся целевые поды

Порты (ports) - какие порты слушать и куда их маппить

Тип (type) - как сервис будет доступен извне (или только внутри кластера)


Как только ты создаёшь Service с селектором, контроллер endpoints автоматически находит все поды, подходящие под этот селектор, и создаёт объект Endpoints (или EndpointSlice в новых версиях). В свою очередь Endpoints - это список реальных IP-адресов и портов подов💻

Интересно, что если под падает или пересоздаётся с новым IP, то Endpoints обновляется автоматически, а Service при этом не меняется

На каждой ноде работает демон kube-proxy. Он следит за изменениями объектов Service и Endpoints через API-server (watch) и локально на ноде обновляет правила маршрутизации

А ещё есть разные типы Service и они все между собой различают

ClusterIP
(по дефолту). Сервис доступен только внутри кластера. Получает виртуальный IP (VIP), который существует только в правилах iptables/IPVS на нодах

NodePort
. Открывает один и тот же порт (30000–32767) на всех нодах кластера. Внешний трафик идёт на <NodeIP>:<NodePort> и дальше DNAT-ится на поды

LoadBalancer
. Автоматически заказывает внешний балансировщик у облачного провайдера (AWS ALB, GCP CLB, Yandex Cloud NLB и т.д.). Внутри кластера ведёт себя как NodePort + ClusterIP

ExternalName
(редкий штука). Не создаёт никаких правил - просто CNAME-запись в DNS, которая перенаправляет на внешний хост
  • 🔥 5
  • 🏆 2
Post #20 68

This post (sticker, poll or similar) has no web preview. Open in Telegram

  • 🌭 10
  • 🔥 4
  • 🏆 3
Post #19 93
#морнинг_рутин

Несмотря на отпуск, Андрей поделился своими планами. Просьба сильно не завидовать:

"Приветик всем!

Сегодня у меня уже никакой работы и мой понедельник трудно назвать днем тяжелым, но про планы на отпуск напишу, надеюсь, такие вещи не сильно больно читать в начале недели

Уезжаю я в горы, на Кавказ, из планов посетить: Пятигорск, Кисловодск и Минеральные воды, в которых нас будут ждать: экскурсия по самой живописной дороге в России, лечебная вода практически из любого крана в городе, а также согревающие еловые бочки

Читаю это и понимаю, что, наверное, в моем возрасте отдыхают далеко не так, но мой психологический возраст видимо уже ближе к предпенсионному

Ну и самая главная задача - НЕ писать ни одной строчки кода и вообще НЕ думать о работа. С первым справлюсь легко, а второе всегда дается с трудом

Надеюсь вернусь отдохнувшим и смогу навалить вам годного контента пачками!

А так, всех с приближающейся осенью, те, кому нужно в школу - соболезную"
  • 🏆 7
  • 👏 3
Post #18 112
#итоги_недели

Доброй ночи, дорогие подписчики🌌

У нас позднее включение и небольшой отчет за неделю от Андрея:

«Йоу!

Ну чтож пятница пришла - неделя прошла

Читаю и чуть хихикаю че я тут написал, пацанчик на ночной мотивации походу решил что все успеет сделать, но ладно, будь как будет

Рабочие задачи - закрыты, все подготовлено, документики написаны и переданы, даже не пришлось катить пятничный релиз, приколите!
Книжку прочитал, но, честно говоря, я далеко не в востороге, советовать не буду, если вы любите Андрея Дороничева - пусть он останется у Вас в голове человеком который не писал эту книжку

5 баксов не потратил и эксперимента не было, чтож, тут я и прокололся, есть еще выходные реабилитроваться, но там прилетела срочная задачка выпить пива и подготовиться к отпуску, к сожалению прийдется похоже все таки отложить эксперимент до лучших времен((

Всем хороших выходных!»
  • ❤ 6
  • 😁 3
Post #17 346

This post (sticker, poll or similar) has no web preview. Open in Telegram

  • 😁 10
  • 🔥 2
Post #15 107
#глоссарий

Контейнер - легковесная, изолированная и исполняемая единица ПО, включающая всё необходимое для работы приложения: код, среду выполнения, инструменты, библиотеки и настройки

В K8s у контейнеров есть особенности:

• Не существуют сами по себе
K8s не запускает отдельные контейнеры. Минимальная единица - Под (Pod). Под может содержать один или несколько контейнеров, которые делят сеть, хранилище и ресурсы узла


• Эфемерность
Контейнеры временные: их легко создавать, удалять или заменять (например, при масштабировании или обновлении образов). Постоянные данные хранят во внешних томах (volumes)


• Основаны на образах
Контейнер запускается из образа (Docker и др., совместимых с OCI). Образ - неизменяемый шаблон, контейнер - его запущенный экземпляр


• Управление через
CRIK8s делегирует запуск контейнеров через Container Runtime Interface (CRI)


• Изоляция и эффективность
Контейнеры не эмулируют железо и не требуют гостевой ОС. Благодаря общему ядру ОС они стартуют мгновенно и экономно расходуют ресурсы


Если объяснять сооовсеееем просто:
Представьте, что Pod — это коммунальная квартира (или студия), а Контейнер — это жилец (человек).

Контейнер (жилец): У каждого жильца есть свой личный чемодан (образ) со своими вещами (библиотеки и код). Он ест, спит и работает сам по себе.

Pod (квартира): Это общее пространство, которое дает жильцам общий IP-адрес (дверь на улицу) и общую файловую систему (общий холодильник или кладовка).

Суть: Жильцы могут общаться друг с другом шепотом (через localhost), не выходя на улицу. Если один жилец умер (контейнер упал), второй продолжает жить в этой же квартире. Но если снесло всю квартиру (Pod удалили), то обоих жильцов выселяют.
  • ❤ 6
  • 🏆 1
Post #14 83
  • ❤ 6
  • 💯 3
Post #13 79
#морнинг_рутин

Андрей поделился своими планами на неделю, и звучат они очень и очень амбициозно (подстать нашей команде Слерм🦾)

Какие рабочие задача тебя ждут на этой неделе?
Релиз приложения, которым я плотно занимался последние полгода, большая интеграция нового важного инженерного инструмента в компании

Самая сложная задача на твой взгляд и сколько времени она займет?
Наверное, полная интеграция больших платформ данных: синхронизация данных, построение событийной модели, работа с внешними командами
Звучит очень банально, соглашусь, но, кажется, что банальная работа иногда и оказывается самой сложной
Хочется сделать сразу и навека

Кратко про спорт, хобби и саморазвитие на этой неделе
• Прочитать книгу Андрея Дороничева «Измени себя, не изменяя себе»
• Вводить привычку решать литкод хотя бы 2 раза в неделю
• Потратить 5 баксов в рамках научного эксперимента работы с deepseek harness

Ваши ставки, насколько Андрей будет продуктивен и успеет ли он закрыть все таски?
  • ❤ 7
Post #11 82
#глоссарий

Обычно говорят «Я запустил контейнер». Но в K8s мы запускаем не контейнеры, а поды

Pod(под) - это не контейнер, а абстракция над группой контейнеров. На уровне рантайма (containerd/CRI-O) Kubernetes вообще не оперирует подами. Рантайм знает только про контейнеры. Pod - это концепция уровня оркестратора, способ сгруппировать несколько контейнеров так, чтобы они разделяли ресурсы ядра Linux

Если объяснять совсем простым языком, то Pod - это как несколько парашютов, которые на дают вам упасть, если один из них не раскроется🪂

С точки зрения Linux, Pod - это набор контейнеров, которые работают в одних и тех же namespaces:
• Network namespace - один сетевой стек, один IP, один loopback-интерфейс. Поэтому контейнеры внутри пода общаются по 127.0.0.1
• IPC namespace - общая память, семафоры, очереди сообщений
• UTS namespace - общее hostname
При этом каждый контейнер имеет свой собственный PID namespace и filesystem namespace - то есть у каждого свой корень файловой системы и свой список процессов
  • 🏆 8
  • ⚡ 2
  • ❤ 1
Post #10 301
DevOps — это не профессия, это образ жизни между «works on my machine» и «уже в проде»🤖

Всем привет! Ваша любимая и бессменная команда Слерм запускает новый канал нашего растущего специалиста - Андрей с Кубами

Мы попросили Андрея немного рассказать о себе:

• Ганжа Андрей (да, фамилия настоящая)

• Full-stack разработчик в компании АЕДОН 💻

• В двух словах - работаю на заводе, а если говорить глубже — автоматизирую бизнес процессы, стараюсь сделать так чтобы продукция, которую мы производим:
А) делалась быстрее
Б) раньше оказывалась у клиентов
В) Производство было максимально эффективным и прозрачным

• Хобби — видеоигры и оч люблю сериалы (иногда даже русские, но без ментовских войн)
Книжки иногда даже русские (без мятной сказки)
Из спорта люблю велик и футбол (играть не умею, только смотрю)

• В чем сила?
Скажу банально, но в любви - к близким и к делу которым занимаешься

Безумно рады, что Андрей пополнил нашу друууужную команду

Надеемся, что и вы тепло примите Андрея🤍
  • 🏆 20
  • 👍 3
  • 🔥 2
  • ❤ 1
Older posts →

About this channel

How can I read @k8s_and_experts without a Telegram account?
TGViewer shows the public web preview Telegram publishes for Андрей с кубами | K8s: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does Андрей с кубами | K8s have?
Андрей с кубами | K8s (@k8s_and_experts) has 36 subscribers on Telegram, refreshed roughly every 30 minutes.
Does Андрей с кубами | K8s know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →