Рейтинг:2

Почему kube-proxy аутентифицируется на kube-api-сервере, используя учетную запись службы вместо сертификата tls

флаг tn

Я копаюсь в Kubernetes PKI. Я заметил, что в основном все компоненты плоскости управления, включая kubelet, аутентифицируются на API-сервере с использованием сертификатов TLS.
Только kube-proxy и flannel работают как Наборы демонов авторизоваться с помощью сервисной учетной записи. В документации указано:

DaemonSet: поскольку сам kubelet загружается на каждом узле и его достаточно для запуска базовых служб, вы можете запускать kube-proxy и другие специфичные для узла службы не как отдельный процесс, а как набор демонов в пространстве имен kube-system. Поскольку он будет находиться в кластере, вы можете предоставить ему соответствующую учетную запись службы с соответствующими разрешениями для выполнения его действий. Это может быть самый простой способ настройки таких служб.

Что здесь особенного Наборы демонов относительно аутентификации?
В чем смысл "Так как сам kubelet загружается на каждую ноду и его достаточно для запуска базовых сервисов"?

Рейтинг:3
флаг cn

Чтобы лучше разобраться в этом вопросе, стоит напомнить основные Кубернетес-компоненты.

Кубернетес-компоненты

В основном мы можем разделить кластер на:

  • Главный узел: плоскость управления, отвечающая за принятие глобальных решений о кластере.
  • Рабочие узлы — отвечают за запуск модулей, предоставляя среду выполнения Kubernetes.

Рассмотрим компоненты раздела «Узел» (рабочий):

кубелет

Агент, работающий на каждом узел в кластере. Это гарантирует, что контейнеры работают в Стручок. kubelet принимает набор PodSpec, предоставляемых с помощью различных механизмов, и обеспечивает работоспособность контейнеров, описанных в этих PodSpec. Kubelet не управляет контейнерами, которые не были созданы Kubernetes.

kube-прокси

kube-proxy — это сетевой прокси, который работает на каждом узел в вашем кластере, реализуя часть Kubernetes Оказание услуг концепция. kube-прокси поддерживает сетевые правила на узлах. Эти сетевые правила разрешают сетевое взаимодействие с вашими модулями из сетевых сеансов внутри или за пределами вашего кластера. kube-proxy использует уровень фильтрации пакетов операционной системы, если он есть и доступен. В противном случае kube-proxy сам пересылает трафик.

Время выполнения контейнера

Среда выполнения контейнера — это программное обеспечение, отвечающее за запуск контейнеров. Kubernetes поддерживает несколько сред выполнения контейнеров: Докер, контейнерd, ЦРИ-Ои любая реализация Kubernetes CRI (интерфейс времени выполнения контейнера).

Как кубелет и среда выполнения контейнера — это два основных компонента, которые отвечают за запуск модуля и установление соединения с Control Plane, они должны быть установлены непосредственно в ОС узла. значит и для кубелет он должен иметь сертификаты TLS, которые вы упомянули в своем вопросе, для обеспечения безопасного подключения к плоскости управления. Как насчет kube-прокси?

Его можно было установить двумя способами при подготовке кластера — непосредственно на ОС узла (например, этот способ используется в Kubernetes: трудный путь) или как DaemonSet (кубадм).

Когда kube-прокси является установлен напрямую это будет также отдельно сгенерированные сертификаты TLS, как кубелет.

Второй способ - это «DamonSet», упомянутый в вашем вопросе. Это означает, что вместо того, чтобы работать в качестве демона ОС непосредственно на узле, он будет настроен через ДемонСет развертывание, и он будет работать как модуль на каждом узле. Преимущества перед запуском непосредственно в ОС:

  • Используя функции DeamonSet, мы гарантируем, что в случае сбоя этот модуль будет автоматически воссоздан на узле.
  • меньше вмешательства непосредственно в ОС узла — вместо генерации новых парных TLS-сертификатов мы будем просто использовать ServiceAccount

Отвечая на ваш вопрос:

Что особенного в демонсетах относительно аутентификации?

Чтобы лучше понять это, мы можем более глубоко взглянуть на kube-прокси настроен через DaemonSets с использованием кластера, подготовленного с помощью кубадм. На основе Документы Kubernetes:

Сервисный аккаунт для kube-прокси создается в kube-система пространство имен; затем kube-proxy развертывается как DaemonSet:

  • Учетные данные (ca.crt и жетон) в плоскость управления поступают из ServiceAccount
  • Расположение (URL) сервера API берется из ConfigMap
  • kube-прокси ServiceAccount привязан к привилегиям в система: узел-прокси КластерРоле

Есть три точки. Сначала проверим первое:

Учетные данные - секрет

Получите имя учетной записи службы из определения модуля:

kubectl получить daemonset kube-proxy -n kube-system -o yaml
  ...
  serviceAccount: kube-proxy
  serviceAccountName: кубе-прокси
  ...

Как видите, имеет назначен сервисный аккаунт называется kube-прокси:

Давайте проверим это:

kubectl получить sa kube-proxy -n kube-system -o yaml

Вывод:

