Как добавить домен в сертификат k3s

Вопрос или проблема

При попытке получить доступ к кластеру Kubernetes k3s, который работает на другой машине, я получаю следующее сообщение об ошибке:

E0204 19:13:27.185678    8066 proxy_server.go:147]
Ошибка при проксировании запроса:
  tls: не удалось проверить сертификат:
    x509: сертификат действителен для kubernetes, kubernetes.default,
    kubernetes.default.svc, kubernetes.default.svc.cluster.local,
    localhost, node1, не node1.lan

node1 — это имя хоста машины, служащей главным узлом в кластере k3s. Однако хосты в моей локальной сети имеют суффикс .lan, поэтому node1 доступен по адресу node1.lan.

Я полагаю, что получаю вышеупомянутую ошибку, так как сертификат, сгенерированный k3s, не включает node1.lan. Я хотел бы изменить/заменить сертификат на такой, который также включает node1.lan.

Я уже пробовал инструкции, задокументированные на сайте k8s. Однако, так как я использую k3s, а не k8s, некоторые детали отличаются.

Я довольно неопытен в k8s, поэтому буду признателен за любые советы.

Сообщение об ошибке указывает на то, что сертификат, представленный кластером k3s, недействителен для доменного имени node1.lan. Это, вероятно, потому что сертификат был сгенерирован для другого доменного имени, такого как kubernetes.default.svc. Поскольку имя субъекта в сертификате кластера Kubernetes, который вы хотите мониторить, отличается от конечной точки, установленной в конфигурации цели Kubernetes.

Укажите IP-адрес в kube config, и это работает нормально, следуйте этому блогу от Micro Focus для получения более подробной информации.

Обходное решение:1

Ротация сертификатов с пользовательским ЦС помогает добавить домен к k3s сертификатам.

Как указано в документации от K3s

  • Чтобы выполнить ротацию сертификатов пользовательского ЦС, используйте подкоманду к3s certificate rotate-ca. Обновленные файлы должны быть подготовлены во временной директории, загружены в хранилище данных, и k3s должен быть перезапущен на всех узлах, чтобы использовать обновленные сертификаты.
  • Сделав это, будут сгенерированы все сертификаты кластера, включая серверные сертификаты с новыми доменами.
  • Для полного управления сертификатами по всему кластеру используйте ротацию пользовательского ЦС.

Обходное решение:2

Чтобы добавить домен к сертификату k3s, выполните следующие шаги:

  • Создайте новый сертификат, включающий дополнительные домены
  • Создайте запрос на подписание сертификата (CSR) и отредактируйте CSR для включения доменного имени.
  • Отправьте этот Запрос на Подписание Сертификата (ЗПС) в Удостоверяющий Центр k3s для его подписания
  • Перезапустите службу k3s на всех узлах, чтобы получить доступ к кластеру Kubernetes k3s без получения сообщения об ошибке

См. Setting up your own K3S home cluster BY BAS BREMER для получения дополнительной информации.

Я также долгое время сталкивался с этой проблемой, однако, думаю, нашел правильный способ ее решения в k3s.

Наивное решение

Долгое время я просто выполнял все команды kubectl с --insecure-skip-tls-verify, что работало нормально, но со временем стало раздражать (и небезопасно).

Правильное решение

Что наконец решило мою проблему с доступом к кластеру k3s из другого домена/машины, так это запуск команды k3s server с флагом --tls-san <доменное имя>, как это задокументировано здесь https://docs.k3s.io/cli/server.

Чтобы сделать это постоянным, домен можно добавить либо в файл конфигурации k3s, либо в сервис systemd/openrc k3s, в зависимости от системы, которую вы используете.

Я использую Alpine Linux и openrc, это означает, что я должен был сначала остановить службу k3s с командой rc-service k3s stop, затем изменить файл службы в /etc/init.d/k3s и изменить command_args="server" на command_args="server --tls-san <домен> перед тем как снова запустить службу с командой rc-service k3s start.

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

Вот так в итоге выглядел мой файл службы k3s openrc:

#!/sbin/openrc-run

depend() {
    after network-online
    want cgroups
}

start_pre() {
    rm -f /tmp/k3s.*
}

supervisor=supervise-daemon
name=k3s
command="/usr/local/bin/k3s"

# Это строка, которую я изменил
command_args="server --tls-san <домен> \
    >>/var/log/k3s.log 2>&1"

output_log=/var/log/k3s.log
error_log=/var/log/k3s.log

pidfile="/var/run/k3s.pid"
respawn_delay=5
respawn_max=0

set -o allexport
if [ -f /etc/environment ]; then . /etc/environment; fi
if [ -f /etc/rancher/k3s/k3s.env ]; then . /etc/rancher/k3s/k3s.env; fi
set +o allexport

