Cilium install

Kubernetes CNI Cilium

В открытый доступ начал выходить цикл видео про Cilium.

Видео доступны на следующих площадках:

Список и время премьер можно посмотреть на канале в Youtube.

Время AI, время интересное.

AI — инструмент, который позволяет реализовать свои хотелки, которые в жизни никогда бы не смог развить. Ну или не дано по жизни.

Я не умею рисовать. Максимум квадраты Малевича получаются. Но могу объяснить, что я хочу видеть на рисунке.

В общем, добрался до сбычи мечт!

Решил начать с заставок для своих Youtube видео. Это первое видео в серии для начинающих.

Раньше там было мое ничем не запоминающееся лицо. А теперь китайская манга 🙂

Zed, добавление русского словаря в cSpell

MacOS

Я постепенно перехожу с vs code на zed. Мне для работы с claude code достаточно простой консоли и приложения для просмотра файлов. vs code штука хорошая, но достаточно медленная.

В zed всякие spell checkers подключаются как модули. Их там несколько и у всех есть различные проблемы. Самый простой по подключению к zed, по моему мнению — это cSpell. Но… У него в поставке по умолчанию нет русского словаря. И как его туда впихнуть, совсем непонятно.

Т.е. стандартная рекомендация: создайте файл ~/.cspell.json и добавтье в него:

{
"language": "en-EN,ru-RU",
}

не подходит. Словаря то нет. Да и ошибки в описании локали как то не заметил.

Хорошо, что под рукой есть claude code на этой же машине. Запрос:

Проблема проверка русского языка в Zed. Установлен cspell  есть файл ~/.cspell.json cspell сервер стартует, но все русские слова подчеркиваются как не правильные

В ответ

Проблема ясна. Две причины:

1. Пакет русского словаря не установлен — @cspell/dict-ru_ru отсутствует
2. Неправильные имена словарей в конфиге — cspell использует ru_RU (с подчёркиванием), а не ru-RU. Также en-EN не
  существует, нужен en_US

Вывод cspell trace "привет" подтверждает: русский словарь не подключён, слово не найдено ни в одном словаре.

Исправляем. Сначала установим словарь:

Дальше, в течении 5-ти минут он находит решение и все заработало.

Ниже привожу инструкцию, сгенеированную им для устранения прболемы на MacOs.

# Добавление русского языка в cspell (Zed editor)

## Проблема

cspell в Zed по умолчанию не включает русский словарь. Пакет `@cspell/dict-ru_ru` не входит в `@cspell/cspell-bundled-dicts`, поэтому даже при указании `"language": "en,ru"` русские слова не распознаются.

## Решение (пошагово)

### 1. Установить пакет русского словаря

```bash
cd ~/Library/Application\ Support/Zed/extensions/work/cspell
npm install @cspell/dict-ru_ru
```

Словарь устанавливается в node_modules расширения cspell для Zed.

### 2. Настроить cspell конфиг

Создать/обновить `~/.cspell.json` (глобальный конфиг для всех проектов):

```json
{
  "language": "en,ru",
  "dictionaryDefinitions": [
    {
      "name": "ru-ru",
      "path": "~/Library/Application Support/Zed/extensions/work/cspell/node_modules/@cspell/dict-ru_ru/ru_ru.trie.gz"
    }
  ],
  "dictionaries": ["ru-ru"]
}
```

### 3. Перезапустить Zed или перезагрузить cspell LSP

## Ключевые моменты

