Как обновить сертификаты Kubernetes?
В этой статье мы покажем, как можно произвести ротацию сертификатов движка Kubernetes.
По умолчанию kubeadm генерирует все сертификаты, необходимые для работы кластера.
Срок действия клиентских сертификатов, сгенерированных kubeadm, истекает через 1 год.
Основная концепция заключается в том, что через год вы, вероятно, обновитесь на следующую версию kubernetes.
☸️ Ломаем и чиним Kubernetes
Проверка срока действия сертификата
Для проверки истечения срока действия сертификатов можно использовать подкоманду check-expiration:
kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Apr 19, 2022 16:34 UTC 364d no
apiserver Apr 19, 2022 16:34 UTC 364d ca no
apiserver-etcd-client Apr 19, 2022 16:34 UTC 364d etcd-ca no
apiserver-kubelet-client Apr 19, 2022 16:34 UTC 364d ca no
controller-manager.conf Apr 19, 2022 16:34 UTC 364d no
etcd-healthcheck-client Apr 19, 2022 16:34 UTC 364d etcd-ca no
etcd-peer Apr 19, 2022 16:34 UTC 364d etcd-ca no
etcd-server Apr 19, 2022 16:34 UTC 364d etcd-ca no
front-proxy-client Apr 19, 2022 16:34 UTC 364d front-proxy-ca no
scheduler.conf Apr 19, 2022 16:34 UTC 364d no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Apr 17, 2031 16:34 UTC 9y no
etcd-ca Apr 17, 2031 16:34 UTC 9y no
front-proxy-ca Apr 17, 2031 16:34 UTC 9y no
Если вы получаете ошибку:
unknown command "certs" for "kubeadm"
To see the stack trace of this error execute with --v=5 or higher
Используйте команду:
kubeadm alpha certs check-expiration
☸️ Перехват трафика контейнеров в Kubernetes
Сертификаты kubernetes находятся в папке /etc/kubernetes/pki/.
Проверить сертификаты можно в ручном режиме:
find /etc/kubernetes/pki/ -type f -name "*.crt" -print |xargs -L 1 -t -i bash -c 'openssl x509 -noout -text -in {}|grep Not'
Сертификат kubelet не проверяется командой выше. Он находится в папке /var/lib/kubelet/pki/.
Автоматическое обновление сертификатов
kubeadm обновляет все сертификаты во время обновления control plane.
Для обеспечения безопасности лучше всего часто обновлять кластер.
В kubelet Kubernetes версии 1.8 и выше реализованы возможности для включения ротации клиентских и/или служебных сертификатов.
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
kubectl create clusterrolebinding node-client-auto-approve-csr \
--clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient \
--group=system:node-bootstrappers
kubectl create clusterrolebinding node-client-auto-renew-crt \
--clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient \
--group=system:nodes
nano /etc/systemd/system/kubelet.env
или
nano /var/lib/kubelet/kubeadm-flags.env
...
KUBELET_EXTRA_ARGS=="--rotate-certificates=true --rotate-server-certificates=true"
systemctl restart kubelet
или
nano /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
или
nano /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
Environment="KUBELET_EXTRA_ARGS=--rotate-certificates=true --rotate-server-certificates=true"
systemctl daemon-reload
systemctl restart kubelet
ps -ef | grep kubelet | grep "rotate-certificates"
root 14105 1 0 16:56 pts/0 00:00:00 bash -c while true ; do /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manifests --pod-infra-container-image=k8s.gcr.io/pause:3.2 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt --cgroup-driver=cgroupfs --fail-swap-on=false --resolv-conf=/etc/resolv.conf.override --rotate-certificates=true --rotate-server-certificates=true; sleep 5; done
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
csr-pswns 27m kubernetes.io/kube-apiserver-client-kubelet system:node:node1 Approved,Issued
node-csr-cQYdjcH2F3kl-ysnzq2TlZOuUDCPgYU8cfKV1V0kqlE 47m kubernetes.io/kube-apiserver-client-kubelet system:bootstrap:lzhuxv Approved,Issued
node-csr-f2J5HT9hg4CIKP0-0BtsEffBzg28VlUbesKJ4p_2mi0 47m kubernetes.io/kube-apiserver-client-kubelet system:bootstrap:lzhuxv Approved,Issued
см. также: