Merge pull request #27071 from neolit123/1.21-add-kubelet-serving-cert-guide
kubeadm: add guide for kubelet serving certs and metrics-serverpull/27640/head
commit
9b300a4f4f
|
@ -420,3 +420,20 @@ To workaround the issue, re-mount the `/var/lib/kubelet` directory after perform
|
|||
|
||||
This is a regression introduced in kubeadm 1.15. The issue is fixed in 1.20.
|
||||
|
||||
## Cannot use the metrics-server securely in a kubeadm cluster
|
||||
|
||||
In a kubeadm cluster, the [metrics-server](https://github.com/kubernetes-sigs/metrics-server)
|
||||
can be used insecurely by passing the `--kubelet-insecure-tls` to it. This is not recommended for production clusters.
|
||||
|
||||
If you want to use TLS between the metrics-server and the kubelet there is a problem,
|
||||
since kubeadm deploys a self-signed serving certificate for the kubelet. This can cause the following errors
|
||||
on the side of the metrics-server:
|
||||
```
|
||||
x509: certificate signed by unknown authority
|
||||
x509: certificate is valid for IP-foo not IP-bar
|
||||
```
|
||||
|
||||
See [Enabling signed kubelet serving certificates](/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/#kubelet-serving-certs)
|
||||
to understand how to configure the kubelets in a kubeadm cluster to have properly signed serving certificates.
|
||||
|
||||
Also see [How to run the metrics-server securely](https://github.com/kubernetes-sigs/metrics-server/blob/master/FAQ.md#how-to-run-metrics-server-securely).
|
||||
|
|
|
@ -207,3 +207,71 @@ After a certificate is signed using your preferred method, the certificate and t
|
|||
Kubeadm does not support rotation or replacement of CA certificates out of the box.
|
||||
|
||||
For more information about manual rotation or replacement of CA, see [manual rotation of CA certificates](/docs/tasks/tls/manual-rotation-of-ca-certificates/).
|
||||
|
||||
## Enabling signed kubelet serving certificates {#kubelet-serving-certs}
|
||||
|
||||
By default the kubelet serving certificate deployed by kubeadm is self-signed.
|
||||
This means a connection from external services like the
|
||||
[metrics-server](https://github.com/kubernetes-sigs/metrics-server) to a
|
||||
kubelet cannot be secured with TLS.
|
||||
|
||||
To configure the kubelets in a new kubeadm cluster to obtain properly signed serving
|
||||
certificates you must pass the following minimal configuration to `kubeadm init`:
|
||||
|
||||
```yaml
|
||||
apiVersion: kubeadm.k8s.io/v1beta2
|
||||
kind: ClusterConfiguration
|
||||
---
|
||||
apiVersion: kubelet.config.k8s.io/v1beta1
|
||||
kind: KubeletConfiguration
|
||||
serverTLSBootstrap: true
|
||||
```
|
||||
|
||||
If you have already created the cluster you must adapt it by doing the following:
|
||||
- Find and edit the `kubelet-config-{{< skew latestVersion >}}` ConfigMap in the `kube-system` namespace.
|
||||
In that ConfigMap, the `config` key has a
|
||||
[KubeletConfiguration](/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration)
|
||||
document as its value. Edit the KubeletConfiguration document to set `serverTLSBootstrap: true`.
|
||||
- On each node, add the `serverTLSBootstrap: true` field in `/var/lib/kubelet/config.yaml`
|
||||
and restart the kubelet with `systemctl restart kubelet`
|
||||
|
||||
The field `serverTLSBootstrap: true` will enable the bootstrap of kubelet serving
|
||||
certificates by requesting them from the `certificates.k8s.io` API. One known limitation
|
||||
is that the CSRs (Certificate Signing Requests) for these certificates cannot be automatically
|
||||
approved by the default signer in the kube-controller-manager -
|
||||
[`kubernetes.io/kubelet-serving`](https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#kubernetes-signers).
|
||||
This will require action from the user or a third party controller.
|
||||
|
||||
These CSRs can be viewed using:
|
||||
|
||||
```shell
|
||||
kubectl get csr
|
||||
NAME AGE SIGNERNAME REQUESTOR CONDITION
|
||||
csr-9wvgt 112s kubernetes.io/kubelet-serving system:node:worker-1 Pending
|
||||
csr-lz97v 1m58s kubernetes.io/kubelet-serving system:node:control-plane-1 Pending
|
||||
```
|
||||
|
||||
To approve them you can do the following:
|
||||
```shell
|
||||
kubectl certificate approve <CSR-name>
|
||||
```
|
||||
|
||||
By default, these serving certificate will expire after one year. Kubeadm sets the
|
||||
`KubeletConfiguration` field `rotateCertificates` to `true`, which means that close
|
||||
to expiration a new set of CSRs for the serving certificates will be created and must
|
||||
be approved to complete the rotation. To understand more see
|
||||
[Certificate Rotation](/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#certificate-rotation).
|
||||
|
||||
If you are looking for a solution for automatic approval of these CSRs it is recommended
|
||||
that you contact your cloud provider and ask if they have a CSR signer that verifies
|
||||
the node identity with an out of band mechanism.
|
||||
|
||||
{{% thirdparty-content %}}
|
||||
|
||||
Third party custom controllers can be used:
|
||||
- [kubelet-rubber-stamp](https://github.com/kontena/kubelet-rubber-stamp)
|
||||
|
||||
Such a controller is not a secure mechanism unless it not only verifies the CommonName
|
||||
in the CSR but also verifies the requested IPs and domain names. This would prevent
|
||||
a malicious actor that has access to a kubelet client certificate to create
|
||||
CSRs requesting serving certificates for any IP or domain name.
|
||||
|
|
Loading…
Reference in New Issue