#kubelet #kubernetes #containerd
Недавно столкнулся с ошибкой на проде: не стартовали static pods из-за невозможности скачать pause контейнер. Разбор этого случая привел к написанию статьи ниже.
Дано:
- containerD 1.6.
- kubernetes 1.28.
- Один приватный регистри с аутентификацией.
- Абсолютно все образа загружаются с этого регистри.
Вопрос:
- Где необходимо и достаточно указать данные для доступа к регистри чтобы запустить под?
Уверен большинство из вас правильно ответили на этот вопрос.
Для тех кто сомневается ответ под катом.
Необходимо и достаточно указать данные для доступа в конфиге containerD.
А тем кому интересны кровавые подробности, проходите по ссылке 🙂
Недавно столкнулся с ошибкой на проде: не стартовали static pods из-за невозможности скачать pause контейнер. Разбор этого случая привел к написанию статьи ниже.
Дано:
- containerD 1.6.
- kubernetes 1.28.
- Один приватный регистри с аутентификацией.
- Абсолютно все образа загружаются с этого регистри.
Вопрос:
- Где необходимо и достаточно указать данные для доступа к регистри чтобы запустить под?
Уверен большинство из вас правильно ответили на этот вопрос.
Для тех кто сомневается ответ под катом.
А тем кому интересны кровавые подробности, проходите по ссылке 🙂
Gist
Аутентификация в private registry в kubernetes и containerD
Аутентификация в private registry в kubernetes и containerD - containerD_kubelet_auth.md
🔥2
#kubernetes #kube-scheduler
Огромный пост от инженера OpenAI про то, как осуществляется preemption в kube-scheduler.
Огромный пост от инженера OpenAI про то, как осуществляется preemption в kube-scheduler.
❤2🔥2
#kubernetes #security
Интересный проект для защиты подов. Основная фишка - недоверие облачному провайдеру, но запуск нагрузки на облачном провайдере :)
https://docs.edgeless.systems/contrast/
Основан на kata-containers и Confidential Containers
Интересный проект для защиты подов. Основная фишка - недоверие облачному провайдеру, но запуск нагрузки на облачном провайдере :)
https://docs.edgeless.systems/contrast/
Основан на kata-containers и Confidential Containers
Contrast is designed to keep all data always encrypted and to prevent access from the infrastructure layer. It removes the infrastructure provider from the trusted computing base (TCB). This includes access from datacenter employees, privileged cloud admins, own cluster administrators, and attackers coming through the infrastructure, for example, malicious co-tenants escalating their privileges.
👍1
Возникла у меня рабочая потребность разобраться в google protobuf и как это может быть реализованно на Go.
А когда я разбираюсь, я обычно залезаю очень подробно внутрь.
Статей, которые на достаточно подробном уровне дали вводную и были понятны новичку я не нашел, поэтому написал свою.
По сути дела это пример как сделать клиент-сервер на protobuf и gRPC с очень подробными комментариями.
https://github.com/azalio/protobuf-example
А когда я разбираюсь, я обычно залезаю очень подробно внутрь.
Статей, которые на достаточно подробном уровне дали вводную и были понятны новичку я не нашел, поэтому написал свою.
По сути дела это пример как сделать клиент-сервер на protobuf и gRPC с очень подробными комментариями.
https://github.com/azalio/protobuf-example
GitHub
GitHub - azalio/protobuf-example
Contribute to azalio/protobuf-example development by creating an account on GitHub.
👍11
Я уже немного перестал следить за развитием опенсорсных генерилок картинок, но в одном из чатов зашла речь о том, как это делать и я написал краткую инструкцию.
По большому счету все что вам нужно это ваше желание и совсем немного времени.
https://telegra.ph/Voploshchaem-fantazii-v-cifrovoj-realnosti-07-06
По большому счету все что вам нужно это ваше желание и совсем немного времени.
https://telegra.ph/Voploshchaem-fantazii-v-cifrovoj-realnosti-07-06
Telegraph
Воплощаем фантазии в цифровой реальности
Здравствуй мой совершеннолетний друг! Если ты не совершеннолетний, пожалуйста, закрой эту страничку! Сегодня я расскажу о том, как бесплатно, то есть даром, получать тонну любых картинок. Вот совсем любых, если ты понимаешь о чем я говорю... Для начала хочу…
🔥3😁1
Многие технари в приватных беседах признаются что они «душнилы».
Душнилы, я к вам обращаюсь!
Хотите душнить профессионально?
Я тут сделал презентацию, по тому как аргументированно душнить и надеюсь она вам пригодится :)
https://arguments.my.canva.site
Душнилы, я к вам обращаюсь!
Хотите душнить профессионально?
Я тут сделал презентацию, по тому как аргументированно душнить и надеюсь она вам пригодится :)
https://arguments.my.canva.site
🔥6
Сколько раз ко мне приходили ML разработчики и предлагали затащить модельку 10 Gb в образ не счесть. А тут им счастье подвезли:
А если внедрить к себе в кластер что-то из p2p доставки образов, да хоть ту же Стрекозу, то вообще можно на чуть-чуть сделать инженеров ML более счастливыми :)
https://habr.com/ru/companies/flant/articles/835626/
VolumeSource: OCI Artifact and/or Image
#4639; KEP
KEP добавляет в Kubernetes новыйVolumeSource, поддерживающий OCI-образы и/или OCI-артефакты. Теперь пользователи смогут упаковывать файлы и шарить их в контейнерах пода, не включая в основной образ. Это позволит снизить уязвимости и упростит создание образов.
Поддержка образов OCI уже достаточно отлажена в Kubernetes и CRI. Этот KEP расширяет её на OCI-артефакты. Теперь пользователи смогут пробрасывать новые медиатипы (media types) в рантаймы контейнеров, пользуясь всеми преимуществами, реализованными в подходе OCI (кастомное управление жизненным циклом, валидация, безопасность и так далее).
А если внедрить к себе в кластер что-то из p2p доставки образов, да хоть ту же Стрекозу, то вообще можно на чуть-чуть сделать инженеров ML более счастливыми :)
https://habr.com/ru/companies/flant/articles/835626/
Хабр
Kubernetes 1.31: новый VolumeSource, эмуляция старых версий и настройка анонимного доступа к эндпоинтам
Сегодня официально выпустили новую версию Kubernetes — 1.31. Среди главных нововведений — VolumeSource , поддерживающий OCI-образы и/или OCI-артефакты и поле SupplementalGroupsPolicy для контроля...
👍7🔥2
А что, если в действительности написать такую программу, которая содержит в себе сравнение всех uint32 чисел? Какие сложности нас ожидают?
(hint: компилятор скомпилировать такую программу не смог и пришлось выкручиваться…
hint2: превосходство питона над другими жалкими языками программирования, но не так как вы подумали)
https://andreasjhkarlsson.github.io//jekyll/update/2023/12/27/4-billion-if-statements.html
(hint: компилятор скомпилировать такую программу не смог и пришлось выкручиваться…
hint2: превосходство питона над другими жалкими языками программирования, но не так как вы подумали)
https://andreasjhkarlsson.github.io//jekyll/update/2023/12/27/4-billion-if-statements.html
🔥3
Сегодня мне задали интересный вопрос: как обнаружить ситуацию, когда YAML-файл синтаксически корректен, но его содержимое некорректно для Kubernetes, и сделать это до попытки его применения в кластере?
https://gist.github.com/azalio/f2e2859258c5d1768131623775ad369c
#kubernetes #lint
https://gist.github.com/azalio/f2e2859258c5d1768131623775ad369c
#kubernetes #lint
Gist
Как проверить валидность Kubernetes-манифеста до его применения.
Как проверить валидность Kubernetes-манифеста до его применения. - kube-valid.md
👍6
#cilium #external_nodes #kubernetes
Начальные условия: Есть кластер(а) kubernetes с cilium в режиме VxVLAN. Мастер ноды никак не входят в кластер k8s.
Надо: Настроить control plane так, чтобы kube-apiserver мог общаться с k8s node(s), вебхуками и расширенным апи (например, метрик сервер), но не был нодой kubernetes.
Сколько вариантов это сделать вы можете придумать используя стандартные средства (без написания чего-то своего)?
Я пока вижу 3 нормальных.
1. VTEP (Virtual Tunnel Endpoint)
https://docs.cilium.io/en/stable/network/vtep/
- Как работает: Поднимается vxvlan устройство на мастер-ноде, которое подключается ко всем нодам кластера, а весь трафик на поды направляется через это устройство.
- Плюсы: Легко настроить.
- Минусы: Требует обновления конфигурации при каждом изменении состава нод, увеличивает количество broadcast-пакетов, что может создавать проблемы на больших кластерах.
2. Cilium External Workloads
https://docs.cilium.io/en/stable/network/external-workloads/
- Как работает: Создаётся vxvlan интерфейс для Cilium сети и подключается Cilium Agent на внешней ноде с clustermesh API.
- Плюсы: Позволяет настраивать L3-связь без broadcast, а Cilium управляет всей связностью.
- Минусы: Требуется LoadBalancer или NodePort для clustermesh API, что может добавить сложности и расходы. Требуется надежное хранение в etcd.
3. Konnectivity Service
https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/
- Как работает: Konnectivity сервер разворачивается на мастер-ноде и позволяет контроллеру взаимодействовать с ресурсами нод через прокси.
- Плюсы: Работает и через NAT, поддерживает любые CNI.
- Минусы: Требуются дополнительные ресурсы на агенты и сервер Konnectivity, а также балансировщик для отказоустойчивости.
Есть еще вариант с выносом вебхуков и расширенного апи на хостовую сеть, но это не удобно.
Начальные условия: Есть кластер(а) kubernetes с cilium в режиме VxVLAN. Мастер ноды никак не входят в кластер k8s.
Надо: Настроить control plane так, чтобы kube-apiserver мог общаться с k8s node(s), вебхуками и расширенным апи (например, метрик сервер), но не был нодой kubernetes.
Сколько вариантов это сделать вы можете придумать используя стандартные средства (без написания чего-то своего)?
1. VTEP (Virtual Tunnel Endpoint)
https://docs.cilium.io/en/stable/network/vtep/
- Как работает: Поднимается vxvlan устройство на мастер-ноде, которое подключается ко всем нодам кластера, а весь трафик на поды направляется через это устройство.
- Плюсы: Легко настроить.
- Минусы: Требует обновления конфигурации при каждом изменении состава нод, увеличивает количество broadcast-пакетов, что может создавать проблемы на больших кластерах.
2. Cilium External Workloads
https://docs.cilium.io/en/stable/network/external-workloads/
- Как работает: Создаётся vxvlan интерфейс для Cilium сети и подключается Cilium Agent на внешней ноде с clustermesh API.
- Плюсы: Позволяет настраивать L3-связь без broadcast, а Cilium управляет всей связностью.
- Минусы: Требуется LoadBalancer или NodePort для clustermesh API, что может добавить сложности и расходы. Требуется надежное хранение в etcd.
3. Konnectivity Service
https://kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity/
- Как работает: Konnectivity сервер разворачивается на мастер-ноде и позволяет контроллеру взаимодействовать с ресурсами нод через прокси.
- Плюсы: Работает и через NAT, поддерживает любые CNI.
- Минусы: Требуются дополнительные ресурсы на агенты и сервер Konnectivity, а также балансировщик для отказоустойчивости.
Есть еще вариант с выносом вебхуков и расширенного апи на хостовую сеть, но это не удобно.
❤2
Я перед сном смотрю разные видео и это видео я посмотрел судя по истории 11 октября, но идея этого видео не отпускает меня до сих пор.
Как вам такая мысль:
В нашей вселенной время и расстояние квантуются.
То есть есть минимальные единицы, меньше которых нельзя либо переместиться, либо измерить время?
То есть, например, нельзя переместиться на произвольное расстояние, а только на минимальное или больше него.
Именно о таких понятиях это видео и оно весьма интересно.
Как вам такая мысль:
В нашей вселенной время и расстояние квантуются.
То есть есть минимальные единицы, меньше которых нельзя либо переместиться, либо измерить время?
То есть, например, нельзя переместиться на произвольное расстояние, а только на минимальное или больше него.
Именно о таких понятиях это видео и оно весьма интересно.
✍4🤔2
#AI #opensource
Как с помощью генеративного ИИ улучшить PR в open source проект.
## Введение
Fluent Bit - это быстрый и легковесный логгер и форвардер логов, который часто используется в облачных средах для сбора и отправки данных. В этой статье я расскажу, как с помощью ИИ удалось быстро разобраться в незнакомой кодовой базе и подготовить качественный PR.
## Проблема
При настройке отправки логов в Amazon Kinesis через Fluent Bit я столкнулся с ограничением - плагин не позволял указать нестандартный порт для подключения. Это было критично в нашей инфраструктуре, где из-за особенностей сетевой архитектуры мы используем нестандартные порты для доступа к kinesis.
## Первоначальное решение
Мой коллега предложил простой патч, который решал проблему:
Было:
Стало:
Патч работал, но для долгосрочного решения нужно было внести изменения в апстрим проекта. Пересборка Fluent Bit при каждом обновлении не самый удобный вариант.
## Работа с ИИ
Для работы я использовал cursor.com - форк VSCode с интегрированным Claude AI. Главное преимущество этого редактора в том, что он "понимает" всю кодовую базу проекта.
Вот как проходила работа с ИИ:
1. Сначала я показал ему существующий патч и попросил предложить улучшения. ИИ самостоятельно:
- Обнаружил существующие в кодовой базе механизмы логирования (
- Предложил добавить информативные сообщения о выбранном порте
- Добавил валидацию входных данных после моей просьбы.
2. ИИ самостоятельно написал тесты, проверяющие:
- Инициализацию с дефолтным портом
- Использование кастомного порта
- Обработку некорректных значений порта
3. Когда возникли проблемы с подхватыванием порта, ИИ предложил пошаговую отладку через gdb:
## Результат
Итоговый PR был вмержен в основную ветку проекта. На всю работу ушло около 6 часов, включая время на знакомство с кодовой базой Fluent Bit.
Теперь изменение конфигурации Fluent Bit для работы с нестандартным портом Kinesis выглядит так:
Я надеюсь в версии fluent-bit 3.2 оно уже будет работать.
P.S. Я пробовал копилот от гитхаба для этой задачи - он мне показался несколько бесполезым и не шел ни в какое сравнение с sonnet 3.5.
Как с помощью генеративного ИИ улучшить PR в open source проект.
## Введение
Fluent Bit - это быстрый и легковесный логгер и форвардер логов, который часто используется в облачных средах для сбора и отправки данных. В этой статье я расскажу, как с помощью ИИ удалось быстро разобраться в незнакомой кодовой базе и подготовить качественный PR.
## Проблема
При настройке отправки логов в Amazon Kinesis через Fluent Bit я столкнулся с ограничением - плагин не позволял указать нестандартный порт для подключения. Это было критично в нашей инфраструктуре, где из-за особенностей сетевой архитектуры мы используем нестандартные порты для доступа к kinesis.
## Первоначальное решение
Мой коллега предложил простой патч, который решал проблему:
Было:
ctx->kinesis_client->port = 443;
struct flb_upstream *upstream = flb_upstream_create(config, ctx->endpoint,
443, FLB_IO_TLS,
ctx->client_tls);
Стало:
ctx->kinesis_client->port = ctx->port;
struct flb_upstream *upstream = flb_upstream_create(config, ctx->endpoint,
ctx->port, FLB_IO_TLS,
ctx->client_tls);
Патч работал, но для долгосрочного решения нужно было внести изменения в апстрим проекта. Пересборка Fluent Bit при каждом обновлении не самый удобный вариант.
## Работа с ИИ
Для работы я использовал cursor.com - форк VSCode с интегрированным Claude AI. Главное преимущество этого редактора в том, что он "понимает" всю кодовую базу проекта.
Вот как проходила работа с ИИ:
1. Сначала я показал ему существующий патч и попросил предложить улучшения. ИИ самостоятельно:
- Обнаружил существующие в кодовой базе механизмы логирования (
flb_plg_debug и flb_plg_error)- Предложил добавить информативные сообщения о выбранном порте
- Добавил валидацию входных данных после моей просьбы.
2. ИИ самостоятельно написал тесты, проверяющие:
- Инициализацию с дефолтным портом
- Использование кастомного порта
- Обработку некорректных значений порта
3. Когда возникли проблемы с подхватыванием порта, ИИ предложил пошаговую отладку через gdb:
# Сборка с отладочной информацией
cmake .. -DCMAKE_BUILD_TYPE=Debug -DFLB_DEV=On
# Запуск отладчика
gdb --args ./bin/fluent-bit -c /etc/fluent-bit/fluent-bit.conf
# Команды отладки
(gdb) break cb_kinesis_init
(gdb) run
(gdb) print flb_output_get_property("port", ins)
(gdb) print *ins
## Результат
Итоговый PR был вмержен в основную ветку проекта. На всю работу ушло около 6 часов, включая время на знакомство с кодовой базой Fluent Bit.
Теперь изменение конфигурации Fluent Bit для работы с нестандартным портом Kinesis выглядит так:
[OUTPUT]
Name kinesis
Match *
region us-east-1
port 4443 # Новый параметр
stream my-stream
Я надеюсь в версии fluent-bit 3.2 оно уже будет работать.
P.S. Я пробовал копилот от гитхаба для этой задачи - он мне показался несколько бесполезым и не шел ни в какое сравнение с sonnet 3.5.
GitHub
out_kinesis_streams: add custom port support for Kinesis output plugin by azalio · Pull Request #9317 · fluent/fluent-bit
This PR enhances the Kinesis output plugin by adding support for custom port configuration. The changes include:
Added a new configuration option 'port' to allow users to specify ...
Added a new configuration option 'port' to allow users to specify ...
👍4❤1
Собирали вручную Kubernetes-кластер без всяких там kubeadm?
Я разрабатываю курс по Kubernetes и решил: что может быть лучше для практики, чем собрать кластер своими руками? Это не только помогает понять, как работает Kubernetes, но и учит не бояться его сломать.
Kubernetes the Hard Way от легендарного Келси Высокая Башня — лучший туториал для этой задачи. Но вот что странно: в репозитории нет быстрого способа поднять виртуалки для начала работы.
Поэтому я написал Vagrantfile, который автоматически создает все нужные виртуалки по заданной спецификации. Теперь можно забыть о ручной настройке инфраструктуры и сосредоточиться на самом важном — практике.
```bash
brew tap hashicorp/tap
brew install hashicorp/tap/hashicorp-vagrant
vagrant plugin install vagrant-vmware-desktop
vagrant up
```
P.S. В репозиторий я также добавил файл, без которого пройти упражнение на сегодняшний день невозможно.
---
Ставьте лайки, пробуйте запустить и делитесь фидбеком! А еще будет интересно узнать ваши идеи, как решить подобную задачу. 👨💻✨
Я разрабатываю курс по Kubernetes и решил: что может быть лучше для практики, чем собрать кластер своими руками? Это не только помогает понять, как работает Kubernetes, но и учит не бояться его сломать.
Kubernetes the Hard Way от легендарного Келси Высокая Башня — лучший туториал для этой задачи. Но вот что странно: в репозитории нет быстрого способа поднять виртуалки для начала работы.
Поэтому я написал Vagrantfile, который автоматически создает все нужные виртуалки по заданной спецификации. Теперь можно забыть о ручной настройке инфраструктуры и сосредоточиться на самом важном — практике.
```bash
brew tap hashicorp/tap
brew install hashicorp/tap/hashicorp-vagrant
vagrant plugin install vagrant-vmware-desktop
vagrant up
```
P.S. В репозиторий я также добавил файл, без которого пройти упражнение на сегодняшний день невозможно.
---
Ставьте лайки, пробуйте запустить и делитесь фидбеком! А еще будет интересно узнать ваши идеи, как решить подобную задачу. 👨💻✨
👍7❤2🔥1
#это_база #kubelet #kubernetes
Дело было вечером, делать былонечего, да много дел было !
Писал тут лекцию по kubelet и подумал, а почему бы не рассказать про то, как работает вхождение ноды кубера по токенам.
Так и получилась небольшая статейка.
---
Понравилось? Поставь лайк! Они улучшают мне настроение.
Есть что добавить - велком в комменты!
Дело было вечером, делать было
Писал тут лекцию по kubelet и подумал, а почему бы не рассказать про то, как работает вхождение ноды кубера по токенам.
Так и получилась небольшая статейка.
---
Понравилось? Поставь лайк! Они улучшают мне настроение.
Есть что добавить - велком в комменты!
Gist
bootstap-token.md
GitHub Gist: instantly share code, notes, and snippets.
👍6🔥4🦄3
#AI
Я часто слышу, что генеративные ИИ скоро заменят разработчиков...
Поэтому у меня тут возникла идея попробовать разобраться можно ли написать проект полностью с помощью генеративного ИИ.
Решил написать мем-бота, который использует YandexGPT для улучшения или придумывания промпта и для генерации картинок взял YandexART и Kandinsky.
И оно работает! Вот, положила: @meme_ydx_bot
Для генерации API внешних сервисов я копировал страницу с сайта в чат и говорил: "Вот тебе дока, напиши код".
Ну и для всего остального я только выдавал текстовые команды.
Итого я написал всего около 1% кода. Все остальное сделал Deepseek v3 с помощью плагинов Continue.dev и Aider.chat.
Continue.dev - это плагин для VS Code. А Aider.chat - клевый инструмент для работы в терминале.
Бот одновременно запускает генерацию в обоих сервисах и возвращает первый успешный результат. Из тестов выяснилось, что YandexART работает побыстрее, поэтому он почти всегда отвечает первым.
Мемы получаются так себе, правда... 🙂 Надо будет дообучить на каком-нибудь корпусе мемов ИИшку.
P.S. Кстати, пробовал Sonnet 3.5 - он хорош, но очень дорогой по сравнению с Deepseek.
P.S. ЯндексАрт более щепетильно относится к промпту и, например, не будет генерировать картику по запросу "Гроб, кладбище,пидор ".
P.S. Более крутые товарищи уже написали сервис @AIMemeArenaBot.
---
Если есть мысли как улучшить бота или промпт - напишите, пожалуйста :)
Я часто слышу, что генеративные ИИ скоро заменят разработчиков...
Поэтому у меня тут возникла идея попробовать разобраться можно ли написать проект полностью с помощью генеративного ИИ.
Решил написать мем-бота, который использует YandexGPT для улучшения или придумывания промпта и для генерации картинок взял YandexART и Kandinsky.
И оно работает! Вот, положила: @meme_ydx_bot
Для генерации API внешних сервисов я копировал страницу с сайта в чат и говорил: "Вот тебе дока, напиши код".
Ну и для всего остального я только выдавал текстовые команды.
Итого я написал всего около 1% кода. Все остальное сделал Deepseek v3 с помощью плагинов Continue.dev и Aider.chat.
Continue.dev - это плагин для VS Code. А Aider.chat - клевый инструмент для работы в терминале.
Бот одновременно запускает генерацию в обоих сервисах и возвращает первый успешный результат. Из тестов выяснилось, что YandexART работает побыстрее, поэтому он почти всегда отвечает первым.
Мемы получаются так себе, правда... 🙂 Надо будет дообучить на каком-нибудь корпусе мемов ИИшку.
P.S. Кстати, пробовал Sonnet 3.5 - он хорош, но очень дорогой по сравнению с Deepseek.
P.S. ЯндексАрт более щепетильно относится к промпту и, например, не будет генерировать картику по запросу "Гроб, кладбище,
P.S. Более крутые товарищи уже написали сервис @AIMemeArenaBot.
---
Если есть мысли как улучшить бота или промпт - напишите, пожалуйста :)
GitHub
GitHub - azalio/meme-bot
Contribute to azalio/meme-bot development by creating an account on GitHub.
👍1
#cilium #l2 #kubernetes
Разбирался я тут с опциями цилиума и наткнулся на опцию --agent-liveness-update-interval и что-то из описания опции в документации яснее не стало.
Полез разбираться и внезапно почувствовал себя мужчиной из ролика, который решил поменять лампочку (скину в комменты).
Встречайте L2 анонсы в Cilium для доступа к сервисам LoadBalancer в bare-metal Kubernetes.
Все как вы любите, код на go, код на C, bpf-maps, bpftrace и прочие потроха цилиума и немножко линукс ядра.
---
Понравилось? Поставь лайк!
Разбирался я тут с опциями цилиума и наткнулся на опцию --agent-liveness-update-interval и что-то из описания опции в документации яснее не стало.
Полез разбираться и внезапно почувствовал себя мужчиной из ролика, который решил поменять лампочку (скину в комменты).
Встречайте L2 анонсы в Cilium для доступа к сервисам LoadBalancer в bare-metal Kubernetes.
Все как вы любите, код на go, код на C, bpf-maps, bpftrace и прочие потроха цилиума и немножко линукс ядра.
---
Понравилось? Поставь лайк!
👍16🔥4
Kubernetes Network Policies Done the Right Way by Isovalent.pdf
7.9 MB
Прочитал новую книжку от #cilium про то как надо делать сетевые политики в #kubernetes.
Сначала дают теорию, рассказывают как с 0 организовать сетевые политики, дают пошаговое руководство, потом переходят к практике, но практике сильно урезанной.
Захватывают все свои фишки типа:
- свое переосмысление на чем надо основываться при выборе эндпоинтов (identities)
- избирательный defaultDeny
- hubble UI и cli
- генерацию политик в редакторе
- L3/L4, L7 политики
В целом если вы давно в этой теме - вам эта книжка ничего не даст, если же вы не работали или работали эпизодически с сетевыми политиками (особенно с сетевыми политиками cilium), то рекомендую эту книжку - отличный старт.
Сначала дают теорию, рассказывают как с 0 организовать сетевые политики, дают пошаговое руководство, потом переходят к практике, но практике сильно урезанной.
Захватывают все свои фишки типа:
- свое переосмысление на чем надо основываться при выборе эндпоинтов (identities)
- избирательный defaultDeny
- hubble UI и cli
- генерацию политик в редакторе
- L3/L4, L7 политики
В целом если вы давно в этой теме - вам эта книжка ничего не даст, если же вы не работали или работали эпизодически с сетевыми политиками (особенно с сетевыми политиками cilium), то рекомендую эту книжку - отличный старт.
👍20
Говорят, в этом канале собрались очень умные люди.
Поэтому поступило предложение рассказать про митап, который устраивает Магнит OMNI и я не нашел поводов отказаться.
—
23 апреля встречаемся на митапе в Магнит OMNI!
Ивент, на котором инженеры, администраторы и разработчиками обсудят, как сделать инфраструктуру устойчивой к сбоям, как развивать Observability в условиях распределенной инфраструктуры и какие внутренние протоколы помогают, когда все идет совсем не по плану.
🔸 Что будет:
— Спикеры из Магнит OMNI, Лаборатории Касперского, Авито, Cloud.ru и других компаний
— Разбор болей, кейсов и решений, которые работают.
— Розыгрыш призов от Магнит OMNI.
— Живой нетворкинг.
Митап можно посетить:
— Офлайн в московском офисе Магнита,
— Онлайн
📅 Дата: 23 апреля
🕔 Время: 17:30
Не упускайте возможность узнать новое и пообщаться с профессионалами!
Подробности и регистрация — по ссылке.
#OMNI_events
@magnit_omni_team
Поэтому поступило предложение рассказать про митап, который устраивает Магнит OMNI и я не нашел поводов отказаться.
—
23 апреля встречаемся на митапе в Магнит OMNI!
Ивент, на котором инженеры, администраторы и разработчиками обсудят, как сделать инфраструктуру устойчивой к сбоям, как развивать Observability в условиях распределенной инфраструктуры и какие внутренние протоколы помогают, когда все идет совсем не по плану.
🔸 Что будет:
— Спикеры из Магнит OMNI, Лаборатории Касперского, Авито, Cloud.ru и других компаний
— Разбор болей, кейсов и решений, которые работают.
— Розыгрыш призов от Магнит OMNI.
— Живой нетворкинг.
Митап можно посетить:
— Офлайн в московском офисе Магнита,
— Онлайн
📅 Дата: 23 апреля
🕔 Время: 17:30
Не упускайте возможность узнать новое и пообщаться с профессионалами!
Подробности и регистрация — по ссылке.
#OMNI_events
@magnit_omni_team
❤5🔥3🤩1
🔒 Отключаем анонимный доступ к kube-apiserver, но оставляем health checks!
Привет! Недавно ко мне пришел коллега-безопасник (Дима привет!) с интересным вопросом: как полностью отключить анонимный доступ к API-серверу Kubernetes, но оставить рабочими проверки
Проблема в том, что по умолчанию (`--anonymous-auth=true`) любой может дернуть эндпоинты health-чеков и не только health-чеков:
Это удобно, но создает потенциальный вектор атаки, если RBAC настроен не идеально или найдется уязвимость. Безопасники такое не любят. 😟
К счастью, в KEP-4633 сообщество Kubernetes предложило решение! Теперь можно тонко настроить, к каким путям разрешен анонимный доступ, даже если глобально он выключен.
Сделать это можно так:
Сначала выключаем глобальный анонимный доступ в манифесте
Затем создаем файл конфигурации
*(Не забудьте добавить
В итоге получаем:
- Запросы к
- Запросы к другим путям (например,
Кстати, эта функциональность появилась как Alpha в Kubernetes 1.31 и стала Beta в 1.32.
Теперь можно спать спокойнее, зная, что анонимный доступ под контролем!
#kubernetes #k8s #security #authentication #kubeadm #devops #infosec
Привет! Недавно ко мне пришел коллега-безопасник (Дима привет!) с интересным вопросом: как полностью отключить анонимный доступ к API-серверу Kubernetes, но оставить рабочими проверки
/livez, /readyz и /healthz? 🤔 Сходу не ответил, полез копаться в исходниках и KEPах.Проблема в том, что по умолчанию (`--anonymous-auth=true`) любой может дернуть эндпоинты health-чеков и не только health-чеков:
curl -k https://<API_SERVER_IP>:6443/livez
# Output: ok
Это удобно, но создает потенциальный вектор атаки, если RBAC настроен не идеально или найдется уязвимость. Безопасники такое не любят. 😟
К счастью, в KEP-4633 сообщество Kubernetes предложило решение! Теперь можно тонко настроить, к каким путям разрешен анонимный доступ, даже если глобально он выключен.
Сделать это можно так:
Сначала выключаем глобальный анонимный доступ в манифесте
kube-apiserver:
spec:
containers:
- command:
- kube-apiserver
# ... другие флаги ...
- --anonymous-auth=false # <--- Выключаем!
- --authentication-config=/etc/kubernetes/auth-config.yaml # <--- Указываем конфиг
Затем создаем файл конфигурации
/etc/kubernetes/auth-config.yaml на control plane нодах и монтируем его в под kube-apiserver:
# /etc/kubernetes/auth-config.yaml
apiVersion: apiserver.config.k8s.io/v1beta1
kind: AuthenticationConfiguration
anonymous:
enabled: true # Включаем анонимный доступ *только* для указанных путей
conditions:
- path: /livez
- path: /readyz
- path: /healthz
*(Не забудьте добавить
volume и volumeMount в манифест kube-apiserver для этого файла)*В итоге получаем:
- Запросы к
/livez, /readyz, /healthz проходят как system:anonymous.- Запросы к другим путям (например,
/apis) без аутентификации получают 401 Unauthorized.Кстати, эта функциональность появилась как Alpha в Kubernetes 1.31 и стала Beta в 1.32.
Теперь можно спать спокойнее, зная, что анонимный доступ под контролем!
#kubernetes #k8s #security #authentication #kubeadm #devops #infosec
👍20🔥3💋1
😠 Агент-лимитер “слепнет” после появления новых PV? Раз и навсегда разбираемся с `mountPropagation` в Kubernetes!
Недавно писал I/O-лимитер для LVM-томов: агент читает маунты подов, чтобы вычислить
Почему так происходит
* Каждый контейнер стартует в своём *privаte* mount-namespace -> изменения на хосте туда не пролетают.
* В Kubernetes это равно
Как починить?
Параметр
* None - полная изоляция (`rprivate`), дефолт.
* HostToContainer - маунты летят *с хоста -> в контейнер* (`rslave`). Нам нужен именно он.
* Bidirectional - маунты ходят в обе стороны (`rshared`). Работает *только* в `privileged`-контейнере, иначе Pod не стартует.
Спека
Теперь каждое *новое* bind-mount событие внутри
Что происходит под капотом
1. Kubelet видит
2. CRI-shim (containerd/CRI-O) делает каталог
3. Все будущие маунты, созданные kubelet’ом на хосте, автоматически “проливаются” в контейнер.
На заметку
*
* В Kubernetes 1.10 было краткое время, когда дефолтом неожиданно стал
* Cilium тоже использует этот трюк чтобы следить за bpf мапами.
Полезные ссылки
• Документация
• CRI интерфейс
• man mount
#kubernetes #k8s #mountPropagation #linux #devops #storage
Недавно писал I/O-лимитер для LVM-томов: агент читает маунты подов, чтобы вычислить
MAJOR:MINOR для добавления в io.max, и всё ок… пока на узел не приедет новый Pod. Его маунта агент уже не видит. Перезапуск помогает, но это же костыль!Почему так происходит
* Каждый контейнер стартует в своём *privаte* mount-namespace -> изменения на хосте туда не пролетают.
* В Kubernetes это равно
mountPropagation: None.Как починить?
Параметр
mountPropagation у volumeMounts имеет 3 режима:* None - полная изоляция (`rprivate`), дефолт.
* HostToContainer - маунты летят *с хоста -> в контейнер* (`rslave`). Нам нужен именно он.
* Bidirectional - маунты ходят в обе стороны (`rshared`). Работает *только* в `privileged`-контейнере, иначе Pod не стартует.
Спека
spec:
containers:
- name: my-agent
image: my-agent-image
volumeMounts:
- name: kubelet-pods
mountPath: /var/lib/kubelet/pods
mountPropagation: HostToContainer
volumes:
- name: kubelet-pods
hostPath:
path: /var/lib/kubelet/pods
type: Directory
Теперь каждое *новое* bind-mount событие внутри
/var/lib/kubelet/pods мгновенно видно агенту - без рестартов.Что происходит под капотом
1. Kubelet видит
HostToContainer и пишет в CRI PROPAGATION_HOST_TO_CONTAINER. 2. CRI-shim (containerd/CRI-O) делает каталог
rslave. 3. Все будущие маунты, созданные kubelet’ом на хосте, автоматически “проливаются” в контейнер.
На заметку
*
Bidirectional опасен в мульти-тенант окружениях: контейнер может пролить маунты *на хост*. * В Kubernetes 1.10 было краткое время, когда дефолтом неожиданно стал
HostToContainer. Если админите древний кластер - проверьте (хотя боюсь вам уже ничего не поможет...). * Cilium тоже использует этот трюк чтобы следить за bpf мапами.
Полезные ссылки
• Документация
• CRI интерфейс
• man mount
#kubernetes #k8s #mountPropagation #linux #devops #storage
GitHub
Private mount propagation by jsafrane · Pull Request #62462 · kubernetes/kubernetes
This PR changes the default mount propagation from "rslave" (newly added in 1.10) to "private" (default in 1.9 and before). "rslave" as default...
👍12