Настройте сервер Kubernetes API для подключения к отдельному защищенному TLS-кластеру etcd, где каждый участник имеет свой уникальный публичный сертификат
Я следую за Kubernetes по трудному пути, не используя облако Google, а вместо этого использую контейнер linux и отдельный кластер etcd (тот, который не существует на узлах контроллера плоскости управления, где живет сервер API).
Окружение выглядит так:
etcd01
, etcd02
, etcd03
controller01
, controller02
, controller03
worker01
, worker02
, worker03
Каждый член etcd имеет свой уникальный публичный сертификат с именем etcd{01,02,03}.lab.com.crt
с их собственными уникальными альтернативными именами субъекта и общим именем, и серверы API хост-контроллера имеют один сертификат на каждой машине, которую они все совместно используют (api-server.crt
).
При следовании Kubernetes по сложному пути для раздела " Подготовка CA и генерация сертификатов TLS" в разделе " Сертификат сервера API Kubernetes " он создает следующие сертификаты:
kubernetes-key.pem
kubernetes.pem
В разделе " Настройка сервера etcd " он использует эти два сертификата в конфигурации с целью размещения экземпляров etcd на самих контроллерах.
[Service]
ExecStart=/usr/local/bin/etcd \\
--name ${ETCD_NAME} \\
--cert-file=/etc/etcd/kubernetes.pem \\
--key-file=/etc/etcd/kubernetes-key.pem \\
--peer-cert-file=/etc/etcd/kubernetes.pem \\
--peer-key-file=/etc/etcd/kubernetes-key.pem \\
--trusted-ca-file=/etc/etcd/ca.pem \\
--peer-trusted-ca-file=/etc/etcd/ca.pem \\
--peer-client-cert-auth \\
--client-cert-auth \\
--initial-advertise-peer-urls https://${INTERNAL_IP}:2380 \\
--listen-peer-urls https://${INTERNAL_IP}:2380 \\
--listen-client-urls https://${INTERNAL_IP}:2379,https://127.0.0.1:2379 \\
--advertise-client-urls https://${INTERNAL_IP}:2379 \\
--initial-cluster-token etcd-cluster-0 \\
--initial-cluster controller-0=https://10.240.0.10:2380,controller-1=https://10.240.0.11:2380,controller-2=https://10.240.0.12:2380 \\
--initial-cluster-state new \\
--data-dir=/var/lib/etcd
Вот конфигурация, которую он использует в " Настройте сервер API Kubernetes " для сервера API, используя те же сертификаты, что и упомянутые ранее:
[Service]
ExecStart=/usr/local/bin/kube-apiserver \\
--advertise-address=${INTERNAL_IP} \\
--allow-privileged=true \\
--apiserver-count=3 \\
--audit-log-maxage=30 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-path=/var/log/audit.log \\
--authorization-mode=Node,RBAC \\
--bind-address=0.0.0.0 \\
--client-ca-file=/var/lib/kubernetes/ca.pem \\
--enable-admission-plugins=Initializers,NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \\
--enable-swagger-ui=true \\
--etcd-cafile=/var/lib/kubernetes/ca.pem \\
--etcd-certfile=/var/lib/kubernetes/kubernetes.pem \\
--etcd-keyfile=/var/lib/kubernetes/kubernetes-key.pem \\
--etcd-servers=https://10.240.0.10:2379,https://10.240.0.11:2379,https://10.240.0.12:2379 \\
--event-ttl=1h \\
--experimental-encryption-provider-config=/var/lib/kubernetes/encryption-config.yaml \\
--kubelet-certificate-authority=/var/lib/kubernetes/ca.pem \\
--kubelet-client-certificate=/var/lib/kubernetes/kubernetes.pem \\
--kubelet-client-key=/var/lib/kubernetes/kubernetes-key.pem \\
--kubelet-https=true \\
--runtime-config=api/all \\
--service-account-key-file=/var/lib/kubernetes/service-account.pem \\
--service-cluster-ip-range=10.32.0.0/24 \\
--service-node-port-range=30000-32767 \\
--tls-cert-file=/var/lib/kubernetes/kubernetes.pem \\
--tls-private-key-file=/var/lib/kubernetes/kubernetes-key.pem \\
--v=2
Restart=on-failure
RestartSec=5
При поиске документации для сервера API Kubernetes относительно опции конфигурации --etcd-certfile
, Говорится:
" string: SSL certification file used to secure etcd communication.
"
Это замечательно, если у вас есть один и тот же сертификат для каждого члена etcd, но как я могу заставить эту работу работать, когда каждый член etcd имеет свой собственный файл сертификата с разными именами, включая уникальные альтернативные имена субъекта и общее имя?