5.2.2.1. Корневые сертификаты
Центр сертификации (CA) — это доверенный источник, выпускающий корневые сертификаты, которые используются для подписи всех остальных сертификатов внутри кластера Kubernetes.
Сертификаты CA играют ключевую роль в установлении доверия между компонентами, обеспечивая аутентификацию, шифрование и целостность коммуникаций.
В этом разделе описывается процесс получения корневых (root) сертификатов, которые используются для подписи остальных сертификатов в кластере Kubernetes.
- Init
- Join
Создание корневых сертификатов
● Обязателен к применению
Создание корневых сертификатов
● Обязателен к применению
- Kubernetes ЦА
- FrontProxy ЦА
- ETCD ЦА
Kubernetes CA
Обратите внимание: данный блок описывает только процесс создания корневых сертификатов Kubernetes CA
.
- HardWay
- Kubeadm
Рабочая директория
mkdir -p /etc/kubernetes/openssl
mkdir -p /etc/kubernetes/pki
Конфигурация
cat <<EOF > /etc/kubernetes/openssl/ca.conf
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
prompt = no
[req_distinguished_name]
CN = kubernetes
[v3_ca]
keyUsage = critical, keyCertSign, keyEncipherment, digitalSignature
basicConstraints = critical,CA:TRUE
EOF
Генерация приватного ключа
openssl genrsa \
-out /etc/kubernetes/pki/ca.key 2048
Генерация публичного ключа
openssl req \
-x509 \
-new \
-nodes \
-key /etc/kubernetes/pki/ca.key \
-sha256 \
-days 3650 \
-out /etc/kubernetes/pki/ca.crt \
-config /etc/kubernetes/openssl/ca.conf
Проверка готовности сертификата
Данный раздел зависит от следующих разделов:
/etc/kubernetes/openssl/cert-report.sh /etc/kubernetes/pki/ca.crt
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Oct 20, 2034 22:04 UTC 9y no
Генерация сертификатов
kubeadm init phase certs ca \
--config=/var/run/kubeadm/kubeadm.yaml
После выполнения команд получаем следующий вывод.
#### Create Kubernetes CA
[certs] Generating "ca" certificate and key
FrontProxy CA
Обратите внимание: данный блок описывает только процесс создания корневых сертификатов Front Proxy CA
.
- HardWay
- Kubeadm
Ра бочая директория
mkdir -p /etc/kubernetes/openssl
mkdir -p /etc/kubernetes/pki
Конфигурация
cat <<EOF > /etc/kubernetes/openssl/front-proxy-ca.conf
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
prompt = no
[req_distinguished_name]
CN = front-proxy-ca
[v3_ca]
keyUsage = critical, keyCertSign, keyEncipherment, digitalSignature
basicConstraints = critical,CA:TRUE
EOF
Генерация приватного ключа
openssl genrsa \
-out /etc/kubernetes/pki/front-proxy-ca.key 2048
Генерация публичного ключа
openssl req \
-x509 \
-new \
-nodes \
-key /etc/kubernetes/pki/front-proxy-ca.key \
-sha256 \
-days 3650 \
-out /etc/kubernetes/pki/front-proxy-ca.crt \
-config /etc/kubernetes/openssl/front-proxy-ca.conf
Проверка готовности сертификата
Данный раздел зависит от следующих разделов:
/etc/kubernetes/openssl/cert-report.sh /etc/kubernetes/pki/front-proxy-ca.crt
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
front-proxy-ca Oct 20, 2034 22:04 UTC 9y no
Генерация сертификатов
kubeadm init phase certs front-proxy-ca \
--config=/var/run/kubeadm/kubeadm.yaml
После выполнения команд получаем следующий вывод.
#### Create Front Proxy CA
[certs] Generating "front-proxy-ca" certificate and key
ETCD CA
Обратите внимание: данный блок описывает только процесс создания корневых сертификатов ETCD CA
.
- HardWay
- Kubeadm
Рабочая директория
mkdir -p /etc/kubernetes/openssl
mkdir -p /etc/kubernetes/pki/etcd
Конфигурация
cat <<EOF > /etc/kubernetes/openssl/etcd-ca.conf
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
prompt = no
[req_distinguished_name]
CN = "etcd-ca"
[v3_ca]
keyUsage = critical, keyCertSign, keyEncipherment, digitalSignature
basicConstraints = critical,CA:TRUE
EOF
Генерация приватного ключа
openssl genrsa \
-out /etc/kubernetes/pki/etcd/ca.key 2048
Генерация публичного ключа
openssl req \
-x509 \
-new \
-nodes \
-key /etc/kubernetes/pki/etcd/ca.key \
-sha256 \
-days 3650 \
-out /etc/kubernetes/pki/etcd/ca.crt \
-config /etc/kubernetes/openssl/etcd-ca.conf
Проверка готовности сертификата
Данный раздел зависит от следующих разделов:
/etc/kubernetes/openssl/cert-report.sh /etc/kubernetes/pki/etcd/ca.crt
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
etcd-ca Oct 20, 2034 22:04 UTC 9y no
Генерация сертификатов
kubeadm init phase certs etcd-ca \
--config=/var/run/kubeadm/kubeadm.yaml
После выполнения команды мы получаем следующий вывод.
#### Create ETCD CA
[certs] Generating "etcd/ca" certificate and key
Выгрузка существующих CA
● Обязателен к применению
Выгрузка существующих CA
● Обязателен к применению
- HardWay
- Kubeadm
В этом разделе приведена инструкция по выгрузке корневых сертификатов из управляющего контура Kubernetes. Сертификаты выгружаются в зашифрованном виде из ресурса Secret
, что позволяет их безопасно передавать и расшифровывать на узле для управления жизненным циклом узлов УК.
Рабочая директория
mkdir -p /etc/kubernetes/openssl
mkdir -p /etc/kubernetes/pki
mkdir -p /etc/kubernetes/pki/etcd
Переменные окружения
Под каждую ноду в продуктивной среде рекомендуется создавать отдельный bootstrap-токен. Однако, для целей демонстрации (и в рамках данной документации) мы упростили процесс и используем один общий токен для всех узлов управляющего контура.
export CERTIFICATE_UPLOAD_KEY=0c00c2fd5c67c37656c00d78a9d7e1f2eb794ef8e4fc3e2a4b532eb14323cd59
export KUBE_API_BOOTSTRAP_TOKEN=fjt9ex.lwzqgdlvoxtqk4yw
export KUBE_API_SERVER=https://api.my-first-cluster.example.com:6443
cat <<EOF > /etc/kubernetes/openssl/decrypt.py
#!/usr/bin/env python3
import sys, base64
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
key = bytes.fromhex(sys.argv[1])
payload = base64.b64decode(sys.argv[2])
nonce, ct = payload[:12], payload[12:]
aesgcm = AESGCM(key)
plain = aesgcm.decrypt(nonce, ct, None)
sys.stdout.buffer.write(plain)
EOF
cat <<'EOF' > /etc/kubernetes/openssl/download-certs.sh
#!/bin/bash
set -euo pipefail
CERT_PATH="/etc/kubernetes/pki"
KEY="${CERTIFICATE_UPLOAD_KEY:-}"
PY_SCRIPT="$(dirname "$0")/decrypt.py"
KUBE_API_SERVER="${KUBE_API_SERVER:-https://127.0.0.1:6443}"
TOKEN="${KUBE_API_BOOTSTRAP_TOKEN:?KUBE_API_BOOTSTRAP_TOKEN is required}"
declare -A files=(
["ca.crt"]="$CERT_PATH/ca.crt"
["ca.key"]="$CERT_PATH/ca.key"
["etcd-ca.crt"]="$CERT_PATH/etcd/ca.crt"
["etcd-ca.key"]="$CERT_PATH/etcd/ca.key"
["front-proxy-ca.crt"]="$CERT_PATH/front-proxy-ca.crt"
["front-proxy-ca.key"]="$CERT_PATH/front-proxy-ca.key"
["sa.key"]="$CERT_PATH/sa.key"
["sa.pub"]="$CERT_PATH/sa.pub"
)
mkdir -p "$CERT_PATH"
echo "[INFO] Using certificate key: $KEY"
echo "[WARN] TLS verification is DISABLED (insecure mode)"
echo "[INFO] Fetching Secret kubeadm-certs from API..."
RESPONSE=$(curl -sSL -k \
-H "Authorization: Bearer $TOKEN" \
"$KUBE_API_SERVER/api/v1/namespaces/kube-system/secrets/kubeadm-certs")
echo "$RESPONSE" | jq -r '.data | to_entries[] | @base64' | while read -r item; do
name=$(echo "$item" | base64 -d | jq -r '.key')
b64=$(echo "$item" | base64 -d | jq -r '.value' | tr -d '\n')
out_path="${files[$name]:-}"
if [[ -z "$out_path" ]]; then
echo "[WARN] Unknown certificate: $name — skipping"
continue
fi
mkdir -p "$(dirname "$out_path")"
echo "[INFO] Decrypting $name → $out_path"
python3 "$PY_SCRIPT" "$KEY" "$b64" > "$out_path"
done
echo "[INFO] Certificates unpacked."
EOF
Настройка прав
chmod +x /etc/kubernetes/openssl/download-certs.sh
Запуск скрипта
/etc/kubernetes/openssl/download-certs.sh
[INFO] Using certificate key: 0c00c2fd5c67c37656c00d78a9d7e1f2eb794ef8e4fc3e2a4b532eb14323cd59
[WARN] TLS verification is DISABLED (insecure mode)
[INFO] Fetching Secret kubeadm-certs from API...
[INFO] Decrypting ca.crt → /etc/kubernetes/pki/ca.crt
[INFO] Decrypting ca.key → /etc/kubernetes/pki/ca.key
[INFO] Decrypting etcd-ca.crt → /etc/kubernetes/pki/etcd/ca.crt
[INFO] Decrypting etcd-ca.key → /etc/kubernetes/pki/etcd/ca.key
[INFO] Decrypting front-proxy-ca.crt → /etc/kubernetes/pki/front-proxy-ca.crt
[INFO] Decrypting front-proxy-ca.key → /etc/kubernetes/pki/front-proxy-ca.key
[INFO] Decrypting sa.key → /etc/kubernetes/pki/sa.key
[INFO] Decrypting sa.pub → /etc/kubernetes/pki/sa.pub
[INFO] Certificates unpacked.
Данный раздел зависит от следующих разделов:
Генерация манифеста
kubeadm join phase control-plane-prepare download-certs \
--config=/var/run/kubeadm/kubeadm.yaml
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[download-certs] Downloading the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[download-certs] Saving the certificates to the folder: "/etc/kubernetes/pki"