Сертифікати PKI та вимоги

Kubernetes вимагає наявності сертифікатів PKI для автентифікації за допомогою TLS. Якщо ви встановлюєте Kubernetes за допомогою kubeadm, сертифікати, необхідні для вашого кластера, генеруються автоматично. Ви також можете створити свої власні сертифікати, наприклад, щоб зберігати ваші приватні ключі більш безпечно, не зберігаючи їх на сервері API. Ця сторінка пояснює, які сертифікати необхідні для вашого кластера.

Як кластер використовує сертифікати

Kubernetes вимагає PKI для виконання таких операцій:

Сертифікати сервера

  • Сертифікат сервера для точки доступу API сервера
  • Сертифікат сервера для сервера etcd
  • Сертифікати сервера для кожного kubelet (кожен вузол запускає kubelet)
  • Опціональний сертифікат сервера для front-proxy

Сертифікати клієнта

  • Сертифікати клієнта для кожного kubelet, які використовуються для автентифікації в API сервері як клієнта Kubernetes API
  • Сертифікат клієнта для кожного API сервера, який використовується для автентифікації в etcd
  • Сертифікат клієнта для менеджера контролерів для безпечного звʼязку з API сервером
  • Сертифікат клієнта для планувальника для безпечного звʼязку з API сервером
  • Сертифікати клієнтів для кожного вузла, які використовуються kube-proxy для автентифікації в API сервері
  • Опціональні сертифікати клієнтів для адміністраторів кластера для автентифікації в API сервері
  • Опціональний сертифікат клієнта для front-proxy

Серверні та клієнтські сертифікати Kubelet

Для встановлення безпечного зʼєднання та автентифікації у kubelet, API сервер вимагає сертифікат клієнта та пару ключів.

У цій ситуації є два підходи до використання сертифікатів:

  • Спільні сертифікати: kube-apiserver може використовувати ту ж саму пару сертифікатів та ключів, яку використовує для автентифікації своїх клієнтів. Це означає, що наявні сертифікати, такі як apiserver.crt та apiserver.key, можуть використовуватися для звʼязку з серверами kubelet.

  • Окремі сертифікати: Альтернативно, kube-apiserver може згенерувати новий сертифікат клієнта та пару ключів для автентифікації звʼязку з серверами kubelet. У цьому випадку створюється окремий сертифікат з назвою kubelet-client.crt та відповідний приватний ключ, kubelet-client.key.

etcd також реалізує взаємну аутентифікацію TLS для автентифікації клієнтів.

Де зберігаються сертифікати

Якщо ви встановлюєте Kubernetes за допомогою kubeadm, більшість сертифікатів зберігається в /etc/kubernetes/pki. Усі шляхи в цьому документі стосуються цієї теки, за винятком сертифікатів облікових записів користувачів, які kubeadm розміщує в /etc/kubernetes.

Налаштування сертифікатів вручну

Якщо ви не хочете, щоб kubeadm генерував необхідні сертифікати, ви можете створити їх за допомогою одного кореневого ЦС або подавши всі сертифікати. Детальні відомості щодо створення власного центра сертифікації дивіться в Сертифікати. Додаткові відомості знаходяться в розділі Управління сертифікатами з kubeadm.

Один кореневий ЦС

Ви можете створити один кореневий ЦС, яким керує адміністратор. Цей кореневий ЦС може створювати кілька проміжних ЦС та делегувати весь подальший процес створення Kubernetes.

Необхідні ЦС:

ШляхТиповий CNОпис
ca.crt,keykubernetes-caЗагальний ЦС Kubernetes
etcd/ca.crt,keyetcd-caДля всіх функцій, повʼязаних з etcd
front-proxy-ca.crt,keykubernetes-front-proxy-caДля проксі-сервера

На додачу до цих ЦС також необхідно отримати пару ключ/сертифікат для управління обліковими записами служби, sa.key та sa.pub. Наведений нижче приклад ілюструє файли ключа та сертифіката ЦС, показані в попередній таблиці:

/etc/kubernetes/pki/ca.crt
/etc/kubernetes/pki/ca.key
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key
/etc/kubernetes/pki/front-proxy-ca.crt
/etc/kubernetes/pki/front-proxy-ca.key

Усі сертифікати

Якщо ви не хочете копіювати приватні ключі ЦС до свого кластера, ви можете створити всі сертифікати самостійно.

Необхідні сертифікати:

Типовий CNБатьківський ЦСO (в обʼєкті)видhosts (SAN)
kube-etcdetcd-caserver, client<hostname>, <Host_IP>, localhost, 127.0.0.1
kube-etcd-peeretcd-caserver, client<hostname>, <Host_IP>, localhost, 127.0.0.1
kube-etcd-healthcheck-clientetcd-caclient
kube-apiserver-etcd-clientetcd-caclient
kube-apiserverkubernetes-caserver<hostname>, <Host_IP>, <advertise_IP>, [^1]
kube-apiserver-kubelet-clientkubernetes-casystem:mastersclient
front-proxy-clientkubernetes-front-proxy-caclient

де kind посилається на один або кілька ключів x509, які також документовані в .spec.usages типу CertificateSigningRequest:

kindВикористання ключа
serverцифровий підпис, шифрування ключа, автентифікація сервера
clientцифровий підпис, шифрування ключа, автентифікація клієнта

Шляхи до сертифікатів

Сертифікати повинні бути розміщені в рекомендованому шляху (який використовує kubeadm). Шляхи повинні бути вказані за вказаним аргументом незалежно від місця розташування.

Типовий CNрекомендований шлях до ключарекомендований шлях до сертифікатакомандааргумент ключааргумент сертифіката
etcd-caetcd/ca.keyetcd/ca.crtkube-apiserver--etcd-cafile
kube-apiserver-etcd-clientapiserver-etcd-client.keyapiserver-etcd-client.crtkube-apiserver--etcd-keyfile--etcd-certfile
kubernetes-caca.keyca.crtkube-apiserver--client-ca-file
kubernetes-caca.keyca.crtkube-controller-manager--cluster-signing-key-file--client-ca-file, --root-ca-file, --cluster-signing-cert-file
kube-apiserverapiserver.keyapiserver.crtkube-apiserver--tls-private-key-file--tls-cert-file
kube-apiserver-kubelet-clientapiserver-kubelet-client.keyapiserver-kubelet-client.crtkube-apiserver--kubelet-client-key--kubelet-client-certificate
front-proxy-cafront-proxy-ca.keyfront-proxy-ca.crtkube-apiserver--requestheader-client-ca-file
front-proxy-cafront-proxy-ca.keyfront-proxy-ca.crtkube-controller-manager--requestheader-client-ca-file
front-proxy-clientfront-proxy-client.keyfront-proxy-client.crtkube-apiserver--proxy-client-key-file--proxy-client-cert-file
etcd-caetcd/ca.keyetcd/ca.crtetcd--trusted-ca-file, --peer-trusted-ca-file
kube-etcdetcd/server.keyetcd/server.crtetcd--key-file--cert-file
kube-etcd-peeretcd/peer.keyetcd/peer.crtetcd--peer-key-file--peer-cert-file
etcd-caetcd/ca.crtetcdctl--cacert
kube-etcd-healthcheck-clientetcd/healthcheck-client.keyetcd/healthcheck-client.crtetcdctl--key--cert

Ті ж самі вимоги стосуються пари ключів облікових записів служби:

Шлях приватного ключаШлях публічного ключакомандааргумент
sa.keykube-controller-manager--service-account-private-key-file
sa.pubkube-apiserver--service-account-key-file

Наведений нижче приклад ілюструє повні шляхи до файлів, перерахованих в попередній таблиці:

/etc/kubernetes/pki/etcd/ca.key
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/apiserver-etcd-client.key
/etc/kubernetes/pki/apiserver-etcd-client.crt
/etc/kubernetes/pki/ca.key
/etc/kubernetes/pki/ca.crt
/etc/kubernetes/pki/apiserver.key
/etc/kubernetes/pki/apiserver.crt
/etc/kubernetes/pki/apiserver-kubelet-client.key
/etc/kubernetes/pki/apiserver-kubelet-client.crt
/etc/kubernetes/pki/front-proxy-ca.key
/etc/kubernetes/pki/front-proxy-ca.crt
/etc/kubernetes/pki/front-proxy-client.key
/etc/kubernetes/pki/front-proxy-client.crt
/etc/kubernetes/pki/etcd/server.key
/etc/kubernetes/pki/etcd/server.crt
/etc/kubernetes/pki/etcd/peer.key
/etc/kubernetes/pki/etcd/peer.crt
/etc/kubernetes/pki/etcd/healthcheck-client.key
/etc/kubernetes/pki/etcd/healthcheck-client.crt
/etc/kubernetes/pki/sa.key
/etc/kubernetes/pki/sa.pub

Налаштування сертифікатів для облікових записів користувачів

Ви повинні вручну налаштувати ці облікові записи адміністратора та службові облікові записи:

Імʼя файлуІмʼя облікового записуТиповий CNO (в обʼєкті)
admin.confdefault-adminkubernetes-admin<admin-group>
super-admin.confdefault-super-adminkubernetes-super-adminsystem:masters
kubelet.confdefault-authsystem:node:<nodeName> (див. примітку)system:nodes
controller-manager.confdefault-controller-managersystem:kube-controller-manager
scheduler.confdefault-schedulersystem:kube-scheduler
  1. Для кожної конфігурації створіть пару ключ/сертифікат x509 із зазначеними Common Name (CN) та Organization (O).

  2. Виконайте команду kubectl для кожної конфігурації наступним чином:

KUBECONFIG=<filename> kubectl config set-cluster default-cluster --server=https://<host ip>:6443 --certificate-authority <path-to-kubernetes-ca> --embed-certs
KUBECONFIG=<filename> kubectl config set-credentials <credential-name> --client-key <path-to-key>.pem --client-certificate <path-to-cert>.pem --embed-certs
KUBECONFIG=<filename> kubectl config set-context default-system --cluster default-cluster --user <credential-name>
KUBECONFIG=<filename> kubectl config use-context default-system

Ці файли використовуються наступним чином:

Імʼя файлуКомандаКоментар
admin.confkubectlНалаштовує користувача-адміністратора для кластера
super-admin.confkubectlНалаштовує користувача-суперадміністратора для кластера
kubelet.confkubeletОдин обовʼязковий для кожного вузла в кластері
controller-manager.confkube-controller-managerМає бути доданий до manifests/kube-controller-manager.yaml
scheduler.confkube-schedulerМає бути доданий до manifests/kube-scheduler.yaml

Наведені нижче файли ілюструють повні шляхи до файлів, перерахованих у попередній таблиці:

/etc/kubernetes/admin.conf
/etc/kubernetes/super-admin.conf
/etc/kubernetes/kubelet.conf
/etc/kubernetes/controller-manager.conf
/etc/kubernetes/scheduler.conf
Змінено November 07, 2024 at 6:31 PM PST: sync upstream (5b9caf30cd)