Merge pull request #32764 from neolit123/1.24-add-steps-for-reconf
kubeadm: add task page for cluster reconf
This commit is contained in:
commit
3b19dbf22f
|
|
@ -24,9 +24,12 @@ you can skip the default CoreDNS deployment and deploy your own variant.
|
|||
For more details on that see [Using init phases with kubeadm](/docs/reference/setup-tools/kubeadm/kubeadm-init/#init-phases).
|
||||
{{< /note >}}
|
||||
|
||||
<!-- body -->
|
||||
{{< note >}}
|
||||
To reconfigure a cluster that has already been created see
|
||||
[Reconfiguring a kubeadm cluster](/docs/tasks/administer-cluster/kubeadm/kubeadm-reconfigure).
|
||||
{{< /note >}}
|
||||
|
||||
{{< feature-state for_k8s_version="v1.12" state="stable" >}}
|
||||
<!-- body -->
|
||||
|
||||
## Customizing the control plane with flags in `ClusterConfiguration`
|
||||
|
||||
|
|
|
|||
|
|
@ -162,6 +162,9 @@ To customize control plane components, including optional IPv6 assignment to liv
|
|||
for control plane components and etcd server, provide extra arguments to each component as documented in
|
||||
[custom arguments](/docs/setup/production-environment/tools/kubeadm/control-plane-flags/).
|
||||
|
||||
To reconfigure a cluster that has already been created see
|
||||
[Reconfiguring a kubeadm cluster](/docs/tasks/administer-cluster/kubeadm/kubeadm-reconfigure).
|
||||
|
||||
To run `kubeadm init` again, you must first [tear down the cluster](#tear-down).
|
||||
|
||||
If you join a node with a different architecture to your cluster, make sure that your deployed DaemonSets
|
||||
|
|
|
|||
|
|
@ -0,0 +1,281 @@
|
|||
---
|
||||
reviewers:
|
||||
- sig-cluster-lifecycle
|
||||
title: Reconfiguring a kubeadm cluster
|
||||
content_type: task
|
||||
weight: 10
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
kubeadm does not support automated ways of reconfiguring components that
|
||||
were deployed on managed nodes. One way of automating this would be
|
||||
by using a custom [operator](/docs/concepts/extend-kubernetes/operator/).
|
||||
|
||||
To modify the components configuration you must manually edit associated cluster
|
||||
objects and files on disk.
|
||||
|
||||
This guide shows the correct sequence of steps that need to be performed
|
||||
to achieve kubeadm cluster reconfiguration.
|
||||
|
||||
## {{% heading "prerequisites" %}}
|
||||
|
||||
- You need a cluster that was deployed using kubeadm
|
||||
- Have administrator credentials (`/etc/kubernetes/admin.conf`) and network connectivity
|
||||
to a running kube-apiserver in the cluster from a host that has kubectl installed
|
||||
- Have a text editor installed on all hosts
|
||||
|
||||
<!-- steps -->
|
||||
|
||||
## Reconfiguring the cluster
|
||||
|
||||
kubeadm writes a set of cluster wide component configuration options in
|
||||
ConfigMaps and other objects. These objects must be manually edited. The command `kubectl edit`
|
||||
can be used for that.
|
||||
|
||||
The `kubectl edit` command will open a text editor where you can edit and save the object directly.
|
||||
|
||||
You can use the environment variables `KUBECONFIG` and `KUBE_EDITOR` to specify the location of
|
||||
the kubectl consumed kubeconfig file and preferred text editor.
|
||||
|
||||
For example:
|
||||
```
|
||||
KUBECONFIG=/etc/kubernetes/admin.conf KUBE_EDITOR=nano kubectl edit <parameters>
|
||||
```
|
||||
|
||||
{{< note >}}
|
||||
Upon saving any changes to these cluster objects, components running on nodes may not be
|
||||
automatically updated. The steps below instruct you on how to perform that manually.
|
||||
{{< /note >}}
|
||||
|
||||
{{< warning >}}
|
||||
Component configuration in ConfigMaps is stored as unstructured data (YAML string).
|
||||
This means that validation will not be performed upon updating the contents of a ConfigMap.
|
||||
You have to be careful to follow the documented API format for a particular
|
||||
component configuration and avoid introducing typos and YAML indentation mistakes.
|
||||
{{< /warning >}}
|
||||
|
||||
### Applying cluster configuration changes
|
||||
|
||||
#### Updating the `ClusterConfiguration`
|
||||
|
||||
During cluster creation and upgrade, kubeadm writes its
|
||||
[`ClusterConfiguration`](/docs/reference/config-api/kubeadm-config.v1beta3/)
|
||||
in a ConfigMap called `kubeadm-config` in the `kube-system` namespace.
|
||||
|
||||
To change a particular option in the `ClusterConfiguration` you can edit the ConfigMap with this command:
|
||||
|
||||
```shell
|
||||
kubectl edit cm -n kube-system kubeadm-config
|
||||
```
|
||||
|
||||
The configuration is located under the `data.ClusterConfiguration` key.
|
||||
|
||||
{{< note >}}
|
||||
The `ClusterConfiguration` includes a variety of options that affect the configuration of individual
|
||||
components such as kube-apiserver, kube-scheduler, kube-controller-manager, CoreDNS, etcd and kube-proxy.
|
||||
Changes to the configuration must be reflected on node components manually.
|
||||
{{< /note >}}
|
||||
|
||||
#### Reflecting `ClusterConfiguration` changes on control plane nodes
|
||||
|
||||
kubeadm manages the control plane components as static Pod manifests located in
|
||||
the directory `/etc/kubernetes/manifests`.
|
||||
Any changes to the `ClusterConfiguration` under the `apiServer`, `controllerManager`, `scheduler` or `etcd`
|
||||
keys must be reflected in the associated files in the manifests directory on a control plane node.
|
||||
|
||||
Such changes may include:
|
||||
- `extraArgs` - requires updating the list of flags passed to a component container
|
||||
- `extraMounts` - requires updated the volume mounts for a component container
|
||||
- `*SANs` - requires writing new certificates with updated Subject Alternative Names.
|
||||
|
||||
Before proceeding with these changes, make sure you have backed up the directory `/etc/kubernetes/`.
|
||||
|
||||
To write new certificates you can use:
|
||||
```shell
|
||||
kubeadm init phase certs <component-name> --config <config-file>
|
||||
```
|
||||
|
||||
To write new manifest files in `/etc/kubernetes/manifests` you can use:
|
||||
|
||||
```shell
|
||||
kubeadm init phase control-plane <component-name> --config <config-file>
|
||||
```
|
||||
|
||||
The `<config-file>` contents must match the updated `ClusterConfiguration`.
|
||||
The `<component-name>` value must be the name of the component.
|
||||
|
||||
{{< note >}}
|
||||
Updating a file in `/etc/kubernetes/manifests` will tell the kubelet to restart the static Pod for the corresponding component.
|
||||
Try doing these changes one node at a time to leave the cluster without downtime.
|
||||
{{< /note >}}
|
||||
|
||||
### Applying kubelet configuration changes
|
||||
|
||||
#### Updating the `KubeletConfiguration`
|
||||
|
||||
During cluster creation and upgrade, kubeadm writes its
|
||||
[`KubeletConfiguration`](/docs/reference/config-api/kubelet-config.v1beta1/)
|
||||
in a ConfigMap called `kubelet-config` in the `kube-system` namespace.
|
||||
|
||||
You can edit the ConfigMap with this command:
|
||||
|
||||
```shell
|
||||
kubectl edit cm -n kube-system kubelet-config
|
||||
```
|
||||
|
||||
The configuration is located under the `data.kubelet` key.
|
||||
|
||||
#### Reflecting the kubelet changes
|
||||
|
||||
To reflect the change on kubeadm nodes you must do the following:
|
||||
- Log in to a kubeadm node
|
||||
- Run `kubeadm upgrade node phase kubelet-config` to download the latest `kubelet-config`
|
||||
ConfigMap contents into the local file `/var/lib/kubelet/config.conf`
|
||||
- Edit the file `/var/lib/kubelet/kubeadm-flags.env` to apply additional configuration with
|
||||
flags
|
||||
- Restart the kubelet service with `systemctl restart kubelet`
|
||||
|
||||
{{< note >}}
|
||||
Do these changes one node at a time to allow workloads to be rescheduled properly.
|
||||
{{< /note >}}
|
||||
|
||||
{{< note >}}
|
||||
During `kubeadm upgrade`, kubeadm downloads the `KubeletConfiguration` from the
|
||||
`kubelet-config` ConfigMap and overwrite the contents of `/var/lib/kubelet/config.conf`.
|
||||
This means that node local configuration must be applied either by flags in
|
||||
`/var/lib/kubelet/kubeadm-flags.env` or by manually updating the contents of
|
||||
`/var/lib/kubelet/config.conf` after `kubeadm upgrade`, and then restarting the kubelet.
|
||||
{{< /note >}}
|
||||
|
||||
### Applying kube-proxy configuration changes
|
||||
|
||||
#### Updating the `KubeProxyConfiguration`
|
||||
|
||||
During cluster creation and upgrade, kubeadm writes its
|
||||
[`KubeProxyConfiguration`](/docs/reference/config-api/kube-proxy-config.v1alpha1/)
|
||||
in a ConfigMap in the `kube-system` namespace called `kube-proxy`.
|
||||
|
||||
This ConfigMap is used by the `kube-proxy` DaemonSet in the `kube-system` namespace.
|
||||
|
||||
To change a particular option in the `KubeProxyConfiguration`, you can edit the ConfigMap with this command:
|
||||
|
||||
```shell
|
||||
kubectl edit cm -n kube-system kube-proxy
|
||||
```
|
||||
|
||||
The configuration is located under the `data.config.conf` key.
|
||||
|
||||
#### Reflecting the kube-proxy changes
|
||||
|
||||
Once the `kube-proxy` ConfigMap is updated, you can restart all kube-proxy Pods:
|
||||
|
||||
Obtain the Pod names:
|
||||
|
||||
```shell
|
||||
kubectl get po -n kube-system | grep kube-proxy
|
||||
```
|
||||
|
||||
Delete a Pod with:
|
||||
|
||||
```shell
|
||||
kubectl delete po -n kube-system <pod-name>
|
||||
```
|
||||
|
||||
New Pods that use the updated ConfigMap will be created.
|
||||
|
||||
{{< note >}}
|
||||
Because kubeadm deploys kube-proxy as a DaemonSet, node specific configuration is unsupported.
|
||||
{{< /note >}}
|
||||
|
||||
### Applying CoreDNS configuration changes
|
||||
|
||||
#### Updating the CoreDNS Deployment and Service
|
||||
|
||||
kubeadm deploys CoreDNS as a Deployment called `coredns` and with a Service `kube-dns`,
|
||||
both in the `kube-system` namespace.
|
||||
|
||||
To update any of the CoreDNS settings, you can edit the Deployment and
|
||||
Service objects:
|
||||
|
||||
```shell
|
||||
kubectl edit deployment -n kube-system coredns
|
||||
kubectl edit service -n kube-system kube-dns
|
||||
```
|
||||
|
||||
#### Reflecting the CoreDNS changes
|
||||
|
||||
Once the CoreDNS changes are applied you can delete the CoreDNS Pods:
|
||||
|
||||
Obtain the Pod names:
|
||||
|
||||
```shell
|
||||
kubectl get po -n kube-system | grep coredns
|
||||
```
|
||||
|
||||
Delete a Pod with:
|
||||
|
||||
```shell
|
||||
kubectl delete po -n kube-system <pod-name>
|
||||
```
|
||||
|
||||
New Pods with the updated CoreDNS configuration will be created.
|
||||
|
||||
{{< note >}}
|
||||
kubeadm does not allow CoreDNS configuration during cluster creation and upgrade.
|
||||
This means that if you execute `kubeadm upgrade apply`, your changes to the CoreDNS
|
||||
objects will be lost and must be reapplied.
|
||||
{{< /note >}}
|
||||
|
||||
## Persisting the reconfiguration
|
||||
|
||||
During the execution of `kubeadm upgrade` on a managed node, kubeadm might overwrite configuration
|
||||
that was applied after the cluster was created (reconfiguration).
|
||||
|
||||
### Persisting Node object reconfiguration
|
||||
|
||||
kubeadm writes Labels, Taints, CRI socket and other information on the Node object for a particular
|
||||
Kubernetes node. To change any of the contents of this Node object you can use:
|
||||
|
||||
```shell
|
||||
kubectl edit no <node-name>
|
||||
```
|
||||
|
||||
During `kubeadm upgrade` the contents of such a Node might get overwritten.
|
||||
If you would like to persist your modifications to the Node object after upgrade,
|
||||
you can prepare a [kubectl patch](/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/)
|
||||
and apply it to the Node object:
|
||||
|
||||
```shell
|
||||
kubectl patch no <node-name> --patch-file <patch-file>
|
||||
```
|
||||
|
||||
#### Persisting control plane component reconfiguration
|
||||
|
||||
The main source of control plane configuration is the `ClusterConfiguration`
|
||||
object stored in the cluster. To extend the static Pod manifests configuration,
|
||||
[patches](/docs/setup/production-environment/tools/kubeadm/control-plane-flags/#patches) can be used.
|
||||
|
||||
These patch files must remain as files on the control plane nodes to ensure that
|
||||
they can be used by the `kubeadm upgrade ... --patches <directory>`.
|
||||
|
||||
If reconfiguration is done to the `ClusterConfiguration` and static Pod manifests on disk,
|
||||
the set of node specific patches must be updated accordingly.
|
||||
|
||||
#### Persisting kubelet reconfiguration
|
||||
|
||||
Any changes to the `KubeletConfiguration` stored in `/var/lib/kubelet/config.conf` will be overwritten on
|
||||
`kubeadm upgrade` by downloading the contents of the cluster wide `kubelet-config` ConfigMap.
|
||||
To persist kubelet node specific configuration either the file `/var/lib/kubelet/config.conf`
|
||||
has to be updated manually post-upgrade or the file `/var/lib/kubelet/kubeadm-flags.env` can include flags.
|
||||
The kubelet flags override the associated `KubeletConfiguration` options, but note that
|
||||
some of the flags are deprecated.
|
||||
|
||||
A kubelet restart will be required after changing `/var/lib/kubelet/config.conf` or
|
||||
`/var/lib/kubelet/kubeadm-flags.env`.
|
||||
|
||||
{{% heading "whatsnext" %}}
|
||||
|
||||
- [Upgrading kubeadm clusters](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade)
|
||||
- [Customizing components with the kubeadm API](/docs/setup/production-environment/tools/kubeadm/control-plane-flags)
|
||||
- [Certificate management with kubeadm](/docs/tasks/administer-cluster/kubeadm/kubeadm-certs)
|
||||
|
|
@ -43,7 +43,12 @@ first drain the node (or nodes) that you are upgrading. In the case of control p
|
|||
they could be running CoreDNS Pods or other critical workloads. For more information see
|
||||
[Draining nodes](/docs/tasks/administer-cluster/safely-drain-node/).
|
||||
- All containers are restarted after upgrade, because the container spec hash value is changed.
|
||||
- To verify that the kubelet service has successfully restarted after the kubelet has been upgraded, you can execute `systemctl status kubelet` or view the service logs with `journalctl -xeu kubelet`.
|
||||
- To verify that the kubelet service has successfully restarted after the kubelet has been upgraded,
|
||||
you can execute `systemctl status kubelet` or view the service logs with `journalctl -xeu kubelet`.
|
||||
- Usage of the `--config` flag of `kubeadm upgrade` with
|
||||
[kubeadm configuration API types](/docs/reference/config-api/kubeadm-config.v1beta3)
|
||||
with the purpose of reconfiguring the cluster is not recommended and can have unexpected results. Follow the steps in
|
||||
[Reconfiguring a kubeadm cluster](/docs/tasks/administer-cluster/kubeadm/kubeadm-reconfigure) instead.
|
||||
|
||||
<!-- steps -->
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue