Модуль ActiveDirectory говорит с контроллером не по LDAP, а через службу ADWS на порту 9389, которая сама выполняет обычный LDAP-поиск. Один объект находят по -Identity (sAMAccountName, DN, GUID или SID), несколько — по -Filter, который модуль переводит в LDAP-фильтр и выполняет на сервере. Атрибуты перечисляют в -Properties, а не берут *, и пишущие скрипты фиксируют один контроллер через -Server.
Pod — минимальная единица, которую Kubernetes планирует и запускает: не один контейнер, а группа контейнеров с общим IP-адресом, общими томами и общей судьбой на одном узле. Общие namespaces держит служебный контейнер pause, поэтому перезапуск любого контейнера не меняет адрес пода. kubelet запускает init-контейнеры по одному, затем sidecar-ы (init с restartPolicy: Always) и основные контейнеры, следит за ними через probes, а при удалении даёт terminationGracePeriodSeconds на завершение по SIGTERM.
Время в домене идёт по иерархии: члены домена берут его у контроллеров, контроллеры — у PDC-эмулятора, и только PDC-эмулятор корневого домена леса синхронизируется с внешним источником, который ему назначает администратор (w32tm /config /manualpeerlist). Ответы контроллеров подписаны по MS-SNTP паролем учётной записи компьютера, поэтому член домена не возьмёт время у постороннего NTP-сервера. Расхождение часов больше пяти минут ломает Kerberos и репликацию.
Образ — дерево JSON-документов и слоёв, которые ссылаются друг на друга по дайджесту, поэтому тег можно перезаписать, а дайджест — нет. Приложение hello на Go собираем многоэтапным Dockerfile через docker buildx build под amd64 и arm64 на базе distroless, без shell и не от root, и отправляем с --push в частный GitHub Container Registry. Узлам даём токен только на чтение через Secret типа kubernetes.io/dockerconfigjson, привязанный к ServiceAccount через imagePullSecrets, а в манифестах пишем теги версий или дайджесты, но не latest.
RODC — контроллер для филиала: он выдаёт билеты Kerberos, отвечает на LDAP и работает DNS-сервером, но записи отсылает на записываемый контроллер и сам ничего не реплицирует. Хешей паролей он по умолчанию не хранит: кешируются только учётные записи из разрешённого списка политики репликации паролей (PRP), остальных проверяет контроллер в офисе. TGT он шифрует ключом собственной учётной записи krbtgt_, поэтому украденный RODC не открывает ни других сайтов, ни чужих привилегий.
На трёх машинах Ubuntu 26.04 выключаем swap, включаем net.ipv4.ip_forward, ставим containerd с SystemdCgroup = true и пакеты kubeadm, kubelet и kubectl версии 1.36. На мастере kubeadm init --config kubeadm-config.yaml за минуту выпускает сертификаты, пишет kubeconfig и манифесты статических подов, затем ставим Calico через оператор Tigera, а рабочие узлы подключаем kubeadm join. Самое важное решение — отдельное имя API k8s-api.example.com в controlPlaneEndpoint: без него кластер потом не превратить в отказоустойчивый.
В прошлой статье мы подняли сервер Xray с VLESS, XTLS Vision и REALITY и настроили клиент v2rayN на Windows. Здесь — то же для Android. Телефон чаще остальных устройств ходит по чужим сетям: мобильный интернет, Wi-Fi в кафе, роуминг, — и именно на нём прокси нужнее всего.
В статье: как устроен VPN в Android и почему он в системе один; что находится внутри приложения v2rayNG; как установить его с проверкой подписи; как выдать телефону отдельный ключ и ввести его QR-кодом; какие настройки стоит поменять и почему — IPv6, routeOnly, DNS, обход локальной сети; как устроена маршрутизация и что делать с правилами, подписанными по-китайски; как проверить результат по журналу сервера и какие подводные камни ждут при переключении между VPN и между сетями.
Сервер и протоколы здесь заново не разбираются: они описаны в предыдущей статье, а про DNS, TCP, UDP и TLS есть части серии «Сети для самых маленьких». Нужное для понимания повторяется в одну-две фразы.
Каждый контроллер принимает изменения сам и передаёт партнёрам только изменившиеся атрибуты: изменение помечено USN и invocationID контроллера, где оно родилось, а вектор актуальности не даёт получить одно изменение дважды. Конфликт решает версия атрибута, затем метка времени. Соединения между контроллерами строит KCC; внутри сайта репликация идёт по уведомлению через 15 секунд, между сайтами — по расписанию связи сайтов, а проверяют её repadmin /replsummary и /showrepl.
Каждый объект — документ с полями apiVersion, kind, metadata, spec и status; kube-apiserver хранит его в etcd и отдаёт по пути вида /apis/apps/v1/namespaces/default/deployments/web. Запрос проходит аутентификацию, авторизацию, admission и проверку схемы, а запись сверяет resourceVersion и при расхождении отвечает 409 Conflict, чтобы клиенты не затирали чужие правки. Контроллеры не опрашивают API, а подписываются на изменения через watch, удаление идёт через финализаторы, а server-side apply ведёт учёт, кто каким полем владеет.
На сервере Windows создаётся область для префикса /64 (Add-DhcpServerv6Scope) с опциями DNS; адреса сервер выдаёт случайно из всего префикса, а резервирует по DUID и IAID вместо MAC. Клиенты придут к нему, только если роутер поднял в Router Advertisement флаг M или O, а шлюз всё равно приходит от роутера: DHCPv6 лишь дополняет RA. Failover для IPv6 нет — два сервера просто держат одинаковую область.