апиВерсия: v1
тип: ServiceAccount
метаданные:
  Отметка времени создания: "2021-08-16T14:14:56Z"
  имя: kube-прокси
  пространство имен: kube-система
  РесурсВерсия: "259"
  идентификатор: (UID)
секреты:
- имя: kube-proxy-token-2qhph

Как видите, речь идет о секрете с именем куб-прокси-токен-2qhph:

kubectl получить секрет kube-proxy-token-2qhph -n kube-system -o yaml

Вывод:

апиВерсия: v1
данные:
  ca.crt: (КОДИРОВАНИЕ BASE64 CA APISERVER)
  пространство имен: (ПРОСТРАНСТВО ИМЕН В КОДИРОВАНИИ BASE64)
  токен: (ТОКЕН-НОСИТЕЛЬ BASE64, ЗАКОДИРОВАННЫЙ)
вид: Секрет
метаданные:
  аннотации:
    kubernetes.io/service-account.name: kube-proxy
    kubernetes.io/service-account.uid: ...
  Отметка времени создания: "2021-08-16T14:14:56Z"
  имя: kube-proxy-token-2qhph
  пространство имен: kube-система
  РесурсВерсия: "256"
  идентификатор: (UID)
тип: kubernetes.io/service-account-token

Этот секрет содержит:

Созданный секрет содержит общедоступный ЦС сервера API и подписанный веб-токен JSON (JWT).

Мы используем этот токен носителя «JSON Web Token» для проверки запросов:

Учетная запись службы — это автоматически включенный аутентификатор, который использует подписанные токены носителя для проверки запросов.

Подписанный JWT можно использовать в качестве маркера носителя для аутентификации в качестве данной учетной записи службы. Видеть выше для того, как токен включается в запрос. Обычно эти секреты монтируются в модули для внутрикластерного доступа к серверу API, но их можно использовать и за пределами кластера.

Для получения дополнительной информации о токенах начальной загрузки я бы рекомендовал прочитать следующие документы Kubernetes: Аутентификация с помощью токенов Bootstrap, токен kubeadm и Kubernetes RBAC 101: аутентификация.

Карта конфигурации

Выполнив те же шаги, что и для получения имени ServiceAccount, мы получим имя ConfigMap, которое смонтировано на kube-прокси стручок:

kubectl получить daemonset kube-proxy -n kube-system -o yaml
...
тома:
      - карта конфигурации:
          дефолтмоде: 420
          имя: kube-прокси
 ...

Теперь давайте получим определение ConfigMap:

kubectl получить cm kube-proxy -n kube-system -o yaml
  kubeconfig.conf: |-
    апиВерсия: v1
    вид: Конфигурация
    кластеры:
    - кластер:
        центр сертификации: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        сервер: https://10.230.0.12:6443
      имя: по умолчанию
    контексты:
    - контекст:
        кластер: по умолчанию
        пространство имен: по умолчанию
        пользователь: по умолчанию
      имя: по умолчанию
    текущий контекст: по умолчанию
    пользователи:
    - имя: по умолчанию
      пользователь:
        tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token

Этот IP-адрес в сервер: это адрес API, поэтому kube-прокси знает его и может с ним общаться. Имеются также ссылки на ca.rt и жетон которые монтируются из куб-прокси-токен-2qhph секрет.

КластерРоле

Давайте проверим ранее упомянутую ClusterRole — система: узел-прокси:

kubectl описывает систему кластерных ролей: узел-прокси
Имя: система: узел-прокси
Ярлыки: kubernetes.io/bootstrapping=rbac-defaults
Аннотации: rbac.authorization.kubernetes.io/autoupdate: true
Правило политики:
  Ресурсы URL-адреса, не относящиеся к ресурсам Имена ресурсов Глаголы
  ------------------------ ------------------ -------------- -----
  события [] [] [создать обновление патча]
  events.events.k8s.io [] [] [создать обновление патча]
  узлы [] [] [получить список просмотра]
  конечные точки [] [] [список просмотра]
  услуги [] [] [список просмотра]
  endpointslices.discovery.k8s.io [] [] [список просмотра]

Мы можем, чтобы эта роль могла перечислять и отслеживать конечные точки узла, конечные точки, службы и т. д.

Описывая ClusterRoleBinding kubeadm:узел-прокси мы можем подтвердить эту роль система: узел-прокси используется kube-прокси Сервисный аккаунт:

kubectl описывает привязку кластерной роли kubeadm:node-proxyer
Имя: kubeadm: узел-прокси
Ярлыки: <нет>
Аннотации: <нет>
Роль:
  Вид: ClusterRole
  Имя: система: узел-прокси
Предметы:
  Пространство имен видов
  ---- ---- ---------
  ServiceAccount kube-proxy kube-system

Для получения более подробной информации я бы рекомендовал прочитать кубадм детали реализации.

Отвечая на ваш второй вопрос:

В чем смысл "Так как сам kubelet загружается на каждую ноду, и этого достаточно для запуска базовых сервисов" ?

Это просто означает, что узел установил соединение с Control Plane (как кубелет компонент, отвечающий за это), так что Control Plane может начать планировать kube-прокси pod на узле с помощью предопределенной среды выполнения контейнера.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.