OpenSSH Server в Windows Server 2025 уже установлен: его запускают (Start-Service sshd, Set-Service sshd -StartupType Automatic) и добавляют профиль Domain в правило файрвола для порта 22, которое создано только для Private. Входить могут Administrators и члены встроенной группы OpenSSH Users, а ключи администраторов лежат в общем C:\ProgramData\ssh\administrators_authorized_keys, доступном только SYSTEM и Administrators. PowerShell делают оболочкой параметром реестра DefaultShell, вход по Kerberos включают через GSSAPI, а PowerShell 7 умеет Remoting поверх SSH с -HostName.
ConfigMap хранит настройки парами «ключ — значение»; Secret устроен так же, но его значения записаны в base64, тома с ним kubelet держит в tmpfs, а чтение ограничивает RBAC. В под оба попадают переменными окружения или файлами тома: файлы kubelet обновляет при изменении объекта атомарной подменой ссылки ..data, а переменные и файлы через subPath не меняются до перезапуска контейнера. base64 — не шифрование: в etcd секреты лежат открытым текстом, пока не включено шифрование при хранении через EncryptionConfiguration.
Неймспейс — область уникальности имён и граница для API: в нём действуют права RBAC, квоты, LimitRange и сетевые политики, но сеть, узлы и DNS он сам по себе не изолирует, а удаляется через финализатор kubernetes, когда контроллер вычистит содержимое. Метки — пары «ключ — значение» для отбора: по селекторам matchLabels и matchExpressions контроллеры находят свои поды, а kubectl -l фильтрует объекты на стороне API-сервера. Аннотации хранят данные, по которым не выбирают: причину изменения, хеш коммита, настройки внешних контроллеров.
requests — то, что контейнеру гарантировано: по их сумме планировщик решает, поместится ли под в allocatable узла, а request CPU становится весом cpu.weight. limits — потолок: лимит CPU превращается в квоту cpu.max, за которой потоки замораживаются до конца периода (throttling), лимит памяти — в memory.max, за которым ядро убивает контейнер (OOMKilled). По requests и limits под получает класс QoS — Guaranteed, Burstable или BestEffort, — от которого зависят oom_score_adj и порядок выселения при нехватке памяти.
Job создаёт поды с restartPolicyNever или OnFailure и считает успешные завершения: completions — сколько успехов нужно, parallelism — сколько подов работают одновременно, backoffLimit — сколько неудач допустимо до Failed. В режиме Indexed каждый под получает свой номер в JOB_COMPLETION_INDEX. CronJob создаёт такие Job по расписанию cron в часовом поясе timeZone, concurrencyPolicy: Forbid не пускает второй запуск поверх первого, а задания должны быть идемпотентными: Job может быть создан дважды.
На рабочую станцию ставят RSAT — компоненты по требованию Rsat.* через Add-WindowsCapability, — и модули, оснастки и утилиты оттуда ходят на серверы разными путями. ActiveDirectory обращается к ADWS на 9389, модули из CDXML вроде DnsServer с -CimSession — к CIM поверх WinRM, а их -ComputerName, Get-WinEvent и оснастки MMC — по RPC, для которого часть правил файрвола на сервере по умолчанию выключена. Недостающий модуль импортируют с сервера неявным remoting — тем же механизмом PowerShell 7 загружает модули, несовместимые с ним.
StatefulSet закрепляет за каждым подом номер: имя web-1, DNS-имя через headless-сервис и свою заявку на том из volumeClaimTemplates, которая после пересоздания возвращается к тому же номеру; поды создаются и обновляются по одному, и под с данным именем существует не больше одного. DaemonSet держит ровно по одному поду на каждом подходящем узле: привязывает под к узлу через node affinity и сам добавляет tolerations на taints узла. Репликацию и выбор лидера ни тот ни другой не делают — это дело приложения или оператора.
WinRM — реализация стандарта WS-Management: клиент шлёт SOAP-запросы POST /wsman на порт 5985 или 5986, а PowerShell Remoting — ресурс, внутри которого ездит протокол PSRP с сериализованными объектами. В домене аутентификация идёт по Kerberos, и тело шифруется ключом сеанса даже по HTTP; без Kerberos клиент требует HTTPS или TrustedHosts. Объекты из сеанса приходят десериализованными, без методов, а на сервере каждый сеанс живёт в своём wsmprovhost.exe.
ReplicaSet следит, чтобы подов по его шаблону было ровно replicas: недостающие создаёт, лишние удаляет. Deployment отвечает за версии: каждое изменение шаблона пода — новый ReplicaSet с меткой pod-template-hash, и контроллер переносит реплики со старого на новый в рамках maxSurge и maxUnavailable, делая следующий шаг только когда новые поды стали доступными по readiness probe и minReadySeconds. Старые ReplicaSet-ы с нулём реплик остаются историей, по которой работает kubectl rollout undo.
Модуль ActiveDirectory говорит с контроллером не по LDAP, а через службу ADWS на порту 9389, которая сама выполняет обычный LDAP-поиск. Один объект находят по -Identity (sAMAccountName, DN, GUID или SID), несколько — по -Filter, который модуль переводит в LDAP-фильтр и выполняет на сервере. Атрибуты перечисляют в -Properties, а не берут *, и пишущие скрипты фиксируют один контроллер через -Server.