Что делает kube-api-server в Kubernetes
Что проверяют
Понимаете ли вы, что apiserver это не «веб-морда кластера», а единственная точка записи состояния, и знаете ли, что происходит с запросом внутри. По ответу видно, отлаживали ли вы кластер или только применяли манифесты.
Как отвечать
Скажите главное: apiserver это единственный компонент, который ходит в etcd. Всё остальное, контроллеры, планировщик, kubelet, kubectl, работает только через его REST API. Отсюда следствие: сам по себе он ничего не запускает, он проверяет, записывает и рассылает изменения.
Дальше проведите запрос по конвейеру, это и есть содержательная часть ответа:
- аутентификация: клиентский сертификат, токен сервисного аккаунта, OIDC;
- авторизация: чаще всего RBAC, роли и привязки;
- admission: сначала мутирующие плагины и вебхуки (дефолты, подстановка контейнера рядом), затем валидирующие (квоты, политики);
- проверка схемы объекта и запись в etcd.
Отдельно про подписку: клиенты не опрашивают apiserver, а держат watch и получают поток изменений начиная с указанной версии ресурса. На том же поле построена оптимистичная блокировка: запись устаревшей версии объекта отклоняется конфликтом, и контроллер повторяет попытку.
Полезно добавить эксплуатационное: своего состояния apiserver не держит, поэтому масштабируется горизонтально за балансировщиком, а типичные его беды это медленный etcd, шумные клиенты и лимиты на число запросов в полёте, откуда берутся ответы 429.
Где спотыкаются
Приписывают apiserver чужую работу: «он назначает поды на ноды», «он перезапускает упавшие контейнеры». Планирование за scheduler, перезапуск за kubelet, приведение к желаемому состоянию за контроллерами.
Второе: не различают авторизацию и admission. RBAC отвечает на вопрос, разрешено ли вам такое действие, admission на вопрос, допустим ли сам объект, и запрет привилегированного контейнера живёт именно во втором.
Третье: забывают, что вебхуки admission стоят на пути каждой записи. Недоступный вебхук с политикой отказа блокирует создание объектов во всём кластере, и это одна из самых частых причин ситуации «кластер живой, но ничего не создаётся».