---
title: 'Обновить сертификаты для системных компонентов в кластере Managed Kubernetes'
sidebar_label: 'Обновить сертификаты для системных компонентов'
sidebar_position: 7
description: 'Как обновлять сертификаты в панели управления и настроить обновление через Service Account Token'
---

import Formbricks from '@theme/MDXComponents/Formbricks';
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import { TabItemLabel } from '@selectel/docux/components';

# Обновить сертификаты для системных компонентов в кластере Managed Kubernetes

Для взаимодействия [системных компонентов Kubernetes](https://kubernetes.io/ru/docs/concepts/overview/components/) нужны актуальные сертификаты.
Они обновляются автоматически каждые 30 дней.
Если при обновлении сертификатов возникает ошибка, вы можете [обновить сертификаты в панели управления](#update-certificates-when-error-occurs) или через [API Managed Kubernetes](/api/managed-kubernetes/).

Информация об обновлении сертификатов отражается в [логах кластера](/managed-kubernetes/clusters/logs.mdx).

При каждом обновлении сертификатов меняется kubeconfig-файл, поэтому к кластеру нужно заново [подключаться](/managed-kubernetes/clusters/connect-to-cluster.mdx).
Чтобы не подключаться заново, [настройте обновление через ServiceAccount Token](#configure-certificate-update-via-serviceaccount-token).

## Обновить сертификаты при возникновении ошибки \{#update-certificates-when-error-occurs}

Если при автоматическом обновлении сертификатов возникла ошибка `ROTATE CERTS = ERROR`, можно обновить сертификаты в панели управления или через [API Managed Kubernetes](/api/managed-kubernetes/).

1. В [панели управления](https://my.selectel.ru/mks/) в верхнем меню нажмите **Продукты** и выберите **Managed Kubernetes**.
2. В разделе **Кластеры** откройте страницу кластера → вкладка **Настройки**.
3. В блоке **Доступ к кластеру** нажмите **Обновить сертификаты**.
4. Заново [подключитесь к кластеру](/managed-kubernetes/clusters/connect-to-cluster.mdx).

## Настроить обновление сертификатов через ServiceAccount Token \{#configure-certificate-update-via-serviceaccount-token}

ServiceAccount Token — это способ авторизации в Kubernetes API.
Он позволяет не обновлять kubeconfig-файл после каждого обновления сертификатов.

Процесс получения ServiceAccount Token зависит от версии Kubernetes:

* [для версии Kubernetes 1.23 и ниже](#for-kubernetes-version-123-and-lower);
* [для версии Kubernetes 1.24 и выше](#for-kubernetes-version-124-and-higher).

### Для версии Kubernetes 1.23 и ниже \{#for-kubernetes-version-123-and-lower}

<Tabs queryString="for-kubernetes-version-123-and-lower">
  <TabItem value="Linux" default>
    <TabItemLabel>
      Linux
    </TabItemLabel>

    1. Создайте ServiceAccount:

       ```bash
       kubectl -n kube-system create serviceaccount <serviceaccount_name>
       ```

       Укажите `<serviceaccount_name>` — имя сервисного аккаунта.

    2. Создайте ClusterRoleBinding (группу для нового пользователя) и добавьте роль с правами администратора (cluster-admin):

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

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

    3. Добавьте в переменную окружения `TOKENNAME` имя секрета созданного ServiceAccount, в котором хранится токен:

       ```bash
       export TOKENNAME=$(kubectl -n kube-system get serviceaccount/<serviceaccount_name> -o jsonpath='{.secrets[0].name}')
       ```

    4. Добавьте в переменную окружения `TOKEN` декодированный токен из секрета:

       ```bash
       export TOKEN=$(kubectl -n kube-system get secret $TOKENNAME -o jsonpath='{.data.token}' | base64 --decode)
       ```

    5. Проверьте работоспособность токена — сделайте запрос в Kubernetes API с токеном в заголовке:

       ```bash
       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-файл:

       ```bash
       kubectl config set-credentials <serviceaccount_name> --token=$TOKEN
       ```

    7. Переключите контекст:

       ```bash
       kubectl config set-context --current --user=<serviceaccount_name>
       ```

    8. Проверьте работоспособность — сделайте любой запрос в Kubernetes API. Например, запросите список нод кластера:

       ```bash
       kubectl get nodes
       ```

    9. Обновленный kubeconfig-файл будет находиться в домашней директории `$HOME/.kube/config`.
  </TabItem>

  <TabItem value="windows">
    <TabItemLabel>
      Windows
    </TabItemLabel>

    1. Запустите PowerShell от имени администратора.

    2. Создайте ServiceAccount:

       ```bash
       kubectl -n kube-system create serviceaccount <serviceaccount_name>
       ```

       Укажите `<serviceaccount_name>` — имя сервисного аккаунта.

    3. Создайте ClusterRoleBinding (группу для нового пользователя) и добавьте роль с правами администратора (cluster-admin):

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

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

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

       ```bash
       $env:token_name = kubectl -n kube-system get serviceaccount/<serviceaccount_name> -o jsonpath='{.secrets[0].name}'
       ```

    5. Добавьте в переменную `token` декодированный токен из секрета:

       ```bash
       $env:token = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String((kubectl -n kube-system get secret $token_name -o jsonpath='{.data.token}')))
       ```

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

       ```bash
       kubectl config set-credentials <serviceaccount_name> --token=$token
       ```

    7. Переключите контекст:

       ```bash
       kubectl config set-context --current --user=<serviceaccount_name>
       ```

    8. Проверьте работоспособность — сделайте любой запрос в Kubernetes API. Например, запросите список нод кластера:

       ```bash
       kubectl get nodes
       ```

    9. Обновленный kubeconfig-файл будет находиться в домашней директории `$env:USERPROFILE/.kube/config`.
  </TabItem>
</Tabs>

### Для версии Kubernetes 1.24 и выше \{#for-kubernetes-version-124-and-higher}

<Tabs queryString="for-kubernetes-version-124-and-higher">
  <TabItem value="Linux" default>
    <TabItemLabel>
      Linux
    </TabItemLabel>

    1. Создайте ServiceAccount:

       ```bash
       kubectl -n kube-system create serviceaccount <serviceaccount_name>
       ```

       Укажите `<serviceaccount_name>` — имя сервисного аккаунта.

    2. Создайте ClusterRoleBinding (группу для нового пользователя) и добавьте роль с правами администратора (cluster-admin):

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

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

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

       ```yaml
       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` декодированный токен из секрета:

       ```bash
       export TOKEN=$(kubectl -n kube-system get secret <serviceaccount_name>-token -o jsonpath='{.data.token}' | base64 --decode)
       ```

    5. Проверьте работоспособность токена — сделайте запрос в Kubernetes API с токеном в заголовке:

       ```bash
       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-файл:

       ```bash
       kubectl config set-credentials <serviceaccount_name> --token=$TOKEN
       ```

    7. Переключите контекст:

       ```bash
       kubectl config set-context --current --user=<serviceaccount_name>
       ```

    8. Проверьте работоспособность — сделайте любой запрос в Kubernetes API. Например, запросите список нод кластера:

       ```bash
       kubectl get nodes
       ```

    9. Обновленный kubeconfig-файл будет находиться в домашней директории `$HOME/.kube/config`.
  </TabItem>

  <TabItem value="windows">
    <TabItemLabel>
      Windows
    </TabItemLabel>

    1. Запустите PowerShell от имени администратора.

    2. Создайте ServiceAccount:

       ```bash
       kubectl -n kube-system create serviceaccount <serviceaccount_name>
       ```

       Укажите `<serviceaccount_name>` — имя сервисного аккаунта.

    3. Создайте ClusterRoleBinding (группу для нового пользователя) и добавьте роль с правами администратора (cluster-admin):

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

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

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

       ```yaml
       @"
       apiVersion: v1
       kind: Secret
       metadata:
         name: <serviceaccount_name>-token
         annotations:
           kubernetes.io/service-account.name: <serviceaccount_name>
       type: kubernetes.io/service-account-token
       "@ | kubectl -n kube-system apply -f -
       ```

    5. Добавьте в переменную окружения `TOKEN` декодированный токен из секрета:

       ```bash
       $env:token = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String((kubectl -n kube-system get secret <serviceaccount_name>-token -o jsonpath='{.data.token}')))
       ```

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

       ```bash
       kubectl config set-credentials <serviceaccount_name> --token=$token
       ```

    7. Переключите контекст:

       ```bash
       kubectl config set-context --current --user=<serviceaccount_name>
       ```

    8. Проверьте работоспособность — сделайте любой запрос в Kubernetes API. Например, запросите список нод кластера:

       ```bash
       kubectl get nodes
       ```

    9. Обновленный kubeconfig-файл будет находиться в домашней директории `$env:USERPROFILE/.kube/config`.
  </TabItem>
</Tabs>

<Formbricks />
