Обновляем системные сертификаты
Чтобы компоненты 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.