Перейти к основному содержимому
Обновляем системные сертификаты

Обновляем системные сертификаты

Чтобы компоненты Kubernetes нормально "общались" друг с другом, им нужны свежие сертификаты. Обычно они сами обновляются каждые 30 дней. Но если что-то пошло не так, ты можешь взять дело в свои руки и обновить их самостоятельно через панель управления.

Следи за процессом обновления в логах кластера, там всё отображается.

Каждое обновление сертификатов меняет kubeconfig-файл, так что тебе придется подключаться к кластеру заново. Чтобы избежать этого, можешь настроить обновление через ServiceAccount Token — и вот как.

подсказка

А вы знали?

Все данные в секретах Kubernetes хранятся в формате base64, что позволяет их безопасно передавать и хранить.

И как это выглядит?
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64 кодировка строки "admin"
password: aHR0cHM6Ly9maWxlcy52c2NhbGUuaW8vYmxvZy9hY3Rpdml0eS8zMzAxLmpwZWc= # base64 кодировка супер-сложного мега-пароля

Что делать, если возникли ошибки

Если во время автообновления сертификатов возникает ошибка ROTATE CERTS = ERROR, не беда! Можно попробовать обновить их вручную через панель управления:

  1. Заходишь в панель управления и выбираешь раздел Managed Kubernetes.
  2. Открываешь страницу своего кластера.
  3. В разделе Сертификаты жмешь Обновить.
  4. После обновления заново подключаешься к кластеру.

Как настроить автообновление сертификатов через ServiceAccount Token

ServiceAccount Token помогает авторизоваться в Kubernetes API, благодаря чему тебе не придется каждый раз обновлять kubeconfig-файл после смены сертификатов.

В зависимости от версии Kubernetes процесс немного различается:

Если у тебя Kubernetes 1.23 или старше

Следуй этим шагам:

  1. Сначала создай ServiceAccount командой:

    kubectl -n kube-system create serviceaccount <serviceaccount_name>

    Замени <serviceaccount_name> на имя твоего сервисного аккаунта.

  2. Теперь нужно создать ClusterRoleBinding и дать новому пользователю админские права:

    kubectl create clusterrolebinding <clusterrolebinding_name> --clusterrole=cluster-admin --serviceaccount=kube-system:<serviceaccount_name>

    Вместо <clusterrolebinding_name> подставь имя для группы нового пользователя.

  3. Запиши в переменную окружения TOKENNAME имя секрета, созданного для ServiceAccount, где и хранится токен:

    export TOKENNAME=$(kubectl -n kube-system get serviceaccount/<serviceaccount_name> -o jsonpath='{.secrets[0].name}')
  4. Теперь в TOKEN запиши декодированный токен:

    export TOKEN=$(kubectl -n kube-system get secret $TOKENNAME -o jsonpath='{.data.token}' | base64 --decode)
  5. Проверь, всё ли работает: отправь запрос в Kubernetes API, используя токен:

    curl -k -H 'Authorization: Bearer $TOKEN' -X GET 'https://<kube_api_ip>:6443/api/v1/nodes' | json_pp

    <kube_api_ip> — это IP-адрес твоего кластера.

  6. Добавь ServiceAccount в kubeconfig-файл:

    kubectl config set-credentials <serviceaccount_name> --token=$TOKEN
  7. Переключи контекст:

    kubectl config set-context --current --user=<serviceaccount_name>
  8. Проверь, что всё ок: сделай запрос в Kubernetes API, например, получи список нод кластера:

    kubectl get nodes
  9. Обновленный kubeconfig-файл найдешь в директории $HOME/.kube/config.

Если у тебя Kubernetes 1.24 или новее

Сделай следующее:

  1. Создай ServiceAccount:

    kubectl -n kube-system create serviceaccount <serviceaccount_name>

    Подставь имя твоего сервисного аккаунта вместо <serviceaccount_name>.

  2. Создай ClusterRoleBinding и дай новому пользователю админские права:

    kubectl create clusterrolebinding <clusterrolebinding_name> --clusterrole=cluster-admin --serviceaccount=kube-system:<serviceaccount_name>

    Вместо <clusterrolebinding_name> укажи имя для группы нового пользователя.

  3. Получи имя секрета для ServiceAccount, где хранится токен:

    kubectl -n kube-system apply -f - <<EOF
    apiVersion: v1
    kind: Secret
    metadata:
    name: <serviceaccount_name>-token
    annotations:
    kubernetes.io/service-account.name: <serviceaccount_name>
    type: kubernetes.io/service-account-token
    EOF
  4. Запиши декодированный токен в переменную окружения TOKEN:

    export TOKEN=$(kubectl -n kube-system get secret <serviceaccount_name>-token -o jsonpath='{.data.token}' | base64 --decode)
  5. Проверь, работает ли всё: отправь запрос в Kubernetes API с токеном:

    curl -k -H 'Authorization: Bearer $TOKEN' -X GET 'https://<kube_api_ip>:6443/api/v1/nodes' | json_pp

    Укажи IP-адрес твоего кластера вместо <kube_api_ip>.

  6. Добавь ServiceAccount в kubeconfig-файл:

    kubectl config set-credentials <serviceaccount_name> --token=$TOKEN
  7. Переключи контекст:

    kubectl config set-context --current --user=<serviceaccount_name>
  8. Проверь, что всё в порядке: сделай запрос в Kubernetes API, например, получи список нод кластера:

    kubectl get nodes
  9. Найдешь обновленный kubeconfig-файл в директории $HOME/.kube/config.

Таким образом, ты можешь легко обновить сертификаты вручную или настроить их автообновление через ServiceAccount Token.