Как перевыпустить сертификат подключения к кластеру

«Как перевыпустить сертификат подключения к кластеру» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Перевыпуск сертификата подключения зависит от того, о каком именно сертификате идет речь: клиентском (для пользователя) или серверном (для API-сервера). Я опишу оба сценария.

Сценарий 1: Перевыпуск клиентского сертификата (например, для разработчика или CI/CD)

Обычно кластер использует встроенный CA (Certificate Authority), ключи которого находятся на control-plane нодах в /etc/kubernetes/pki/.

  1. Генерация нового ключа и CSR (Certificate Signing Request):

    openssl genrsa -out dev-user.key 2048
    openssl req -new -key dev-user.key -out dev-user.csr -subj "/CN=dev-user/O=developers"

    O=developers — это группа (RBAC Group) для привязки ролей.

  2. Создание CSR-объекта в Kubernetes:

    # csr.yaml
    apiVersion: certificates.k8s.io/v1
    kind: CertificateSigningRequest
    metadata:
      name: dev-user-csr
    spec:
      request: $(cat dev-user.csr | base64 | tr -d 'n')
      signerName: kubernetes.io/kube-apiserver-client
      usages:
      - client auth
    kubectl apply -f csr.yaml
  3. Одобрение CSR и получение сертификата:

    kubectl certificate approve dev-user-csr
    kubectl get csr dev-user-csr -o jsonpath='{.status.certificate}' | base64 --decode > dev-user.crt
  4. Обновление конфигурации kubeconfig:

    kubectl config set-credentials dev-user 
      --client-key=dev-user.key 
      --client-certificate=dev-user.crt 
      --embed-certs=true  # Опционально: встраивает серты прямо в конфиг

Сценарий 2: Перевыпуск сертификатов самого API-сервера

Это критическая операция, обычно выполняется автоматически инструментами вроде kubeadm при продлении.

  1. Проверка срока действия сертификатов:
    sudo kubeadm certs check-expiration
  2. Продление всех сертификатов на control-plane ноде:
    sudo kubeadm certs renew all

    Эта команда обновит сертификаты в /etc/kubernetes/pki/ и в конфигах (/etc/kubernetes/*.conf).

  3. Перезагрузка компонентов control plane:
    # Для статичных подов
    sudo systemctl restart kubelet
    # Для подов в kube-system
    kubectl rollout restart deployment -n kube-system coredns

Важно: Для продакшн-кластеров я автоматизирую этот процесс с помощью cert-manager или скриптов, интегрированных в пайплайны обновления кластера, чтобы избежать простоев.