Это локальные диски узлов (local-path-provisioner, том local, TopoLVM), бакеты S3, смонтированные через FUSE драйвером вроде k8s-csi-s3, и распределённые хранилища Longhorn, Ceph и OpenEBS с репликацией между узлами. Локальный том самый быстрый, но привязывает под к узлу через nodeAffinity, а local-path к тому же не ограничивает размер; S3 не даёт POSIX-семантики — ни атомарного rename, ни блокировок между узлами, а новые файлы другой узел видит с задержкой; распределённое хранилище переживает отказ узла ценой сети и сложности эксплуатации. Базы данных держат на локальных дисках с репликацией средствами самой СУБД под управлением оператора, бэкапы — в S3.
Драйвер ставится манифестами выпуска в kube-system, пароль служебной учётной записи — в Secret в отдельном неймспейсе, а StorageClass с provisioner: smb.csi.k8s.io задаёт шару, этот Secret и опции монтирования — vers=3, seal, nobrl, nolease, hard. Модуль ядра cifs монтирует шару один раз на узел и PV и ходит к серверу одной сессией от одной учётной записи, а владельца и режим файлов эмулирует из опций, поэтому 0777 и noperm — антипример; fsGroup пода драйвер превращает в gid. Новые опции и новый пароль действуют только при новом монтировании: тома перемонтируют по одному узлу через cordon, а не rollout restart.
Ставим csi-driver-nfs v4.13.6 манифестами проекта: контроллер в hostNetwork на каждый PVC монтирует экспорт с опциями класса и создаёт в нём подкаталог от root, а node-плагин по команде kubelet монтирует подкаталог в каталог пода без шага attach. В StorageClass задаём subDir с ${pv.metadata.name} для уникальности, reclaimPolicy: Retain, onDelete: archive и одинаковые для всего сервера mountOptions (nfsvers=4.2, hard, nconnect=4): клиент NFS у узла один на все тома, и опции соединения задаёт первое монтирование. Права даёт fsGroup пода с fsGroupChangePolicy: OnRootMismatch при no_root_squash и manage-gids=n на сервере, а шифрование xprtsec=tls требует tlshd на каждом узле и Secret с опциями для удаления томов.
На Ubuntu Server с отдельным XFS-диском оставляем только NFSv4.1 и 4.2, маскируем rpcbind и rpc.statd, выключаем manage-gids, без чего не работает fsGroup, и отдаём /srv/nfs/k8s поимённо трём узлам с rw,sync,secure,no_root_squash,mp, а ufw пускает к порту 2049 только их. no_root_squash нужен csi-driver-nfs, но при sec=sys сервер верит удостоверению из запроса, поды выходят через NAT с адресом узла, а containerd 2 разрешает им порты ниже 1024 — ни адрес, ни secure подов не отсекают. Это делает GlobalNetworkPolicy Calico в отдельном tier с defaultAction: Pass: подам к серверу нельзя, а тома монтирует kubelet из сети узла.
TGT, полученный при входе, обменивается у KDC на билет к SPN службы, а служба проверяет его своим ключом из keytab — пароль больше не нужен. Приложения добираются до Kerberos через GSSAPI и SPNEGO, поэтому так работают SSH (gssapi-with-mic), веб по Negotiate, PostgreSQL и NFS. Службе нужны SPN в каталоге и ключ в доступном ей keytab; TGT на сервер попадает только при делегировании, а клиент Windows делегирует его лишь серверам, доверенным для делегирования.
Ставим realmd, sssd и adcli и выполняем realm join: realmd находит контроллеры по SRV-записям, adcli создаёт учётную запись компьютера LNX1$ и пишет её ключи в /etc/krb5.keytab, а дальше работает sssd — читает пользователей и группы по LDAP с Kerberos, проверяет пароли, раз в 30 дней меняет пароль машины и обновляет её запись в DNS. До вступления нужны полное имя машины, DNS и время с контроллеров. UID вычисляется из SID домена и RID, вход ограничивается realm permit, LDAP-фильтром или правами из GPO, а sudo выдаётся доменной группе файлом в /etc/sudoers.d/.
Туннель IKEv2 терминирует strongSwan на границе сети, а пользователей проверяет NPS: клиент приходит в IKE_AUTH без AUTH, шлюз с auth = eap-radius предъявляет свой сертификат и перекладывает EAP в RADIUS, не зная ни одного пароля. Метод — EAP-MSCHAPv2 без PEAP: обмен уже защищён IKE SA, а NPS проверяет ответ через контроллер по Netlogon за три пары запрос — ответ. Ключи MS-MPPE из Access-Accept становятся последним AUTH, клиент получает адрес из пула и DNS контроллеров, а на Windows подключение создаёт Add-VpnConnection, алгоритмы задаёт Set-VpnConnectionIPsecConfiguration.
Точка доступа становится клиентом RADIUS и держит порт закрытым, пропуская только EAPOL, пока NPS не пришлёт Access-Accept с ключом для PMK и, если нужно, номером VLAN. На машины домена групповой политикой приезжает профиль с PEAP или EAP-TLS и authMode = machineOrUser: компьютер подключается до входа своей учётной записью, пользователь — после входа, и в NPS для этого нужны политики и для Domain Computers, и для Domain Users. Обязательна проверка сертификата сервера по корню и имени, иначе точка-двойник соберёт пароли.
RADIUS — протокол между сетевым оборудованием и сервером проверки: точка доступа, коммутатор или VPN-шлюз шлёт по UDP 1812 Access-Request и получает Access-Accept с атрибутами вроде VLAN, Access-Reject или Access-Challenge с очередным шагом EAP, а пакеты защищают общий секрет и атрибут Message-Authenticator. NPS — реализация RADIUS в Windows Server: он принимает запросы только от зарегистрированных клиентов, проверяет учётные данные по каталогу и решает по двум упорядоченным спискам политик, где побеждает первая подходящая, а несовпавшее ограничение означает отказ. Для Wi-Fi доказательство едет как EAP внутри RADIUS, и при PEAP или EAP-TLS сервер обязан предъявить сертификат, который клиент проверяет.
Под ссылается на PersistentVolumeClaim, контроллер связывает его с подходящим PersistentVolume, а при динамическом выделении провизионер из StorageClass сам создаёт том и PV pvc-<uid> — с WaitForFirstConsumer только после того, как планировщик выбрал узел. Драйвер CSI — программа с gRPC-сервисами Identity, Controller и Node: sidecar-контейнеры переводят события API в CreateVolume, ControllerExpandVolume и CreateSnapshot, kubelet зовёт NodeStageVolume и NodePublishVolume, и каталог тома из /var/lib/kubelet/pods/ bind-монтируется в контейнер. Права на томе выставляет fsGroup пода, если позволяет fsGroupPolicy драйвера.