- **Имена словарей**: русский словарь регистрируется как `"ru-ru"` (нижний регистр, дефис). НЕ `"ru-RU"`.
- **Английский**: `Английский bundled и включается автоматически через `"language": "en,ru"`.
- **`import` не работает** для абсолютных путей к небандленным словарям — используй `dictionaryDefinitions` + `dictionaries`.
- **`language`** задаёт локаль для languageSettings, но без `dictionaryDefinitions` словарь не подключится, т.к. он не bundled.
- **Глобальный конфиг**: `~/.cspell.json` — cspell ищет конфиг вверх по дереву директорий.
- **Путь Zed extension**: `~/Library/Application Support/Zed/extensions/work/cspell/node_modules/`
- **cspell-ext.json** словаря находится в `@cspell/dict-ru_ru/cspell-ext.json`, но `import` из конфига его не подхватывает.

## Проверка

```bash
cd ~/Library/Application\ Support/Zed/extensions/work/cspell
node -e "
async function main() {
  const lib = await import('cspell-lib');
  const defaults = await lib.getDefaultBundledSettingsAsync();
  const config = await lib.searchForConfig(process.env.HOME + '/');
  const merged = lib.mergeSettings(defaults, config || {});
  const s = lib.constructSettingsForText(merged, 'привет мир', 'markdown');
  const dict = await lib.getDictionary(s);
  console.log('привет:', dict.has('привет'));  // true
  console.log('мир:', dict.has('мир'));        // true
  console.log('ошибко:', dict.has('ошибко'));  // false
}
main();
"
```

Windows

Процедура почти идентична, но пути другие, плюс есть пара нюансов с оболочками (PowerShell против Git Bash) и с тем, в каком файле лежат настройки в актуальной версии cspell.

Дальше предполагается, что общую идею вы уже поняли из Linux-версии, поэтому здесь акцент на отличиях для Windows.

Предварительные требования

  • Zed с установленным из галереи расширением cspell;
  • Node.js и npm (Zed и так использует их для расширений, поэтому обычно уже стоят).
npm --version

Где лежит расширение на Windows

В Linux это ~/.local/share/zed/extensions/work/cspell, а на Windows

%LOCALAPPDATA%\Zed\extensions\work\cspell

Для пользователя auser полный путь выглядит так:

C:\Users\auser\AppData\Local\Zed\extensions\work\cspell

В примерах ниже используется именно он — подставьте своё имя пользователя.

Шаг 1. Устанавливаем словарь

PowerShell:

cd $env:LOCALAPPDATA\Zed\extensions\work\cspell
npm install @cspell/dict-ru_ru

Git Bash:

cd "$LOCALAPPDATA/Zed/extensions/work/cspell"
npm install @cspell/dict-ru_ru

После выполнения в node_modules\@cspell\dict-ru_ru\ появится файл ru_ru.trie.gz — это и есть словарь.

Шаг 2. Правим конфиг bundled-словарей

Файл cspell-default.json. В актуальной версии cspell (8.19+) этот файл превратился в тонкую обёртку, которая просто импортирует реальные настройки из cspell-default.config.js. Поэтому править нужно именно .config.js.

Полный путь:

node_modules\@cspell\cspell-bundled-dicts\cspell-default.config.js

2.0. Резервная копия (обязательно)

PowerShell:

cd $env:LOCALAPPDATA\Zed\extensions\work\cspell\node_modules\@cspell\cspell-bundled-dicts
Copy-Item cspell-default.config.js cspell-default.config.js.bak

Git Bash:

cd "$LOCALAPPDATA/Zed/extensions/work/cspell/node_modules/@cspell/cspell-bundled-dicts"
cp cspell-default.config.js cspell-default.config.js.bak

2.1. Локаль по умолчанию

-    language: 'en',
+    language: 'en,ru',

2.2. Добавляем словарь в активный список

-    dictionaries: ['companies', 'softwareTerms', 'public-licenses', 'filetypes'],
+    dictionaries: ['companies', 'softwareTerms', 'public-licenses', 'filetypes', 'ru-ru'],

2.3. Подключаем cspell-ext.json русского словаря

В массиве import находим строку с dict-rust и добавляем сразу после неё импорт русского словаря (внимание на подчёркивания — именно _ru_ru):

         '@cspell/dict-rust/cspell-ext.json',
+        '@cspell/dict-ru_ru/cspell-ext.json',
         '@cspell/dict-shell/cspell-ext.json',

Шаг 3. Проверяем, что настройки применились

Самый простой способ убедиться, что правки прочитались, — прямо в Zed открыть cspell-default.config.js и сверить три изменённых блока. Если хочется программно, удобнее всего из Git Bash (PowerShell плохо переваривает многострочные node -e с кавычками):

cd "$LOCALAPPDATA/Zed/extensions/work/cspell" && node --input-type=module -e "import { getDefaultSettings } from 'cspell-lib';
const s = await getDefaultSettings();
console.log('language:', s.language);
console.log('ru-ru active:', (s.dictionaries || []).includes('ru-ru'));
const ru = (s.dictionaryDefinitions || []).find(d => d.name === 'ru-ru');
console.log('ru-ru path:', ru ? ru.path : 'NOT FOUND');"

Ожидаемый вывод (путь приведён для пользователя auser):

language: en,
ruru-ru active: true
ru-ru path: C:\Users\auser\AppData\Local\Zed\extensions\work\cspell\node_modules\@cspell\dict-ru_ru\ru_ru.trie.gz

В PowerShell без Git Bash можно хотя бы убедиться, что строки попали в файл:

cd $env:LOCALAPPDATA\Zed\extensions\work\cspell\node_modules\@cspell\cspell-bundled-dicts
Select-String -Path cspell-default.config.js -Pattern "en,ru","'ru-ru'","dict-ru_ru"

Должны увидеть все три совпадения.

Шаг 4. Перезапускаем Zed

Закройте Zed полностью — не reload через командную палитру, а именно закройте все окна и откройте заново. Нужно, чтобы перезапустился LSP-сервер cspell и подхватил новые настройки.

Откройте markdown-файл с русским текстом. Корректные слова (приветпредложение) подчёркиваться не должны, опечатки (опечятка) — должны.

Нюансы и отличия от MacOS/Linux

  1. Пути. ~/.local/share/zed/... → %LOCALAPPDATA%\Zed\.... В JSON/JS-строках обратные слеши надо экранировать (\\) либо использовать прямые (/) — Windows понимает оба варианта.
  2. Где настройки. В актуальной версии cspell реальные настройки лежат в cspell-default.config.js, а cspell-default.json только импортирует его. Если у вас cspell постарше — правьте cspell-default.json, как в оригинальной статье.
  3. Оболочка. PowerShell и cmd плохо переваривают многострочные команды с кавычками. Для установок и копирований они вполне годятся, а для проверок через node -e удобнее Git Bash. Сами правки конфига можно делать в любом редакторе — хоть в самом Zed.
  4. package.json расширения. npm install сам допишет @cspell/dict-ru_ru в зависимости расширения, поэтому при будущих обновлениях словарь подтянется автоматически и переустанавливать его вручную не нужно. Но: при крупном обновлении самого расширения, когда node_modules пересоздаётся с нуля, правки cspell-default.config.js слетят вместе с .bak-копией. Поэтому полезно держать ещё одну копию правленого файла где-то вне node_modules (например, в D:\backup\cspell-default.config.js) и при апдейте быстро возвращать.
  5. Кодировка. Сохраняйте cspell-default.config.js в UTF-8 без BOM. Zed по умолчанию так и делает, а вот классический Блокнот может добавить BOM, и тогда .js-модуль не загрузится.

vCluster — Виртуальный кластер kubernetes

В общий доступ вышли два видео про технологию создания виртуальных кластеров kubernetes — vcluster.

Первое видео.

Описание проекта.
Настройка и запуск виртуального кластера.

00:00 — Вступление
01:09 — Пример, где это можно использовать
13:13 — Внутреннее устройство vCluster
17:47 — Предварительные требования
21:33 — Конфигурационный файл
32:13 — Запуск vCluster
34:55 — Config файл виртуального сервера
37:12 — Заключение

Второе видео

Примеры настройки.
Синхронизация ресурсов между хост и виртуальными кластерами.

00:00 — Вступление
00:18 — Безопасность
08:23 — Тестовое приложение
13:56 — Синхронизация ресурсов между хост и виртуальным кластерами
15:51 — Синхронизация PVC
21:09 — Использование ingress controller хост кластера в vcluster
27:14 — Заключение

Istio

Начинаем разбираться с Istio.
Теория.
Установка Istio.

00:00 — Вступление
00:46 — Теория
04:40 — Тестовый стенд
12:02 — Теория (продолжаем)
14:54 — Ambient mode
21:43 — Установка тестового приложения
26:19 — Установка istio
32:35 — Доступ к тестовому приложению
37:38 — Заключение

Поддержи канал на Boosty
Тем, кто не верит в boosty можно на ВТБ: 2200 2460 1569 3404

Файлы, используемые в видео.

Это видео на других площадках:

Первое видео для начинающих изучать kubernetes.

Компоненты кластера kubernetes.

Первые 2 видео про Gateway API

Что такое GatewayAPI?
Сравнение с Ingress.
Пример реализации на базе traefik.

Gateway — два https listener и cert-manager.
Всякое разное про TCPRoute.

Цикл видео про OpenLDAP

Начиная с основ. Заканчивая деплоем в kubernetes.

OpenLDAP как обычное приложение на Linux сервере.
Master — Slave, Master — Master, Master — Master — Slave.
OpenLDAP containers.
OpenLDAP helm chart.
OpenLDAP и SSL, Keycloak, Linux users.

Новый цикл видео — Kyverno

На https://boosty.to/bigkaa вышли первые три видео о kyverno.

01 —
Общие сведения о kyverno.
Дружим kyverno и argocd.
Установка kyverno

02 —
Постановка задачи.
Validating rules: patterns and deny.

03 —
Generate и Mutate rules.
Aggregated ClusterRoles
Создание шаблона для содержимого namespace.

Премьера на Youtube, Rutube, VK Video и Telegram, запланирована в Январе 2025.

Понедельник, вторник, среда? Среда передачи данных!

Задача стояла простая – развернуть кубер в закрытом периметре. Для этого в этот самый периметр надо передать используемые контейнеры. Загрузить их в локальное хранилище оных. Банальная операция:

docker save -> ctr image import

Дальше теги, пуши и установка кубера.

И вот… Ставлю это я кубер. Запускается контейнер coredns и отваливается. Запускается и отваливается. Мягко говоря – необычная ситуация. Ясное дело, без внутреннего DNS ничего работать не будет.

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

Линукс, используемый на ноде, импортозамещенный с наворотами по безопасности. Первая мысль – опять что-то ИБ закрутило. Но нет. Там все оказалось в пределах нормы. Но время на проверку потратили много.

Дольше смотрим CNI куба. Первый раз в жизни я по логам containerd и calico отследил процесс от загрузки контейнера до выдачи поду IP адреса. Серьезно прокачал эту тему. Не то что бы что-то новое узнал, но погрузился значительно глубже чем нырял раньше.

В итоге картина: контейнер загружен, под запущен, сетевой интерфейс для пода создан, IPAM IP выделил, маршруты в таблице маршрутизации есть. В кубе это все видно. В Linux это все видно. Но не работает. Curl говорит, что отказано в подключении.

В голову полезли нехорошие мысли: потерял квалификацию, пора на пенсию, придется возвращать гонорар.

Ладно, проведем еще один эксперимент: вместо стандартного coredns, который ставит по умолчанию kubeadm, поставлю его последнюю версию. Закачали образ, намутил манифесты. Установил кубер без coredns по умолчанию. Запустил свой coredns – заработало! Эээ!

И тут я вспомнил – Telegram! В качестве среды передачи контейнера от меня к ним на первом хопе был Telegram. Где-то года полтора назад, мы через телегу перекидывали большой конфиг одного приложения. После подкидывания конфига, приложение тупо не заводилось. Обнаружили, что телега внесла изменения в файл, пока передавала его на ту сторону. Вот так вот.

Проверил контрольную сумму файла контейнера предыдущего coredns на своей машине и на сервере. Оба на! Контрольная сумма не совпадает.

Получается, что containerd запустил контейнер из битого образа! Скорее всего какой-то слой контейнера не того. (Это что получается, в файле контейнера не передаются контрольные суммы слоев?) Все остальные приложения обращаются к containerd, тот уверенно говорит: все Ок! Запущен, работает. Вот вам контейнер ID, работаем! Да уж.

Долго и витеевато матерился. Мораль:

  • — Telegramm не торт.
  • — CRC придумали не просто так.