Обновляем системные сертификаты
Чтобы компоненты 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, не беда! Можно попробовать обновить их вручную через панель управления:
- Заходишь в панель управления и выбираешь раздел Managed Kubernetes.
 - Открываешь страницу своего кластера.
 - В разделе Сертификаты жмешь Обновить.
 - После обновления заново подключаешься к кластеру.
 
Как настроить автообновление сертификатов через ServiceAccount Token
ServiceAccount Token помогает авторизоваться в Kubernetes API, благодаря чему тебе не придется каждый раз обновлять kubeconfig-файл после смены сертификатов.
В зависимости от версии Kubernetes процесс немного различается:
Если у тебя Kubernetes 1.23 или старше
- Linux & MacOS
 - Windows
 
Следуй этим шагам:
Сначала создай ServiceAccount командой:
kubectl -n kube-system create serviceaccount <serviceaccount_name>Замени
<serviceaccount_name>на имя твоего сервисного аккаунта.Теперь нужно создать ClusterRoleBinding и дать новому пользователю админские права:
kubectl create clusterrolebinding <clusterrolebinding_name> --clusterrole=cluster-admin --serviceaccount=kube-system:<serviceaccount_name>Вместо
<clusterrolebinding_name>подставь имя для группы нового пользователя.Запиши в переменную окружения
TOKENNAMEимя секрета, созданного для ServiceAccount, где и хранится токен:export TOKENNAME=$(kubectl -n kube-system get serviceaccount/<serviceaccount_name> -o jsonpath='{.secrets[0].name}')Теперь в
TOKENзапиши декодированный токен:export TOKEN=$(kubectl -n kube-system get secret $TOKENNAME -o jsonpath='{.data.token}' | base64 --decode)Проверь, всё ли работает: отправь запрос в Kubernetes API, используя токен:
curl -k -H 'Authorization: Bearer $TOKEN' -X GET 'https://<kube_api_ip>:6443/api/v1/nodes' | json_pp<kube_api_ip>— это IP-адрес твоего кластера.Добавь ServiceAccount в kubeconfig-файл:
kubectl config set-credentials <serviceaccount_name> --token=$TOKENПереключи контекст:
kubectl config set-context --current --user=<serviceaccount_name>Проверь, что всё ок: сделай запрос в Kubernetes API, например, получи список нод кластера:
kubectl get nodesОбновленный kubeconfig-файл найдешь в директории
$HOME/.kube/config.
Следуй этим шагам:
Сначала создай ServiceAccount:
kubectl -n kube-system create serviceaccount <serviceaccount_name>Укажи имя сервисного аккаунта вместо
<serviceaccount_name>.Потом создай ClusterRoleBinding и добавь админские права новому пользователю:
kubectl create clusterrolebinding <clusterrolebinding_name> --clusterrole=cluster-admin --serviceaccount=kube-system:<serviceaccount_name>Подставь имя для группы нового пользователя вместо
<clusterrolebinding_name>.Узнай имя секрета для ServiceAccount, где хранится токен:
$token_name = kubectl -n kube-system get serviceaccount/<serviceaccount_name> -o jsonpath='{.secrets[0].name}'Теперь декодируй токен и добавь его в переменную
token:$token = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String((kubectl -n kube-system get secret $token_name -o jsonpath='{.data.token}')))Проверь, работает ли токен: отправь запрос в Kubernetes API:
curl -k -H 'Authorization: Bearer $token' -X GET 'https://<kube_api_ip>:6443/api/v1/nodes'<kube_api_ip>— это IP твоего кластера.Добавь ServiceAccount в kubeconfig-файл:
kubectl config set-credentials <serviceaccount_name> --token=$tokenПереключи контекст:
kubectl config set-context --current --user=<serviceaccount_name>Проверь, что всё работает: например, запроси список нод кластера:
kubectl get nodesНайдешь обновленный kubeconfig-файл в директории
$env:USERPROFILE/.kube/config.
Если у тебя Kubernetes 1.24 или новее
- Linux & MacOS
 - Windows
 
Сделай следующее:
Создай ServiceAccount:
kubectl -n kube-system create serviceaccount <serviceaccount_name>Подставь имя твоего сервисного аккаунта вместо
<serviceaccount_name>.Создай ClusterRoleBinding и дай новому пользователю админские права:
kubectl create clusterrolebinding <clusterrolebinding_name> --clusterrole=cluster-admin --serviceaccount=kube-system:<serviceaccount_name>Вместо
<clusterrolebinding_name>укажи имя для группы нового пользователя.Получи имя секрета для 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Запиши декодированный токен в переменную окружения
TOKEN:export TOKEN=$(kubectl -n kube-system get secret <serviceaccount_name>-token -o jsonpath='{.data.token}' | base64 --decode)Проверь, работает ли всё: отправь запрос в Kubernetes API с токеном:
curl -k -H 'Authorization: Bearer $TOKEN' -X GET 'https://<kube_api_ip>:6443/api/v1/nodes' | json_ppУкажи IP-адрес твоего кластера вместо
<kube_api_ip>.Добавь ServiceAccount в kubeconfig-файл:
kubectl config set-credentials <serviceaccount_name> --token=$TOKENПереключи контекст:
kubectl config set-context --current --user=<serviceaccount_name>Проверь, что всё в порядке: сделай запрос в Kubernetes API, например, получи список нод кластера:
kubectl get nodesНайдешь обновленный
kubeconfig-файл в директории$HOME/.kube/config.
Сделай следующее:
Создай ServiceAccount:
kubectl -n kube-system create serviceaccount <serviceaccount_name>Вместо
<serviceaccount_name>подставь имя твоего сервисного аккаунта.Создай ClusterRoleBinding и дай новому пользователю админские права:
kubectl create clusterrolebinding <clusterrolebinding_name> --clusterrole=cluster-admin --serviceaccount=kube-system:<serviceaccount_name>Укажи имя для группы нового пользователя вместо
<clusterrolebinding_name>.Получи имя секрета для ServiceAccount, где хранится токен:
@"
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 -Запиши декодированный токен в переменную
TOKEN:$token = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String((kubectl -n kube-system get secret <serviceaccount_name>-token -o jsonpath='{.data.token}')))Проверь, работает ли токен: отправь запрос в Kubernetes API:
curl -k -H 'Authorization: Bearer $token' -X GET 'https://<kube_api_ip>:6443/api/v1/nodes'<kube_api_ip>— это IP твоего кластера.Добавь ServiceAccount в kubeconfig-файл:
kubectl config set-credentials <serviceaccount_name> --token=$tokenПереключи контекст:
kubectl config set-context --current --user=<serviceaccount_name>Убедись, что всё работает: например, запроси список нод кластера:
kubectl get nodesОбновленный kubeconfig-файл найдешь в директории
$env:USERPROFILE/.kube/config.
Таким образом, ты можешь легко обновить сертификаты вручную или настроить их автообновление через ServiceAccount Token.