Где <домен> — это домен, на который жалуется kubectl при выполнении любой команды kubectl по отношению к кластеру.

Лучше решение, вероятно, это изменить файл конфигурации k3s по умолчанию с путем /etc/rancher/k3s/config.yaml. Пример из документации:

write-kubeconfig-mode: "0644"
tls-san:
  - "foo.local"
node-label:
  - "foo=bar"
  - "something=amazing"
cluster-init: true

Если вы используете систему с systemd, путь по умолчанию к службе k3s должен быть /etc/systemd/system и должна быть строка с ExecStart=k3s server под [service] (это не было проверено). Чтобы запустить и остановить службу используйте sudo systemctl stop k3s и sudo systemctl start k3s

Надеюсь, это поможет!

Вот мое решение проблемы:

  1. Выполните kubectl edit secrets -n kube-system k3s-serving, создайте запись под metadata.annotations: listener.cattle.io/cn-x.x.x.x: x.x.x.x, что означает добавление IP-адреса или доменного имени x.x.x.x в TLS SAN.
  2. Выполните k3s certificate rotate для регенерации TLS сертификата.
  3. Выполните systemctl restart k3s, чтобы перезапустить k3s.

Должно помочь.

.

Ответ или решение

Для решения проблемы добавления домена в сертификат k3s, необходимо провести комплекс действий, которые требуют понимания работы с системами контейнеризации и управления сертификатами. В вашем случае, проблема заключается в том, что сертификат k3s не включает домен node1.lan, что приводит к ошибке валидации сертификата. Рассмотрим несколько способов решения данной проблемы, опираясь на лучшие практики и возможности, предоставляемые k3s.

Теория

Сертификаты в Kubernetes, включая k3s, создаются с некоторым набором Subject Alternative Names (SANs), которые являются допустимыми доменными именами для данного сертификата. Если вы пытаетесь подключиться к узлу по имени, не включенному в SAN, соединение может быть отклонено по причине недействительности сертификата для указанного имени.

Пример

Предположим, у вас есть мастер-узел в k3s-кластере с именем node1, и, пытаясь обратиться к нему под названием node1.lan, вы получаете ошибку, связанную с TLS-сертификатом. Это случается, если node1.lan не был включен в SAN при генерации сертификатов. Чтобы исправить ситуацию, вам нужно так или иначе добавить этот домен в список допустимых имен.

Применение

Способ 1: Использование --tls-san

  1. Перезапуск k3s с параметром --tls-san: Встроенная опция для k3s позволяет вам добавить дополнительные имена в SANs при запуске демона. Используйте флаг --tls-san для указания нового домена. Это можно сделать двумя способами:

    • Через конфигурационный файл: Создайте или отредактируйте файл конфигурации /etc/rancher/k3s/config.yaml, добавив секцию tls-san:
      tls-san:
      - "node1.lan"
    • Через командную строку: Если вы используете OpenRC, отредактируйте файл /etc/init.d/k3s, изменив строку command_args="server" на command_args="server --tls-san node1.lan". Для systemd отредактируйте конфигурацию сервиса и добавьте --tls-san node1.lan к строке ExecStart.
  2. Перезапустите сервис k3s: Выполните команду sudo systemctl restart k3s или, если используете OpenRC, sudo rc-service k3s restart для применения изменений.

Способ 2: Переоформление сертификатов с пользовательским CA

  1. Создание нового CA и сертификатов:

    • Подготовьте новый центр сертификации, который будет включать необходимые домены. Это можно сделать с помощью инструментов, таких как openssl или cfssl.
    • Сгенерируйте новый сертификат с обновленным списком SAN, включая node1.lan.
  2. Замена текущих сертификатов:

    • Поместите новые сертификаты в временный каталог и используйте k3s certificate rotate-ca для загрузки новых сертификатов в кластер.
  3. Перезапустите все узлы k3s: Это необходимо для применения новых сертификатов ко всей инфраструктуре кластера.

Способ 3: Ручная правка сертификата

  1. Редактирование TLS-секрета:

    • Используйте команду kubectl edit secrets -n kube-system k3s-serving и добавьте ваш домен node1.lan в секцию SANs.
  2. Ротация сертификатов:

    • Выполните команду k3s certificate rotate, чтобы перегенерировать сертификаты с новыми параметрами.
  3. Перезагрузка сервиса:

    • Перезапустите k3s, чтобы изменения вступили в силу.

Заключение

Вышеописанные методы предоставляют гибкость в управлении сертификатами для k3s, позволяя вам легко адаптироваться под различные сетевые конфигурации. Правильная настройка сертификатов не только позволит избежать ошибок типа "certificate is not valid for the name", но и повысит общую безопасность и надежность вашего кластера. Выбор конкретного способа зависит от ваших предпочтений, требований к безопасности и инфраструктуры.

Оцените материал
Добавить комментарий

Капча загружается...