Философия kubectl: контексты, конфигурация и анатомия запроса
Философия kubectl: контексты, конфигурация и анатомия запроса
Вы набираете в терминале kubectl get pods, нажимаете Enter, и перед вами появляется список запущенных контейнеров. Кажется, что вы напрямую управляете кластером. Но вот первый инсайт уровня Senior: утилита kubectl абсолютно ничего не знает о Kubernetes.
В ней нет сложной логики оркестрации, она не управляет контейнерами и не знает, что такое Pod. По своей сути kubectl — это просто очень умная обертка над утилитой curl. Это REST-клиент, чья единственная задача — перевести вашу человекочитаемую команду в HTTP-запрос, отправить его в kube-apiserver (о котором мы говорили в первом курсе) и красиво отформатировать полученный JSON-ответ.
Чтобы стать профессионалом в отладке, нужно перестать воспринимать kubectl как «черный ящик» и научиться видеть, что именно он отправляет по сети.
Анатомия ~/.kube/config: Как клиент находит дорогу
Поскольку kubectl — это лишь HTTP-клиент, для работы ему нужны две базовые вещи: куда отправлять запрос (адрес сервера) и как представиться (сертификаты или токены).
Все эти данные хранятся в конфигурационном файле, который по умолчанию ищется по пути ~/.kube/config. Этот файл часто называют просто kubeconfig.
Файл состоит из трех главных сущностей, которые собираются в единую картину:
- Clusters (Кластеры) — это физические эндпоинты
kube-apiserver. Здесь хранится URL сервера и корневой сертификат (CA), чтобы клиент понимал, что общается с настоящим сервером, а не с подделкой. - Users (Пользователи) — это ваши учетные данные. Kubernetes не имеет собственной базы пользователей, поэтому здесь хранятся клиентские TLS-сертификаты, токены (Bearer Token) или настройки интеграции с внешними провайдерами (OIDC, AWS IAM).
- Contexts (Контексты) — это клей. Контекст жестко связывает один Кластер и одного Пользователя. Опционально он задает Namespace по умолчанию.
Контекст — это ответ на вопрос: «К какому кластеру я сейчас обращаюсь и под чьим именем я это делаю?»
Как это выглядит в YAML
Давайте заглянем внутрь типичного ~/.kube/config:
apiVersion: v1
kind: Config
current-context: prod-admin-context # Указывает, какой контекст активен прямо сейчас
clusters:
- name: production-cluster
cluster:
server: https://10.100.0.1:6443
certificate-authority-data: LS0tLS1C... # Урезанный base64 сертификата CA
users:
- name: admin-user
user:
client-certificate-data: LS0tLS1C... # Сертификат пользователя
client-key-data: LS0tLS1C... # Приватный ключ пользователя
contexts:
- name: prod-admin-context
context:
cluster: production-cluster
user: admin-user
namespace: kube-system # Все команды без ключа -n полетят сюда
Обратите внимание на поле current-context. В крупных компаниях у вас в одном файле будут описаны десятки кластеров (dev, stage, prod) и разные пользователи. Переключение между ними — это просто смена активного контекста.
Практика: Управление контекстами
Ошибиться контекстом и удалить базу данных в Production вместо Dev-среды — классическая ошибка новичка. Чтобы этого избежать, используйте базовые команды интроспекции:
kubectl config view— выведет содержимое вашего kubeconfig (скрыв сами секреты и сертификаты).kubectl config get-contexts— покажет таблицу всех доступных контекстов. Звездочкой*будет отмечен текущий.kubectl config use-context <имя>— переключит вас на другой контекст.kubectl config set-context --current --namespace=monitoring— закрепит за текущим контекстом дефолтный неймспейс, чтобы не писать-n monitoringв каждой команде.
Рентген запроса: уровни детализации (Verbosity)
Если kubectl — это просто генератор HTTP-запросов, мы можем заставить его показать нам эти запросы. Для этого используется флаг -v (verbosity) с указанием уровня детализации от 0 до 9.
Это мощнейший инструмент отладки. Если команда зависает или выдает неочевидную ошибку, повышение уровня детализации покажет, на каком этапе сети происходит сбой.
| Уровень | Что показывает | Когда использовать |
|---|---|---|
-v=6 |
URL запроса и HTTP-статус ответа | Чтобы понять, к какому именно API-эндпоинту обращается команда (полезно при изучении структуры API). |
-v=7 |
+ HTTP-заголовки (Headers) запроса | Проверка, правильный ли токен авторизации отправляется на сервер. |
-v=8 |
+ Тело запроса (Body) и ответа в JSON | Глубокий дебаг. Вы увидите сырой JSON, который возвращает apiserver до того, как kubectl превратит его в таблицу. |
-v=9 |
+ Эквивалентная команда curl |
Если вам нужно скопировать запрос и выполнить его с сервера, где нет kubectl. |
Попробуйте выполнить в своем терминале:
kubectl get pods -v=8
Вы увидите, что вместо магии происходит банальный GET https://<ip>:6443/api/v1/namespaces/default/pods. Компонент kube-apiserver (проверяющий AuthN/AuthZ, как мы учили во втором курсе) возвращает массив JSON-объектов, а kubectl просто рисует из них колонки NAME, READY, STATUS.
Типичные ошибки и их диагностика
Понимание того, как kubectl читает конфиг и отправляет запросы, позволяет мгновенно диагностировать ошибки подключения.
1. Ошибка: The connection to the server localhost:8080 was refused Это самая частая ошибка. Она означает одно из двух:
- У вас нет файла
~/.kube/config(или переменная окруженияKUBECONFIGуказывает в пустоту). Не найдя конфига,kubectlпо умолчанию пытается постучаться наhttp://localhost:8080, где, естественно, никого нет. - Конфиг есть, в нем прописан
localhost:8080, но локальный кластер (например, minikube или kind) не запущен.
2. Ошибка: error: You must be logged in to the server (Unauthorized)
Сетевое соединение установлено, kube-apiserver ответил, но на этапе Authentication (AuthN) ваш запрос был отклонен (HTTP 401).
Решение: Проверьте блок users в вашем контексте. Срок действия сертификата истек, либо токен отозван.
3. Ошибка: Unable to connect to the server: x509: certificate signed by unknown authority
Вы пытаетесь подключиться к серверу по HTTPS, но kubectl не доверяет сертификату сервера.
Решение: В блоке clusters неверно указан certificate-authority-data. Клиент не может криптографически подтвердить, что сервер подлинный.
В следующих главах мы перейдем от устройства самой утилиты к эффективной работе с данными: научимся фильтровать огромные простыни JSON-ответов с помощью JSONPath и кастомных колонок, не прибегая к внешним утилитам вроде grep или awk.