`,
-using the
-[KubeSchedulerConfiguration (v1beta1)](/docs/reference/config-api/kube-scheduler-config.v1beta1/)
+using the
+KubeSchedulerConfiguration ([v1beta1](/docs/reference/config-api/kube-scheduler-config.v1beta1/)
+or [v1beta2](/docs/reference/config-api/kube-scheduler-config.v1beta2/))
struct.
A minimal configuration looks as follows:
```yaml
-apiVersion: kubescheduler.config.k8s.io/v1beta1
+apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
clientConnection:
kubeconfig: /etc/srv/kubernetes/kube-scheduler/kubeconfig
@@ -48,38 +49,41 @@ You can configure a single instance of `kube-scheduler` to run
Scheduling happens in a series of stages that are exposed through the following
extension points:
-1. `QueueSort`: These plugins provide an ordering function that is used to
+1. `queueSort`: These plugins provide an ordering function that is used to
sort pending Pods in the scheduling queue. Exactly one queue sort plugin
may be enabled at a time.
-1. `PreFilter`: These plugins are used to pre-process or check information
+1. `preFilter`: These plugins are used to pre-process or check information
about a Pod or the cluster before filtering. They can mark a pod as
unschedulable.
-1. `Filter`: These plugins are the equivalent of Predicates in a scheduling
+1. `filter`: These plugins are the equivalent of Predicates in a scheduling
Policy and are used to filter out nodes that can not run the Pod. Filters
are called in the configured order. A pod is marked as unschedulable if no
nodes pass all the filters.
-1. `PreScore`: This is an informational extension point that can be used
+1. `postFilter`: These plugins are called in their configured order when no
+ feasible nodes were found for the pod. If any `postFilter` plugin marks the
+ Pod _schedulable_, the remaining plugins are not called.
+1. `preScore`: This is an informational extension point that can be used
for doing pre-scoring work.
-1. `Score`: These plugins provide a score to each node that has passed the
+1. `score`: These plugins provide a score to each node that has passed the
filtering phase. The scheduler will then select the node with the highest
weighted scores sum.
-1. `Reserve`: This is an informational extension point that notifies plugins
+1. `reserve`: This is an informational extension point that notifies plugins
when resources have been reserved for a given Pod. Plugins also implement an
`Unreserve` call that gets called in the case of failure during or after
`Reserve`.
-1. `Permit`: These plugins can prevent or delay the binding of a Pod.
-1. `PreBind`: These plugins perform any work required before a Pod is bound.
-1. `Bind`: The plugins bind a Pod to a Node. Bind plugins are called in order
+1. `permit`: These plugins can prevent or delay the binding of a Pod.
+1. `preBind`: These plugins perform any work required before a Pod is bound.
+1. `bind`: The plugins bind a Pod to a Node. `bind` plugins are called in order
and once one has done the binding, the remaining plugins are skipped. At
least one bind plugin is required.
-1. `PostBind`: This is an informational extension point that is called after
+1. `postBind`: This is an informational extension point that is called after
a Pod has been bound.
For each extension point, you could disable specific [default plugins](#scheduling-plugins)
or enable your own. For example:
```yaml
-apiVersion: kubescheduler.config.k8s.io/v1beta1
+apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
profiles:
- plugins:
@@ -99,101 +103,109 @@ desired.
### Scheduling plugins
-1. `UnReserve`: This is an informational extension point that is called if
- a Pod is rejected after being reserved and put on hold by a `Permit` plugin.
-
-## Scheduling plugins
-
The following plugins, enabled by default, implement one or more of these
extension points:
+- `ImageLocality`: Favors nodes that already have the container images that the
+ Pod runs.
+ Extension points: `score`.
+- `TaintToleration`: Implements
+ [taints and tolerations](/docs/concepts/scheduling-eviction/taint-and-toleration/).
+ Implements extension points: `filter`, `preScore`, `score`.
+- `NodeName`: Checks if a Pod spec node name matches the current node.
+ Extension points: `filter`.
+- `NodePorts`: Checks if a node has free ports for the requested Pod ports.
+ Extension points: `preFilter`, `filter`.
+- `NodePreferAvoidPods`: Scores nodes according to the node
+ {{< glossary_tooltip text="annotation" term_id="annotation" >}}
+ `scheduler.alpha.kubernetes.io/preferAvoidPods`.
+ Extension points: `score`.
+- `NodeAffinity`: Implements
+ [node selectors](/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector)
+ and [node affinity](/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity).
+ Extension points: `filter`, `score`.
+- `PodTopologySpread`: Implements
+ [Pod topology spread](/docs/concepts/workloads/pods/pod-topology-spread-constraints/).
+ Extension points: `preFilter`, `filter`, `preScore`, `score`.
+- `NodeUnschedulable`: Filters out nodes that have `.spec.unschedulable` set to
+ true.
+ Extension points: `filter`.
+- `NodeResourcesFit`: Checks if the node has all the resources that the Pod is
+ requesting. The score can use one of three strategies: `LeastAllocated`
+ (default), `MostAllocated` and `RequestedToCapacityRatio`.
+ Extension points: `preFilter`, `filter`, `score`.
+- `NodeResourcesBalancedAllocation`: Favors nodes that would obtain a more
+ balanced resource usage if the Pod is scheduled there.
+ Extension points: `score`.
+- `VolumeBinding`: Checks if the node has or if it can bind the requested
+ {{< glossary_tooltip text="volumes" term_id="volume" >}}.
+ Extension points: `preFilter`, `filter`, `reserve`, `preBind`, `score`.
+ {{< note >}}
+ `score` extension point is enabled when `VolumeCapacityPriority` feature is
+ enabled. It prioritizes the smallest PVs that can fit the requested volume
+ size.
+ {{< /note >}}
+- `VolumeRestrictions`: Checks that volumes mounted in the node satisfy
+ restrictions that are specific to the volume provider.
+ Extension points: `filter`.
+- `VolumeZone`: Checks that volumes requested satisfy any zone requirements they
+ might have.
+ Extension points: `filter`.
+- `NodeVolumeLimits`: Checks that CSI volume limits can be satisfied for the
+ node.
+ Extension points: `filter`.
+- `EBSLimits`: Checks that AWS EBS volume limits can be satisfied for the node.
+ Extension points: `filter`.
+- `GCEPDLimits`: Checks that GCP-PD volume limits can be satisfied for the node.
+ Extension points: `filter`.
+- `AzureDiskLimits`: Checks that Azure disk volume limits can be satisfied for
+ the node.
+ Extension points: `filter`.
+- `InterPodAffinity`: Implements
+ [inter-Pod affinity and anti-affinity](/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity).
+ Extension points: `preFilter`, `filter`, `preScore`, `score`.
+- `PrioritySort`: Provides the default priority based sorting.
+ Extension points: `queueSort`.
+- `DefaultBinder`: Provides the default binding mechanism.
+ Extension points: `bind`.
+- `DefaultPreemption`: Provides the default preemption mechanism.
+ Extension points: `postFilter`.
+
+You can also enable the following plugins, through the component config APIs,
+that are not enabled by default:
+
- `SelectorSpread`: Favors spreading across nodes for Pods that belong to
{{< glossary_tooltip text="Services" term_id="service" >}},
{{< glossary_tooltip text="ReplicaSets" term_id="replica-set" >}} and
{{< glossary_tooltip text="StatefulSets" term_id="statefulset" >}}.
- Extension points: `PreScore`, `Score`.
-- `ImageLocality`: Favors nodes that already have the container images that the
- Pod runs.
- Extension points: `Score`.
-- `TaintToleration`: Implements
- [taints and tolerations](/docs/concepts/scheduling-eviction/taint-and-toleration/).
- Implements extension points: `Filter`, `Prescore`, `Score`.
-- `NodeName`: Checks if a Pod spec node name matches the current node.
- Extension points: `Filter`.
-- `NodePorts`: Checks if a node has free ports for the requested Pod ports.
- Extension points: `PreFilter`, `Filter`.
-- `NodePreferAvoidPods`: Scores nodes according to the node
- {{< glossary_tooltip text="annotation" term_id="annotation" >}}
- `scheduler.alpha.kubernetes.io/preferAvoidPods`.
- Extension points: `Score`.
-- `NodeAffinity`: Implements
- [node selectors](/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector)
- and [node affinity](/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity).
- Extension points: `Filter`, `Score`.
-- `PodTopologySpread`: Implements
- [Pod topology spread](/docs/concepts/workloads/pods/pod-topology-spread-constraints/).
- Extension points: `PreFilter`, `Filter`, `PreScore`, `Score`.
-- `NodeUnschedulable`: Filters out nodes that have `.spec.unschedulable` set to
- true.
- Extension points: `Filter`.
-- `NodeResourcesFit`: Checks if the node has all the resources that the Pod is
- requesting.
- Extension points: `PreFilter`, `Filter`.
-- `NodeResourcesBalancedAllocation`: Favors nodes that would obtain a more
- balanced resource usage if the Pod is scheduled there.
- Extension points: `Score`.
+ Extension points: `preScore`, `score`.
+- `CinderLimits`: Checks that [OpenStack Cinder](https://docs.openstack.org/cinder/)
+ volume limits can be satisfied for the node.
+ Extension points: `filter`.
+
+The following plugins are deprecated and can only be enabled in a `v1beta1`
+configuration:
+
- `NodeResourcesLeastAllocated`: Favors nodes that have a low allocation of
resources.
- Extension points: `Score`.
-- `VolumeBinding`: Checks if the node has or if it can bind the requested
- {{< glossary_tooltip text="volumes" term_id="volume" >}}.
- Extension points: `PreFilter`, `Filter`, `Reserve`, `PreBind`.
-- `VolumeRestrictions`: Checks that volumes mounted in the node satisfy
- restrictions that are specific to the volume provider.
- Extension points: `Filter`.
-- `VolumeZone`: Checks that volumes requested satisfy any zone requirements they
- might have.
- Extension points: `Filter`.
-- `NodeVolumeLimits`: Checks that CSI volume limits can be satisfied for the
- node.
- Extension points: `Filter`.
-- `EBSLimits`: Checks that AWS EBS volume limits can be satisfied for the node.
- Extension points: `Filter`.
-- `GCEPDLimits`: Checks that GCP-PD volume limits can be satisfied for the node.
- Extension points: `Filter`.
-- `AzureDiskLimits`: Checks that Azure disk volume limits can be satisfied for
- the node.
- Extension points: `Filter`.
-- `InterPodAffinity`: Implements
- [inter-Pod affinity and anti-affinity](/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity).
- Extension points: `PreFilter`, `Filter`, `PreScore`, `Score`.
-- `PrioritySort`: Provides the default priority based sorting.
- Extension points: `QueueSort`.
-- `DefaultBinder`: Provides the default binding mechanism.
- Extension points: `Bind`.
-- `DefaultPreemption`: Provides the default preemption mechanism.
- Extension points: `PostFilter`.
-
-You can also enable the following plugins, through the component config APIs,
-that are not enabled by default:
-
+ Extension points: `score`.
- `NodeResourcesMostAllocated`: Favors nodes that have a high allocation of
resources.
- Extension points: `Score`.
+ Extension points: `score`.
- `RequestedToCapacityRatio`: Favor nodes according to a configured function of
the allocated resources.
- Extension points: `Score`.
-- `CinderVolume`: Checks that OpenStack Cinder volume limits can be satisfied
- for the node.
- Extension points: `Filter`.
+ Extension points: `score`.
- `NodeLabel`: Filters and / or scores a node according to configured
{{< glossary_tooltip text="label(s)" term_id="label" >}}.
- Extension points: `Filter`, `Score`.
+ Extension points: `filter`, `score`.
- `ServiceAffinity`: Checks that Pods that belong to a
{{< glossary_tooltip term_id="service" >}} fit in a set of nodes defined by
configured labels. This plugin also favors spreading the Pods belonging to a
Service across nodes.
- Extension points: `PreFilter`, `Filter`, `Score`.
+ Extension points: `preFilter`, `filter`, `score`.
+- `NodePreferAvoidPods`: Prioritizes nodes according to the node annotation
+ `scheduler.alpha.kubernetes.io/preferAvoidPods`.
+ Extension points: `score`.
### Multiple profiles
@@ -206,7 +218,7 @@ profiles: one with the default plugins and one with all scoring plugins
disabled.
```yaml
-apiVersion: kubescheduler.config.k8s.io/v1beta1
+apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
@@ -238,14 +250,15 @@ list.
{{< /note >}}
{{< note >}}
-All profiles must use the same plugin in the QueueSort extension point and have
+All profiles must use the same plugin in the `queueSort` extension point and have
the same configuration parameters (if applicable). This is because the scheduler
only has one pending pods queue.
{{< /note >}}
## {{% heading "whatsnext" %}}
-* Read the [kube-scheduler reference](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-scheduler/)
+* Read the [kube-scheduler reference](/docs/reference/command-line-tools-reference/kube-scheduler/)
* Learn about [scheduling](/docs/concepts/scheduling-eviction/kube-scheduler/)
* Read the [kube-scheduler configuration (v1beta1)](/docs/reference/config-api/kube-scheduler-config.v1beta1/) reference
+* Read the [kube-scheduler configuration (v1beta2)](/docs/reference/config-api/kube-scheduler-config.v1beta2/) reference
diff --git a/content/en/docs/reference/scheduling/policies.md b/content/en/docs/reference/scheduling/policies.md
index fc9a740266..99291c2b37 100644
--- a/content/en/docs/reference/scheduling/policies.md
+++ b/content/en/docs/reference/scheduling/policies.md
@@ -43,21 +43,6 @@ The following *predicates* implement filtering:
- `MaxCSIVolumeCount`: Decides how many {{< glossary_tooltip text="CSI" term_id="csi" >}}
volumes should be attached, and whether that's over a configured limit.
-- `CheckNodeMemoryPressure`: If a Node is reporting memory pressure, and there's no
- configured exception, the Pod won't be scheduled there.
-
-- `CheckNodePIDPressure`: If a Node is reporting that process IDs are scarce, and
- there's no configured exception, the Pod won't be scheduled there.
-
-- `CheckNodeDiskPressure`: If a Node is reporting storage pressure (a filesystem that
- is full or nearly full), and there's no configured exception, the Pod won't be
- scheduled there.
-
-- `CheckNodeCondition`: Nodes can report that they have a completely full filesystem,
- that networking isn't available or that kubelet is otherwise not ready to run Pods.
- If such a condition is set for a Node, and there's no configured exception, the Pod
- won't be scheduled there.
-
- `PodToleratesNodeTaints`: checks if a Pod's {{< glossary_tooltip text="tolerations" term_id="toleration" >}}
can tolerate the Node's {{< glossary_tooltip text="taints" term_id="taint" >}}.
@@ -119,6 +104,6 @@ The following *priorities* implement scoring:
* Learn about [scheduling](/docs/concepts/scheduling-eviction/kube-scheduler/)
* Learn about [kube-scheduler Configuration](/docs/reference/scheduling/config/)
-* Read the [kube-scheduler configuration reference (v1beta1)](/docs/reference/config-api/kube-scheduler-config.v1beta1)
+* Read the [kube-scheduler configuration reference (v1beta2)](/docs/reference/config-api/kube-scheduler-config.v1beta2)
* Read the [kube-scheduler Policy reference (v1)](/docs/reference/config-api/kube-scheduler-policy-config.v1/)
diff --git a/content/en/docs/reference/setup-tools/kubeadm/_index.md b/content/en/docs/reference/setup-tools/kubeadm/_index.md
old mode 100755
new mode 100644
index d747c05124..00120e3d9d
--- a/content/en/docs/reference/setup-tools/kubeadm/_index.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/_index.md
@@ -8,7 +8,7 @@ card:
weight: 40
---
-
Kubeadm is a tool built to provide `kubeadm init` and `kubeadm join` as best-practice "fast paths" for creating Kubernetes clusters.
+
Kubeadm is a tool built to provide `kubeadm init` and `kubeadm join` as best-practice "fast paths" for creating Kubernetes clusters.
kubeadm performs the actions necessary to get a minimum viable cluster up and running. By design, it cares only about bootstrapping, not about provisioning machines. Likewise, installing various nice-to-have addons, like the Kubernetes Dashboard, monitoring solutions, and cloud-specific addons, is not in scope.
@@ -26,5 +26,7 @@ To install kubeadm, see the [installation guide](/docs/setup/production-environm
* [kubeadm config](/docs/reference/setup-tools/kubeadm/kubeadm-config) if you initialized your cluster using kubeadm v1.7.x or lower, to configure your cluster for `kubeadm upgrade`
* [kubeadm token](/docs/reference/setup-tools/kubeadm/kubeadm-token) to manage tokens for `kubeadm join`
* [kubeadm reset](/docs/reference/setup-tools/kubeadm/kubeadm-reset) to revert any changes made to this host by `kubeadm init` or `kubeadm join`
+* [kubeadm certs](/docs/reference/setup-tools/kubeadm/kubeadm-certs) to manage Kubernetes certificates
+* [kubeadm kubeconfig](/docs/reference/setup-tools/kubeadm/kubeadm-kubeconfig) to manage kubeconfig files
* [kubeadm version](/docs/reference/setup-tools/kubeadm/kubeadm-version) to print the kubeadm version
* [kubeadm alpha](/docs/reference/setup-tools/kubeadm/kubeadm-alpha) to preview a set of features made available for gathering feedback from the community
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm.md
index ed03bf49c4..ff545b4042 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm.md
@@ -1,3 +1,16 @@
+
+
+
+kubeadm: easily bootstrap a secure Kubernetes cluster
### Synopsis
@@ -47,14 +60,14 @@ Example usage:
-h, --help |
- | help for kubeadm |
+ | help for kubeadm |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha.md
deleted file mode 100644
index 95b034be1b..0000000000
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha.md
+++ /dev/null
@@ -1,48 +0,0 @@
-
-### Synopsis
-
-
-Kubeadm experimental sub-commands
-
-### Options
-
-
-
-
-
-
-
-
-
-| -h, --help |
-
-
- | help for alpha |
-
-
-
-
-
-
-
-### Options inherited from parent commands
-
-
-
-
-
-
-
-
-
-| --rootfs string |
-
-
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
-
-
-
-
-
-
-
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubeconfig.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubeconfig.md
deleted file mode 100644
index 67f30bc3f8..0000000000
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubeconfig.md
+++ /dev/null
@@ -1,50 +0,0 @@
-
-### Synopsis
-
-
-Kubeconfig file utilities.
-
-Alpha Disclaimer: this command is currently alpha.
-
-### Options
-
-
-
-
-
-
-
-
-
-| -h, --help |
-
-
- | help for kubeconfig |
-
-
-
-
-
-
-
-### Options inherited from parent commands
-
-
-
-
-
-
-
-
-
-| --rootfs string |
-
-
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
-
-
-
-
-
-
-
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubeconfig_user.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubeconfig_user.md
deleted file mode 100644
index bdb246232f..0000000000
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubeconfig_user.md
+++ /dev/null
@@ -1,89 +0,0 @@
-
-### Synopsis
-
-
-Output a kubeconfig file for an additional user.
-
-Alpha Disclaimer: this command is currently alpha.
-
-```
-kubeadm alpha kubeconfig user [flags]
-```
-
-### Examples
-
-```
- # Output a kubeconfig file for an additional user named foo using a kubeadm config file bar
- kubeadm alpha kubeconfig user --client-name=foo --config=bar
-```
-
-### Options
-
-
-
-
-
-
-
-
-
-| --client-name string |
-
-
- | The name of user. It will be used as the CN if client certificates are created |
-
-
-
-| --config string |
-
-
- | Path to a kubeadm configuration file. |
-
-
-
-| -h, --help |
-
-
- | help for user |
-
-
-
-| --org stringSlice |
-
-
- | The orgnizations of the client certificate. It will be used as the O if client certificates are created |
-
-
-
-| --token string |
-
-
- | The token that should be used as the authentication mechanism for this kubeconfig, instead of client certificates |
-
-
-
-
-
-
-
-### Options inherited from parent commands
-
-
-
-
-
-
-
-
-
-| --rootfs string |
-
-
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
-
-
-
-
-
-
-
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubelet.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubelet.md
deleted file mode 100644
index 055c8ecac5..0000000000
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubelet.md
+++ /dev/null
@@ -1,48 +0,0 @@
-
-### Synopsis
-
-
-This command is not meant to be run on its own. See list of available subcommands.
-
-### Options
-
-
-
-
-
-
-
-
-
-| -h, --help |
-
-
- | help for kubelet |
-
-
-
-
-
-
-
-### Options inherited from parent commands
-
-
-
-
-
-
-
-
-
-| --rootfs string |
-
-
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
-
-
-
-
-
-
-
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubelet_config.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubelet_config.md
deleted file mode 100644
index 563d9fe227..0000000000
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubelet_config.md
+++ /dev/null
@@ -1,48 +0,0 @@
-
-### Synopsis
-
-
-This command is not meant to be run on its own. See list of available subcommands.
-
-### Options
-
-
-
-
-
-
-
-
-
-| -h, --help |
-
-
- | help for config |
-
-
-
-
-
-
-
-### Options inherited from parent commands
-
-
-
-
-
-
-
-
-
-| --rootfs string |
-
-
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
-
-
-
-
-
-
-
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubelet_config_enable-dynamic.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubelet_config_enable-dynamic.md
deleted file mode 100644
index 278def1dd3..0000000000
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_kubelet_config_enable-dynamic.md
+++ /dev/null
@@ -1,87 +0,0 @@
-
-### Synopsis
-
-
-Enable or update dynamic kubelet configuration for a Node, against the kubelet-config-1.X ConfigMap in the cluster, where X is the minor version of the desired kubelet version.
-
-WARNING: This feature is still experimental, and disabled by default. Enable only if you know what you are doing, as it may have surprising side-effects at this stage.
-
-Alpha Disclaimer: this command is currently alpha.
-
-```
-kubeadm alpha kubelet config enable-dynamic [flags]
-```
-
-### Examples
-
-```
- # Enable dynamic kubelet configuration for a Node.
- kubeadm alpha phase kubelet enable-dynamic-config --node-name node-1 --kubelet-version 1.18.0
-
- WARNING: This feature is still experimental, and disabled by default. Enable only if you know what you are doing, as it
- may have surprising side-effects at this stage.
-```
-
-### Options
-
-
-
-
-
-
-
-
-
-| -h, --help |
-
-
- | help for enable-dynamic |
-
-
-
-| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
-
-
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
-
-
-
-| --kubelet-version string |
-
-
- | The desired version for the kubelet |
-
-
-
-| --node-name string |
-
-
- | Name of the node that should enable the dynamic kubelet configuration |
-
-
-
-
-
-
-
-### Options inherited from parent commands
-
-
-
-
-
-
-
-
-
-| --rootfs string |
-
-
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
-
-
-
-
-
-
-
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_selfhosting.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_selfhosting.md
deleted file mode 100644
index 77646b064b..0000000000
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_selfhosting.md
+++ /dev/null
@@ -1,48 +0,0 @@
-
-### Synopsis
-
-
-This command is not meant to be run on its own. See list of available subcommands.
-
-### Options
-
-
-
-
-
-
-
-
-
-| -h, --help |
-
-
- | help for selfhosting |
-
-
-
-
-
-
-
-### Options inherited from parent commands
-
-
-
-
-
-
-
-
-
-| --rootfs string |
-
-
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
-
-
-
-
-
-
-
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_selfhosting_pivot.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_selfhosting_pivot.md
deleted file mode 100644
index 554b8fe4c6..0000000000
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_alpha_selfhosting_pivot.md
+++ /dev/null
@@ -1,99 +0,0 @@
-
-### Synopsis
-
-
-Convert static Pod files for control plane components into self-hosted DaemonSets configured via the Kubernetes API.
-
-See the documentation for self-hosting limitations.
-
-Alpha Disclaimer: this command is currently alpha.
-
-```
-kubeadm alpha selfhosting pivot [flags]
-```
-
-### Examples
-
-```
- # Convert a static Pod-hosted control plane into a self-hosted one.
-
- kubeadm alpha phase self-hosting convert-from-staticpods
-```
-
-### Options
-
-
-
-
-
-
-
-
-
-| --cert-dir string Default: "/etc/kubernetes/pki" |
-
-
- | The path where certificates are stored |
-
-
-
-| --config string |
-
-
- | Path to a kubeadm configuration file. |
-
-
-
-| -f, --force |
-
-
- | Pivot the cluster without prompting for confirmation |
-
-
-
-| -h, --help |
-
-
- | help for pivot |
-
-
-
-| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
-
-
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
-
-
-
-| -s, --store-certs-in-secrets |
-
-
- | Enable storing certs in secrets |
-
-
-
-
-
-
-
-### Options inherited from parent commands
-
-
-
-
-
-
-
-
-
-| --rootfs string |
-
-
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
-
-
-
-
-
-
-
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs.md
index fef772e702..9458702330 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs.md
@@ -1,3 +1,16 @@
+
+
+
+Commands related to handling kubernetes certificates
### Synopsis
@@ -17,7 +30,7 @@ Commands related to handling kubernetes certificates
-h, --help |
- | help for certs |
+ | help for certs |
@@ -38,7 +51,7 @@ Commands related to handling kubernetes certificates
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_certificate-key.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_certificate-key.md
index 2de0366641..3f978e50fd 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_certificate-key.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_certificate-key.md
@@ -1,3 +1,16 @@
+
+
+
+Generate certificate keys
### Synopsis
@@ -27,7 +40,7 @@ kubeadm certs certificate-key [flags]
-h, --help |
- | help for certificate-key |
+ | help for certificate-key |
@@ -48,7 +61,7 @@ kubeadm certs certificate-key [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_check-expiration.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_check-expiration.md
index 50a3cb8bf2..e321a5a029 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_check-expiration.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_check-expiration.md
@@ -1,3 +1,16 @@
+
+
+
+Check certificates expiration for a Kubernetes cluster
### Synopsis
@@ -21,28 +34,28 @@ kubeadm certs check-expiration [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for check-expiration |
+ | help for check-expiration |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -63,7 +76,7 @@ kubeadm certs check-expiration [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_generate-csr.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_generate-csr.md
index 81b248e4f0..1abc7d9bac 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_generate-csr.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_generate-csr.md
@@ -1,3 +1,16 @@
+
+
+
+Generate keys and certificate signing requests
### Synopsis
@@ -16,7 +29,7 @@ kubeadm certs generate-csr [flags]
```
# The following command will generate keys and CSRs for all control-plane certificates and kubeconfig files:
- kubeadm alpha certs generate-csr --kubeconfig-dir /tmp/etc-k8s --cert-dir /tmp/etc-k8s/pki
+ kubeadm certs generate-csr --kubeconfig-dir /tmp/etc-k8s --cert-dir /tmp/etc-k8s/pki
```
### Options
@@ -32,28 +45,28 @@ kubeadm certs generate-csr [flags]
--cert-dir string |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for generate-csr |
+ | help for generate-csr |
| --kubeconfig-dir string Default: "/etc/kubernetes" |
- | The path where to save the kubeconfig file. |
+ | The path where to save the kubeconfig file. |
@@ -74,7 +87,7 @@ kubeadm certs generate-csr [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew.md
index 8b627a595d..e728f9f060 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew.md
@@ -1,3 +1,16 @@
+
+
+
+Renew certificates for a Kubernetes cluster
### Synopsis
@@ -21,7 +34,7 @@ kubeadm certs renew [flags]
-h, --help |
- | help for renew |
+ | help for renew |
@@ -42,7 +55,7 @@ kubeadm certs renew [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_admin.conf.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_admin.conf.md
index 536164c45a..31192cf3f7 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_admin.conf.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_admin.conf.md
@@ -1,3 +1,16 @@
+
+
+
+Renew the certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself
### Synopsis
@@ -27,42 +40,28 @@ kubeadm certs renew admin.conf [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --csr-dir string |
-
-
- | The path to output the CSRs and private keys to |
-
-
-
-| --csr-only |
-
-
- | Create CSRs instead of generating certificates |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for admin.conf |
+ | help for admin.conf |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -83,7 +82,7 @@ kubeadm certs renew admin.conf [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_all.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_all.md
index 13c12ed0d0..77ea6e45a1 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_all.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_all.md
@@ -1,3 +1,16 @@
+
+
+
+Renew all available certificates
### Synopsis
@@ -21,42 +34,28 @@ kubeadm certs renew all [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --csr-dir string |
-
-
- | The path to output the CSRs and private keys to |
-
-
-
-| --csr-only |
-
-
- | Create CSRs instead of generating certificates |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for all |
+ | help for all |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -77,7 +76,7 @@ kubeadm certs renew all [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver-etcd-client.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver-etcd-client.md
index fac6861a7c..f95a51e1a7 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver-etcd-client.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver-etcd-client.md
@@ -1,3 +1,16 @@
+
+
+
+Renew the certificate the apiserver uses to access etcd
### Synopsis
@@ -27,42 +40,28 @@ kubeadm certs renew apiserver-etcd-client [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --csr-dir string |
-
-
- | The path to output the CSRs and private keys to |
-
-
-
-| --csr-only |
-
-
- | Create CSRs instead of generating certificates |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for apiserver-etcd-client |
+ | help for apiserver-etcd-client |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -83,7 +82,7 @@ kubeadm certs renew apiserver-etcd-client [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver-kubelet-client.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver-kubelet-client.md
index 030fb1425a..27ba374b9f 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver-kubelet-client.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver-kubelet-client.md
@@ -1,3 +1,16 @@
+
+
+
+Renew the certificate for the API server to connect to kubelet
### Synopsis
@@ -27,42 +40,28 @@ kubeadm certs renew apiserver-kubelet-client [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --csr-dir string |
-
-
- | The path to output the CSRs and private keys to |
-
-
-
-| --csr-only |
-
-
- | Create CSRs instead of generating certificates |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for apiserver-kubelet-client |
+ | help for apiserver-kubelet-client |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -83,7 +82,7 @@ kubeadm certs renew apiserver-kubelet-client [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver.md
index 8ab01efd89..7dc59c45d4 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_apiserver.md
@@ -1,3 +1,16 @@
+
+
+
+Renew the certificate for serving the Kubernetes API
### Synopsis
@@ -27,42 +40,28 @@ kubeadm certs renew apiserver [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --csr-dir string |
-
-
- | The path to output the CSRs and private keys to |
-
-
-
-| --csr-only |
-
-
- | Create CSRs instead of generating certificates |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for apiserver |
+ | help for apiserver |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -83,7 +82,7 @@ kubeadm certs renew apiserver [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_controller-manager.conf.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_controller-manager.conf.md
index 10b44f7c3e..4df1d8221c 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_controller-manager.conf.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_controller-manager.conf.md
@@ -1,3 +1,16 @@
+
+
+
+Renew the certificate embedded in the kubeconfig file for the controller manager to use
### Synopsis
@@ -27,42 +40,28 @@ kubeadm certs renew controller-manager.conf [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --csr-dir string |
-
-
- | The path to output the CSRs and private keys to |
-
-
-
-| --csr-only |
-
-
- | Create CSRs instead of generating certificates |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for controller-manager.conf |
+ | help for controller-manager.conf |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -83,7 +82,7 @@ kubeadm certs renew controller-manager.conf [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-healthcheck-client.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-healthcheck-client.md
index b9ddadd6f1..84d75bfd36 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-healthcheck-client.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-healthcheck-client.md
@@ -1,3 +1,16 @@
+
+
+
+Renew the certificate for liveness probes to healthcheck etcd
### Synopsis
@@ -27,42 +40,28 @@ kubeadm certs renew etcd-healthcheck-client [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --csr-dir string |
-
-
- | The path to output the CSRs and private keys to |
-
-
-
-| --csr-only |
-
-
- | Create CSRs instead of generating certificates |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for etcd-healthcheck-client |
+ | help for etcd-healthcheck-client |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -83,7 +82,7 @@ kubeadm certs renew etcd-healthcheck-client [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-peer.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-peer.md
index 3b15fa02f0..60acaae1db 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-peer.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-peer.md
@@ -1,3 +1,16 @@
+
+
+
+Renew the certificate for etcd nodes to communicate with each other
### Synopsis
@@ -27,42 +40,28 @@ kubeadm certs renew etcd-peer [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --csr-dir string |
-
-
- | The path to output the CSRs and private keys to |
-
-
-
-| --csr-only |
-
-
- | Create CSRs instead of generating certificates |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for etcd-peer |
+ | help for etcd-peer |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -83,7 +82,7 @@ kubeadm certs renew etcd-peer [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-server.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-server.md
index 82b9e43e34..969157fe3e 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-server.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_etcd-server.md
@@ -1,3 +1,16 @@
+
+
+
+Renew the certificate for serving etcd
### Synopsis
@@ -27,42 +40,28 @@ kubeadm certs renew etcd-server [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --csr-dir string |
-
-
- | The path to output the CSRs and private keys to |
-
-
-
-| --csr-only |
-
-
- | Create CSRs instead of generating certificates |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for etcd-server |
+ | help for etcd-server |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -83,7 +82,7 @@ kubeadm certs renew etcd-server [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_front-proxy-client.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_front-proxy-client.md
index b1f3bc0c84..3d9564e485 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_front-proxy-client.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_front-proxy-client.md
@@ -1,3 +1,16 @@
+
+
+
+Renew the certificate for the front proxy client
### Synopsis
@@ -27,42 +40,28 @@ kubeadm certs renew front-proxy-client [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --csr-dir string |
-
-
- | The path to output the CSRs and private keys to |
-
-
-
-| --csr-only |
-
-
- | Create CSRs instead of generating certificates |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for front-proxy-client |
+ | help for front-proxy-client |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -83,7 +82,7 @@ kubeadm certs renew front-proxy-client [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_scheduler.conf.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_scheduler.conf.md
index f26fbc22b1..6c8d40dae3 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_scheduler.conf.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_certs_renew_scheduler.conf.md
@@ -1,3 +1,16 @@
+
+
+
+Renew the certificate embedded in the kubeconfig file for the scheduler manager to use
### Synopsis
@@ -27,42 +40,28 @@ kubeadm certs renew scheduler.conf [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save the certificates |
+ | The path where to save the certificates |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --csr-dir string |
-
-
- | The path to output the CSRs and private keys to |
-
-
-
-| --csr-only |
-
-
- | Create CSRs instead of generating certificates |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for scheduler.conf |
+ | help for scheduler.conf |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -83,7 +82,7 @@ kubeadm certs renew scheduler.conf [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_completion.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_completion.md
index f5a69d79fd..5fe7d65b40 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_completion.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_completion.md
@@ -1,3 +1,16 @@
+
+
+
+Output shell completion code for the specified shell (bash or zsh)
### Synopsis
@@ -59,7 +72,7 @@ source <(kubeadm completion zsh)
-h, --help |
- | help for completion |
+ | help for completion |
@@ -80,7 +93,7 @@ source <(kubeadm completion zsh)
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config.md
index b39cdd7a0d..50cb9f63b9 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config.md
@@ -1,3 +1,16 @@
+
+
+
+Manage configuration for a kubeadm cluster persisted in a ConfigMap in the cluster
### Synopsis
@@ -26,14 +39,14 @@ kubeadm config [flags]
-h, --help |
- | help for config |
+ | help for config |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -54,7 +67,7 @@ kubeadm config [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images.md
index 436f3c3c7e..0f85b4fbc2 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images.md
@@ -1,3 +1,16 @@
+
+
+
+Interact with container images used by kubeadm
### Synopsis
@@ -21,7 +34,7 @@ kubeadm config images [flags]
-h, --help |
- | help for images |
+ | help for images |
@@ -42,14 +55,14 @@ kubeadm config images [flags]
--kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images_list.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images_list.md
index 842fb2fe92..b7f3e05a8b 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images_list.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images_list.md
@@ -1,3 +1,16 @@
+
+
+
+Print a list of images kubeadm will use. The configuration file is used in case any images or image repositories are customized
### Synopsis
@@ -21,49 +34,56 @@ kubeadm config images list [flags]
--allow-missing-template-keys Default: true |
- | If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to golang and jsonpath output formats. |
+ | If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to golang and jsonpath output formats. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -o, --experimental-output string Default: "text" |
- | Output format. One of: text|json|yaml|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file. |
+ | Output format. One of: text|json|yaml|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file. |
| --feature-gates string |
- | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (ALPHA - default=false) PublicKeysECDSA=true|false (ALPHA - default=false) |
+ | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (BETA - default=true) PublicKeysECDSA=true|false (ALPHA - default=false) RootlessControlPlane=true|false (ALPHA - default=false) |
| -h, --help |
- | help for list |
+ | help for list |
| --image-repository string Default: "k8s.gcr.io" |
- | Choose a container registry to pull control plane images from |
+ | Choose a container registry to pull control plane images from |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
+
+
+
+| --show-managed-fields |
+
+
+ | If true, keep the managedFields when printing objects in JSON or YAML format. |
@@ -84,14 +104,14 @@ kubeadm config images list [flags]
--kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images_pull.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images_pull.md
index d2f5961f85..a44970a68a 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images_pull.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_images_pull.md
@@ -1,3 +1,16 @@
+
+
+
+Pull images used by kubeadm
### Synopsis
@@ -21,42 +34,42 @@ kubeadm config images pull [flags]
--config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --cri-socket string |
- | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
+ | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
| --feature-gates string |
- | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (ALPHA - default=false) PublicKeysECDSA=true|false (ALPHA - default=false) |
+ | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (BETA - default=true) PublicKeysECDSA=true|false (ALPHA - default=false) RootlessControlPlane=true|false (ALPHA - default=false) |
| -h, --help |
- | help for pull |
+ | help for pull |
| --image-repository string Default: "k8s.gcr.io" |
- | Choose a container registry to pull control plane images from |
+ | Choose a container registry to pull control plane images from |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -77,14 +90,14 @@ kubeadm config images pull [flags]
--kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_migrate.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_migrate.md
index d07ffe8677..8aa2f6f1d2 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_migrate.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_migrate.md
@@ -1,3 +1,16 @@
+
+
+
+Read an older version of the kubeadm configuration API types from a file, and output the similar config object for the newer version
### Synopsis
@@ -6,9 +19,9 @@
This command lets you convert configuration objects of older versions to the latest supported version,
locally in the CLI tool without ever touching anything in the cluster.
In this version of kubeadm, the following API versions are supported:
-- kubeadm.k8s.io/v1beta2
+- kubeadm.k8s.io/v1beta3
-Further, kubeadm can only write out config of version "kubeadm.k8s.io/v1beta2", but read both types.
+Further, kubeadm can only write out config of version "kubeadm.k8s.io/v1beta3", but read both types.
So regardless of what version you pass to the --old-config parameter here, the API object will be
read, deserialized, defaulted, converted, validated, and re-serialized when written to stdout or
--new-config if specified.
@@ -34,21 +47,21 @@ kubeadm config migrate [flags]
-h, --help |
- | help for migrate |
+ | help for migrate |
| --new-config string |
- | Path to the resulting equivalent kubeadm config file using the new API version. Optional, if not specified output will be sent to STDOUT. |
+ | Path to the resulting equivalent kubeadm config file using the new API version. Optional, if not specified output will be sent to STDOUT. |
| --old-config string |
- | Path to the kubeadm config file that is using an old API version and should be converted. This flag is mandatory. |
+ | Path to the kubeadm config file that is using an old API version and should be converted. This flag is mandatory. |
@@ -69,14 +82,14 @@ kubeadm config migrate [flags]
--kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print.md
index c6e1ea2173..e8aa81abf6 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print.md
@@ -1,10 +1,23 @@
+
+
+
+Print configuration
### Synopsis
This command prints configurations for subcommands provided.
-For details, see: https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
+For details, see: https://pkg.go.dev/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm#section-directories
```
kubeadm config print [flags]
@@ -23,7 +36,7 @@ kubeadm config print [flags]
-h, --help |
- | help for print |
+ | help for print |
@@ -44,14 +57,14 @@ kubeadm config print [flags]
--kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print_init-defaults.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print_init-defaults.md
index adc76ee41c..f8200dfd52 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print_init-defaults.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print_init-defaults.md
@@ -1,3 +1,16 @@
+
+
+
+Print default init configuration, that can be used for 'kubeadm init'
### Synopsis
@@ -5,7 +18,7 @@
This command prints objects such as the default init configuration that is used for 'kubeadm init'.
-Note that sensitive values like the Bootstrap Token fields are replaced with placeholder values like {"abcdef.0123456789abcdef" "" "nil" <nil> [] []} in order to pass validation but
+Note that sensitive values like the Bootstrap Token fields are replaced with placeholder values like "abcdef.0123456789abcdef" in order to pass validation but
not perform the real computation for creating a token.
@@ -23,17 +36,17 @@ kubeadm config print init-defaults [flags]
-| --component-configs stringSlice |
+--component-configs strings |
- | A comma-separated list for component config API objects to print the default values for. Available values: [KubeProxyConfiguration KubeletConfiguration]. If this flag is not set, no component configs will be printed. |
+ | A comma-separated list for component config API objects to print the default values for. Available values: [KubeProxyConfiguration KubeletConfiguration]. If this flag is not set, no component configs will be printed. |
| -h, --help |
- | help for init-defaults |
+ | help for init-defaults |
@@ -54,14 +67,14 @@ kubeadm config print init-defaults [flags]
--kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print_join-defaults.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print_join-defaults.md
index b1c976c663..1c634871eb 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print_join-defaults.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_print_join-defaults.md
@@ -1,3 +1,16 @@
+
+
+
+Print default join configuration, that can be used for 'kubeadm join'
### Synopsis
@@ -5,7 +18,7 @@
This command prints objects such as the default join configuration that is used for 'kubeadm join'.
-Note that sensitive values like the Bootstrap Token fields are replaced with placeholder values like {"abcdef.0123456789abcdef" "" "nil" <nil> [] []} in order to pass validation but
+Note that sensitive values like the Bootstrap Token fields are replaced with placeholder values like "abcdef.0123456789abcdef" in order to pass validation but
not perform the real computation for creating a token.
@@ -23,17 +36,17 @@ kubeadm config print join-defaults [flags]
-| --component-configs stringSlice |
+--component-configs strings |
- | A comma-separated list for component config API objects to print the default values for. Available values: [KubeProxyConfiguration KubeletConfiguration]. If this flag is not set, no component configs will be printed. |
+ | A comma-separated list for component config API objects to print the default values for. Available values: [KubeProxyConfiguration KubeletConfiguration]. If this flag is not set, no component configs will be printed. |
| -h, --help |
- | help for join-defaults |
+ | help for join-defaults |
@@ -54,14 +67,14 @@ kubeadm config print join-defaults [flags]
--kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_view.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_view.md
deleted file mode 100644
index c3a3137105..0000000000
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_config_view.md
+++ /dev/null
@@ -1,63 +0,0 @@
-
-### Synopsis
-
-
-
-Using this command, you can view the ConfigMap in the cluster where the configuration for kubeadm is located.
-
-The configuration is located in the "kube-system" namespace in the "kubeadm-config" ConfigMap.
-
-
-```
-kubeadm config view [flags]
-```
-
-### Options
-
-
-
-
-
-
-
-
-
-| -h, --help |
-
-
- | help for view |
-
-
-
-
-
-
-
-### Options inherited from parent commands
-
-
-
-
-
-
-
-
-
-| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
-
-
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
-
-
-
-| --rootfs string |
-
-
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
-
-
-
-
-
-
-
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init.md
index 49c7fd112a..62f4ca7e5b 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init.md
@@ -1,3 +1,16 @@
+
+
+
+Run this command in order to set up the Kubernetes control plane
### Synopsis
@@ -39,7 +52,7 @@ mark-control-plane Mark a node as a control-plane
bootstrap-token Generates bootstrap tokens used to join a node to a cluster
kubelet-finalize Updates settings relevant to the kubelet after TLS bootstrap
/experimental-cert-rotation Enable kubelet client certificate rotation
-addon Install required addons for passing Conformance tests
+addon Install required addons for passing conformance tests
/coredns Install the CoreDNS addon to a Kubernetes cluster
/kube-proxy Install the kube-proxy addon to a Kubernetes cluster
```
@@ -62,175 +75,175 @@ kubeadm init [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | Port for the API Server to bind to. |
+ | Port for the API Server to bind to. |
-| --apiserver-cert-extra-sans stringSlice |
+--apiserver-cert-extra-sans strings |
- | Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate. Can be both IP addresses and DNS names. |
+ | Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate. Can be both IP addresses and DNS names. |
| --cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --certificate-key string |
- | Key used to encrypt the control-plane certificates in the kubeadm-certs Secret. |
+ | Key used to encrypt the control-plane certificates in the kubeadm-certs Secret. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
| --cri-socket string |
- | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
+ | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
| --dry-run |
- | Don't apply any changes; just output what would be done. |
-
-
-
-| --experimental-patches string |
-
-
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | Don't apply any changes; just output what would be done. |
| --feature-gates string |
- | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (ALPHA - default=false) PublicKeysECDSA=true|false (ALPHA - default=false) |
+ | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (BETA - default=true) PublicKeysECDSA=true|false (ALPHA - default=false) RootlessControlPlane=true|false (ALPHA - default=false) |
| -h, --help |
- | help for init |
+ | help for init |
-| --ignore-preflight-errors stringSlice |
+--ignore-preflight-errors strings |
- | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
+ | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
| --image-repository string Default: "k8s.gcr.io" |
- | Choose a container registry to pull control plane images from |
+ | Choose a container registry to pull control plane images from |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
+
+
+
+| --patches string |
+
+
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
| --pod-network-cidr string |
- | Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node. |
+ | Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node. |
| --service-cidr string Default: "10.96.0.0/12" |
- | Use alternative range of IP address for service VIPs. |
+ | Use alternative range of IP address for service VIPs. |
| --service-dns-domain string Default: "cluster.local" |
- | Use alternative domain for services, e.g. "myorg.internal". |
+ | Use alternative domain for services, e.g. "myorg.internal". |
| --skip-certificate-key-print |
- | Don't print the key used to encrypt the control-plane certificates. |
+ | Don't print the key used to encrypt the control-plane certificates. |
-| --skip-phases stringSlice |
+--skip-phases strings |
- | List of phases to be skipped |
+ | List of phases to be skipped |
| --skip-token-print |
- | Skip printing of the default bootstrap token generated by 'kubeadm init'. |
+ | Skip printing of the default bootstrap token generated by 'kubeadm init'. |
| --token string |
- | The token to use for establishing bidirectional trust between nodes and control-plane nodes. The format is [a-z0-9]{6}\.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef |
+ | The token to use for establishing bidirectional trust between nodes and control-plane nodes. The format is [a-z0-9]{6}.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef |
| --token-ttl duration Default: 24h0m0s |
- | The duration before the token is automatically deleted (e.g. 1s, 2m, 3h). If set to '0', the token will never expire |
+ | The duration before the token is automatically deleted (e.g. 1s, 2m, 3h). If set to '0', the token will never expire |
| --upload-certs |
- | Upload control-plane certificates to the kubeadm-certs Secret. |
+ | Upload control-plane certificates to the kubeadm-certs Secret. |
@@ -251,7 +264,7 @@ kubeadm init [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase.md
index 2db3ea5e54..48ccd99cd5 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase.md
@@ -1,3 +1,16 @@
+
+
+
+Use this command to invoke single phase of the init workflow
### Synopsis
@@ -17,7 +30,7 @@ Use this command to invoke single phase of the init workflow
-h, --help |
- | help for phase |
+ | help for phase |
@@ -38,7 +51,7 @@ Use this command to invoke single phase of the init workflow
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon.md
index 67b9c3af75..64777661d0 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon.md
@@ -1,3 +1,16 @@
+
+
+
+Install required addons for passing conformance tests
### Synopsis
@@ -21,7 +34,7 @@ kubeadm init phase addon [flags]
-h, --help |
- | help for addon |
+ | help for addon |
@@ -42,7 +55,7 @@ kubeadm init phase addon [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_all.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_all.md
index 103dd7e7c5..c30d45980c 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_all.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_all.md
@@ -1,3 +1,16 @@
+
+
+
+Install all the addons
### Synopsis
@@ -21,84 +34,84 @@ kubeadm init phase addon all [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | Port for the API Server to bind to. |
+ | Port for the API Server to bind to. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
| --feature-gates string |
- | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (ALPHA - default=false) PublicKeysECDSA=true|false (ALPHA - default=false) |
+ | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (BETA - default=true) PublicKeysECDSA=true|false (ALPHA - default=false) RootlessControlPlane=true|false (ALPHA - default=false) |
| -h, --help |
- | help for all |
+ | help for all |
| --image-repository string Default: "k8s.gcr.io" |
- | Choose a container registry to pull control plane images from |
+ | Choose a container registry to pull control plane images from |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
| --pod-network-cidr string |
- | Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node. |
+ | Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node. |
| --service-cidr string Default: "10.96.0.0/12" |
- | Use alternative range of IP address for service VIPs. |
+ | Use alternative range of IP address for service VIPs. |
| --service-dns-domain string Default: "cluster.local" |
- | Use alternative domain for services, e.g. "myorg.internal". |
+ | Use alternative domain for services, e.g. "myorg.internal". |
@@ -119,7 +132,7 @@ kubeadm init phase addon all [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_coredns.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_coredns.md
index 3eebcb828b..3e4076a862 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_coredns.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_coredns.md
@@ -1,3 +1,16 @@
+
+
+
+Install the CoreDNS addon to a Kubernetes cluster
### Synopsis
@@ -21,56 +34,56 @@ kubeadm init phase addon coredns [flags]
--config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --feature-gates string |
- | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (ALPHA - default=false) PublicKeysECDSA=true|false (ALPHA - default=false) |
+ | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (BETA - default=true) PublicKeysECDSA=true|false (ALPHA - default=false) RootlessControlPlane=true|false (ALPHA - default=false) |
| -h, --help |
- | help for coredns |
+ | help for coredns |
| --image-repository string Default: "k8s.gcr.io" |
- | Choose a container registry to pull control plane images from |
+ | Choose a container registry to pull control plane images from |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
| --service-cidr string Default: "10.96.0.0/12" |
- | Use alternative range of IP address for service VIPs. |
+ | Use alternative range of IP address for service VIPs. |
| --service-dns-domain string Default: "cluster.local" |
- | Use alternative domain for services, e.g. "myorg.internal". |
+ | Use alternative domain for services, e.g. "myorg.internal". |
@@ -91,7 +104,7 @@ kubeadm init phase addon coredns [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_kube-proxy.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_kube-proxy.md
index 78140e94e8..4dc9a18339 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_kube-proxy.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_addon_kube-proxy.md
@@ -1,3 +1,16 @@
+
+
+
+Install the kube-proxy addon to a Kubernetes cluster
### Synopsis
@@ -21,63 +34,63 @@ kubeadm init phase addon kube-proxy [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | Port for the API Server to bind to. |
+ | Port for the API Server to bind to. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
| -h, --help |
- | help for kube-proxy |
+ | help for kube-proxy |
| --image-repository string Default: "k8s.gcr.io" |
- | Choose a container registry to pull control plane images from |
+ | Choose a container registry to pull control plane images from |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
| --pod-network-cidr string |
- | Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node. |
+ | Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node. |
@@ -98,7 +111,7 @@ kubeadm init phase addon kube-proxy [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_bootstrap-token.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_bootstrap-token.md
index 123ab38fdc..652399d5cf 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_bootstrap-token.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_bootstrap-token.md
@@ -1,3 +1,16 @@
+
+
+
+Generates bootstrap tokens used to join a node to a cluster
### Synopsis
@@ -31,28 +44,28 @@ kubeadm init phase bootstrap-token [flags]
--config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for bootstrap-token |
+ | help for bootstrap-token |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --skip-token-print |
- | Skip printing of the default bootstrap token generated by 'kubeadm init'. |
+ | Skip printing of the default bootstrap token generated by 'kubeadm init'. |
@@ -73,7 +86,7 @@ kubeadm init phase bootstrap-token [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs.md
index 28f5acc3e3..c779b920e1 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs.md
@@ -1,3 +1,16 @@
+
+
+
+Certificate generation
### Synopsis
@@ -21,7 +34,7 @@ kubeadm init phase certs [flags]
-h, --help |
- | help for certs |
+ | help for certs |
@@ -42,7 +55,7 @@ kubeadm init phase certs [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_all.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_all.md
index 7ac391c078..7485310462 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_all.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_all.md
@@ -1,3 +1,16 @@
+
+
+
+Generate all certificates
### Synopsis
@@ -21,63 +34,63 @@ kubeadm init phase certs all [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
-| --apiserver-cert-extra-sans stringSlice |
+--apiserver-cert-extra-sans strings |
- | Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate. Can be both IP addresses and DNS names. |
+ | Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate. Can be both IP addresses and DNS names. |
| --cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
| -h, --help |
- | help for all |
+ | help for all |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
| --service-cidr string Default: "10.96.0.0/12" |
- | Use alternative range of IP address for service VIPs. |
+ | Use alternative range of IP address for service VIPs. |
| --service-dns-domain string Default: "cluster.local" |
- | Use alternative domain for services, e.g. "myorg.internal". |
+ | Use alternative domain for services, e.g. "myorg.internal". |
@@ -98,7 +111,7 @@ kubeadm init phase certs all [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver-etcd-client.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver-etcd-client.md
index eef07b2afa..3280fdc0eb 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver-etcd-client.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver-etcd-client.md
@@ -1,8 +1,21 @@
+
+
+
+Generate the certificate the apiserver uses to access etcd
### Synopsis
-Generate the certificate the apiserver uses to access etcd, and save them into apiserver-etcd-client.cert and apiserver-etcd-client.key files.
+Generate the certificate the apiserver uses to access etcd, and save them into apiserver-etcd-client.crt and apiserver-etcd-client.key files.
If both files already exist, kubeadm skips the generation step and existing files will be used.
@@ -25,28 +38,28 @@ kubeadm init phase certs apiserver-etcd-client [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for apiserver-etcd-client |
+ | help for apiserver-etcd-client |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -67,7 +80,7 @@ kubeadm init phase certs apiserver-etcd-client [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver-kubelet-client.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver-kubelet-client.md
index 1d03b13ef1..f98f75def0 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver-kubelet-client.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver-kubelet-client.md
@@ -1,8 +1,21 @@
+
+
+
+Generate the certificate for the API server to connect to kubelet
### Synopsis
-Generate the certificate for the API server to connect to kubelet, and save them into apiserver-kubelet-client.cert and apiserver-kubelet-client.key files.
+Generate the certificate for the API server to connect to kubelet, and save them into apiserver-kubelet-client.crt and apiserver-kubelet-client.key files.
If both files already exist, kubeadm skips the generation step and existing files will be used.
@@ -25,28 +38,28 @@ kubeadm init phase certs apiserver-kubelet-client [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for apiserver-kubelet-client |
+ | help for apiserver-kubelet-client |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -67,7 +80,7 @@ kubeadm init phase certs apiserver-kubelet-client [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver.md
index 28f6cc6244..afa192d3de 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_apiserver.md
@@ -1,10 +1,21 @@
+
+
+
+Generate the certificate for serving the Kubernetes API
### Synopsis
-Generate the certificate for serving the Kubernetes API, and save them into apiserver.cert and apiserver.key files.
-
-Default SANs are kubernetes, kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster.local, 10.96.0.1, 127.0.0.1
+Generate the certificate for serving the Kubernetes API, and save them into apiserver.crt and apiserver.key files.
If both files already exist, kubeadm skips the generation step and existing files will be used.
@@ -27,63 +38,63 @@ kubeadm init phase certs apiserver [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
-| --apiserver-cert-extra-sans stringSlice |
+--apiserver-cert-extra-sans strings |
- | Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate. Can be both IP addresses and DNS names. |
+ | Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate. Can be both IP addresses and DNS names. |
| --cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
| -h, --help |
- | help for apiserver |
+ | help for apiserver |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
| --service-cidr string Default: "10.96.0.0/12" |
- | Use alternative range of IP address for service VIPs. |
+ | Use alternative range of IP address for service VIPs. |
| --service-dns-domain string Default: "cluster.local" |
- | Use alternative domain for services, e.g. "myorg.internal". |
+ | Use alternative domain for services, e.g. "myorg.internal". |
@@ -104,7 +115,7 @@ kubeadm init phase certs apiserver [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_ca.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_ca.md
index 81ccc2cbc2..b94061e8d4 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_ca.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_ca.md
@@ -1,8 +1,21 @@
+
+
+
+Generate the self-signed Kubernetes CA to provision identities for other Kubernetes components
### Synopsis
-Generate the self-signed Kubernetes CA to provision identities for other Kubernetes components, and save them into ca.cert and ca.key files.
+Generate the self-signed Kubernetes CA to provision identities for other Kubernetes components, and save them into ca.crt and ca.key files.
If both files already exist, kubeadm skips the generation step and existing files will be used.
@@ -25,28 +38,28 @@ kubeadm init phase certs ca [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for ca |
+ | help for ca |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -67,7 +80,7 @@ kubeadm init phase certs ca [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-ca.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-ca.md
index 17066413dd..547601e364 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-ca.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-ca.md
@@ -1,8 +1,21 @@
+
+
+
+Generate the self-signed CA to provision identities for etcd
### Synopsis
-Generate the self-signed CA to provision identities for etcd, and save them into etcd/ca.cert and etcd/ca.key files.
+Generate the self-signed CA to provision identities for etcd, and save them into etcd/ca.crt and etcd/ca.key files.
If both files already exist, kubeadm skips the generation step and existing files will be used.
@@ -25,28 +38,28 @@ kubeadm init phase certs etcd-ca [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for etcd-ca |
+ | help for etcd-ca |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -67,7 +80,7 @@ kubeadm init phase certs etcd-ca [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-healthcheck-client.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-healthcheck-client.md
index 6ee2e7ea11..ea3755c786 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-healthcheck-client.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-healthcheck-client.md
@@ -1,8 +1,21 @@
+
+
+
+Generate the certificate for liveness probes to healthcheck etcd
### Synopsis
-Generate the certificate for liveness probes to healthcheck etcd, and save them into etcd/healthcheck-client.cert and etcd/healthcheck-client.key files.
+Generate the certificate for liveness probes to healthcheck etcd, and save them into etcd/healthcheck-client.crt and etcd/healthcheck-client.key files.
If both files already exist, kubeadm skips the generation step and existing files will be used.
@@ -25,28 +38,28 @@ kubeadm init phase certs etcd-healthcheck-client [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for etcd-healthcheck-client |
+ | help for etcd-healthcheck-client |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -67,7 +80,7 @@ kubeadm init phase certs etcd-healthcheck-client [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-peer.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-peer.md
index a127d4095a..904b00a68f 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-peer.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-peer.md
@@ -1,8 +1,21 @@
+
+
+
+Generate the certificate for etcd nodes to communicate with each other
### Synopsis
-Generate the certificate for etcd nodes to communicate with each other, and save them into etcd/peer.cert and etcd/peer.key files.
+Generate the certificate for etcd nodes to communicate with each other, and save them into etcd/peer.crt and etcd/peer.key files.
Default SANs are localhost, 127.0.0.1, 127.0.0.1, ::1
@@ -27,28 +40,28 @@ kubeadm init phase certs etcd-peer [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for etcd-peer |
+ | help for etcd-peer |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -69,7 +82,7 @@ kubeadm init phase certs etcd-peer [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-server.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-server.md
index 07a58373c1..4b8894075c 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-server.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_etcd-server.md
@@ -1,8 +1,21 @@
+
+
+
+Generate the certificate for serving etcd
### Synopsis
-Generate the certificate for serving etcd, and save them into etcd/server.cert and etcd/server.key files.
+Generate the certificate for serving etcd, and save them into etcd/server.crt and etcd/server.key files.
Default SANs are localhost, 127.0.0.1, 127.0.0.1, ::1
@@ -27,28 +40,28 @@ kubeadm init phase certs etcd-server [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for etcd-server |
+ | help for etcd-server |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -69,7 +82,7 @@ kubeadm init phase certs etcd-server [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_front-proxy-ca.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_front-proxy-ca.md
index 4a05b78d77..8193d38fce 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_front-proxy-ca.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_front-proxy-ca.md
@@ -1,8 +1,21 @@
+
+
+
+Generate the self-signed CA to provision identities for front proxy
### Synopsis
-Generate the self-signed CA to provision identities for front proxy, and save them into front-proxy-ca.cert and front-proxy-ca.key files.
+Generate the self-signed CA to provision identities for front proxy, and save them into front-proxy-ca.crt and front-proxy-ca.key files.
If both files already exist, kubeadm skips the generation step and existing files will be used.
@@ -25,28 +38,28 @@ kubeadm init phase certs front-proxy-ca [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for front-proxy-ca |
+ | help for front-proxy-ca |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -67,7 +80,7 @@ kubeadm init phase certs front-proxy-ca [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_front-proxy-client.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_front-proxy-client.md
index 8e2d76f451..d5cff5b662 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_front-proxy-client.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_front-proxy-client.md
@@ -1,8 +1,21 @@
+
+
+
+Generate the certificate for the front proxy client
### Synopsis
-Generate the certificate for the front proxy client, and save them into front-proxy-client.cert and front-proxy-client.key files.
+Generate the certificate for the front proxy client, and save them into front-proxy-client.crt and front-proxy-client.key files.
If both files already exist, kubeadm skips the generation step and existing files will be used.
@@ -25,28 +38,28 @@ kubeadm init phase certs front-proxy-client [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for front-proxy-client |
+ | help for front-proxy-client |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -67,7 +80,7 @@ kubeadm init phase certs front-proxy-client [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_sa.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_sa.md
index 8d36df6c52..a3df321d88 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_sa.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_certs_sa.md
@@ -1,3 +1,16 @@
+
+
+
+Generate a private key for signing service account tokens along with its public key
### Synopsis
@@ -23,14 +36,14 @@ kubeadm init phase certs sa [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| -h, --help |
- | help for sa |
+ | help for sa |
@@ -51,7 +64,7 @@ kubeadm init phase certs sa [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane.md
index 2bed8442d3..86ef35d14d 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane.md
@@ -1,3 +1,16 @@
+
+
+
+Generate all static Pod manifest files necessary to establish the control plane
### Synopsis
@@ -21,7 +34,7 @@ kubeadm init phase control-plane [flags]
-h, --help |
- | help for control-plane |
+ | help for control-plane |
@@ -42,7 +55,7 @@ kubeadm init phase control-plane [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_all.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_all.md
index e03cdb6274..6a53512cc4 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_all.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_all.md
@@ -1,3 +1,16 @@
+
+
+
+Generate all static Pod manifest files
### Synopsis
@@ -32,105 +45,112 @@ kubeadm init phase control-plane all [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | Port for the API Server to bind to. |
+ | Port for the API Server to bind to. |
-| --apiserver-extra-args mapStringString |
+--apiserver-extra-args <comma-separated 'key=value' pairs> |
- | A set of extra flags to pass to the API Server or override default ones in form of <flagname>=<value> |
+ | A set of extra flags to pass to the API Server or override default ones in form of <flagname>=<value> |
| --cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
-| --controller-manager-extra-args mapStringString |
+--controller-manager-extra-args <comma-separated 'key=value' pairs> |
- | A set of extra flags to pass to the Controller Manager or override default ones in form of <flagname>=<value> |
+ | A set of extra flags to pass to the Controller Manager or override default ones in form of <flagname>=<value> |
-| --experimental-patches string |
+--dry-run |
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | Don't apply any changes; just output what would be done. |
| --feature-gates string |
- | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (ALPHA - default=false) PublicKeysECDSA=true|false (ALPHA - default=false) |
+ | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (BETA - default=true) PublicKeysECDSA=true|false (ALPHA - default=false) RootlessControlPlane=true|false (ALPHA - default=false) |
| -h, --help |
- | help for all |
+ | help for all |
| --image-repository string Default: "k8s.gcr.io" |
- | Choose a container registry to pull control plane images from |
+ | Choose a container registry to pull control plane images from |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
+
+
+
+| --patches string |
+
+
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
| --pod-network-cidr string |
- | Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node. |
+ | Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node. |
-| --scheduler-extra-args mapStringString |
+--scheduler-extra-args <comma-separated 'key=value' pairs> |
- | A set of extra flags to pass to the Scheduler or override default ones in form of <flagname>=<value> |
+ | A set of extra flags to pass to the Scheduler or override default ones in form of <flagname>=<value> |
| --service-cidr string Default: "10.96.0.0/12" |
- | Use alternative range of IP address for service VIPs. |
+ | Use alternative range of IP address for service VIPs. |
@@ -151,7 +171,7 @@ kubeadm init phase control-plane all [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_apiserver.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_apiserver.md
index 50aef041fd..b46d5ea7c8 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_apiserver.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_apiserver.md
@@ -1,3 +1,16 @@
+
+
+
+Generates the kube-apiserver static Pod manifest
### Synopsis
@@ -21,84 +34,91 @@ kubeadm init phase control-plane apiserver [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | Port for the API Server to bind to. |
+ | Port for the API Server to bind to. |
-| --apiserver-extra-args mapStringString |
+--apiserver-extra-args <comma-separated 'key=value' pairs> |
- | A set of extra flags to pass to the API Server or override default ones in form of <flagname>=<value> |
+ | A set of extra flags to pass to the API Server or override default ones in form of <flagname>=<value> |
| --cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
-| --experimental-patches string |
+--dry-run |
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | Don't apply any changes; just output what would be done. |
| --feature-gates string |
- | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (ALPHA - default=false) PublicKeysECDSA=true|false (ALPHA - default=false) |
+ | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (BETA - default=true) PublicKeysECDSA=true|false (ALPHA - default=false) RootlessControlPlane=true|false (ALPHA - default=false) |
| -h, --help |
- | help for apiserver |
+ | help for apiserver |
| --image-repository string Default: "k8s.gcr.io" |
- | Choose a container registry to pull control plane images from |
+ | Choose a container registry to pull control plane images from |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
+
+
+
+| --patches string |
+
+
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
| --service-cidr string Default: "10.96.0.0/12" |
- | Use alternative range of IP address for service VIPs. |
+ | Use alternative range of IP address for service VIPs. |
@@ -119,7 +139,7 @@ kubeadm init phase control-plane apiserver [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_controller-manager.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_controller-manager.md
index c1f0989cb6..48d36cb899 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_controller-manager.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_controller-manager.md
@@ -1,3 +1,16 @@
+
+
+
+Generates the kube-controller-manager static Pod manifest
### Synopsis
@@ -21,56 +34,63 @@ kubeadm init phase control-plane controller-manager [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
-| --controller-manager-extra-args mapStringString |
+--controller-manager-extra-args <comma-separated 'key=value' pairs> |
- | A set of extra flags to pass to the Controller Manager or override default ones in form of <flagname>=<value> |
+ | A set of extra flags to pass to the Controller Manager or override default ones in form of <flagname>=<value> |
-| --experimental-patches string |
+--dry-run |
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | Don't apply any changes; just output what would be done. |
| -h, --help |
- | help for controller-manager |
+ | help for controller-manager |
| --image-repository string Default: "k8s.gcr.io" |
- | Choose a container registry to pull control plane images from |
+ | Choose a container registry to pull control plane images from |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
+
+
+
+| --patches string |
+
+
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
| --pod-network-cidr string |
- | Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node. |
+ | Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node. |
@@ -91,7 +111,7 @@ kubeadm init phase control-plane controller-manager [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_scheduler.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_scheduler.md
index ce2f366b13..f726834229 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_scheduler.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_control-plane_scheduler.md
@@ -1,3 +1,16 @@
+
+
+
+Generates the kube-scheduler static Pod manifest
### Synopsis
@@ -21,49 +34,56 @@ kubeadm init phase control-plane scheduler [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
-| --experimental-patches string |
+--dry-run |
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | Don't apply any changes; just output what would be done. |
| -h, --help |
- | help for scheduler |
+ | help for scheduler |
| --image-repository string Default: "k8s.gcr.io" |
- | Choose a container registry to pull control plane images from |
+ | Choose a container registry to pull control plane images from |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
-| --scheduler-extra-args mapStringString |
+--patches string |
- | A set of extra flags to pass to the Scheduler or override default ones in form of <flagname>=<value> |
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+
+
+
+| --scheduler-extra-args <comma-separated 'key=value' pairs> |
+
+
+ | A set of extra flags to pass to the Scheduler or override default ones in form of <flagname>=<value> |
@@ -84,7 +104,7 @@ kubeadm init phase control-plane scheduler [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_etcd.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_etcd.md
index dc5227a34c..be2aef8c3b 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_etcd.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_etcd.md
@@ -1,3 +1,16 @@
+
+
+
+Generate static Pod manifest file for local etcd
### Synopsis
@@ -21,7 +34,7 @@ kubeadm init phase etcd [flags]
-h, --help |
- | help for etcd |
+ | help for etcd |
@@ -42,7 +55,7 @@ kubeadm init phase etcd [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_etcd_local.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_etcd_local.md
index 0e4cb7181e..f5bc0a529b 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_etcd_local.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_etcd_local.md
@@ -1,3 +1,16 @@
+
+
+
+Generate the static Pod manifest file for a local, single-node local etcd instance
### Synopsis
@@ -33,35 +46,35 @@ kubeadm init phase etcd local [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
-
-
-
-| --experimental-patches string |
-
-
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for local |
+ | help for local |
| --image-repository string Default: "k8s.gcr.io" |
- | Choose a container registry to pull control plane images from |
+ | Choose a container registry to pull control plane images from |
+
+
+
+| --patches string |
+
+
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
@@ -82,7 +95,7 @@ kubeadm init phase etcd local [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig.md
index b3a200a228..da4fde7ebc 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig.md
@@ -1,3 +1,16 @@
+
+
+
+Generate all kubeconfig files necessary to establish the control plane and the admin kubeconfig file
### Synopsis
@@ -21,7 +34,7 @@ kubeadm init phase kubeconfig [flags]
-h, --help |
- | help for kubeconfig |
+ | help for kubeconfig |
@@ -42,7 +55,7 @@ kubeadm init phase kubeconfig [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_admin.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_admin.md
index 85885559f7..a664e126ff 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_admin.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_admin.md
@@ -1,3 +1,16 @@
+
+
+
+Generate a kubeconfig file for the admin to use and for kubeadm itself
### Synopsis
@@ -21,56 +34,56 @@ kubeadm init phase kubeconfig admin [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | Port for the API Server to bind to. |
+ | Port for the API Server to bind to. |
| --cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
| -h, --help |
- | help for admin |
+ | help for admin |
| --kubeconfig-dir string Default: "/etc/kubernetes" |
- | The path where to save the kubeconfig file. |
+ | The path where to save the kubeconfig file. |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -91,7 +104,7 @@ kubeadm init phase kubeconfig admin [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_all.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_all.md
index 9296e84a19..f1ebdbcf12 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_all.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_all.md
@@ -1,3 +1,16 @@
+
+
+
+Generate all kubeconfig files
### Synopsis
@@ -21,63 +34,63 @@ kubeadm init phase kubeconfig all [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | Port for the API Server to bind to. |
+ | Port for the API Server to bind to. |
| --cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
| -h, --help |
- | help for all |
+ | help for all |
| --kubeconfig-dir string Default: "/etc/kubernetes" |
- | The path where to save the kubeconfig file. |
+ | The path where to save the kubeconfig file. |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
@@ -98,7 +111,7 @@ kubeadm init phase kubeconfig all [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_controller-manager.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_controller-manager.md
index 295d7e57dc..c49ab4b6c4 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_controller-manager.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_controller-manager.md
@@ -1,3 +1,16 @@
+
+
+
+Generate a kubeconfig file for the controller manager to use
### Synopsis
@@ -21,56 +34,56 @@ kubeadm init phase kubeconfig controller-manager [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | Port for the API Server to bind to. |
+ | Port for the API Server to bind to. |
| --cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
| -h, --help |
- | help for controller-manager |
+ | help for controller-manager |
| --kubeconfig-dir string Default: "/etc/kubernetes" |
- | The path where to save the kubeconfig file. |
+ | The path where to save the kubeconfig file. |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -91,7 +104,7 @@ kubeadm init phase kubeconfig controller-manager [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_kubelet.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_kubelet.md
index 9fd3145290..fd141ea0fc 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_kubelet.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_kubelet.md
@@ -1,3 +1,16 @@
+
+
+
+Generate a kubeconfig file for the kubelet to use *only* for cluster bootstrapping purposes
### Synopsis
@@ -23,63 +36,63 @@ kubeadm init phase kubeconfig kubelet [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | Port for the API Server to bind to. |
+ | Port for the API Server to bind to. |
| --cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
| -h, --help |
- | help for kubelet |
+ | help for kubelet |
| --kubeconfig-dir string Default: "/etc/kubernetes" |
- | The path where to save the kubeconfig file. |
+ | The path where to save the kubeconfig file. |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
@@ -100,7 +113,7 @@ kubeadm init phase kubeconfig kubelet [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_scheduler.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_scheduler.md
index c608732717..9618c2d874 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_scheduler.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubeconfig_scheduler.md
@@ -1,3 +1,16 @@
+
+
+
+Generate a kubeconfig file for the scheduler to use
### Synopsis
@@ -21,56 +34,56 @@ kubeadm init phase kubeconfig scheduler [flags]
--apiserver-advertise-address string |
- | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | The IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | Port for the API Server to bind to. |
+ | Port for the API Server to bind to. |
| --cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --control-plane-endpoint string |
- | Specify a stable IP address or DNS name for the control plane. |
+ | Specify a stable IP address or DNS name for the control plane. |
| -h, --help |
- | help for scheduler |
+ | help for scheduler |
| --kubeconfig-dir string Default: "/etc/kubernetes" |
- | The path where to save the kubeconfig file. |
+ | The path where to save the kubeconfig file. |
| --kubernetes-version string Default: "stable-1" |
- | Choose a specific Kubernetes version for the control plane. |
+ | Choose a specific Kubernetes version for the control plane. |
@@ -91,7 +104,7 @@ kubeadm init phase kubeconfig scheduler [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize.md
index 4e5febf638..d2eb7f0125 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize.md
@@ -1,3 +1,16 @@
+
+
+
+Updates settings relevant to the kubelet after TLS bootstrap
### Synopsis
@@ -28,7 +41,7 @@ kubeadm init phase kubelet-finalize [flags]
-h, --help |
- | help for kubelet-finalize |
+ | help for kubelet-finalize |
@@ -49,7 +62,7 @@ kubeadm init phase kubelet-finalize [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize_all.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize_all.md
index fce712fc45..70e4c634b0 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize_all.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize_all.md
@@ -1,3 +1,16 @@
+
+
+
+Run all kubelet-finalize phases
### Synopsis
@@ -28,21 +41,21 @@ kubeadm init phase kubelet-finalize all [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for all |
+ | help for all |
@@ -63,7 +76,7 @@ kubeadm init phase kubelet-finalize all [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize_experimental-cert-rotation.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize_experimental-cert-rotation.md
index 2ace62929b..6ce904cc2b 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize_experimental-cert-rotation.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-finalize_experimental-cert-rotation.md
@@ -1,3 +1,16 @@
+
+
+
+Enable kubelet client certificate rotation
### Synopsis
@@ -21,21 +34,21 @@ kubeadm init phase kubelet-finalize experimental-cert-rotation [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path where to save and store the certificates. |
+ | The path where to save and store the certificates. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for experimental-cert-rotation |
+ | help for experimental-cert-rotation |
@@ -56,7 +69,7 @@ kubeadm init phase kubelet-finalize experimental-cert-rotation [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-start.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-start.md
index f9898b58e0..11d2407499 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-start.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_kubelet-start.md
@@ -1,3 +1,16 @@
+
+
+
+Write kubelet settings and (re)start the kubelet
### Synopsis
@@ -28,28 +41,28 @@ kubeadm init phase kubelet-start [flags]
--config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --cri-socket string |
- | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
+ | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
| -h, --help |
- | help for kubelet-start |
+ | help for kubelet-start |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
@@ -70,7 +83,7 @@ kubeadm init phase kubelet-start [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_mark-control-plane.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_mark-control-plane.md
index 453783db52..6ba7e90479 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_mark-control-plane.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_mark-control-plane.md
@@ -1,3 +1,16 @@
+
+
+
+Mark a node as a control-plane
### Synopsis
@@ -12,7 +25,7 @@ kubeadm init phase mark-control-plane [flags]
```
# Applies control-plane label and taint to the current node, functionally equivalent to what executed by kubeadm init.
- kubeadm init phase mark-control-plane --config config.yml
+ kubeadm init phase mark-control-plane --config config.yaml
# Applies control-plane label and taint to a specific node
kubeadm init phase mark-control-plane --node-name myNode
@@ -31,21 +44,21 @@ kubeadm init phase mark-control-plane [flags]
--config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for mark-control-plane |
+ | help for mark-control-plane |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
@@ -66,7 +79,7 @@ kubeadm init phase mark-control-plane [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_preflight.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_preflight.md
index 06d47e861c..345621f703 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_preflight.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_preflight.md
@@ -1,3 +1,16 @@
+
+
+
+Run pre-flight checks
### Synopsis
@@ -12,7 +25,7 @@ kubeadm init phase preflight [flags]
```
# Run pre-flight checks for kubeadm init using a config file.
- kubeadm init phase preflight --config kubeadm-config.yml
+ kubeadm init phase preflight --config kubeadm-config.yaml
```
### Options
@@ -28,21 +41,21 @@ kubeadm init phase preflight [flags]
--config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for preflight |
+ | help for preflight |
-| --ignore-preflight-errors stringSlice |
+--ignore-preflight-errors strings |
- | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
+ | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
@@ -63,7 +76,7 @@ kubeadm init phase preflight [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-certs.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-certs.md
index 404f62d725..515060a76c 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-certs.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-certs.md
@@ -1,3 +1,16 @@
+
+
+
+Upload certificates to kubeadm-certs
### Synopsis
@@ -21,42 +34,42 @@ kubeadm init phase upload-certs [flags]
--certificate-key string |
- | Key used to encrypt the control-plane certificates in the kubeadm-certs Secret. |
+ | Key used to encrypt the control-plane certificates in the kubeadm-certs Secret. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for upload-certs |
+ | help for upload-certs |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --skip-certificate-key-print |
- | Don't print the key used to encrypt the control-plane certificates. |
+ | Don't print the key used to encrypt the control-plane certificates. |
| --upload-certs |
- | Upload control-plane certificates to the kubeadm-certs Secret. |
+ | Upload control-plane certificates to the kubeadm-certs Secret. |
@@ -77,7 +90,7 @@ kubeadm init phase upload-certs [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config.md
index c1b5c96092..7d007e7b56 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config.md
@@ -1,3 +1,16 @@
+
+
+
+Upload the kubeadm and kubelet configuration to a ConfigMap
### Synopsis
@@ -21,7 +34,7 @@ kubeadm init phase upload-config [flags]
-h, --help |
- | help for upload-config |
+ | help for upload-config |
@@ -42,7 +55,7 @@ kubeadm init phase upload-config [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_all.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_all.md
index 6370094df9..3c087368a7 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_all.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_all.md
@@ -1,3 +1,16 @@
+
+
+
+Upload all configuration to a config map
### Synopsis
@@ -21,21 +34,21 @@ kubeadm init phase upload-config all [flags]
--config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for all |
+ | help for all |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -56,7 +69,7 @@ kubeadm init phase upload-config all [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_kubeadm.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_kubeadm.md
index 030595466b..13e561f486 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_kubeadm.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_kubeadm.md
@@ -1,3 +1,16 @@
+
+
+
+Upload the kubeadm ClusterConfiguration to a ConfigMap
### Synopsis
@@ -30,21 +43,21 @@ kubeadm init phase upload-config kubeadm [flags]
--config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for kubeadm |
+ | help for kubeadm |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -65,7 +78,7 @@ kubeadm init phase upload-config kubeadm [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_kubelet.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_kubelet.md
index bd334e091c..ba27f728cb 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_kubelet.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_init_phase_upload-config_kubelet.md
@@ -1,3 +1,16 @@
+
+
+
+Upload the kubelet component config to a ConfigMap
### Synopsis
@@ -28,21 +41,21 @@ kubeadm init phase upload-config kubelet [flags]
--config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -h, --help |
- | help for kubelet |
+ | help for kubelet |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -63,7 +76,7 @@ kubeadm init phase upload-config kubelet [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join.md
index 3a6f7299d6..145f0bc340 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join.md
@@ -1,3 +1,16 @@
+
+
+
+Run this on any machine you wish to join an existing cluster
### Synopsis
@@ -56,7 +69,7 @@ control-plane-prepare Prepare the machine for serving a control plane
kubelet-start Write kubelet settings, certificates and (re)start the kubelet
control-plane-join Join a machine as a control plane instance
/etcd Add a new local etcd member
- /update-status Register the new control-plane node into the ClusterStatus maintained in the kubeadm-config ConfigMap
+ /update-status Register the new control-plane node into the ClusterStatus maintained in the kubeadm-config ConfigMap (DEPRECATED)
/mark-control-plane Mark a node as a control-plane
```
@@ -78,119 +91,119 @@ kubeadm join [api-server-endpoint] [flags]
--apiserver-advertise-address string |
- | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | If the node should host a new control plane instance, the port for the API Server to bind to. |
+ | If the node should host a new control plane instance, the port for the API Server to bind to. |
| --certificate-key string |
- | Use this key to decrypt the certificate secrets uploaded by init. |
+ | Use this key to decrypt the certificate secrets uploaded by init. |
| --config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --control-plane |
- | Create a new control plane instance on this node |
+ | Create a new control plane instance on this node |
| --cri-socket string |
- | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
+ | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
| --discovery-file string |
- | For file-based discovery, a file or URL from which to load cluster information. |
+ | For file-based discovery, a file or URL from which to load cluster information. |
| --discovery-token string |
- | For token-based discovery, the token used to validate cluster information fetched from the API server. |
+ | For token-based discovery, the token used to validate cluster information fetched from the API server. |
-| --discovery-token-ca-cert-hash stringSlice |
+--discovery-token-ca-cert-hash strings |
- | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
+ | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
| --discovery-token-unsafe-skip-ca-verification |
- | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
-
-
-
-| --experimental-patches string |
-
-
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
| -h, --help |
- | help for join |
+ | help for join |
-| --ignore-preflight-errors stringSlice |
+--ignore-preflight-errors strings |
- | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
+ | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
-| --skip-phases stringSlice |
+--patches string |
- | List of phases to be skipped |
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+
+
+
+| --skip-phases strings |
+
+
+ | List of phases to be skipped |
| --tls-bootstrap-token string |
- | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
+ | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
| --token string |
- | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
+ | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
@@ -211,7 +224,7 @@ kubeadm join [api-server-endpoint] [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase.md
index 873f64aa16..b780de18cc 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase.md
@@ -1,3 +1,16 @@
+
+
+
+Use this command to invoke single phase of the join workflow
### Synopsis
@@ -17,7 +30,7 @@ Use this command to invoke single phase of the join workflow
-h, --help |
- | help for phase |
+ | help for phase |
@@ -38,7 +51,7 @@ Use this command to invoke single phase of the join workflow
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join.md
index 20170c783c..07768a16c6 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join.md
@@ -1,3 +1,16 @@
+
+
+
+Join a machine as a control plane instance
### Synopsis
@@ -28,7 +41,7 @@ kubeadm join phase control-plane-join [flags]
-h, --help |
- | help for control-plane-join |
+ | help for control-plane-join |
@@ -49,7 +62,7 @@ kubeadm join phase control-plane-join [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_all.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_all.md
index 9515d0dfe7..7a3517652d 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_all.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_all.md
@@ -1,3 +1,16 @@
+
+
+
+Join a machine as a control plane instance
### Synopsis
@@ -21,35 +34,42 @@ kubeadm join phase control-plane-join all [flags]
--apiserver-advertise-address string |
- | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --control-plane |
- | Create a new control plane instance on this node |
+ | Create a new control plane instance on this node |
| -h, --help |
- | help for all |
+ | help for all |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
+
+
+
+| --patches string |
+
+
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
@@ -70,7 +90,7 @@ kubeadm join phase control-plane-join all [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_etcd.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_etcd.md
index 4618107dd2..c06ddaae40 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_etcd.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_etcd.md
@@ -1,3 +1,16 @@
+
+
+
+Add a new local etcd member
### Synopsis
@@ -21,42 +34,42 @@ kubeadm join phase control-plane-join etcd [flags]
--apiserver-advertise-address string |
- | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --control-plane |
- | Create a new control plane instance on this node |
-
-
-
-| --experimental-patches string |
-
-
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | Create a new control plane instance on this node |
| -h, --help |
- | help for etcd |
+ | help for etcd |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
+
+
+
+| --patches string |
+
+
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
@@ -77,7 +90,7 @@ kubeadm join phase control-plane-join etcd [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_mark-control-plane.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_mark-control-plane.md
index 37bd9675b8..9e2d117ed9 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_mark-control-plane.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_mark-control-plane.md
@@ -1,3 +1,16 @@
+
+
+
+Mark a node as a control-plane
### Synopsis
@@ -21,28 +34,28 @@ kubeadm join phase control-plane-join mark-control-plane [flags]
--config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --control-plane |
- | Create a new control plane instance on this node |
+ | Create a new control plane instance on this node |
| -h, --help |
- | help for mark-control-plane |
+ | help for mark-control-plane |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
@@ -63,7 +76,7 @@ kubeadm join phase control-plane-join mark-control-plane [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_update-status.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_update-status.md
index 258210f303..af1aac985c 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_update-status.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-join_update-status.md
@@ -1,8 +1,21 @@
+
+
+
+Register the new control-plane node into the ClusterStatus maintained in the kubeadm-config ConfigMap (DEPRECATED)
### Synopsis
-Register the new control-plane node into the ClusterStatus maintained in the kubeadm-config ConfigMap
+Register the new control-plane node into the ClusterStatus maintained in the kubeadm-config ConfigMap (DEPRECATED)
```
kubeadm join phase control-plane-join update-status [flags]
@@ -21,35 +34,35 @@ kubeadm join phase control-plane-join update-status [flags]
--apiserver-advertise-address string |
- | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --control-plane |
- | Create a new control plane instance on this node |
+ | Create a new control plane instance on this node |
| -h, --help |
- | help for update-status |
+ | help for update-status |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
@@ -70,7 +83,7 @@ kubeadm join phase control-plane-join update-status [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare.md
index 81a88bdaa5..6952dbca80 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare.md
@@ -1,3 +1,16 @@
+
+
+
+Prepare the machine for serving a control plane
### Synopsis
@@ -28,7 +41,7 @@ kubeadm join phase control-plane-prepare [flags]
-h, --help |
- | help for control-plane-prepare |
+ | help for control-plane-prepare |
@@ -49,7 +62,7 @@ kubeadm join phase control-plane-prepare [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_all.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_all.md
index 932ef5f27b..661edf597d 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_all.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_all.md
@@ -1,3 +1,16 @@
+
+
+
+Prepare the machine for serving a control plane
### Synopsis
@@ -21,98 +34,98 @@ kubeadm join phase control-plane-prepare all [api-server-endpoint] [flags]
--apiserver-advertise-address string |
- | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | If the node should host a new control plane instance, the port for the API Server to bind to. |
+ | If the node should host a new control plane instance, the port for the API Server to bind to. |
| --certificate-key string |
- | Use this key to decrypt the certificate secrets uploaded by init. |
+ | Use this key to decrypt the certificate secrets uploaded by init. |
| --config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --control-plane |
- | Create a new control plane instance on this node |
+ | Create a new control plane instance on this node |
| --discovery-file string |
- | For file-based discovery, a file or URL from which to load cluster information. |
+ | For file-based discovery, a file or URL from which to load cluster information. |
| --discovery-token string |
- | For token-based discovery, the token used to validate cluster information fetched from the API server. |
+ | For token-based discovery, the token used to validate cluster information fetched from the API server. |
-| --discovery-token-ca-cert-hash stringSlice |
+--discovery-token-ca-cert-hash strings |
- | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
+ | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
| --discovery-token-unsafe-skip-ca-verification |
- | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
-
-
-
-| --experimental-patches string |
-
-
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
| -h, --help |
- | help for all |
+ | help for all |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
+
+
+
+| --patches string |
+
+
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
| --tls-bootstrap-token string |
- | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
+ | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
| --token string |
- | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
+ | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
@@ -133,7 +146,7 @@ kubeadm join phase control-plane-prepare all [api-server-endpoint] [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_certs.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_certs.md
index c8d59d58eb..6475115940 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_certs.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_certs.md
@@ -1,3 +1,16 @@
+
+
+
+Generate the certificates for the new control plane components
### Synopsis
@@ -21,77 +34,77 @@ kubeadm join phase control-plane-prepare certs [api-server-endpoint] [flags]
--apiserver-advertise-address string |
- | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --control-plane |
- | Create a new control plane instance on this node |
+ | Create a new control plane instance on this node |
| --discovery-file string |
- | For file-based discovery, a file or URL from which to load cluster information. |
+ | For file-based discovery, a file or URL from which to load cluster information. |
| --discovery-token string |
- | For token-based discovery, the token used to validate cluster information fetched from the API server. |
+ | For token-based discovery, the token used to validate cluster information fetched from the API server. |
-| --discovery-token-ca-cert-hash stringSlice |
+--discovery-token-ca-cert-hash strings |
- | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
+ | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
| --discovery-token-unsafe-skip-ca-verification |
- | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
+ | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
| -h, --help |
- | help for certs |
+ | help for certs |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
| --tls-bootstrap-token string |
- | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
+ | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
| --token string |
- | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
+ | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
@@ -112,7 +125,7 @@ kubeadm join phase control-plane-prepare certs [api-server-endpoint] [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_control-plane.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_control-plane.md
index 3e9a120c00..c9084c6e55 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_control-plane.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_control-plane.md
@@ -1,3 +1,16 @@
+
+
+
+Generate the manifests for the new control plane components
### Synopsis
@@ -21,42 +34,42 @@ kubeadm join phase control-plane-prepare control-plane [flags]
--apiserver-advertise-address string |
- | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | If the node should host a new control plane instance, the port for the API Server to bind to. |
+ | If the node should host a new control plane instance, the port for the API Server to bind to. |
| --config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --control-plane |
- | Create a new control plane instance on this node |
-
-
-
-| --experimental-patches string |
-
-
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | Create a new control plane instance on this node |
| -h, --help |
- | help for control-plane |
+ | help for control-plane |
+
+
+
+| --patches string |
+
+
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
@@ -77,7 +90,7 @@ kubeadm join phase control-plane-prepare control-plane [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_download-certs.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_download-certs.md
index 26e65cce87..1cfac530cd 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_download-certs.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_download-certs.md
@@ -1,3 +1,16 @@
+
+
+
+[EXPERIMENTAL] Download certificates shared among control-plane nodes from the kubeadm-certs Secret
### Synopsis
@@ -21,70 +34,70 @@ kubeadm join phase control-plane-prepare download-certs [api-server-endpoint] [f
--certificate-key string |
- | Use this key to decrypt the certificate secrets uploaded by init. |
+ | Use this key to decrypt the certificate secrets uploaded by init. |
| --config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --control-plane |
- | Create a new control plane instance on this node |
+ | Create a new control plane instance on this node |
| --discovery-file string |
- | For file-based discovery, a file or URL from which to load cluster information. |
+ | For file-based discovery, a file or URL from which to load cluster information. |
| --discovery-token string |
- | For token-based discovery, the token used to validate cluster information fetched from the API server. |
+ | For token-based discovery, the token used to validate cluster information fetched from the API server. |
-| --discovery-token-ca-cert-hash stringSlice |
+--discovery-token-ca-cert-hash strings |
- | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
+ | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
| --discovery-token-unsafe-skip-ca-verification |
- | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
+ | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
| -h, --help |
- | help for download-certs |
+ | help for download-certs |
| --tls-bootstrap-token string |
- | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
+ | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
| --token string |
- | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
+ | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
@@ -105,7 +118,7 @@ kubeadm join phase control-plane-prepare download-certs [api-server-endpoint] [f
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_kubeconfig.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_kubeconfig.md
index 722ec2263d..027837aeee 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_kubeconfig.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_control-plane-prepare_kubeconfig.md
@@ -1,3 +1,16 @@
+
+
+
+Generate the kubeconfig for the new control plane components
### Synopsis
@@ -21,70 +34,70 @@ kubeadm join phase control-plane-prepare kubeconfig [api-server-endpoint] [flags
--certificate-key string |
- | Use this key to decrypt the certificate secrets uploaded by init. |
+ | Use this key to decrypt the certificate secrets uploaded by init. |
| --config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --control-plane |
- | Create a new control plane instance on this node |
+ | Create a new control plane instance on this node |
| --discovery-file string |
- | For file-based discovery, a file or URL from which to load cluster information. |
+ | For file-based discovery, a file or URL from which to load cluster information. |
| --discovery-token string |
- | For token-based discovery, the token used to validate cluster information fetched from the API server. |
+ | For token-based discovery, the token used to validate cluster information fetched from the API server. |
-| --discovery-token-ca-cert-hash stringSlice |
+--discovery-token-ca-cert-hash strings |
- | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
+ | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
| --discovery-token-unsafe-skip-ca-verification |
- | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
+ | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
| -h, --help |
- | help for kubeconfig |
+ | help for kubeconfig |
| --tls-bootstrap-token string |
- | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
+ | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
| --token string |
- | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
+ | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
@@ -105,7 +118,7 @@ kubeadm join phase control-plane-prepare kubeconfig [api-server-endpoint] [flags
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_kubelet-start.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_kubelet-start.md
index 719700b9a0..5896b25337 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_kubelet-start.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_kubelet-start.md
@@ -1,3 +1,16 @@
+
+
+
+Write kubelet settings, certificates and (re)start the kubelet
### Synopsis
@@ -21,70 +34,70 @@ kubeadm join phase kubelet-start [api-server-endpoint] [flags]
--config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --cri-socket string |
- | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
+ | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
| --discovery-file string |
- | For file-based discovery, a file or URL from which to load cluster information. |
+ | For file-based discovery, a file or URL from which to load cluster information. |
| --discovery-token string |
- | For token-based discovery, the token used to validate cluster information fetched from the API server. |
+ | For token-based discovery, the token used to validate cluster information fetched from the API server. |
-| --discovery-token-ca-cert-hash stringSlice |
+--discovery-token-ca-cert-hash strings |
- | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
+ | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
| --discovery-token-unsafe-skip-ca-verification |
- | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
+ | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
| -h, --help |
- | help for kubelet-start |
+ | help for kubelet-start |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
| --tls-bootstrap-token string |
- | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
+ | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
| --token string |
- | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
+ | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
@@ -105,7 +118,7 @@ kubeadm join phase kubelet-start [api-server-endpoint] [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_preflight.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_preflight.md
index ca975f9d92..0f4b7c50cd 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_preflight.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_join_phase_preflight.md
@@ -1,3 +1,16 @@
+
+
+
+Run join pre-flight checks
### Synopsis
@@ -12,7 +25,7 @@ kubeadm join phase preflight [api-server-endpoint] [flags]
```
# Run join pre-flight checks using a config file.
- kubeadm join phase preflight --config kubeadm-config.yml
+ kubeadm join phase preflight --config kubeadm-config.yaml
```
### Options
@@ -28,105 +41,105 @@ kubeadm join phase preflight [api-server-endpoint] [flags]
--apiserver-advertise-address string |
- | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
+ | If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on. If not set the default network interface will be used. |
| --apiserver-bind-port int32 Default: 6443 |
- | If the node should host a new control plane instance, the port for the API Server to bind to. |
+ | If the node should host a new control plane instance, the port for the API Server to bind to. |
| --certificate-key string |
- | Use this key to decrypt the certificate secrets uploaded by init. |
+ | Use this key to decrypt the certificate secrets uploaded by init. |
| --config string |
- | Path to kubeadm config file. |
+ | Path to kubeadm config file. |
| --control-plane |
- | Create a new control plane instance on this node |
+ | Create a new control plane instance on this node |
| --cri-socket string |
- | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
+ | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
| --discovery-file string |
- | For file-based discovery, a file or URL from which to load cluster information. |
+ | For file-based discovery, a file or URL from which to load cluster information. |
| --discovery-token string |
- | For token-based discovery, the token used to validate cluster information fetched from the API server. |
+ | For token-based discovery, the token used to validate cluster information fetched from the API server. |
-| --discovery-token-ca-cert-hash stringSlice |
+--discovery-token-ca-cert-hash strings |
- | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
+ | For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>"). |
| --discovery-token-unsafe-skip-ca-verification |
- | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
+ | For token-based discovery, allow joining without --discovery-token-ca-cert-hash pinning. |
| -h, --help |
- | help for preflight |
+ | help for preflight |
-| --ignore-preflight-errors stringSlice |
+--ignore-preflight-errors strings |
- | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
+ | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
| --node-name string |
- | Specify the node name. |
+ | Specify the node name. |
| --tls-bootstrap-token string |
- | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
+ | Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node. |
| --token string |
- | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
+ | Use this token for both discovery-token and tls-bootstrap-token when those values are not provided. |
@@ -147,7 +160,7 @@ kubeadm join phase preflight [api-server-endpoint] [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_kubeconfig.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_kubeconfig.md
new file mode 100644
index 0000000000..55177462d6
--- /dev/null
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_kubeconfig.md
@@ -0,0 +1,61 @@
+
+
+
+Kubeconfig file utilities
+
+### Synopsis
+
+
+Kubeconfig file utilities.
+
+### Options
+
+
+
+
+
+
+
+
+
+| -h, --help |
+
+
+ | help for kubeconfig |
+
+
+
+
+
+
+
+### Options inherited from parent commands
+
+
+
+
+
+
+
+
+
+| --rootfs string |
+
+
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+
+
+
+
+
+
+
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_kubeconfig_user.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_kubeconfig_user.md
new file mode 100644
index 0000000000..89315e27b8
--- /dev/null
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_kubeconfig_user.md
@@ -0,0 +1,107 @@
+
+
+
+Output a kubeconfig file for an additional user
+
+### Synopsis
+
+
+Output a kubeconfig file for an additional user.
+
+```
+kubeadm kubeconfig user [flags]
+```
+
+### Examples
+
+```
+ # Output a kubeconfig file for an additional user named foo using a kubeadm config file bar
+ kubeadm kubeconfig user --client-name=foo --config=bar
+```
+
+### Options
+
+
+
+
+
+
+
+
+
+| --client-name string |
+
+
+ | The name of user. It will be used as the CN if client certificates are created |
+
+
+
+| --config string |
+
+
+ | Path to a kubeadm configuration file. |
+
+
+
+| -h, --help |
+
+
+ | help for user |
+
+
+
+| --org strings |
+
+
+ | The orgnizations of the client certificate. It will be used as the O if client certificates are created |
+
+
+
+| --token string |
+
+
+ | The token that should be used as the authentication mechanism for this kubeconfig, instead of client certificates |
+
+
+
+| --validity-period duration Default: 8760h0m0s |
+
+
+ | The validity period of the client certificate. It is an offset from the current time. |
+
+
+
+
+
+
+
+### Options inherited from parent commands
+
+
+
+
+
+
+
+
+
+| --rootfs string |
+
+
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+
+
+
+
+
+
+
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset.md
index 4cfa48be37..19bdbb417a 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset.md
@@ -1,3 +1,16 @@
+
+
+
+Performs a best effort revert of changes made to this host by 'kubeadm init' or 'kubeadm join'
### Synopsis
@@ -7,7 +20,7 @@ Performs a best effort revert of changes made to this host by 'kubeadm init' or
The "reset" command executes the following phases:
```
preflight Run reset pre-flight checks
-update-cluster-status Remove this node from the ClusterStatus object.
+update-cluster-status Remove this node from the ClusterStatus object (DEPRECATED).
remove-etcd-member Remove a local etcd member.
cleanup-node Run cleanup node.
```
@@ -30,49 +43,49 @@ kubeadm reset [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path to the directory where the certificates are stored. If specified, clean this directory. |
+ | The path to the directory where the certificates are stored. If specified, clean this directory. |
| --cri-socket string |
- | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
+ | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
| -f, --force |
- | Reset the node without prompting for confirmation. |
+ | Reset the node without prompting for confirmation. |
| -h, --help |
- | help for reset |
+ | help for reset |
-| --ignore-preflight-errors stringSlice |
+--ignore-preflight-errors strings |
- | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
+ | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
-| --skip-phases stringSlice |
+--skip-phases strings |
- | List of phases to be skipped |
+ | List of phases to be skipped |
@@ -93,7 +106,7 @@ kubeadm reset [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase.md
index 498621b95d..e526dafa1f 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase.md
@@ -1,3 +1,16 @@
+
+
+
+Use this command to invoke single phase of the reset workflow
### Synopsis
@@ -17,7 +30,7 @@ Use this command to invoke single phase of the reset workflow
-h, --help |
- | help for phase |
+ | help for phase |
@@ -38,7 +51,7 @@ Use this command to invoke single phase of the reset workflow
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_cleanup-node.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_cleanup-node.md
index 84376e67b2..ceabd2045e 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_cleanup-node.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_cleanup-node.md
@@ -1,3 +1,16 @@
+
+
+
+Run cleanup node.
### Synopsis
@@ -21,21 +34,21 @@ kubeadm reset phase cleanup-node [flags]
--cert-dir string Default: "/etc/kubernetes/pki" |
- | The path to the directory where the certificates are stored. If specified, clean this directory. |
+ | The path to the directory where the certificates are stored. If specified, clean this directory. |
| --cri-socket string |
- | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
+ | Path to the CRI socket to connect. If empty kubeadm will try to auto-detect this value; use this option only if you have more than one CRI installed or if you have non-standard CRI socket. |
| -h, --help |
- | help for cleanup-node |
+ | help for cleanup-node |
@@ -56,7 +69,7 @@ kubeadm reset phase cleanup-node [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_preflight.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_preflight.md
index 8f3537bc7c..b3d1502184 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_preflight.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_preflight.md
@@ -1,3 +1,16 @@
+
+
+
+Run reset pre-flight checks
### Synopsis
@@ -21,21 +34,21 @@ kubeadm reset phase preflight [flags]
-f, --force |
- | Reset the node without prompting for confirmation. |
+ | Reset the node without prompting for confirmation. |
| -h, --help |
- | help for preflight |
+ | help for preflight |
-| --ignore-preflight-errors stringSlice |
+--ignore-preflight-errors strings |
- | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
+ | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
@@ -56,7 +69,7 @@ kubeadm reset phase preflight [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_remove-etcd-member.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_remove-etcd-member.md
index c7350d27ca..d2c1060ff4 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_remove-etcd-member.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_remove-etcd-member.md
@@ -1,3 +1,16 @@
+
+
+
+Remove a local etcd member.
### Synopsis
@@ -21,14 +34,14 @@ kubeadm reset phase remove-etcd-member [flags]
-h, --help |
- | help for remove-etcd-member |
+ | help for remove-etcd-member |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -49,7 +62,7 @@ kubeadm reset phase remove-etcd-member [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_update-cluster-status.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_update-cluster-status.md
index de4700032b..9d4b7af77f 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_update-cluster-status.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_reset_phase_update-cluster-status.md
@@ -1,8 +1,21 @@
+
+
+
+Remove this node from the ClusterStatus object (DEPRECATED).
### Synopsis
-Remove this node from the ClusterStatus object if the node is a control plane node.
+Remove this node from the ClusterStatus object (DEPRECATED).
```
kubeadm reset phase update-cluster-status [flags]
@@ -21,7 +34,7 @@ kubeadm reset phase update-cluster-status [flags]
-h, --help |
- | help for update-cluster-status |
+ | help for update-cluster-status |
@@ -42,7 +55,7 @@ kubeadm reset phase update-cluster-status [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token.md
index 2662497699..5384fc4d6c 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token.md
@@ -1,3 +1,16 @@
+
+
+
+Manage bootstrap tokens
### Synopsis
@@ -38,21 +51,21 @@ kubeadm token [flags]
--dry-run |
- | Whether to enable dry-run mode or not |
+ | Whether to enable dry-run mode or not |
| -h, --help |
- | help for token |
+ | help for token |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -73,7 +86,7 @@ kubeadm token [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_create.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_create.md
index b2212bba44..a2a217033c 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_create.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_create.md
@@ -1,3 +1,16 @@
+
+
+
+Create bootstrap tokens on the server
### Synopsis
@@ -28,56 +41,56 @@ kubeadm token create [token]
--certificate-key string |
- | When used together with '--print-join-command', print the full 'kubeadm join' flag needed to join the cluster as a control-plane. To create a new certificate key you must use 'kubeadm init phase upload-certs --upload-certs'. |
+ | When used together with '--print-join-command', print the full 'kubeadm join' flag needed to join the cluster as a control-plane. To create a new certificate key you must use 'kubeadm init phase upload-certs --upload-certs'. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --description string |
- | A human friendly description of how this token is used. |
+ | A human friendly description of how this token is used. |
-| --groups stringSlice Default: [system:bootstrappers:kubeadm:default-node-token] |
+--groups strings Default: "system:bootstrappers:kubeadm:default-node-token" |
- | Extra groups that this token will authenticate as when used for authentication. Must match "\\Asystem:bootstrappers:[a-z0-9:-]{0,255}[a-z0-9]\\z" |
+ | Extra groups that this token will authenticate as when used for authentication. Must match "\Asystem:bootstrappers:[a-z0-9:-]{0,255}[a-z0-9]\z" |
| -h, --help |
- | help for create |
+ | help for create |
| --print-join-command |
- | Instead of printing only the token, print the full 'kubeadm join' flag needed to join the cluster using the token. |
+ | Instead of printing only the token, print the full 'kubeadm join' flag needed to join the cluster using the token. |
| --ttl duration Default: 24h0m0s |
- | The duration before the token is automatically deleted (e.g. 1s, 2m, 3h). If set to '0', the token will never expire |
+ | The duration before the token is automatically deleted (e.g. 1s, 2m, 3h). If set to '0', the token will never expire |
-| --usages stringSlice Default: [signing,authentication] |
+--usages strings Default: "signing,authentication" |
- | Describes the ways in which this token can be used. You can pass --usages multiple times or provide a comma separated list of options. Valid options: [signing,authentication] |
+ | Describes the ways in which this token can be used. You can pass --usages multiple times or provide a comma separated list of options. Valid options: [signing,authentication] |
@@ -98,21 +111,21 @@ kubeadm token create [token]
--dry-run |
- | Whether to enable dry-run mode or not |
+ | Whether to enable dry-run mode or not |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_delete.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_delete.md
index d1ddd8bd2c..2040bd3f94 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_delete.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_delete.md
@@ -1,3 +1,16 @@
+
+
+
+Delete bootstrap tokens on the server
### Synopsis
@@ -26,7 +39,7 @@ kubeadm token delete [token-value] ...
-h, --help |
- | help for delete |
+ | help for delete |
@@ -47,21 +60,21 @@ kubeadm token delete [token-value] ...
--dry-run |
- | Whether to enable dry-run mode or not |
+ | Whether to enable dry-run mode or not |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_generate.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_generate.md
index 72ca0220ee..60de389d6c 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_generate.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_generate.md
@@ -1,3 +1,16 @@
+
+
+
+Generate and print a bootstrap token, but do not create it on the server
### Synopsis
@@ -31,7 +44,7 @@ kubeadm token generate [flags]
-h, --help |
- | help for generate |
+ | help for generate |
@@ -52,21 +65,21 @@ kubeadm token generate [flags]
--dry-run |
- | Whether to enable dry-run mode or not |
+ | Whether to enable dry-run mode or not |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_list.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_list.md
index 20ba81f63f..089424492e 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_list.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_token_list.md
@@ -1,3 +1,16 @@
+
+
+
+List bootstrap tokens on the server
### Synopsis
@@ -23,21 +36,28 @@ kubeadm token list [flags]
--allow-missing-template-keys Default: true |
- | If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to golang and jsonpath output formats. |
+ | If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to golang and jsonpath output formats. |
| -o, --experimental-output string Default: "text" |
- | Output format. One of: text|json|yaml|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file. |
+ | Output format. One of: text|json|yaml|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file. |
| -h, --help |
- | help for list |
+ | help for list |
+
+
+
+| --show-managed-fields |
+
+
+ | If true, keep the managedFields when printing objects in JSON or YAML format. |
@@ -58,21 +78,21 @@ kubeadm token list [flags]
--dry-run |
- | Whether to enable dry-run mode or not |
+ | Whether to enable dry-run mode or not |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade.md
index b3fe44532b..0c2a465194 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade.md
@@ -1,3 +1,16 @@
+
+
+
+Upgrade your cluster smoothly to a newer version with this command
### Synopsis
@@ -21,7 +34,7 @@ kubeadm upgrade [flags]
-h, --help |
- | help for upgrade |
+ | help for upgrade |
@@ -42,7 +55,7 @@ kubeadm upgrade [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_apply.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_apply.md
index ed6896b0a7..3add5a98c2 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_apply.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_apply.md
@@ -1,3 +1,16 @@
+
+
+
+Upgrade your Kubernetes cluster to the specified version
### Synopsis
@@ -21,98 +34,98 @@ kubeadm upgrade apply [version]
--allow-experimental-upgrades |
- | Show unstable versions of Kubernetes as an upgrade alternative and allow upgrading to an alpha/beta/release candidate versions of Kubernetes. |
+ | Show unstable versions of Kubernetes as an upgrade alternative and allow upgrading to an alpha/beta/release candidate versions of Kubernetes. |
| --allow-release-candidate-upgrades |
- | Show release candidate versions of Kubernetes as an upgrade alternative and allow upgrading to a release candidate versions of Kubernetes. |
+ | Show release candidate versions of Kubernetes as an upgrade alternative and allow upgrading to a release candidate versions of Kubernetes. |
| --certificate-renewal Default: true |
- | Perform the renewal of certificates used by component changed during upgrades. |
+ | Perform the renewal of certificates used by component changed during upgrades. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --dry-run |
- | Do not change any state, just output what actions would be performed. |
+ | Do not change any state, just output what actions would be performed. |
| --etcd-upgrade Default: true |
- | Perform the upgrade of etcd. |
-
-
-
-| --experimental-patches string |
-
-
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | Perform the upgrade of etcd. |
| --feature-gates string |
- | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (ALPHA - default=false) PublicKeysECDSA=true|false (ALPHA - default=false) |
+ | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (BETA - default=true) PublicKeysECDSA=true|false (ALPHA - default=false) RootlessControlPlane=true|false (ALPHA - default=false) |
| -f, --force |
- | Force upgrading although some requirements might not be met. This also implies non-interactive mode. |
+ | Force upgrading although some requirements might not be met. This also implies non-interactive mode. |
| -h, --help |
- | help for apply |
+ | help for apply |
-| --ignore-preflight-errors stringSlice |
+--ignore-preflight-errors strings |
- | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
+ | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+
+
+
+| --patches string |
+
+
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
| --print-config |
- | Specifies whether the configuration file that will be used in the upgrade should be printed or not. |
+ | Specifies whether the configuration file that will be used in the upgrade should be printed or not. |
| -y, --yes |
- | Perform the upgrade and do not prompt for confirmation (non-interactive mode). |
+ | Perform the upgrade and do not prompt for confirmation (non-interactive mode). |
@@ -133,7 +146,7 @@ kubeadm upgrade apply [version]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_diff.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_diff.md
index c15b118075..eb5e3c4cac 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_diff.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_diff.md
@@ -1,3 +1,16 @@
+
+
+
+Show what differences would be applied to existing static pod manifests. See also: kubeadm upgrade apply --dry-run
### Synopsis
@@ -21,49 +34,49 @@ kubeadm upgrade diff [version] [flags]
--api-server-manifest string Default: "/etc/kubernetes/manifests/kube-apiserver.yaml" |
- | path to API server manifest |
+ | path to API server manifest |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| -c, --context-lines int Default: 3 |
- | How many lines of context in the diff |
+ | How many lines of context in the diff |
| --controller-manager-manifest string Default: "/etc/kubernetes/manifests/kube-controller-manager.yaml" |
- | path to controller manifest |
+ | path to controller manifest |
| -h, --help |
- | help for diff |
+ | help for diff |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --scheduler-manifest string Default: "/etc/kubernetes/manifests/kube-scheduler.yaml" |
- | path to scheduler manifest |
+ | path to scheduler manifest |
@@ -84,7 +97,7 @@ kubeadm upgrade diff [version] [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node.md
index b9198f77d7..a8a3138c88 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node.md
@@ -1,3 +1,16 @@
+
+
+
+Upgrade commands for a node in the cluster
### Synopsis
@@ -29,56 +42,56 @@ kubeadm upgrade node [flags]
--certificate-renewal Default: true |
- | Perform the renewal of certificates used by component changed during upgrades. |
+ | Perform the renewal of certificates used by component changed during upgrades. |
| --dry-run |
- | Do not change any state, just output the actions that would be performed. |
+ | Do not change any state, just output the actions that would be performed. |
| --etcd-upgrade Default: true |
- | Perform the upgrade of etcd. |
-
-
-
-| --experimental-patches string |
-
-
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | Perform the upgrade of etcd. |
| -h, --help |
- | help for node |
+ | help for node |
-| --ignore-preflight-errors stringSlice |
+--ignore-preflight-errors strings |
- | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
+ | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
-| --skip-phases stringSlice |
+--patches string |
- | List of phases to be skipped |
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+
+
+
+| --skip-phases strings |
+
+
+ | List of phases to be skipped |
@@ -99,7 +112,7 @@ kubeadm upgrade node [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase.md
index 39a2e05ab0..6b86c95054 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase.md
@@ -1,3 +1,16 @@
+
+
+
+Use this command to invoke single phase of the node workflow
### Synopsis
@@ -17,7 +30,7 @@ Use this command to invoke single phase of the node workflow
-h, --help |
- | help for phase |
+ | help for phase |
@@ -38,7 +51,7 @@ Use this command to invoke single phase of the node workflow
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_control-plane.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_control-plane.md
index 1ca65f50a7..58a6a672e3 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_control-plane.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_control-plane.md
@@ -1,3 +1,16 @@
+
+
+
+Upgrade the control plane instance deployed on this node, if any
### Synopsis
@@ -21,42 +34,42 @@ kubeadm upgrade node phase control-plane [flags]
--certificate-renewal Default: true |
- | Perform the renewal of certificates used by component changed during upgrades. |
+ | Perform the renewal of certificates used by component changed during upgrades. |
| --dry-run |
- | Do not change any state, just output the actions that would be performed. |
+ | Do not change any state, just output the actions that would be performed. |
| --etcd-upgrade Default: true |
- | Perform the upgrade of etcd. |
-
-
-
-| --experimental-patches string |
-
-
- | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
+ | Perform the upgrade of etcd. |
| -h, --help |
- | help for control-plane |
+ | help for control-plane |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+
+
+
+| --patches string |
+
+
+ | Path to a directory that contains files named "target[suffix][+patchtype].extension". For example, "kube-apiserver0+merge.yaml" or just "etcd.json". "target" can be one of "kube-apiserver", "kube-controller-manager", "kube-scheduler", "etcd". "patchtype" can be one of "strategic", "merge" or "json" and they match the patch formats supported by kubectl. The default "patchtype" is "strategic". "extension" must be either "json" or "yaml". "suffix" is an optional string that can be used to determine which patches are applied first alpha-numerically. |
@@ -77,7 +90,7 @@ kubeadm upgrade node phase control-plane [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_kubelet-config.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_kubelet-config.md
index a4f5ceeafb..d2b03974c2 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_kubelet-config.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_kubelet-config.md
@@ -1,3 +1,16 @@
+
+
+
+Upgrade the kubelet configuration for this node
### Synopsis
@@ -21,21 +34,21 @@ kubeadm upgrade node phase kubelet-config [flags]
--dry-run |
- | Do not change any state, just output the actions that would be performed. |
+ | Do not change any state, just output the actions that would be performed. |
| -h, --help |
- | help for kubelet-config |
+ | help for kubelet-config |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
@@ -56,7 +69,7 @@ kubeadm upgrade node phase kubelet-config [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_preflight.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_preflight.md
index 943e05cb6e..d82a193898 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_preflight.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_node_phase_preflight.md
@@ -1,3 +1,16 @@
+
+
+
+Run upgrade node pre-flight checks
### Synopsis
@@ -21,14 +34,14 @@ kubeadm upgrade node phase preflight [flags]
-h, --help |
- | help for preflight |
+ | help for preflight |
-| --ignore-preflight-errors stringSlice |
+--ignore-preflight-errors strings |
- | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
+ | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
@@ -49,7 +62,7 @@ kubeadm upgrade node phase preflight [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_plan.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_plan.md
index eaa58b588f..c3cc133169 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_plan.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_upgrade_plan.md
@@ -1,3 +1,16 @@
+
+
+
+Check which versions are available to upgrade to and validate whether your current cluster is upgradeable. To skip the internet check, pass in the optional [version] parameter
### Synopsis
@@ -21,56 +34,56 @@ kubeadm upgrade plan [version] [flags]
--allow-experimental-upgrades |
- | Show unstable versions of Kubernetes as an upgrade alternative and allow upgrading to an alpha/beta/release candidate versions of Kubernetes. |
+ | Show unstable versions of Kubernetes as an upgrade alternative and allow upgrading to an alpha/beta/release candidate versions of Kubernetes. |
| --allow-release-candidate-upgrades |
- | Show release candidate versions of Kubernetes as an upgrade alternative and allow upgrading to a release candidate versions of Kubernetes. |
+ | Show release candidate versions of Kubernetes as an upgrade alternative and allow upgrading to a release candidate versions of Kubernetes. |
| --config string |
- | Path to a kubeadm configuration file. |
+ | Path to a kubeadm configuration file. |
| --feature-gates string |
- | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (ALPHA - default=false) PublicKeysECDSA=true|false (ALPHA - default=false) |
+ | A set of key=value pairs that describe feature gates for various features. Options are: IPv6DualStack=true|false (BETA - default=true) PublicKeysECDSA=true|false (ALPHA - default=false) RootlessControlPlane=true|false (ALPHA - default=false) |
| -h, --help |
- | help for plan |
+ | help for plan |
-| --ignore-preflight-errors stringSlice |
+--ignore-preflight-errors strings |
- | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
+ | A list of checks whose errors will be shown as warnings. Example: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks. |
| --kubeconfig string Default: "/etc/kubernetes/admin.conf" |
- | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
+ | The kubeconfig file to use when talking to the cluster. If the flag is not set, a set of standard locations can be searched for an existing kubeconfig file. |
| --print-config |
- | Specifies whether the configuration file that will be used in the upgrade should be printed or not. |
+ | Specifies whether the configuration file that will be used in the upgrade should be printed or not. |
@@ -91,7 +104,7 @@ kubeadm upgrade plan [version] [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_version.md b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_version.md
index 658075c4ea..b86c725977 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_version.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/generated/kubeadm_version.md
@@ -1,3 +1,16 @@
+
+
+
+Print the version of kubeadm
### Synopsis
@@ -21,14 +34,14 @@ kubeadm version [flags]
-h, --help |
- | help for version |
+ | help for version |
| -o, --output string |
- | Output format; available options are 'yaml', 'json' and 'short' |
+ | Output format; available options are 'yaml', 'json' and 'short' |
@@ -49,7 +62,7 @@ kubeadm version [flags]
--rootfs string |
- | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
+ | [EXPERIMENTAL] The path to the 'real' host root filesystem. |
diff --git a/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md b/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md
index 7159fc765d..6222685845 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/implementation-details.md
@@ -298,26 +298,6 @@ Please note that:
2. in case of kubeadm is executed in the `--dry-run` mode, the etcd static Pod manifest is written in a temporary folder
3. Static Pod manifest generation for local etcd can be invoked individually with the [`kubeadm init phase etcd local`](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-etcd) command
-### Optional Dynamic Kubelet Configuration
-
-To use this functionality call `kubeadm alpha kubelet config enable-dynamic`. It writes the kubelet init configuration
-into `/var/lib/kubelet/config/init/kubelet` file.
-
-The init configuration is used for starting the kubelet on this specific node, providing an alternative for the kubelet drop-in file;
-such configuration will be replaced by the kubelet base configuration as described in following steps.
-See [set kubelet parameters via a config file](/docs/tasks/administer-cluster/kubelet-config-file) for additional information.
-
-Please note that:
-
-1. To make dynamic kubelet configuration work, flag `--dynamic-config-dir=/var/lib/kubelet/config/dynamic` should be specified
- in `/etc/systemd/system/kubelet.service.d/10-kubeadm.conf`
-1. The kubelet configuration can be changed by passing a `KubeletConfiguration` object to `kubeadm init` or `kubeadm join` by using
- a configuration file `--config some-file.yaml`. The `KubeletConfiguration` object can be separated from other objects such
- as `InitConfiguration` using the `---` separator. For more details have a look at the `kubeadm config print-default` command.
-
-For more details about the `KubeletConfiguration` struct, take a look at the
-[`KubeletConfiguration` reference](/docs/reference/config-api/kubelet-config.v1beta1/).
-
### Wait for the control plane to come up
kubeadm waits (upto 4m0s) until `localhost:6443/healthz` (kube-apiserver liveness) returns `ok`. However in order to detect
@@ -327,17 +307,6 @@ deadlock conditions, kubeadm fails fast if `localhost:10255/healthz` (kubelet li
kubeadm relies on the kubelet to pull the control plane images and run them properly as static Pods.
After the control plane is up, kubeadm completes the tasks described in following paragraphs.
-### (optional) Write base kubelet configuration
-
-{{< feature-state for_k8s_version="v1.11" state="beta" >}}
-
-If kubeadm is invoked with `--feature-gates=DynamicKubeletConfig`:
-
-1. Write the kubelet base configuration into the `kubelet-base-config-v1.9` ConfigMap in the `kube-system` namespace
-2. Creates RBAC rules for granting read access to that ConfigMap to all bootstrap tokens and all kubelet instances
- (that is `system:bootstrappers:kubeadm:default-node-token` and `system:nodes` groups)
-3. Enable the dynamic kubelet configuration feature for the initial control-plane node by pointing `Node.spec.configSource` to the newly-created ConfigMap
-
### Save the kubeadm ClusterConfiguration in a ConfigMap for later reference
kubeadm saves the configuration passed to `kubeadm init` in a ConfigMap named `kubeadm-config` under `kube-system` namespace.
@@ -440,12 +409,14 @@ A ServiceAccount for `kube-proxy` is created in the `kube-system` namespace; the
#### DNS
-- In Kubernetes version 1.18 kube-dns usage with kubeadm is deprecated and will be removed in a future release
- The CoreDNS service is named `kube-dns`. This is done to prevent any interruption
- in service when the user is switching the cluster DNS from kube-dns to CoreDNS or vice-versa
- the `--config` method described [here](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-addon)
-- A ServiceAccount for CoreDNS/kube-dns is created in the `kube-system` namespace.
-- The `kube-dns` ServiceAccount is bound to the privileges in the `system:kube-dns` ClusterRole
+ in service when the user is switching the cluster DNS from kube-dns to CoreDNS
+ the `--config` method described [here](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-addon).
+- A ServiceAccount for CoreDNS is created in the `kube-system` namespace.
+- The `coredns` ServiceAccount is bound to the privileges in the `system:coredns` ClusterRole
+
+In Kubernetes version 1.21, support for using `kube-dns` with kubeadm was removed.
+You can use CoreDNS with kubeadm even when the related Service is named `kube-dns`.
## kubeadm join phases internal design
@@ -518,18 +489,3 @@ Please note that:
- The temporary authentication resolve to a user member of `system:bootstrappers:kubeadm:default-node-token` group which was granted
access to CSR api during the `kubeadm init` process
- The automatic CSR approval is managed by the csrapprover controller, according with configuration done the `kubeadm init` process
-
-### (optional) Write init kubelet configuration
-
-{{< feature-state for_k8s_version="v1.11" state="beta" >}}
-
-If kubeadm is invoked with `--feature-gates=DynamicKubeletConfig`:
-
-1. Read the kubelet base configuration from the `kubelet-base-config-v1.x` ConfigMap in the `kube-system` namespace using the
- Bootstrap Token credentials, and write it to disk as kubelet init configuration file `/var/lib/kubelet/config/init/kubelet`
-2. As soon as kubelet starts with the Node's own credential (`/etc/kubernetes/kubelet.conf`), update current node configuration
- specifying that the source for the node/kubelet configuration is the above ConfigMap.
-
-Please note that:
-
-1. To make dynamic kubelet configuration work, flag `--dynamic-config-dir=/var/lib/kubelet/config/dynamic` should be specified in `/etc/systemd/system/kubelet.service.d/10-kubeadm.conf`
diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md
index eaef0f5140..dd946c9737 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-alpha.md
@@ -9,34 +9,7 @@ weight: 90
from the community. Please try it out and give us feedback!
{{< /caution >}}
-## kubeadm alpha kubeconfig user {#cmd-phase-kubeconfig}
-
-The `user` subcommand can be used for the creation of kubeconfig files for additional users.
-
-{{< tabs name="tab-kubeconfig" >}}
-{{< tab name="kubeconfig" include="generated/kubeadm_alpha_kubeconfig.md" />}}
-{{< tab name="user" include="generated/kubeadm_alpha_kubeconfig_user.md" />}}
-{{< /tabs >}}
-
-## kubeadm alpha kubelet config {#cmd-phase-kubelet}
-
-Use the following command to enable the DynamicKubeletConfiguration feature.
-
-{{< tabs name="tab-kubelet" >}}
-{{< tab name="kubelet" include="generated/kubeadm_alpha_kubelet.md" />}}
-{{< tab name="enable-dynamic" include="generated/kubeadm_alpha_kubelet_config_enable-dynamic.md" />}}
-{{< /tabs >}}
-
-## kubeadm alpha selfhosting pivot {#cmd-selfhosting}
-
-The subcommand `pivot` can be used to convert a static Pod-hosted control plane into a self-hosted one.
-
-[Documentation](/docs/setup/production-environment/tools/kubeadm/self-hosting/)
-
-{{< tabs name="selfhosting" >}}
-{{< tab name="selfhosting" include="generated/kubeadm_alpha_selfhosting.md" />}}
-{{< tab name="pivot" include="generated/kubeadm_alpha_selfhosting_pivot.md" />}}
-{{< /tabs >}}
+Currently there are no experimental commands under `kubeadm alpha`.
## {{% heading "whatsnext" %}}
diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-config.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-config.md
index 23dff658e9..76d9921be1 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-config.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-config.md
@@ -10,7 +10,7 @@ weight: 50
During `kubeadm init`, kubeadm uploads the `ClusterConfiguration` object to your cluster
in a ConfigMap called `kubeadm-config` in the `kube-system` namespace. This configuration is then read during
-`kubeadm join`, `kubeadm reset` and `kubeadm upgrade`. To view this ConfigMap call `kubeadm config view`.
+`kubeadm join`, `kubeadm reset` and `kubeadm upgrade`.
You can use `kubeadm config print` to print the default configuration and `kubeadm config migrate` to
convert your old configuration files to a newer version. `kubeadm config images list` and
@@ -20,14 +20,17 @@ For more information navigate to
[Using kubeadm init with a configuration file](/docs/reference/setup-tools/kubeadm/kubeadm-init/#config-file)
or [Using kubeadm join with a configuration file](/docs/reference/setup-tools/kubeadm/kubeadm-join/#config-file).
+You can also configure several kubelet-configuration options with `kubeadm init`. These options will be the same on any node in your cluster.
+See [Configuring each kubelet in your cluster using kubeadm](/docs/setup/production-environment/tools/kubeadm/kubelet-integration/) for details.
+
In Kubernetes v1.13.0 and later to list/pull kube-dns images instead of the CoreDNS image
the `--config` method described [here](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-addon)
has to be used.
-## kubeadm config view {#cmd-config-view}
+## kubeadm config print {#cmd-config-print}
-{{< include "generated/kubeadm_config_view.md" >}}
+{{< include "generated/kubeadm_config_print.md" >}}
## kubeadm config print init-defaults {#cmd-config-print-init-defaults}
diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init-phase.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init-phase.md
index 21ab7a863d..3f9812b260 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init-phase.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init-phase.md
@@ -119,16 +119,16 @@ Use the following phase to configure bootstrap tokens.
{{< tab name="bootstrap-token" include="generated/kubeadm_init_phase_bootstrap-token.md" />}}
{{< /tabs >}}
-## kubeadm init phase kubelet-finialize {#cmd-phase-kubelet-finalize-all}
+## kubeadm init phase kubelet-finalize {#cmd-phase-kubelet-finalize-all}
Use the following phase to update settings relevant to the kubelet after TLS
bootstrap. You can use the `all` subcommand to run all `kubelet-finalize`
phases.
{{< tabs name="tab-kubelet-finalize" >}}
-{{< tab name="kublet-finalize" include="generated/kubeadm_init_phase_kubelet-finalize.md" />}}
-{{< tab name="kublet-finalize-all" include="generated/kubeadm_init_phase_kubelet-finalize_all.md" />}}
-{{< tab name="kublet-finalize-cert-rotation" include="generated/kubeadm_init_phase_kubelet-finalize_experimental-cert-rotation.md" />}}
+{{< tab name="kubelet-finalize" include="generated/kubeadm_init_phase_kubelet-finalize.md" />}}
+{{< tab name="kubelet-finalize-all" include="generated/kubeadm_init_phase_kubelet-finalize_all.md" />}}
+{{< tab name="kubelet-finalize-cert-rotation" include="generated/kubeadm_init_phase_kubelet-finalize_experimental-cert-rotation.md" />}}
{{< /tabs >}}
## kubeadm init phase addon {#cmd-phase-addon}
@@ -143,27 +143,8 @@ install them selectively.
{{< tab name="kube-proxy" include="generated/kubeadm_init_phase_addon_kube-proxy.md" />}}
{{< /tabs >}}
-To use kube-dns instead of CoreDNS you have to pass a configuration file:
-
-```bash
-# for installing a DNS addon only
-kubeadm init phase addon coredns --config=someconfig.yaml
-```
-
-The file has to contain a [`dns`](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2#DNS) field in[`ClusterConfiguration`](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2#ClusterConfiguration)
-and also a type for the addon - `kube-dns` (default value is `CoreDNS`).
-
-```yaml
-apiVersion: kubeadm.k8s.io/v1beta2
-kind: ClusterConfiguration
-dns:
- type: "kube-dns"
-```
-
-Please note that kube-dns usage with kubeadm is deprecated as of v1.18 and will be removed in a future release.
-
-For more details on each field in the `v1beta2` configuration you can navigate to our
-[API reference pages.] (https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2)
+For more details on each field in the `v1beta3` configuration you can navigate to our
+[API reference pages.](/docs/reference/config-api/kubeadm-config.v1beta3/)
## {{% heading "whatsnext" %}}
diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md
index c33a195120..3779ec2fdf 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-init.md
@@ -66,12 +66,10 @@ following steps:
1. Installs a DNS server (CoreDNS) and the kube-proxy addon components via the API server.
In Kubernetes version 1.11 and later CoreDNS is the default DNS server.
- To install kube-dns instead of CoreDNS, the DNS addon has to be configured in the kubeadm `ClusterConfiguration`.
- For more information about the configuration see the section `Using kubeadm init with a configuration file` below.
Please note that although the DNS server is deployed, it will not be scheduled until CNI is installed.
{{< warning >}}
- kube-dns usage with kubeadm is deprecated as of v1.18 and will be removed in a future release.
+ kube-dns usage with kubeadm is deprecated as of v1.18 and is removed in v1.21.
{{< /warning >}}
### Using init phases with kubeadm {#init-phases}
@@ -106,6 +104,10 @@ sudo kubeadm init --skip-phases=control-plane,etcd --config=configfile.yaml
What this example would do is write the manifest files for the control plane and etcd in `/etc/kubernetes/manifests` based on the configuration in `configfile.yaml`. This allows you to modify the files and then skip these phases using `--skip-phases`. By calling the last command you will create a control plane node with the custom manifest files.
+{{< feature-state for_k8s_version="v1.22" state="beta" >}}
+
+Alternatively, you can use the `skipPhases` field under `InitConfiguration`.
+
### Using kubeadm init with a configuration file {#config-file}
{{< caution >}}
@@ -124,8 +126,8 @@ The default configuration can be printed out using the
If your configuration is not using the latest version it is **recommended** that you migrate using
the [kubeadm config migrate](/docs/reference/setup-tools/kubeadm/kubeadm-config/) command.
-For more information on the fields and usage of the configuration you can navigate to our API reference
-page and pick a version from [the list](https://pkg.go.dev/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm#section-directories).
+For more information on the fields and usage of the configuration you can navigate to our
+[API reference page](/docs/reference/config-api/kubeadm-config.v1beta2/).
### Adding kube-proxy parameters {#kube-proxy}
@@ -144,7 +146,7 @@ For information about passing flags to control plane components see:
By default, kubeadm pulls images from `k8s.gcr.io`. If the
requested Kubernetes version is a CI label (such as `ci/latest`)
-`gcr.io/kubernetes-ci-images` is used.
+`gcr.io/k8s-staging-ci-images` is used.
You can override this behavior by using [kubeadm with a configuration file](#config-file).
Allowed customization are:
diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md
index 53ca4a789b..5ad349e66c 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-join.md
@@ -66,6 +66,10 @@ For example:
sudo kubeadm join --skip-phases=preflight --config=config.yaml
```
+{{< feature-state for_k8s_version="v1.22" state="beta" >}}
+
+Alternatively, you can use the `skipPhases` field in `JoinConfiguration`.
+
### Discovering what cluster CA to trust
The kubeadm discovery has several options, each with security tradeoffs.
@@ -282,8 +286,8 @@ The default configuration can be printed out using the
If your configuration is not using the latest version it is **recommended** that you migrate using
the [kubeadm config migrate](/docs/reference/setup-tools/kubeadm/kubeadm-config/) command.
-For more information on the fields and usage of the configuration you can navigate to our API reference
-page and pick a version from [the list](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm#pkg-subdirectories).
+For more information on the fields and usage of the configuration you can navigate to our
+[API reference](/docs/reference/config-api/kubeadm-config.v1beta2/).
## {{% heading "whatsnext" %}}
diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-kubeconfig.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-kubeconfig.md
new file mode 100644
index 0000000000..f912285f7d
--- /dev/null
+++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-kubeconfig.md
@@ -0,0 +1,21 @@
+---
+title: kubeadm kubeconfig
+content_type: concept
+weight: 90
+---
+
+`kubeadm kubeconfig` provides utilities for managing kubeconfig files.
+
+## kubeadm kubeconfig {#cmd-kubeconfig}
+
+{{< tabs name="tab-kubeconfig" >}}
+{{< tab name="overview" include="generated/kubeadm_kubeconfig.md" />}}
+{{< /tabs >}}
+
+## kubeadm kubeconfig user {#cmd-kubeconfig-user}
+
+This command can be used to output a kubeconfig file for an additional user.
+
+{{< tabs name="tab-kubeconfig-user" >}}
+{{< tab name="user" include="generated/kubeadm_kubeconfig_user.md" />}}
+{{< /tabs >}}
\ No newline at end of file
diff --git a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade.md b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade.md
index 5796e7aec7..6a2c5f782f 100644
--- a/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade.md
+++ b/content/en/docs/reference/setup-tools/kubeadm/kubeadm-upgrade.md
@@ -20,8 +20,6 @@ For older versions of kubeadm, please refer to older documentation sets of the K
You can use `kubeadm upgrade diff` to see the changes that would be applied to static pod manifests.
-To use kube-dns with upgrades in Kubernetes v1.13.0 and later please follow [this guide](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-addon).
-
In Kubernetes v1.15.0 and later, `kubeadm upgrade apply` and `kubeadm upgrade node` will also
automatically renew the kubeadm managed certificates on this node, including those stored in kubeconfig files.
To opt-out, it is possible to pass the flag `--certificate-renewal=false`. For more details about certificate
diff --git a/content/en/docs/reference/tools/_index.md b/content/en/docs/reference/tools/_index.md
index c8d42be352..f719515af7 100644
--- a/content/en/docs/reference/tools/_index.md
+++ b/content/en/docs/reference/tools/_index.md
@@ -10,9 +10,7 @@ no_list: true
Kubernetes contains several tools to help you work with the Kubernetes system.
-
-{{% thirdparty-content %}}
## Minikube
@@ -25,12 +23,13 @@ development and testing purposes.
[`Dashboard`](/docs/tasks/access-application-cluster/web-ui-dashboard/), the web-based user interface of Kubernetes, allows you to deploy containerized applications
to a Kubernetes cluster, troubleshoot them, and manage the cluster and its resources itself.
+{{% thirdparty-content %}}
## Helm
-[`Kubernetes Helm`](https://github.com/kubernetes/helm) is a tool for managing packages of pre-configured
-Kubernetes resources, aka Kubernetes charts.
+[Helm](https://helm.sh/) is a tool for managing packages of pre-configured
+Kubernetes resources. These packages are known as _Helm charts_.
-Beware Helm is a third party managed tool for managing packages of pre-configured
+Helm is a third party managed tool for managing packages of pre-configured
Kubernetes resources, aka Kubernetes charts.
Use Helm to:
diff --git a/content/en/docs/reference/using-api/api-concepts.md b/content/en/docs/reference/using-api/api-concepts.md
index e517a13d52..913d3db42e 100644
--- a/content/en/docs/reference/using-api/api-concepts.md
+++ b/content/en/docs/reference/using-api/api-concepts.md
@@ -49,7 +49,7 @@ Some resource types will have one or more sub-resources, represented as sub path
* Cluster-scoped subresource: `GET /apis/GROUP/VERSION/RESOURCETYPE/NAME/SUBRESOURCE`
* Namespace-scoped subresource: `GET /apis/GROUP/VERSION/namespaces/NAMESPACE/RESOURCETYPE/NAME/SUBRESOURCE`
-The verbs supported for each subresource will differ depending on the object - see the API documentation more information. It is not possible to access sub-resources across multiple resources - generally a new virtual resource type would be used if that becomes necessary.
+The verbs supported for each subresource will differ depending on the object - see the API documentation for more information. It is not possible to access sub-resources across multiple resources - generally a new virtual resource type would be used if that becomes necessary.
## Efficient detection of changes
@@ -192,7 +192,92 @@ For example, if there are 1,253 pods on the cluster and the client wants to rece
}
```
-Note that the `resourceVersion` of the list remains constant across each request, indicating the server is showing us a consistent snapshot of the pods. Pods that are created, updated, or deleted after version `10245` would not be shown unless the user makes a list request without the `continue` token. This allows clients to break large requests into smaller chunks and then perform a watch operation on the full set without missing any updates.
+Note that the `resourceVersion` of the list remains constant across each request,
+indicating the server is showing us a consistent snapshot of the pods. Pods that
+are created, updated, or deleted after version `10245` would not be shown unless
+the user makes a list request without the `continue` token. This allows clients
+to break large requests into smaller chunks and then perform a watch operation
+on the full set without missing any updates.
+
+`remainingItemCount` is the number of subsequent items in the list which are not
+included in this list response. If the list request contained label or field selectors,
+then the number of remaining items is unknown and the API server does not include
+a `remainingItemCount` field in its response. If the list is complete (either
+because it is not chunking or because this is the last chunk), then there are no
+more remaining items and the API server does not include a `remainingItemCount`
+field in its response. The intended use of the `remainingItemCount` is estimating
+the size of a collection.
+
+## Lists
+
+There are dozens of list types (such as `PodList`, `ServiceList`, and `NodeList`) defined in the Kubernetes API.
+You can get more information about each list type from the [Kubernetes API](/docs/reference/kubernetes-api/) documentation.
+
+When you query the API for a particular type, all items returned by that query are of that type. For example, when you
+ask for a list of services, the list type is shown as `kind: ServiceList` and each item in that list represents a single Service. For example:
+
+```console
+
+GET /api/v1/services
+---
+{
+ "kind": "ServiceList",
+ "apiVersion": "v1",
+ "metadata": {
+ "resourceVersion": "2947301"
+ },
+ "items": [
+ {
+ "metadata": {
+ "name": "kubernetes",
+ "namespace": "default",
+...
+ "metadata": {
+ "name": "kube-dns",
+ "namespace": "kube-system",
+...
+```
+
+Some tools, such as `kubectl` provide another way to query the Kubernetes API. Because the output of `kubectl` might include multiple list types, the list of items is represented as `kind: List`. For example:
+
+```console
+
+$ kubectl get services -A -o yaml
+
+apiVersion: v1
+kind: List
+metadata:
+ resourceVersion: ""
+ selfLink: ""
+items:
+- apiVersion: v1
+ kind: Service
+ metadata:
+ creationTimestamp: "2021-06-03T14:54:12Z"
+ labels:
+ component: apiserver
+ provider: kubernetes
+ name: kubernetes
+ namespace: default
+...
+- apiVersion: v1
+ kind: Service
+ metadata:
+ annotations:
+ prometheus.io/port: "9153"
+ prometheus.io/scrape: "true"
+ creationTimestamp: "2021-06-03T14:54:14Z"
+ labels:
+ k8s-app: kube-dns
+ kubernetes.io/cluster-service: "true"
+ kubernetes.io/name: CoreDNS
+ name: kube-dns
+ namespace: kube-system
+```
+
+{{< note >}}
+Keep in mind that the Kubernetes API does not have a `kind: List` type. `kind: List` is an internal mechanism type for lists of mixed resources and should not be depended upon.
+{{< /note >}}
## Receiving resources as Tables
@@ -442,7 +527,7 @@ feature, see the section on
## Resource Versions
-Resource versions are strings that identify the server's internal version of an object. Resource versions can be used by clients to determine when objects have changed, or to express data consistency requirements when getting, listing and watching resources. Resource versions must be treated as opaque by clients and passed unmodified back to the server. For example, clients must not assume resource versions are numeric, and may only compare two resource version for equality (i.e. must not compare resource versions for greater-than or less-than relationships).
+Resource versions are strings that identify the server's internal version of an object. Resource versions can be used by clients to determine when objects have changed, or to express data consistency requirements when getting, listing and watching resources. Resource versions must be treated as opaque by clients and passed unmodified back to the server. For example, clients must not assume resource versions are numeric, and may only compare two resource versions for equality (i.e. must not compare resource versions for greater-than or less-than relationships).
### ResourceVersion in metadata
@@ -454,7 +539,7 @@ Clients find resource versions in resources, including the resources in watch ev
### The ResourceVersion Parameter
-The get, list and watch operations support the `resourceVersion` parameter.
+The get, list, and watch operations support the `resourceVersion` parameter.
The exact meaning of this parameter differs depending on the operation and the value of `resourceVersion`.
diff --git a/content/en/docs/reference/using-api/client-libraries.md b/content/en/docs/reference/using-api/client-libraries.md
index a484c8e74f..eed8169909 100644
--- a/content/en/docs/reference/using-api/client-libraries.md
+++ b/content/en/docs/reference/using-api/client-libraries.md
@@ -30,13 +30,12 @@ The following client libraries are officially maintained by
| Language | Client Library | Sample Programs |
|----------|----------------|-----------------|
-| Go | [github.com/kubernetes/client-go/](https://github.com/kubernetes/client-go/) | [browse](https://github.com/kubernetes/client-go/tree/master/examples)
-| Python | [github.com/kubernetes-client/python/](https://github.com/kubernetes-client/python/) | [browse](https://github.com/kubernetes-client/python/tree/master/examples)
-| Java | [github.com/kubernetes-client/java](https://github.com/kubernetes-client/java/) | [browse](https://github.com/kubernetes-client/java#installation)
| dotnet | [github.com/kubernetes-client/csharp](https://github.com/kubernetes-client/csharp) | [browse](https://github.com/kubernetes-client/csharp/tree/master/examples/simple)
-| JavaScript | [github.com/kubernetes-client/javascript](https://github.com/kubernetes-client/javascript) | [browse](https://github.com/kubernetes-client/javascript/tree/master/examples)
+| Go | [github.com/kubernetes/client-go/](https://github.com/kubernetes/client-go/) | [browse](https://github.com/kubernetes/client-go/tree/master/examples)
| Haskell | [github.com/kubernetes-client/haskell](https://github.com/kubernetes-client/haskell) | [browse](https://github.com/kubernetes-client/haskell/tree/master/kubernetes-client/example)
-
+| Java | [github.com/kubernetes-client/java](https://github.com/kubernetes-client/java/) | [browse](https://github.com/kubernetes-client/java#installation)
+| JavaScript | [github.com/kubernetes-client/javascript](https://github.com/kubernetes-client/javascript) | [browse](https://github.com/kubernetes-client/javascript/tree/master/examples)
+| Python | [github.com/kubernetes-client/python/](https://github.com/kubernetes-client/python/) | [browse](https://github.com/kubernetes-client/python/tree/master/examples)
## Community-maintained client libraries
@@ -48,6 +47,10 @@ their authors, not the Kubernetes team.
| Language | Client Library |
| -------------------- | ---------------------------------------- |
| Clojure | [github.com/yanatan16/clj-kubernetes-api](https://github.com/yanatan16/clj-kubernetes-api) |
+| DotNet | [github.com/tonnyeremin/kubernetes_gen](https://github.com/tonnyeremin/kubernetes_gen) |
+| DotNet (RestSharp) | [github.com/masroorhasan/Kubernetes.DotNet](https://github.com/masroorhasan/Kubernetes.DotNet) |
+| Elixir | [github.com/obmarg/kazan](https://github.com/obmarg/kazan/) |
+| Elixir | [github.com/coryodaniel/k8s](https://github.com/coryodaniel/k8s) |
| Go | [github.com/ericchiang/k8s](https://github.com/ericchiang/k8s) |
| Java (OSGi) | [bitbucket.org/amdatulabs/amdatu-kubernetes](https://bitbucket.org/amdatulabs/amdatu-kubernetes) |
| Java (Fabric8, OSGi) | [github.com/fabric8io/kubernetes-client](https://github.com/fabric8io/kubernetes-client) |
@@ -63,23 +66,16 @@ their authors, not the Kubernetes team.
| PHP | [github.com/maclof/kubernetes-client](https://github.com/maclof/kubernetes-client) |
| PHP | [github.com/travisghansen/kubernetes-client-php](https://github.com/travisghansen/kubernetes-client-php) |
| PHP | [github.com/renoki-co/php-k8s](https://github.com/renoki-co/php-k8s) |
-| Python | [github.com/eldarion-gondor/pykube](https://github.com/eldarion-gondor/pykube) |
| Python | [github.com/fiaas/k8s](https://github.com/fiaas/k8s) |
| Python | [github.com/mnubo/kubernetes-py](https://github.com/mnubo/kubernetes-py) |
| Python | [github.com/tomplus/kubernetes_asyncio](https://github.com/tomplus/kubernetes_asyncio) |
| Python | [github.com/Frankkkkk/pykorm](https://github.com/Frankkkkk/pykorm) |
| Ruby | [github.com/abonas/kubeclient](https://github.com/abonas/kubeclient) |
| Ruby | [github.com/Ch00k/kuber](https://github.com/Ch00k/kuber) |
+| Ruby | [github.com/k8s-ruby/k8s-ruby](https://github.com/k8s-ruby/k8s-ruby) |
| Ruby | [github.com/kontena/k8s-client](https://github.com/kontena/k8s-client) |
| Rust | [github.com/clux/kube-rs](https://github.com/clux/kube-rs) |
| Rust | [github.com/ynqa/kubernetes-rust](https://github.com/ynqa/kubernetes-rust) |
| Scala | [github.com/hagay3/skuber](https://github.com/hagay3/skuber) |
| Scala | [github.com/joan38/kubernetes-client](https://github.com/joan38/kubernetes-client) |
| Swift | [github.com/swiftkube/client](https://github.com/swiftkube/client) |
-| DotNet | [github.com/tonnyeremin/kubernetes_gen](https://github.com/tonnyeremin/kubernetes_gen) |
-| DotNet (RestSharp) | [github.com/masroorhasan/Kubernetes.DotNet](https://github.com/masroorhasan/Kubernetes.DotNet) |
-| Elixir | [github.com/obmarg/kazan](https://github.com/obmarg/kazan/) |
-| Elixir | [github.com/coryodaniel/k8s](https://github.com/coryodaniel/k8s) |
-
-
-
diff --git a/content/en/docs/reference/using-api/deprecation-guide.md b/content/en/docs/reference/using-api/deprecation-guide.md
old mode 100755
new mode 100644
index a8ad3494bd..579e4c04ac
--- a/content/en/docs/reference/using-api/deprecation-guide.md
+++ b/content/en/docs/reference/using-api/deprecation-guide.md
@@ -25,6 +25,25 @@ deprecated API versions to newer and more stable API versions.
The **v1.25** release will stop serving the following deprecated API versions:
+#### CronJob {#cronjob-v125}
+
+The **batch/v1beta1** API version of CronJob will no longer be served in v1.25.
+
+* Migrate manifests and API clients to use the **batch/v1** API version, available since v1.21.
+* All existing persisted objects are accessible via the new API
+* No notable changes
+
+#### EndpointSlice {#endpointslice-v125}
+
+The **discovery.k8s.io/v1beta1** API version of EndpointSlice will no longer be served in v1.25.
+
+* Migrate manifests and API clients to use the **discovery.k8s.io/v1** API version, available since v1.21.
+* All existing persisted objects are accessible via the new API
+* Notable changes in **discovery.k8s.io/v1**:
+ * use per Endpoint `nodeName` field instead of deprecated `topology["kubernetes.io/hostname"]` field
+ * use per Endpoint `zone` field instead of deprecated `topology["topology.kubernetes.io/zone"]` field
+ * `topology` is replaced with the `deprecatedTopology` field which is not writable in v1
+
#### Event {#event-v125}
The **events.k8s.io/v1beta1** API version of Event will no longer be served in v1.25.
@@ -34,13 +53,29 @@ The **events.k8s.io/v1beta1** API version of Event will no longer be served in v
* Notable changes in **events.k8s.io/v1**:
* `type` is limited to `Normal` and `Warning`
* `involvedObject` is renamed to `regarding`
- * `action`, `reason`, `reportingComponent`, and `reportingInstance` are required when creating new **events.k8s.io/v1** Events
+ * `action`, `reason`, `reportingController`, and `reportingInstance` are required when creating new **events.k8s.io/v1** Events
* use `eventTime` instead of the deprecated `firstTimestamp` field (which is renamed to `deprecatedFirstTimestamp` and not permitted in new **events.k8s.io/v1** Events)
* use `series.lastObservedTime` instead of the deprecated `lastTimestamp` field (which is renamed to `deprecatedLastTimestamp` and not permitted in new **events.k8s.io/v1** Events)
* use `series.count` instead of the deprecated `count` field (which is renamed to `deprecatedCount` and not permitted in new **events.k8s.io/v1** Events)
- * use `reportingComponent` instead of the deprecated `source.component` field (which is renamed to `deprecatedSource.component` and not permitted in new **events.k8s.io/v1** Events)
+ * use `reportingController` instead of the deprecated `source.component` field (which is renamed to `deprecatedSource.component` and not permitted in new **events.k8s.io/v1** Events)
* use `reportingInstance` instead of the deprecated `source.host` field (which is renamed to `deprecatedSource.host` and not permitted in new **events.k8s.io/v1** Events)
+#### PodDisruptionBudget {#poddisruptionbudget-v125}
+
+The **policy/v1beta1** API version of PodDisruptionBudget will no longer be served in v1.25.
+
+* Migrate manifests and API clients to use the **policy/v1** API version, available since v1.21.
+* All existing persisted objects are accessible via the new API
+* Notable changes in **policy/v1**:
+ * an empty `spec.selector` (`{}`) written to a `policy/v1` PodDisruptionBudget selects all pods in the namespace (in `policy/v1beta1` an empty `spec.selector` selected no pods). An unset `spec.selector` selects no pods in either API version.
+
+#### PodSecurityPolicy {#psp-v125}
+
+PodSecurityPolicy in the **policy/v1beta1** API version will no longer be served in v1.25, and the PodSecurityPolicy admission controller will be removed.
+
+PodSecurityPolicy replacements are still under discussion, but current use can be migrated to
+[3rd-party admission webhooks](/docs/reference/access-authn-authz/extensible-admission-controllers/) now.
+
#### RuntimeClass {#runtimeclass-v125}
RuntimeClass in the **node.k8s.io/v1beta1** API version will no longer be served in v1.25.
@@ -51,11 +86,11 @@ RuntimeClass in the **node.k8s.io/v1beta1** API version will no longer be served
### v1.22
-The **v1.22** release will stop serving the following deprecated API versions:
+The **v1.22** release stopped serving the following deprecated API versions:
#### Webhook resources {#webhook-resources-v122}
-The **admissionregistration.k8s.io/v1beta1** API version of MutatingWebhookConfiguration and ValidatingWebhookConfiguration will no longer be served in v1.22.
+The **admissionregistration.k8s.io/v1beta1** API version of MutatingWebhookConfiguration and ValidatingWebhookConfiguration is no longer served as of v1.22.
* Migrate manifests and API clients to use the **admissionregistration.k8s.io/v1** API version, available since v1.16.
* All existing persisted objects are accessible via the new APIs
@@ -69,7 +104,7 @@ The **admissionregistration.k8s.io/v1beta1** API version of MutatingWebhookConfi
#### CustomResourceDefinition {#customresourcedefinition-v122}
-The **apiextensions.k8s.io/v1beta1** API version of CustomResourceDefinition will no longer be served in v1.22.
+The **apiextensions.k8s.io/v1beta1** API version of CustomResourceDefinition is no longer served as of v1.22.
* Migrate manifests and API clients to use the **apiextensions.k8s.io/v1** API version, available since v1.16.
* All existing persisted objects are accessible via the new API
@@ -87,7 +122,7 @@ The **apiextensions.k8s.io/v1beta1** API version of CustomResourceDefinition wil
#### APIService {#apiservice-v122}
-The **apiregistration.k8s.io/v1beta1** API version of APIService will no longer be served in v1.22.
+The **apiregistration.k8s.io/v1beta1** API version of APIService is no longer served as of v1.22.
* Migrate manifests and API clients to use the **apiregistration.k8s.io/v1** API version, available since v1.10.
* All existing persisted objects are accessible via the new API
@@ -95,14 +130,14 @@ The **apiregistration.k8s.io/v1beta1** API version of APIService will no longer
#### TokenReview {#tokenreview-v122}
-The **authentication.k8s.io/v1beta1** API version of TokenReview will no longer be served in v1.22.
+The **authentication.k8s.io/v1beta1** API version of TokenReview is no longer served as of v1.22.
* Migrate manifests and API clients to use the **authentication.k8s.io/v1** API version, available since v1.6.
* No notable changes
#### SubjectAccessReview resources {#subjectaccessreview-resources-v122}
-The **authorization.k8s.io/v1beta1** API version of LocalSubjectAccessReview, SelfSubjectAccessReview, and SubjectAccessReview will no longer be served in v1.22.
+The **authorization.k8s.io/v1beta1** API version of LocalSubjectAccessReview, SelfSubjectAccessReview, and SubjectAccessReview is no longer served as of v1.22.
* Migrate manifests and API clients to use the **authorization.k8s.io/v1** API version, available since v1.6.
* Notable changes:
@@ -110,7 +145,7 @@ The **authorization.k8s.io/v1beta1** API version of LocalSubjectAccessReview, Se
#### CertificateSigningRequest {#certificatesigningrequest-v122}
-The **certificates.k8s.io/v1beta1** API version of CertificateSigningRequest will no longer be served in v1.22.
+The **certificates.k8s.io/v1beta1** API version of CertificateSigningRequest is no longer served as of v1.22.
* Migrate manifests and API clients to use the **certificates.k8s.io/v1** API version, available since v1.19.
* All existing persisted objects are accessible via the new API
@@ -125,7 +160,7 @@ The **certificates.k8s.io/v1beta1** API version of CertificateSigningRequest wil
#### Lease {#lease-v122}
-The **coordination.k8s.io/v1beta1** API version of Lease will no longer be served in v1.22.
+The **coordination.k8s.io/v1beta1** API version of Lease is no longer served as of v1.22.
* Migrate manifests and API clients to use the **coordination.k8s.io/v1** API version, available since v1.14.
* All existing persisted objects are accessible via the new API
@@ -133,7 +168,7 @@ The **coordination.k8s.io/v1beta1** API version of Lease will no longer be serve
#### Ingress {#ingress-v122}
-The **extensions/v1beta1** and **networking.k8s.io/v1beta1** API versions of Ingress will no longer be served in v1.22.
+The **extensions/v1beta1** and **networking.k8s.io/v1beta1** API versions of Ingress is no longer served as of v1.22.
* Migrate manifests and API clients to use the **networking.k8s.io/v1** API version, available since v1.19.
* All existing persisted objects are accessible via the new API
@@ -146,7 +181,7 @@ The **extensions/v1beta1** and **networking.k8s.io/v1beta1** API versions of Ing
#### IngressClass {#ingressclass-v122}
-The **networking.k8s.io/v1beta1** API version of IngressClass will no longer be served in v1.22.
+The **networking.k8s.io/v1beta1** API version of IngressClass is no longer served as of v1.22.
* Migrate manifests and API clients to use the **networking.k8s.io/v1** API version, available since v1.19.
* All existing persisted objects are accessible via the new API
@@ -154,7 +189,7 @@ The **networking.k8s.io/v1beta1** API version of IngressClass will no longer be
#### RBAC resources {#rbac-resources-v122}
-The **rbac.authorization.k8s.io/v1beta1** API version of ClusterRole, ClusterRoleBinding, Role, and RoleBinding will no longer be served in v1.22.
+The **rbac.authorization.k8s.io/v1beta1** API version of ClusterRole, ClusterRoleBinding, Role, and RoleBinding is no longer served as of v1.22.
* Migrate manifests and API clients to use the **rbac.authorization.k8s.io/v1** API version, available since v1.8.
* All existing persisted objects are accessible via the new APIs
@@ -162,7 +197,7 @@ The **rbac.authorization.k8s.io/v1beta1** API version of ClusterRole, ClusterRol
#### PriorityClass {#priorityclass-v122}
-The **scheduling.k8s.io/v1beta1** API version of PriorityClass will no longer be served in v1.22.
+The **scheduling.k8s.io/v1beta1** API version of PriorityClass is no longer served as of v1.22.
* Migrate manifests and API clients to use the **scheduling.k8s.io/v1** API version, available since v1.14.
* All existing persisted objects are accessible via the new API
@@ -170,7 +205,7 @@ The **scheduling.k8s.io/v1beta1** API version of PriorityClass will no longer be
#### Storage resources {#storage-resources-v122}
-The **storage.k8s.io/v1beta1** API version of CSIDriver, CSINode, StorageClass, and VolumeAttachment will no longer be served in v1.22.
+The **storage.k8s.io/v1beta1** API version of CSIDriver, CSINode, StorageClass, and VolumeAttachment is no longer served as of v1.22.
* Migrate manifests and API clients to use the **storage.k8s.io/v1** API version
* CSIDriver is available in **storage.k8s.io/v1** since v1.19.
@@ -234,6 +269,13 @@ The **extensions/v1beta1**, **apps/v1beta1**, and **apps/v1beta2** API versions
* Notable changes:
* `spec.selector` is now required and immutable after creation; use the existing template labels as the selector for seamless upgrades
+#### PodSecurityPolicy {#psp-v116}
+
+The **extensions/v1beta1** API version of PodSecurityPolicy is no longer served as of v1.16.
+
+* Migrate manifests and API client to use the **policy/v1beta1** API version, available since v1.10.
+* Note that the **policy/v1beta1** API version of PodSecurityPolicy will be removed in v1.25.
+
## What to do
### Test with deprecated APIs disabled
diff --git a/content/en/docs/reference/using-api/deprecation-policy.md b/content/en/docs/reference/using-api/deprecation-policy.md
index 4de09ee82a..6bbd9be9e1 100644
--- a/content/en/docs/reference/using-api/deprecation-policy.md
+++ b/content/en/docs/reference/using-api/deprecation-policy.md
@@ -109,7 +109,7 @@ objects.
All of this is best illustrated by examples. Imagine a Kubernetes release,
version X, which introduces a new API group. A new Kubernetes release is made
-every approximately 3 months (4 per year). The following table describes which
+every approximately 4 months (3 per year). The following table describes which
API versions are supported in a series of subsequent releases.
@@ -301,7 +301,7 @@ Starting in Kubernetes v1.19, making an API request to a deprecated REST API end
1. Returns a `Warning` header (as defined in [RFC7234, Section 5.5](https://tools.ietf.org/html/rfc7234#section-5.5)) in the API response.
2. Adds a `"k8s.io/deprecated":"true"` annotation to the [audit event](/docs/tasks/debug-application-cluster/audit/) recorded for the request.
-3. Sets an `apiserver_requested_deprecated_apis` gauge metric to `1` in the `kube-apiserver`
+3. Sets an `apiserver_requested_deprecated_apis` gauge metric to `1` in the `kube-apiserver`
process. The metric has labels for `group`, `version`, `resource`, `subresource` that can be joined
to the `apiserver_request_total` metric, and a `removed_release` label that indicates the
Kubernetes release in which the API will no longer be served. The following Prometheus query
@@ -428,6 +428,46 @@ transitions a lifecycle stage as follows. Feature gates must function for no les
is deprecated it must be documented in both in the release notes and the corresponding CLI help.
Both warnings and documentation must indicate whether a feature gate is non-operational.**
+## Deprecating a metric
+
+Each component of the Kubernetes control-plane exposes metrics (usually the
+`/metrics` endpoint), which are typically ingested by cluster administrators.
+Not all metrics are the same: some metrics are commonly used as SLIs or used
+to determine SLOs, these tend to have greater import. Other metrics are more
+experimental in nature or are used primarily in the Kubernetes development
+process.
+
+Accordingly, metrics fall under two stability classes (`ALPHA` and `STABLE`);
+this impacts removal of a metric during a Kubernetes release. These classes
+are determined by the perceived importance of the metric. The rules for
+deprecating and removing a metric are as follows:
+
+**Rule #9a: Metrics, for the corresponding stability class, must function for no less than:**
+
+ * **STABLE: 4 releases or 12 months (whichever is longer)**
+ * **ALPHA: 0 releases**
+
+**Rule #9b: Metrics, after their _announced deprecation_, must function for no less than:**
+
+ * **STABLE: 3 releases or 9 months (whichever is longer)**
+ * **ALPHA: 0 releases**
+
+Deprecated metrics will have their description text prefixed with a deprecation notice
+string '(Deprecated from x.y)' and a warning log will be emitted during metric
+registration. Like their stable undeprecated counterparts, deprecated metrics will
+be automatically registered to the metrics endpoint and therefore visible.
+
+On a subsequent release (when the metric's `deprecatedVersion` is equal to
+_current_kubernetes_version - 3_)), a deprecated metric will become a _hidden_ metric.
+**_Unlike_** their deprecated counterparts, hidden metrics will _no longer_ be
+automatically registered to the metrics endpoint (hence hidden). However, they
+can be explicitly enabled through a command line flag on the binary
+(`--show-hidden-metrics-for-version=`). This provides cluster admins an
+escape hatch to properly migrate off of a deprecated metric, if they were not
+able to react to the earlier deprecation warnings. Hidden metrics should be
+deleted after one release.
+
+
## Exceptions
No policy can cover every possible situation. This policy is a living
@@ -438,4 +478,3 @@ leaders to find the best solutions for those specific cases, always bearing in
mind that Kubernetes is committed to being a stable system that, as much as
possible, never breaks users. Exceptions will always be announced in all
relevant release notes.
-
diff --git a/content/en/docs/reference/using-api/health-checks.md b/content/en/docs/reference/using-api/health-checks.md
index 2c315505db..e4ce50f30d 100644
--- a/content/en/docs/reference/using-api/health-checks.md
+++ b/content/en/docs/reference/using-api/health-checks.md
@@ -18,14 +18,14 @@ The Kubernetes API server provides 3 API endpoints (`healthz`, `livez` and `read
The `healthz` endpoint is deprecated (since Kubernetes v1.16), and you should use the more specific `livez` and `readyz` endpoints instead.
The `livez` endpoint can be used with the `--livez-grace-period` [flag](/docs/reference/command-line-tools-reference/kube-apiserver) to specify the startup duration.
For a graceful shutdown you can specify the `--shutdown-delay-duration` [flag](/docs/reference/command-line-tools-reference/kube-apiserver) with the `/readyz` endpoint.
-Machines that check the `health`/`livez`/`readyz` of the API server should rely on the HTTP status code.
+Machines that check the `healthz`/`livez`/`readyz` of the API server should rely on the HTTP status code.
A status code `200` indicates the API server is `healthy`/`live`/`ready`, depending of the called endpoint.
The more verbose options shown below are intended to be used by human operators to debug their cluster or specially the state of the API server.
The following examples will show how you can interact with the health API endpoints.
For all endpoints you can use the `verbose` parameter to print out the checks and their status.
-This can be useful for a human operator to debug the current status of the Api server, it is not intended to be consumed by a machine:
+This can be useful for a human operator to debug the current status of the API server, it is not intended to be consumed by a machine:
```shell
curl -k https://localhost:6443/livez?verbose
@@ -93,7 +93,7 @@ The output show that the `etcd` check is excluded:
{{< feature-state state="alpha" >}}
-Each individual health check exposes an http endpoint and could can be checked individually.
+Each individual health check exposes an HTTP endpoint and could can be checked individually.
The schema for the individual health checks is `/livez/` where `livez` and `readyz` and be used to indicate if you want to check the liveness or the readiness of the API server.
The `` path can be discovered using the `verbose` flag from above and take the path between `[+]` and `ok`.
These individual health checks should not be consumed by machines but can be helpful for a human operator to debug a system:
diff --git a/content/en/docs/reference/using-api/server-side-apply.md b/content/en/docs/reference/using-api/server-side-apply.md
index 81afa5b567..60acb02f7d 100644
--- a/content/en/docs/reference/using-api/server-side-apply.md
+++ b/content/en/docs/reference/using-api/server-side-apply.md
@@ -12,7 +12,7 @@ min-kubernetes-server-version: 1.16
-{{< feature-state for_k8s_version="v1.16" state="beta" >}}
+{{< feature-state for_k8s_version="v1.22" state="stable" >}}
## Introduction
@@ -224,17 +224,75 @@ merging, see
A number of markers were added in Kubernetes 1.16 and 1.17, to allow API
developers to describe the merge strategy supported by lists, maps, and
structs. These markers can be applied to objects of the respective type,
-in Go files or in the OpenAPI schema definition of the
+in Go files or in the OpenAPI schema definition of the
[CRD](/docs/reference/generated/kubernetes-api/{{< param "version" >}}#jsonschemaprops-v1-apiextensions-k8s-io):
| Golang marker | OpenAPI extension | Accepted values | Description | Introduced in |
|---|---|---|---|---|
-| `//+listType` | `x-kubernetes-list-type` | `atomic`/`set`/`map` | Applicable to lists. `atomic` and `set` apply to lists with scalar elements only. `map` applies to lists of nested types only. If configured as `atomic`, the entire list is replaced during merge; a single manager manages the list as a whole at any one time. If `set` or `map`, different managers can manage entries separately. | 1.16 |
-| `//+listMapKey` | `x-kubernetes-list-map-keys` | Slice of map keys that uniquely identify entries for example `["port", "protocol"]` | Only applicable when `+listType=map`. A slice of strings whose values in combination must uniquely identify list entries. While there can be multiple keys, `listMapKey` is singular because keys need to be specified individually in the Go type. | 1.16 |
+| `//+listType` | `x-kubernetes-list-type` | `atomic`/`set`/`map` | Applicable to lists. `set` applies to lists that include only scalar elements. These elements must be unique. `map` applies to lists of nested types only. The key values (see `listMapKey`) must be unique in the list. `atomic` can apply to any list. If configured as `atomic`, the entire list is replaced during merge. At any point in time, a single manager owns the list. If `set` or `map`, different managers can manage entries separately. | 1.16 |
+| `//+listMapKey` | `x-kubernetes-list-map-keys` | List of field names, e.g. `["port", "protocol"]` | Only applicable when `+listType=map`. A list of field names whose values uniquely identify entries in the list. While there can be multiple keys, `listMapKey` is singular because keys need to be specified individually in the Go type. The key fields must be scalars. | 1.16 |
| `//+mapType` | `x-kubernetes-map-type` | `atomic`/`granular` | Applicable to maps. `atomic` means that the map can only be entirely replaced by a single manager. `granular` means that the map supports separate managers updating individual fields. | 1.17 |
| `//+structType` | `x-kubernetes-map-type` | `atomic`/`granular` | Applicable to structs; otherwise same usage and OpenAPI annotation as `//+mapType`.| 1.17 |
-### Custom Resources
+If `listType` is missing, the API server interprets a
+`patchMergeStrategy=merge` marker as a `listType=map` and the
+corresponding `patchMergeKey` marker as a `listMapKey`.
+
+The `atomic` list type is recursive.
+
+These markers are specified as comments and don't have to be repeated as
+field tags.
+
+### Compatibility across topology changes
+
+On rare occurrences, a CRD or built-in type author may want to change the
+specific topology of a field in their resource without incrementing its
+version. Changing the topology of types, by upgrading the cluster or
+updating the CRD, has different consequences when updating existing
+objects. There are two categories of changes: when a field goes from
+`map`/`set`/`granular` to `atomic` and the other way around.
+
+When the `listType`, `mapType`, or `structType` changes from
+`map`/`set`/`granular` to `atomic`, the whole list, map, or struct of
+existing objects will end-up being owned by actors who owned an element
+of these types. This means that any further change to these objects
+would cause a conflict.
+
+When a list, map, or struct changes from `atomic` to
+`map`/`set`/`granular`, the API server won't be able to infer the new
+ownership of these fields. Because of that, no conflict will be produced
+when objects have these fields updated. For that reason, it is not
+recommended to change a type from `atomic` to `map`/`set`/`granular`.
+
+Take for example, the custom resource:
+
+```yaml
+apiVersion: example.com/v1
+kind: Foo
+metadata:
+ name: foo-sample
+ managedFields:
+ - manager: manager-one
+ operation: Apply
+ apiVersion: example.com/v1
+ fields:
+ f:spec:
+ f:data: {}
+spec:
+ data:
+ key1: val1
+ key2: val2
+```
+
+Before `spec.data` gets changed from `atomic` to `granular`,
+`manager-one` owns the field `spec.data`, and all the fields within it
+(`key1` and `key2`). When the CRD gets changed to make `spec.data`
+`granular`, `manager-one` continues to own the top-level field
+`spec.data` (meaning no other managers can delete the map called `data`
+without a conflict), but it no longer owns `key1` and `key2`, so another
+manager can then modify or delete those fields without conflict.
+
+## Custom Resources
By default, Server Side Apply treats custom resources as unstructured data. All
keys are treated the same as struct fields, and all lists are considered atomic.
@@ -245,14 +303,14 @@ that contains annotations as defined in the previous "Merge Strategy"
section, these annotations will be used when merging objects of this
type.
-### Using Server-Side Apply in a controller
+## Using Server-Side Apply in a controller
As a developer of a controller, you can use server-side apply as a way to
simplify the update logic of your controller. The main differences with a
read-modify-write and/or patch are the following:
* the applied object must contain all the fields that the controller cares about.
-* there are no way to remove fields that haven't been applied by the controller
+* there is no way to remove fields that haven't been applied by the controller
before (controller can still send a PATCH/UPDATE for these use-cases).
* the object doesn't have to be read beforehand, `resourceVersion` doesn't have
to be specified.
@@ -260,7 +318,7 @@ read-modify-write and/or patch are the following:
It is strongly recommended for controllers to always "force" conflicts, since they
might not be able to resolve or act on these conflicts.
-### Transferring Ownership
+## Transferring Ownership
In addition to the concurrency controls provided by [conflict resolution](#conflicts),
Server Side Apply provides ways to perform coordinated
@@ -329,7 +387,7 @@ Note that whenever the HPA controller sets the `replicas` field to a new value,
the temporary field manager will no longer own any fields and will be
automatically deleted. No clean up is required.
-## Transferring Ownership Between Users
+### Transferring Ownership Between Users
Users can transfer ownership of a field between each other by setting the field
to the same value in both of their applied configs, causing them to share
@@ -415,7 +473,7 @@ have an opinion about.
## Clearing ManagedFields
It is possible to strip all managedFields from an object by overwriting them
-using `MergePatch`, `StrategicMergePatch`, `JSONPatch` or `Update`, so every
+using `MergePatch`, `StrategicMergePatch`, `JSONPatch`, or `Update`, so every
non-apply operation. This can be done by overwriting the managedFields field
with an empty entry. Two examples are:
@@ -458,4 +516,3 @@ Server Side Apply is a beta feature, so it is enabled by default. To turn this
you need to include the `--feature-gates ServerSideApply=false` flag when
starting `kube-apiserver`. If you have multiple `kube-apiserver` replicas, all
should have the same flag setting.
-
diff --git a/content/en/docs/setup/_index.md b/content/en/docs/setup/_index.md
index 59db384258..bb73375553 100644
--- a/content/en/docs/setup/_index.md
+++ b/content/en/docs/setup/_index.md
@@ -3,11 +3,11 @@ reviewers:
- brendandburns
- erictune
- mikedanese
-no_issue: true
title: Getting started
main_menu: true
weight: 20
content_type: concept
+no_list: true
card:
name: setup
weight: 20
@@ -24,16 +24,40 @@ This section lists the different ways to set up and run Kubernetes.
When you install Kubernetes, choose an installation type based on: ease of maintenance, security,
control, available resources, and expertise required to operate and manage a cluster.
-You can deploy a Kubernetes cluster on a local machine, cloud, on-prem datacenter, or choose a managed Kubernetes cluster. There are also custom solutions across a wide range of cloud providers, or bare metal environments.
+You can [download Kubernetes](/releases/download/) to deploy a Kubernetes cluster
+on a local machine, into the cloud, or for your own datacenter.
+
+If you don't want to manage a Kubernetes cluster yourself, you could pick a managed service, including
+[certified platforms](/docs/setup/production-environment/turnkey-solutions/).
+There are also other standardized and custom solutions across a wide range of cloud and
+bare metal environments.
## Learning environment
-If you're learning Kubernetes, use the tools supported by the Kubernetes community, or tools in the ecosystem to set up a Kubernetes cluster on a local machine.
+If you're learning Kubernetes, use the tools supported by the Kubernetes community,
+or tools in the ecosystem to set up a Kubernetes cluster on a local machine.
+See [Install tools](/docs/tasks/tools/).
## Production environment
-When evaluating a solution for a production environment, consider which aspects of operating a Kubernetes cluster (or _abstractions_) you want to manage yourself or offload to a provider.
+When evaluating a solution for a
+[production environment](/docs/setup/production-environment/), consider which aspects of
+operating a Kubernetes cluster (or _abstractions_) you want to manage yourself and which you
+prefer to hand off to a provider.
-[Kubernetes Partners](https://kubernetes.io/partners/#conformance) includes a list of [Certified Kubernetes](https://github.com/cncf/k8s-conformance/#certified-kubernetes) providers.
+For a cluster you're managing yourself, the officially supported tool
+for deploying Kubernetes is [kubeadm](/docs/setup/production-environment/tools/kubeadm/).
+
+## {{% heading "whatsnext" %}}
+
+- [Download Kubernetes](/releases/download/)
+- Download and [install tools](/docs/tasks/tools/) including `kubectl`
+- Select a [container runtime](/docs/setup/production-environment/container-runtimes/) for your new cluster
+- Learn about [best practices](/docs/setup/best-practices/) for cluster setup
+
+Kubernetes is designed for its {{< glossary_tooltip term_id="control-plane" text="control plane" >}} to
+run on Linux. Within your cluster you can run applications on Linux or other operating systems, including
+Windows.
+- Learn to [set up clusters with Windows nodes](/docs/setup/production-environment/windows/)
diff --git a/content/en/docs/setup/best-practices/cluster-large.md b/content/en/docs/setup/best-practices/cluster-large.md
index a75499a811..0f7fb0552e 100644
--- a/content/en/docs/setup/best-practices/cluster-large.md
+++ b/content/en/docs/setup/best-practices/cluster-large.md
@@ -12,7 +12,7 @@ or virtual machines) running Kubernetes agents, managed by the
Kubernetes {{< param "version" >}} supports clusters with up to 5000 nodes. More specifically,
Kubernetes is designed to accommodate configurations that meet *all* of the following criteria:
-* No more than 100 pods per node
+* No more than 110 pods per node
* No more than 5000 nodes
* No more than 150000 total pods
* No more than 300000 total containers
@@ -24,7 +24,7 @@ on how your cluster is deployed.
To avoid running into cloud provider quota issues, when creating a cluster with many nodes,
consider:
-* Request a quota increase for cloud resources such as:
+* Requesting a quota increase for cloud resources such as:
* Computer instances
* CPUs
* Storage volumes
@@ -33,7 +33,7 @@ consider:
* Number of load balancers
* Network subnets
* Log streams
-* Gate the cluster scaling actions to brings up new nodes in batches, with a pause
+* Gating the cluster scaling actions to bring up new nodes in batches, with a pause
between batches, because some cloud providers rate limit the creation of new instances.
## Control plane components
@@ -66,6 +66,10 @@ When creating a cluster, you can (using custom tooling):
* start and configure additional etcd instance
* configure the {{< glossary_tooltip term_id="kube-apiserver" text="API server" >}} to use it for storing events
+See [Operating etcd clusters for Kubernetes](/docs/tasks/administer-cluster/configure-upgrade-etcd/) and
+[Set up a High Availability etcd cluster with kubeadm](/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/)
+for details on configuring and managing etcd for a large cluster.
+
## Addon resources
Kubernetes [resource limits](/docs/concepts/configuration/manage-resources-containers/)
@@ -120,3 +124,6 @@ components, including cluster-critical addons.
The [cluster autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler#readme)
integrates with a number of cloud providers to help you run the right number of
nodes for the level of resource demand in your cluster.
+
+The [addon resizer](https://github.com/kubernetes/autoscaler/tree/master/addon-resizer#readme)
+helps you in resizing the addons automatically as your cluster's scale changes.
\ No newline at end of file
diff --git a/content/en/docs/setup/best-practices/enforcing-pod-security-standards.md b/content/en/docs/setup/best-practices/enforcing-pod-security-standards.md
new file mode 100644
index 0000000000..2b7ca6144e
--- /dev/null
+++ b/content/en/docs/setup/best-practices/enforcing-pod-security-standards.md
@@ -0,0 +1,78 @@
+---
+reviewers:
+- tallclair
+- liggitt
+title: Enforcing Pod Security Standards
+weight: 40
+---
+
+
+
+This page provides an overview of best practices when it comes to enforcing
+[Pod Security Standards](/docs/concepts/security/pod-security-standards).
+
+
+
+## Using the built-in Pod Security Admission Controller
+
+{{< feature-state for_k8s_version="v1.22" state="alpha" >}}
+
+The [Pod Security Admission Controller](/docs/reference/access-authn-authz/admission-controllers/#podsecurity)
+intends to replace the deprecated PodSecurityPolicies.
+
+### Configure all cluster namespaces
+
+Namespaces that lack any configuration at all should be considered significant gaps in your cluster
+security model. We recommend taking the time to analyze the types of workloads occurring in each
+namespace, and by referencing the Pod Security Standards, decide on an appropriate level for
+each of them. Unlabeled namespaces should only indicate that they've yet to be evaluated.
+
+In the scenario that all workloads in all namespaces have the same security requirements,
+we provide an [example](/docs/concepts/security/pod-security-admission/#applying-to-all-namespaces)
+that illustrates how the PodSecurity labels can be applied in bulk.
+
+### Embrace the principle of least privilege
+
+In an ideal world, every pod in every namespace would meet the requirements of the `restricted`
+policy. However, this is not possible nor practical, as some workloads will require elevated
+privileges for legitimate reasons.
+
+- Namespaces allowing `privileged` workloads should establish and enforce appropriate access controls.
+- For workloads running in those permissive namespaces, maintain documentation about their unique
+ security requirements. If at all possible, consider how those requirements could be further
+ constrained.
+
+### Adopt a multi-mode strategy
+
+The `audit` and `warn` modes of the Pod Security Standards admission controller make it easy to
+collect important security insights about your pods without breaking existing workloads.
+
+It is good practice to enable these modes for all namespaces, setting them to the _desired_ level
+and version you would eventually like to `enforce`. The warnings and audit annotations generated in
+this phase can guide you toward that state. If you expect workload authors to make changes to fit
+within the desired level, enable the `warn` mode. If you expect to use audit logs to monitor/drive
+changes to fit within the desired level, enable the `audit` mode.
+
+When you have the `enforce` mode set to your desired value, these modes can still be useful in a
+few different ways:
+
+- By setting `warn` to the same level as `enforce`, clients will receive warnings when attempting
+ to create Pods (or resources that have Pod templates) that do not pass validation. This will help
+ them update those resources to become compliant.
+- In Namespaces that pin `enforce` to a specific non-latest version, setting the `audit` and `warn`
+ modes to the same level as `enforce`, but to the `latest` version, gives visibility into settings
+ that were allowed by previous versions but are not allowed per current best practices.
+
+## Third-party alternatives
+
+{{% thirdparty-content %}}
+
+Other alternatives for enforcing security profiles are being developed in the Kubernetes
+ecosystem:
+
+- [OPA Gatekeeper](https://github.com/open-policy-agent/gatekeeper).
+
+The decision to go with a _built-in_ solution (e.g. PodSecurity admission controller) versus a
+third-party tool is entirely dependent on your own situation. When evaluating any solution,
+trust of your supply chain is crucial. Ultimately, using _any_ of the aforementioned approaches
+will be better than doing nothing.
\ No newline at end of file
diff --git a/content/en/docs/setup/learning-environment/_index.md b/content/en/docs/setup/learning-environment/_index.md
index 672bbd69ed..6abebc3976 100644
--- a/content/en/docs/setup/learning-environment/_index.md
+++ b/content/en/docs/setup/learning-environment/_index.md
@@ -11,7 +11,7 @@ weight: 20
{{/* If you're localizing this page, you only need to copy the front matter */}}
{{/* and add a redirect into "/static/_redirects", for YOUR localization. */}}
-->
-
+
+
diff --git a/content/en/docs/setup/production-environment/_index.md b/content/en/docs/setup/production-environment/_index.md
index 346280893e..1611170ec9 100644
--- a/content/en/docs/setup/production-environment/_index.md
+++ b/content/en/docs/setup/production-environment/_index.md
@@ -1,4 +1,293 @@
---
-title: Production environment
+title: "Production environment"
+description: Create a production-quality Kubernetes cluster
weight: 30
+no_list: true
---
+
+
+A production-quality Kubernetes cluster requires planning and preparation.
+If your Kubernetes cluster is to run critical workloads, it must be configured to be resilient.
+This page explains steps you can take to set up a production-ready cluster,
+or to promote an existing cluster for production use.
+If you're already familiar with production setup and want the links, skip to
+[What's next](#what-s-next).
+
+
+
+## Production considerations
+
+Typically, a production Kubernetes cluster environment has more requirements than a
+personal learning, development, or test environment Kubernetes. A production environment may require
+secure access by many users, consistent availability, and the resources to adapt
+to changing demands.
+
+As you decide where you want your production Kubernetes environment to live
+(on premises or in a cloud) and the amount of management you want to take
+on or hand to others, consider how your requirements for a Kubernetes cluster
+are influenced by the following issues:
+
+- *Availability*: A single-machine Kubernetes [learning environment](/docs/setup/#learning-environment)
+has a single point of failure. Creating a highly available cluster means considering:
+ - Separating the control plane from the worker nodes.
+ - Replicating the control plane components on multiple nodes.
+ - Load balancing traffic to the cluster’s {{< glossary_tooltip term_id="kube-apiserver" text="API server" >}}.
+ - Having enough worker nodes available, or able to quickly become available, as changing workloads warrant it.
+
+- *Scale*: If you expect your production Kubernetes environment to receive a stable amount of
+demand, you might be able to set up for the capacity you need and be done. However,
+if you expect demand to grow over time or change dramatically based on things like
+season or special events, you need to plan how to scale to relieve increased
+pressure from more requests to the control plane and worker nodes or scale down to reduce unused
+resources.
+
+- *Security and access management*: You have full admin privileges on your own
+Kubernetes learning cluster. But shared clusters with important workloads, and
+more than one or two users, require a more refined approach to who and what can
+access cluster resources. You can use role-based access control
+([RBAC](/docs/reference/access-authn-authz/rbac/)) and other
+security mechanisms to make sure that users and workloads can get access to the
+resources they need, while keeping workloads, and the cluster itself, secure.
+You can set limits on the resources that users and workloads can access
+by managing [policies](/docs/concepts/policy/) and
+[container resources](/docs/concepts/configuration/manage-resources-containers/).
+
+Before building a Kubernetes production environment on your own, consider
+handing off some or all of this job to
+[Turnkey Cloud Solutions](/docs/setup/production-environment/turnkey-solutions/)
+providers or other [Kubernetes Partners](https://kubernetes.io/partners/).
+Options include:
+
+- *Serverless*: Just run workloads on third-party equipment without managing
+a cluster at all. You will be charged for things like CPU usage, memory, and
+disk requests.
+- *Managed control plane*: Let the provider manage the scale and availability
+of the cluster's control plane, as well as handle patches and upgrades.
+- *Managed worker nodes*: Configure pools of nodes to meet your needs,
+then the provider makes sure those nodes are available and ready to implement
+upgrades when needed.
+- *Integration*: There are providers that integrate Kubernetes with other
+services you may need, such as storage, container registries, authentication
+methods, and development tools.
+
+Whether you build a production Kubernetes cluster yourself or work with
+partners, review the following sections to evaluate your needs as they relate
+to your cluster’s *control plane*, *worker nodes*, *user access*, and
+*workload resources*.
+
+## Production cluster setup
+
+In a production-quality Kubernetes cluster, the control plane manages the
+cluster from services that can be spread across multiple computers
+in different ways. Each worker node, however, represents a single entity that
+is configured to run Kubernetes pods.
+
+### Production control plane
+
+The simplest Kubernetes cluster has the entire control plane and worker node
+services running on the same machine. You can grow that environment by adding
+worker nodes, as reflected in the diagram illustrated in
+[Kubernetes Components](/docs/concepts/overview/components/).
+If the cluster is meant to be available for a short period of time, or can be
+discarded if something goes seriously wrong, this might meet your needs.
+
+If you need a more permanent, highly available cluster, however, you should
+consider ways of extending the control plane. By design, one-machine control
+plane services running on a single machine are not highly available.
+If keeping the cluster up and running
+and ensuring that it can be repaired if something goes wrong is important,
+consider these steps:
+
+- *Choose deployment tools*: You can deploy a control plane using tools such
+as kubeadm, kops, and kubespray. See
+[Installing Kubernetes with deployment tools](/docs/setup/production-environment/tools/)
+to learn tips for production-quality deployments using each of those deployment
+methods. Different [Container Runtimes](/docs/setup/production-environment/container-runtimes/)
+are available to use with your deployments.
+- *Manage certificates*: Secure communications between control plane services
+are implemented using certificates. Certificates are automatically generated
+during deployment or you can generate them using your own certificate authority.
+See [PKI certificates and requirements](/docs/setup/best-practices/certificates/) for details.
+- *Configure load balancer for apiserver*: Configure a load balancer
+to distribute external API requests to the apiserver service instances running on different nodes. See
+[Create an External Load Balancer](/docs/tasks/access-application-cluster/create-external-load-balancer/)
+for details.
+- *Separate and backup etcd service*: The etcd services can either run on the
+same machines as other control plane services or run on separate machines, for
+extra security and availability. Because etcd stores cluster configuration data,
+backing up the etcd database should be done regularly to ensure that you can
+repair that database if needed.
+See the [etcd FAQ](https://etcd.io/docs/v3.4/faq/) for details on configuring and using etcd.
+See [Operating etcd clusters for Kubernetes](/docs/tasks/administer-cluster/configure-upgrade-etcd/)
+and [Set up a High Availability etcd cluster with kubeadm](/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/)
+for details.
+- *Create multiple control plane systems*: For high availability, the
+control plane should not be limited to a single machine. If the control plane
+services are run by an init service (such as systemd), each service should run on at
+least three machines. However, running control plane services as pods in
+Kubernetes ensures that the replicated number of services that you request
+will always be available.
+The scheduler should be fault tolerant,
+but not highly available. Some deployment tools set up [Raft](https://raft.github.io/)
+consensus algorithm to do leader election of Kubernetes services. If the
+primary goes away, another service elects itself and take over.
+- *Span multiple zones*: If keeping your cluster available at all times is
+critical, consider creating a cluster that runs across multiple data centers,
+referred to as zones in cloud environments. Groups of zones are referred to as regions.
+By spreading a cluster across
+multiple zones in the same region, it can improve the chances that your
+cluster will continue to function even if one zone becomes unavailable.
+See [Running in multiple zones](/docs/setup/best-practices/multiple-zones/) for details.
+- *Manage on-going features*: If you plan to keep your cluster over time,
+there are tasks you need to do to maintain its health and security. For example,
+if you installed with kubeadm, there are instructions to help you with
+[Certificate Management](/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/)
+and [Upgrading kubeadm clusters](/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/).
+See [Administer a Cluster](/docs/tasks/administer-cluster/)
+for a longer list of Kubernetes administrative tasks.
+
+To learn about available options when you run control plane services, see
+[kube-apiserver](/docs/reference/command-line-tools-reference/kube-apiserver/),
+[kube-controller-manager](/docs/reference/command-line-tools-reference/kube-controller-manager/),
+and [kube-scheduler](/docs/reference/command-line-tools-reference/kube-scheduler/)
+component pages. For highly available control plane examples, see
+[Options for Highly Available topology](/docs/setup/production-environment/tools/kubeadm/ha-topology/),
+[Creating Highly Available clusters with kubeadm](/docs/setup/production-environment/tools/kubeadm/high-availability/),
+and [Operating etcd clusters for Kubernetes](/docs/tasks/administer-cluster/configure-upgrade-etcd/).
+See [Backing up an etcd cluster](/docs/tasks/administer-cluster/configure-upgrade-etcd/#backing-up-an-etcd-cluster)
+for information on making an etcd backup plan.
+
+### Production worker nodes
+
+Production-quality workloads need to be resilient and anything they rely
+on needs to be resilient (such as CoreDNS). Whether you manage your own
+control plane or have a cloud provider do it for you, you still need to
+consider how you want to manage your worker nodes (also referred to
+simply as *nodes*).
+
+- *Configure nodes*: Nodes can be physical or virtual machines. If you want to
+create and manage your own nodes, you can install a supported operating system,
+then add and run the appropriate
+[Node services](/docs/concepts/overview/components/#node-components). Consider:
+ - The demands of your workloads when you set up nodes by having appropriate memory, CPU, and disk speed and storage capacity available.
+ - Whether generic computer systems will do or you have workloads that need GPU processors, Windows nodes, or VM isolation.
+- *Validate nodes*: See [Valid node setup](/docs/setup/best-practices/node-conformance/)
+for information on how to ensure that a node meets the requirements to join
+a Kubernetes cluster.
+- *Add nodes to the cluster*: If you are managing your own cluster you can
+add nodes by setting up your own machines and either adding them manually or
+having them register themselves to the cluster’s apiserver. See the
+[Nodes](/docs/concepts/architecture/nodes/) section for information on how to set up Kubernetes to add nodes in these ways.
+- *Add Windows nodes to the cluster*: Kubernetes offers support for Windows
+worker nodes, allowing you to run workloads implemented in Windows containers. See
+[Windows in Kubernetes](/docs/setup/production-environment/windows/) for details.
+- *Scale nodes*: Have a plan for expanding the capacity your cluster will
+eventually need. See [Considerations for large clusters](/docs/setup/best-practices/cluster-large/)
+to help determine how many nodes you need, based on the number of pods and
+containers you need to run. If you are managing nodes yourself, this can mean
+purchasing and installing your own physical equipment.
+- *Autoscale nodes*: Most cloud providers support
+[Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler#readme)
+to replace unhealthy nodes or grow and shrink the number of nodes as demand requires. See the
+[Frequently Asked Questions](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md)
+for how the autoscaler works and
+[Deployment](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler#deployment)
+for how it is implemented by different cloud providers. For on-premises, there
+are some virtualization platforms that can be scripted to spin up new nodes
+based on demand.
+- *Set up node health checks*: For important workloads, you want to make sure
+that the nodes and pods running on those nodes are healthy. Using the
+[Node Problem Detector](/docs/tasks/debug-application-cluster/monitor-node-health/)
+daemon, you can ensure your nodes are healthy.
+
+## Production user management
+
+In production, you may be moving from a model where you or a small group of
+people are accessing the cluster to where there may potentially be dozens or
+hundreds of people. In a learning environment or platform prototype, you might have a single
+administrative account for everything you do. In production, you will want
+more accounts with different levels of access to different namespaces.
+
+Taking on a production-quality cluster means deciding how you
+want to selectively allow access by other users. In particular, you need to
+select strategies for validating the identities of those who try to access your
+cluster (authentication) and deciding if they have permissions to do what they
+are asking (authorization):
+
+- *Authentication*: The apiserver can authenticate users using client
+certificates, bearer tokens, an authenticating proxy, or HTTP basic auth.
+You can choose which authentication methods you want to use.
+Using plugins, the apiserver can leverage your organization’s existing
+authentication methods, such as LDAP or Kerberos. See
+[Authentication](/docs/reference/access-authn-authz/authentication/)
+for a description of these different methods of authenticating Kubernetes users.
+- *Authorization*: When you set out to authorize your regular users, you will probably choose between RBAC and ABAC authorization. See [Authorization Overview](/docs/reference/access-authn-authz/authorization/) to review different modes for authorizing user accounts (as well as service account access to your cluster):
+ - *Role-based access control* ([RBAC](/docs/reference/access-authn-authz/rbac/)): Lets you assign access to your cluster by allowing specific sets of permissions to authenticated users. Permissions can be assigned for a specific namespace (Role) or across the entire cluster (ClusterRole). Then using RoleBindings and ClusterRoleBindings, those permissions can be attached to particular users.
+ - *Attribute-based access control* ([ABAC](/docs/reference/access-authn-authz/abac/)): Lets you create policies based on resource attributes in the cluster and will allow or deny access based on those attributes. Each line of a policy file identifies versioning properties (apiVersion and kind) and a map of spec properties to match the subject (user or group), resource property, non-resource property (/version or /apis), and readonly. See [Examples](/docs/reference/access-authn-authz/abac/#examples) for details.
+
+As someone setting up authentication and authorization on your production Kubernetes cluster, here are some things to consider:
+
+- *Set the authorization mode*: When the Kubernetes API server
+([kube-apiserver](/docs/reference/command-line-tools-reference/kube-apiserver/))
+starts, the supported authentication modes must be set using the *--authorization-mode*
+flag. For example, that flag in the *kube-adminserver.yaml* file (in */etc/kubernetes/manifests*)
+could be set to Node,RBAC. This would allow Node and RBAC authorization for authenticated requests.
+- *Create user certificates and role bindings (RBAC)*: If you are using RBAC
+authorization, users can create a CertificateSigningRequest (CSR) that can be
+signed by the cluster CA. Then you can bind Roles and ClusterRoles to each user.
+See [Certificate Signing Requests](/docs/reference/access-authn-authz/certificate-signing-requests/)
+for details.
+- *Create policies that combine attributes (ABAC)*: If you are using ABAC
+authorization, you can assign combinations of attributes to form policies to
+authorize selected users or groups to access particular resources (such as a
+pod), namespace, or apiGroup. For more information, see
+[Examples](/docs/reference/access-authn-authz/abac/#examples).
+- *Consider Admission Controllers*: Additional forms of authorization for
+requests that can come in through the API server include
+[Webhook Token Authentication](/docs/reference/access-authn-authz/authentication/#webhook-token-authentication).
+Webhooks and other special authorization types need to be enabled by adding
+[Admission Controllers](/docs/reference/access-authn-authz/admission-controllers/)
+to the API server.
+
+## Set limits on workload resources
+
+Demands from production workloads can cause pressure both inside and outside
+of the Kubernetes control plane. Consider these items when setting up for the
+needs of your cluster's workloads:
+
+- *Set namespace limits*: Set per-namespace quotas on things like memory and CPU. See
+[Manage Memory, CPU, and API Resources](/docs/tasks/administer-cluster/manage-resources/)
+for details. You can also set
+[Hierarchical Namespaces](/blog/2020/08/14/introducing-hierarchical-namespaces/)
+for inheriting limits.
+- *Prepare for DNS demand*: If you expect workloads to massively scale up,
+your DNS service must be ready to scale up as well. See
+[Autoscale the DNS service in a Cluster](/docs/tasks/administer-cluster/dns-horizontal-autoscaling/).
+- *Create additional service accounts*: User accounts determine what users can
+do on a cluster, while a service account defines pod access within a particular
+namespace. By default, a pod takes on the default service account from its namespace.
+See [Managing Service Accounts](/docs/reference/access-authn-authz/service-accounts-admin/)
+for information on creating a new service account. For example, you might want to:
+ - Add secrets that a pod could use to pull images from a particular container registry. See [Configure Service Accounts for Pods](/docs/tasks/configure-pod-container/configure-service-account/) for an example.
+ - Assign RBAC permissions to a service account. See [ServiceAccount permissions](/docs/reference/access-authn-authz/rbac/#service-account-permissions) for details.
+
+## {{% heading "whatsnext" %}}
+
+- Decide if you want to build your own production Kubernetes or obtain one from
+available [Turnkey Cloud Solutions](/docs/setup/production-environment/turnkey-solutions/)
+or [Kubernetes Partners](https://kubernetes.io/partners/).
+- If you choose to build your own cluster, plan how you want to
+handle [certificates](/docs/setup/best-practices/certificates/)
+and set up high availability for features such as
+[etcd](/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/)
+and the
+[API server](/docs/setup/production-environment/tools/kubeadm/ha-topology/).
+- Choose from [kubeadm](/docs/setup/production-environment/tools/kubeadm/), [kops](/docs/setup/production-environment/tools/kops/) or [Kubespray](/docs/setup/production-environment/tools/kubespray/)
+deployment methods.
+- Configure user management by determining your
+[Authentication](/docs/reference/access-authn-authz/authentication/) and
+[Authorization](/docs/reference/access-authn-authz/authorization/) methods.
+- Prepare for application workloads by setting up
+[resource limits](/docs/tasks/administer-cluster/manage-resources/),
+[DNS autoscaling](/docs/tasks/administer-cluster/dns-horizontal-autoscaling/)
+and [service accounts](/docs/reference/access-authn-authz/service-accounts-admin/).
diff --git a/content/en/docs/setup/production-environment/container-runtimes.md b/content/en/docs/setup/production-environment/container-runtimes.md
index ba6827d833..fa72d04ced 100644
--- a/content/en/docs/setup/production-environment/container-runtimes.md
+++ b/content/en/docs/setup/production-environment/container-runtimes.md
@@ -48,7 +48,7 @@ Changing the settings such that your container runtime and kubelet use `systemd`
stabilized the system. To configure this for Docker, set `native.cgroupdriver=systemd`.
{{< caution >}}
-Changing the cgroup driver of a Node that has joined a cluster is strongly *not* recommended.
+Changing the cgroup driver of a Node that has joined a cluster is a sensitive operation.
If the kubelet has created Pods using the semantics of one cgroup driver, changing the container
runtime to another cgroup driver can cause errors when trying to re-create the Pod sandbox
for such existing Pods. Restarting the kubelet may not solve such errors.
@@ -57,6 +57,43 @@ If you have automation that makes it feasible, replace the node with another usi
configuration, or reinstall it using automation.
{{< /caution >}}
+## Cgroup v2
+
+Cgroup v2 is the next version of the cgroup Linux API. Differently than cgroup v1, there is a single
+hierarchy instead of a different one for each controller.
+
+The new version offers several improvements over cgroup v1, some of these improvements are:
+
+- cleaner and easier to use API
+- safe sub-tree delegation to containers
+- newer features like Pressure Stall Information
+
+Even if the kernel supports a hybrid configuration where some controllers are managed by cgroup v1
+and some others by cgroup v2, Kubernetes supports only the same cgroup version to manage all the
+controllers.
+
+If systemd doesn't use cgroup v2 by default, you can configure the system to use it by adding
+`systemd.unified_cgroup_hierarchy=1` to the kernel command line.
+
+```shell
+# dnf install -y grubby && \
+ sudo grubby \
+ --update-kernel=ALL \
+ --args=”systemd.unified_cgroup_hierarchy=1"
+```
+
+To apply the configuration, it is necessary to reboot the node.
+
+There should not be any noticeable difference in the user experience when switching to cgroup v2, unless
+users are accessing the cgroup file system directly, either on the node or from within the containers.
+
+In order to use it, cgroup v2 must be supported by the CRI runtime as well.
+
+### Migrating to the `systemd` driver in kubeadm managed clusters
+
+Follow this [Migration guide](/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/)
+if you wish to migrate to the `systemd` cgroup driver in existing kubeadm managed clusters.
+
## Container runtimes
{{% thirdparty-content %}}
@@ -94,7 +131,10 @@ Install containerd:
{{< tabs name="tab-cri-containerd-installation" >}}
{{% tab name="Linux" %}}
-1. Install the `containerd.io` package from the official Docker repositories. Instructions for setting up the Docker repository for your respective Linux distribution and installing the `containerd.io` package can be found at [Install Docker Engine](https://docs.docker.com/engine/install/#server).
+1. Install the `containerd.io` package from the official Docker repositories.
+Instructions for setting up the Docker repository for your respective Linux distribution and
+installing the `containerd.io` package can be found at
+[Install Docker Engine](https://docs.docker.com/engine/install/#server).
2. Configure containerd:
@@ -112,7 +152,8 @@ Install containerd:
{{% /tab %}}
{{% tab name="Windows (PowerShell)" %}}
-Start a Powershell session, set `$Version` to the desired version (ex: `$Version=1.4.3`), and then run the following commands:
+Start a Powershell session, set `$Version` to the desired version (ex: `$Version=1.4.3`),
+and then run the following commands:
1. Download containerd:
@@ -238,7 +279,8 @@ sudo apt-get install cri-o cri-o-runc
{{% tab name="Ubuntu" %}}
-To install on the following operating systems, set the environment variable `OS` to the appropriate field in the following table:
+To install on the following operating systems, set the environment variable `OS`
+to the appropriate field in the following table:
| Operating system | `$OS` |
| ---------------- | ----------------- |
@@ -273,7 +315,8 @@ sudo apt-get install cri-o cri-o-runc
{{% tab name="CentOS" %}}
-To install on the following operating systems, set the environment variable `OS` to the appropriate field in the following table:
+To install on the following operating systems, set the environment variable `OS`
+to the appropriate field in the following table:
| Operating system | `$OS` |
| ---------------- | ----------------- |
@@ -353,7 +396,10 @@ in sync.
### Docker
-1. On each of your nodes, install the Docker for your Linux distribution as per [Install Docker Engine](https://docs.docker.com/engine/install/#server). You can find the latest validated version of Docker in this [dependencies](https://git.k8s.io/kubernetes/build/dependencies.yaml) file.
+1. On each of your nodes, install the Docker for your Linux distribution as per
+[Install Docker Engine](https://docs.docker.com/engine/install/#server).
+You can find the latest validated version of Docker in this
+[dependencies](https://git.k8s.io/kubernetes/build/dependencies.yaml) file.
2. Configure the Docker daemon, in particular to use systemd for the management of the container’s cgroups.
@@ -372,7 +418,8 @@ in sync.
```
{{< note >}}
- `overlay2` is the preferred storage driver for systems running Linux kernel version 4.0 or higher, or RHEL or CentOS using version 3.10.0-514 and above.
+ `overlay2` is the preferred storage driver for systems running Linux kernel version 4.0 or higher,
+ or RHEL or CentOS using version 3.10.0-514 and above.
{{< /note >}}
3. Restart Docker and enable on boot:
diff --git a/content/en/docs/setup/production-environment/tools/kops.md b/content/en/docs/setup/production-environment/tools/kops.md
index 4afab697e4..cf5333a92d 100644
--- a/content/en/docs/setup/production-environment/tools/kops.md
+++ b/content/en/docs/setup/production-environment/tools/kops.md
@@ -56,10 +56,10 @@ To download a specific version, replace the following portion of the command wit
$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)
```
-For example, to download kops version v1.15.0 type:
+For example, to download kops version v1.20.0 type:
```shell
-curl -LO https://github.com/kubernetes/kops/releases/download/1.15.0/kops-darwin-amd64
+curl -LO https://github.com/kubernetes/kops/releases/download/v1.20.0/kops-darwin-amd64
```
Make the kops binary executable.
@@ -94,10 +94,10 @@ To download a specific version of kops, replace the following portion of the com
$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)
```
-For example, to download kops version v1.15.0 type:
+For example, to download kops version v1.20.0 type:
```shell
-curl -LO https://github.com/kubernetes/kops/releases/download/1.15.0/kops-linux-amd64
+curl -LO https://github.com/kubernetes/kops/releases/download/v1.20.0/kops-linux-amd64
```
Make the kops binary executable
diff --git a/content/en/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md b/content/en/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md
index 1dd44e9b0b..ff1fedb9c0 100644
--- a/content/en/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md
+++ b/content/en/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md
@@ -1,86 +1,210 @@
---
reviewers:
- sig-cluster-lifecycle
-title: Customizing control plane configuration with kubeadm
+title: Customizing components with the kubeadm API
content_type: concept
weight: 40
---
+This page covers how to customize the components that kubeadm deploys. For control plane components
+you can use flags in the `ClusterConfiguration` structure or patches per-node. For the kubelet
+and kube-proxy you can use `KubeletConfiguration` and `KubeProxyConfiguration`, accordingly.
+
+All of these options are possible via the kubeadm configuration API.
+For more details on each field in the configuration you can navigate to our
+[API reference pages](/docs/reference/config-api/kubeadm-config.v1beta3/).
+
+{{< note >}}
+Customizing the CoreDNS deployment of kubeadm is currently not supported. You must manually
+patch the `kube-system/coredns` {{< glossary_tooltip text="ConfigMap" term_id="configmap" >}}
+and recreate the CoreDNS {{< glossary_tooltip text="Pods" term_id="pod" >}} after that. Alternatively,
+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 >}}
+
+
+
{{< feature-state for_k8s_version="v1.12" state="stable" >}}
-The kubeadm `ClusterConfiguration` object exposes the field `extraArgs` that can override the default flags passed to control plane
-components such as the APIServer, ControllerManager and Scheduler. The components are defined using the following fields:
+## Customizing the control plane with flags in `ClusterConfiguration`
+
+The kubeadm `ClusterConfiguration` object exposes a way for users to override the default
+flags passed to control plane components such as the APIServer, ControllerManager, Scheduler and Etcd.
+The components are defined using the following structures:
- `apiServer`
- `controllerManager`
- `scheduler`
+- `etcd`
-The `extraArgs` field consist of `key: value` pairs. To override a flag for a control plane component:
+These structures contain a common `extraArgs` field, that consists of `key: value` pairs.
+To override a flag for a control plane component:
-1. Add the appropriate fields to your configuration.
-2. Add the flags to override to the field.
+1. Add the appropriate `extraArgs` to your configuration.
+2. Add flags to the `extraArgs` field.
3. Run `kubeadm init` with `--config `.
-For more details on each field in the configuration you can navigate to our
-[API reference pages](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2#ClusterConfiguration).
-
{{< note >}}
-You can generate a `ClusterConfiguration` object with default values by running `kubeadm config print init-defaults` and saving the output to a file of your choice.
+You can generate a `ClusterConfiguration` object with default values by running `kubeadm config print init-defaults`
+and saving the output to a file of your choice.
{{< /note >}}
+{{< note >}}
+The `ClusterConfiguration` object is currently global in kubeadm clusters. This means that any flags that you add,
+will apply to all instances of the same component on different nodes. To apply individual configuration per component
+on different nodes you can use [patches](#patches).
+{{< /note >}}
+{{< note >}}
+Duplicate flags (keys), or passing the same flag `--foo` multiple times, is currently not supported.
+To workaround that you must use [patches](#patches).
+{{< /note >}}
-
-
-## APIServer flags
+### APIServer flags
For details, see the [reference documentation for kube-apiserver](/docs/reference/command-line-tools-reference/kube-apiserver/).
Example usage:
+
```yaml
-apiVersion: kubeadm.k8s.io/v1beta2
+apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
apiServer:
extraArgs:
- advertise-address: 192.168.0.103
anonymous-auth: "false"
enable-admission-plugins: AlwaysPullImages,DefaultStorageClass
audit-log-path: /home/johndoe/audit.log
```
-## ControllerManager flags
+### ControllerManager flags
For details, see the [reference documentation for kube-controller-manager](/docs/reference/command-line-tools-reference/kube-controller-manager/).
Example usage:
+
```yaml
-apiVersion: kubeadm.k8s.io/v1beta2
+apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
controllerManager:
extraArgs:
cluster-signing-key-file: /home/johndoe/keys/ca.key
- bind-address: 0.0.0.0
deployment-controller-sync-period: "50"
```
-## Scheduler flags
+### Scheduler flags
For details, see the [reference documentation for kube-scheduler](/docs/reference/command-line-tools-reference/kube-scheduler/).
Example usage:
+
```yaml
-apiVersion: kubeadm.k8s.io/v1beta2
+apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
scheduler:
extraArgs:
- bind-address: 0.0.0.0
- config: /home/johndoe/schedconfig.yaml
- kubeconfig: /home/johndoe/kubeconfig.yaml
+ config: /etc/kubernetes/scheduler-config.yaml
+ extraVolumes:
+ - name: schedulerconfig
+ hostPath: /home/johndoe/schedconfig.yaml
+ mountPath: /etc/kubernetes/scheduler-config.yaml
+ readOnly: true
+ pathType: "File"
```
+### Etcd flags
+For details, see the [etcd server documentation](https://etcd.io/docs/).
+
+Example usage:
+
+```yaml
+apiVersion: kubeadm.k8s.io/v1beta3
+kind: ClusterConfiguration
+etcd:
+ local:
+ extraArgs:
+ election-timeout: 1000
+```
+
+## Customizing the control plane with patches {#patches}
+
+{{< feature-state for_k8s_version="v1.22" state="beta" >}}
+
+Kubeadm allows you to pass a directory with patch files to `InitConfiguration` and `JoinConfiguration`
+on individual nodes. These patches can be used as the last customization step before the control
+plane component manifests are written to disk.
+
+You can pass this file to `kubeadm init` with `--config `:
+
+```yaml
+apiVersion: kubeadm.k8s.io/v1beta3
+kind: InitConfiguration
+nodeRegistration:
+ patches:
+ directory: /home/user/somedir
+```
+
+{{< note >}}
+For `kubeadm init` you can pass a file containing both a `ClusterConfiguration` and `InitConfiguration`
+separated by `---`.
+{{< /note >}}
+
+You can pass this file to `kubeadm join` with `--config `:
+
+```yaml
+apiVersion: kubeadm.k8s.io/v1beta3
+kind: JoinConfiguration
+nodeRegistration:
+ patches:
+ directory: /home/user/somedir
+```
+
+The directory must contain files named `target[suffix][+patchtype].extension`.
+For example, `kube-apiserver0+merge.yaml` or just `etcd.json`.
+
+- `target` can be one of `kube-apiserver`, `kube-controller-manager`, `kube-scheduler` and `etcd`.
+- `patchtype` can be one of `strategic`, `merge` or `json` and these must match the patching formats
+[supported by kubectl](/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch).
+The default `patchtype` is `strategic`.
+- `extension` must be either `json` or `yaml`.
+- `suffix` is an optional string that can be used to determine which patches are applied first
+alpha-numerically.
+
+{{< note >}}
+If you are using `kubeadm upgrade` to upgrade your kubeadm nodes you must again provide the same
+patches, so that the customization is preserved after upgrade. To do that you can use the `--patches`
+flag, which must point to the same directory. `kubeadm upgrade` currently does not support a configuration
+API structure that can be used for the same purpose.
+{{< /note >}}
+
+## Customizing the kubelet
+
+To customize the kubelet you can add a `KubeletConfiguration` next to the `ClusterConfiguration` or
+`InitConfiguration` separated by `---` within the same configuration file. This file can then be passed to `kubeadm init`.
+
+{{< note >}}
+kubeadm applies the same `KubeletConfiguration` to all nodes in the cluster. To apply node
+specific settings you can use kubelet flags as overrides by passing them in the `nodeRegistration.kubeletExtraArgs`
+field supported by both `InitConfiguration` and `JoinConfiguration`. Some kubelet flags are deprecated,
+so check their status in the [kubelet reference documentation](/docs/reference/command-line-tools-reference/kubelet)
+before using them.
+{{< /note >}}
+
+For more details see [Configuring each kubelet in your cluster using kubeadm](/docs/setup/production-environment/tools/kubeadm/kubelet-integration)
+
+## Customizing kube-proxy
+
+To customize kube-proxy you can pass a `KubeProxyConfiguration` next your `ClusterConfiguration` or
+`InitConfiguration` to `kubeadm init` separated by `---`.
+
+For more details you can navigate to our [API reference pages](/docs/reference/config-api/kubeadm-config.v1beta3/).
+
+{{< note >}}
+kubeadm deploys kube-proxy as a {{< glossary_tooltip text="DaemonSet" term_id="daemonset" >}}, which means
+that the `KubeProxyConfiguration` would apply to all instances of kube-proxy in the cluster.
+{{< /note >}}
diff --git a/content/en/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md b/content/en/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md
index a5cdecafd7..1f107bbc9a 100644
--- a/content/en/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md
+++ b/content/en/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm.md
@@ -8,9 +8,12 @@ weight: 30
-
Using `kubeadm`, you can create a minimum viable Kubernetes cluster that conforms to best practices. In fact, you can use `kubeadm` to set up a cluster that will pass the [Kubernetes Conformance tests](https://kubernetes.io/blog/2017/10/software-conformance-certification).
-`kubeadm` also supports other cluster
-lifecycle functions, such as [bootstrap tokens](/docs/reference/access-authn-authz/bootstrap-tokens/) and cluster upgrades.
+
+Using `kubeadm`, you can create a minimum viable Kubernetes cluster that conforms to best practices.
+In fact, you can use `kubeadm` to set up a cluster that will pass the
+[Kubernetes Conformance tests](https://kubernetes.io/blog/2017/10/software-conformance-certification).
+`kubeadm` also supports other cluster lifecycle functions, such as
+[bootstrap tokens](/docs/reference/access-authn-authz/bootstrap-tokens/) and cluster upgrades.
The `kubeadm` tool is good if you need:
@@ -42,7 +45,8 @@ To follow this guide, you need:
You also need to use a version of `kubeadm` that can deploy the version
of Kubernetes that you want to use in your new cluster.
-[Kubernetes' version and version skew support policy](/docs/setup/release/version-skew-policy/#supported-versions) applies to `kubeadm` as well as to Kubernetes overall.
+[Kubernetes' version and version skew support policy](/docs/setup/release/version-skew-policy/#supported-versions)
+applies to `kubeadm` as well as to Kubernetes overall.
Check that policy to learn about what versions of Kubernetes and `kubeadm`
are supported. This page is written for Kubernetes {{< param "version" >}}.
@@ -97,7 +101,8 @@ a provider-specific value. See [Installing a Pod network add-on](#pod-network).
1. (Optional) Since version 1.14, `kubeadm` tries to detect the container runtime on Linux
by using a list of well known domain socket paths. To use different container runtime or
if there are more than one installed on the provisioned node, specify the `--cri-socket`
-argument to `kubeadm init`. See [Installing runtime](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-runtime).
+argument to `kubeadm init`. See
+[Installing a runtime](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-runtime).
1. (Optional) Unless otherwise specified, `kubeadm` uses the network interface associated
with the default gateway to set the advertise address for this particular control-plane node's API server.
To use a different network interface, specify the `--apiserver-advertise-address=` argument
@@ -139,9 +144,12 @@ is not supported by kubeadm.
For more information about `kubeadm init` arguments, see the [kubeadm reference guide](/docs/reference/setup-tools/kubeadm/).
-To configure `kubeadm init` with a configuration file see [Using kubeadm init with a configuration file](/docs/reference/setup-tools/kubeadm/kubeadm-init/#config-file).
+To configure `kubeadm init` with a configuration file see
+[Using kubeadm init with a configuration file](/docs/reference/setup-tools/kubeadm/kubeadm-init/#config-file).
-To customize control plane components, including optional IPv6 assignment to liveness probe 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 customize control plane components, including optional IPv6 assignment to liveness probe
+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 run `kubeadm init` again, you must first [tear down the cluster](#tear-down).
@@ -187,6 +195,13 @@ Alternatively, if you are the `root` user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
```
+{{< warning >}}
+Kubeadm signs the certificate in the `admin.conf` to have `Subject: O = system:masters, CN = kubernetes-admin`.
+`system:masters` is a break-glass, super user group that bypasses the authorization layer (e.g. RBAC).
+Do not share the `admin.conf` file with anyone and instead grant users custom permissions by generating
+them a kubeconfig file using the `kubeadm kubeconfig user` command.
+{{< /warning >}}
+
Make a record of the `kubeadm join` command that `kubeadm init` outputs. You
need this command to [join nodes to your cluster](#join-nodes).
@@ -285,11 +300,13 @@ The nodes are where your workloads (containers and Pods, etc) run. To add new no
* SSH to the machine
* Become root (e.g. `sudo su -`)
+* [Install a runtime](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-runtime)
+ if needed
* Run the command that was output by `kubeadm init`. For example:
-```bash
-kubeadm join --token : --discovery-token-ca-cert-hash sha256:
-```
+ ```bash
+ kubeadm join --token : --discovery-token-ca-cert-hash sha256:
+ ```
If you do not have the token, you can get it by running the following command on the control-plane node:
@@ -408,7 +425,7 @@ and make sure that the node is empty, then deconfigure the node.
Talking to the control-plane node with the appropriate credentials, run:
```bash
-kubectl drain --delete-local-data --force --ignore-daemonsets
+kubectl drain --delete-emptydir-data --force --ignore-daemonsets
```
Before removing the node, reset the state installed by `kubeadm`:
diff --git a/content/en/docs/setup/production-environment/tools/kubeadm/dual-stack-support.md b/content/en/docs/setup/production-environment/tools/kubeadm/dual-stack-support.md
new file mode 100644
index 0000000000..39930cca37
--- /dev/null
+++ b/content/en/docs/setup/production-environment/tools/kubeadm/dual-stack-support.md
@@ -0,0 +1,153 @@
+---
+title: Dual-stack support with kubeadm
+content_type: task
+weight: 110
+min-kubernetes-server-version: 1.21
+---
+
+
+
+{{< feature-state for_k8s_version="v1.21" state="beta" >}}
+
+Your Kubernetes cluster can run in [dual-stack](/docs/concepts/services-networking/dual-stack/) networking mode, which means that cluster networking lets you use either address family. In a dual-stack cluster, the control plane can assign both an IPv4 address and an IPv6 address to a single {{< glossary_tooltip text="Pod" term_id="pod" >}} or a {{< glossary_tooltip text="Service" term_id="service" >}}.
+
+
+
+## {{% heading "prerequisites" %}}
+
+You need to have installed the {{< glossary_tooltip text="kubeadm" term_id="kubeadm" >}} tool, following the steps from [Installing kubeadm](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/).
+
+For each server that you want to use as a {{< glossary_tooltip text="node" term_id="node" >}}, make sure it allows IPv6 forwarding. On Linux, you can set this by running run `sysctl -w net.ipv6.conf.all.forwarding=1` as the root user on each server.
+
+You need to have an IPv4 and and IPv6 address range to use. Cluster operators typically
+use private address ranges for IPv4. For IPv6, a cluster operator typically chooses a global
+unicast address block from within `2000::/3`, using a range that is assigned to the operator.
+You don't have to route the cluster's IP address ranges to the public internet.
+
+The size of the IP address allocations should be suitable for the number of Pods and
+Services that you are planning to run.
+
+{{< note >}}
+If you are upgrading an existing cluster then, by default, the `kubeadm upgrade` command
+changes the [feature gate](/docs/reference/command-line-tools-reference/feature-gates/)
+`IPv6DualStack` to `true` if that is not already enabled.
+However, `kubeadm` does not support making modifications to the pod IP address range
+(“cluster CIDR”) nor to the cluster's Service address range (“Service CIDR”).
+{{< /note >}}
+
+### Create a dual-stack cluster
+
+To create a dual-stack cluster with `kubeadm init` you can pass command line arguments
+similar to the following example:
+
+```shell
+# These address ranges are examples
+kubeadm init --pod-network-cidr=10.244.0.0/16,2001:db8:42:0::/56 --service-cidr=10.96.0.0/16,2001:db8:42:1::/112
+```
+
+To make things clearer, here is an example kubeadm [configuration file](https://pkg.go.dev/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3) `kubeadm-config.yaml` for the primary dual-stack control plane node.
+
+```yaml
+---
+apiVersion: kubeadm.k8s.io/v1beta3
+kind: ClusterConfiguration
+featureGates:
+ IPv6DualStack: true
+networking:
+ podSubnet: 10.244.0.0/16,2001:db8:42:0::/56
+ serviceSubnet: 10.96.0.0/16,2001:db8:42:1::/112
+---
+apiVersion: kubeadm.k8s.io/v1beta3
+kind: InitConfiguration
+localAPIEndpoint:
+ advertiseAddress: "10.100.0.1"
+ bindPort: 6443
+nodeRegistration:
+ kubeletExtraArgs:
+ node-ip: 10.100.0.2,fd00:1:2:3::2
+```
+
+`advertiseAddress` in InitConfiguration specifies the IP address that the API Server will advertise it is listening on. The value of `advertiseAddress` equals the `--apiserver-advertise-address` flag of `kubeadm init`
+
+Run kubeadm to initiate the dual-stack control plane node:
+
+```shell
+kubeadm init --config=kubeadm-config.yaml
+```
+
+Currently, the kube-controller-manager flags `--node-cidr-mask-size-ipv4|--node-cidr-mask-size-ipv6` are being left with default values. See [enable IPv4/IPv6 dual stack](/docs/concepts/services-networking/dual-stack#enable-ipv4ipv6-dual-stack).
+
+{{< note >}}
+The `--apiserver-advertise-address` flag does not support dual-stack.
+{{< /note >}}
+
+### Join a node to dual-stack cluster
+
+Before joining a node, make sure that the node has IPv6 routable network interface and allows IPv6 forwarding.
+
+Here is an example kubeadm [configuration file](https://pkg.go.dev/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3) `kubeadm-config.yaml` for joining a worker node to the cluster.
+
+```yaml
+apiVersion: kubeadm.k8s.io/v1beta3
+kind: JoinConfiguration
+discovery:
+ bootstrapToken:
+ apiServerEndpoint: 10.100.0.1:6443
+nodeRegistration:
+ kubeletExtraArgs:
+ node-ip: 10.100.0.3,fd00:1:2:3::3
+```
+
+Also, here is an example kubeadm [configuration file](https://pkg.go.dev/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3) `kubeadm-config.yaml` for joining another control plane node to the cluster.
+```yaml
+apiVersion: kubeadm.k8s.io/v1beta3
+kind: JoinConfiguration
+controlPlane:
+ localAPIEndpoint:
+ advertiseAddress: "10.100.0.2"
+ bindPort: 6443
+discovery:
+ bootstrapToken:
+ apiServerEndpoint: 10.100.0.1:6443
+nodeRegistration:
+ kubeletExtraArgs:
+ node-ip: 10.100.0.4,fd00:1:2:3::4
+
+```
+
+`advertiseAddress` in JoinConfiguration.controlPlane specifies the IP address that the API Server will advertise it is listening on. The value of `advertiseAddress` equals the `--apiserver-advertise-address` flag of `kubeadm join`.
+
+```shell
+kubeadm join --config=kubeadm-config.yaml ...
+```
+
+### Create a single-stack cluster
+
+{{< note >}}
+Enabling the dual-stack feature doesn't mean that you need to use dual-stack addressing.
+You can deploy a single-stack cluster that has the dual-stack networking feature enabled.
+{{< /note >}}
+
+In 1.21 the `IPv6DualStack` feature is Beta and the feature gate is defaulted to `true`. To disable the feature you must configure the feature gate to `false`. Note that once the feature is GA, the feature gate will be removed.
+
+```shell
+kubeadm init --feature-gates IPv6DualStack=false
+```
+
+To make things more clear, here is an example kubeadm [configuration file](https://pkg.go.dev/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3) `kubeadm-config.yaml` for the single-stack control plane node.
+
+```yaml
+apiVersion: kubeadm.k8s.io/v1beta3
+kind: ClusterConfiguration
+featureGates:
+ IPv6DualStack: false
+networking:
+ podSubnet: 10.244.0.0/16
+ serviceSubnet: 10.96.0.0/16
+```
+
+## {{% heading "whatsnext" %}}
+
+* [Validate IPv4/IPv6 dual-stack](/docs/tasks/network/validate-dual-stack) networking
+* Read about [Dual-stack](/docs/concepts/services-networking/dual-stack/) cluster networking
+* Learn more about the kubeadm [configuration format](/docs/reference/config-api/kubeadm-config.v1beta2/)
diff --git a/content/en/docs/setup/production-environment/tools/kubeadm/high-availability.md b/content/en/docs/setup/production-environment/tools/kubeadm/high-availability.md
index e387e2d41c..5206529f5c 100644
--- a/content/en/docs/setup/production-environment/tools/kubeadm/high-availability.md
+++ b/content/en/docs/setup/production-environment/tools/kubeadm/high-availability.md
@@ -115,7 +115,7 @@ option. Your cluster requirements may need a different configuration.
{{< note >}}
The `kubeadm init` flags `--config` and `--certificate-key` cannot be mixed, therefore if you want
- to use the [kubeadm configuration](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2)
+ to use the [kubeadm configuration](/docs/reference/config-api/kubeadm-config.v1beta3/)
you must add the `certificateKey` field in the appropriate config locations
(under `InitConfiguration` and `JoinConfiguration: controlPlane`).
{{< /note >}}
@@ -230,7 +230,7 @@ in the kubeadm config file.
1. Create a file called `kubeadm-config.yaml` with the following contents:
- apiVersion: kubeadm.k8s.io/v1beta2
+ apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: stable
controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT"
diff --git a/content/en/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md b/content/en/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md
index ea144e1dae..7c6a9dd8bf 100644
--- a/content/en/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md
+++ b/content/en/docs/setup/production-environment/tools/kubeadm/install-kubeadm.md
@@ -10,8 +10,9 @@ card:
-
This page shows how to install the `kubeadm` toolbox.
-For information how to create a cluster with kubeadm once you have performed this installation process, see the [Using kubeadm to Create a Cluster](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/) page.
+
+This page shows how to install the `kubeadm` toolbox.
+For information on how to create a cluster with kubeadm once you have performed this installation process, see the [Using kubeadm to Create a Cluster](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/) page.
@@ -66,31 +67,9 @@ sudo sysctl --system
For more details please see the [Network Plugin Requirements](/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#network-plugin-requirements) page.
## Check required ports
-
-### Control-plane node(s)
-
-| Protocol | Direction | Port Range | Purpose | Used By |
-|----------|-----------|------------|-------------------------|---------------------------|
-| TCP | Inbound | 6443\* | Kubernetes API server | All |
-| TCP | Inbound | 2379-2380 | etcd server client API | kube-apiserver, etcd |
-| TCP | Inbound | 10250 | kubelet API | Self, Control plane |
-| TCP | Inbound | 10251 | kube-scheduler | Self |
-| TCP | Inbound | 10252 | kube-controller-manager | Self |
-
-### Worker node(s)
-
-| Protocol | Direction | Port Range | Purpose | Used By |
-|----------|-----------|-------------|-----------------------|-------------------------|
-| TCP | Inbound | 10250 | kubelet API | Self, Control plane |
-| TCP | Inbound | 30000-32767 | NodePort Services† | All |
-
-† Default port range for [NodePort Services](/docs/concepts/services-networking/service/).
-
-Any port numbers marked with * are overridable, so you will need to ensure any
-custom ports you provide are also open.
-
-Although etcd ports are included in control-plane nodes, you can also host your own
-etcd cluster externally or on custom ports.
+These
+[required ports](/docs/reference/ports-and-protocols/)
+need to be open in order for Kubernetes components to communicate with each other.
The pod network plugin you use (see below) may also require certain ports to be
open. Since this differs with each pod network plugin, please see the
@@ -240,11 +219,12 @@ Install CNI plugins (required for most pod network):
```bash
CNI_VERSION="v0.8.2"
+ARCH="amd64"
sudo mkdir -p /opt/cni/bin
-curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgz" | sudo tar -C /opt/cni/bin -xz
+curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-${ARCH}-${CNI_VERSION}.tgz" | sudo tar -C /opt/cni/bin -xz
```
-Define the directory to download command files
+Define the directory to download command files
{{< note >}}
The `DOWNLOAD_DIR` variable must be set to a writable directory.
@@ -260,15 +240,17 @@ Install crictl (required for kubeadm / Kubelet Container Runtime Interface (CRI)
```bash
CRICTL_VERSION="v1.17.0"
-curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz
+ARCH="amd64"
+curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz
```
Install `kubeadm`, `kubelet`, `kubectl` and add a `kubelet` systemd service:
```bash
RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
+ARCH="amd64"
cd $DOWNLOAD_DIR
-sudo curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl}
+sudo curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet,kubectl}
sudo chmod +x {kubeadm,kubelet,kubectl}
RELEASE_VERSION="v0.4.0"
@@ -295,33 +277,17 @@ See the [Kubeadm Troubleshooting guide](/docs/setup/production-environment/tools
The kubelet is now restarting every few seconds, as it waits in a crashloop for
kubeadm to tell it what to do.
-## Configure cgroup driver used by kubelet on control-plane node
+## Configuring a cgroup driver
-When using Docker, kubeadm will automatically detect the cgroup driver for the kubelet
-and set it in the `/var/lib/kubelet/config.yaml` file during runtime.
+Both the container runtime and the kubelet have a property called
+["cgroup driver"](/docs/setup/production-environment/container-runtimes/), which is important
+for the management of cgroups on Linux machines.
-If you are using a different CRI, you must pass your `cgroupDriver` value to `kubeadm init`, like so:
+{{< warning >}}
+Matching the container runtime and kubelet cgroup drivers is required or otherwise the kubelet process will fail.
-```yaml
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-cgroupDriver:
-```
-
-For further details, please read [Using kubeadm init with a configuration file](/docs/reference/setup-tools/kubeadm/kubeadm-init/#config-file)
-and the [`KubeletConfiguration` reference](/docs/reference/config-api/kubelet-config.v1beta1/)
-
-Please mind, that you **only** have to do that if the cgroup driver of your CRI
-is not `cgroupfs`, because that is the default value in the kubelet already.
-
-{{< note >}}
-Since `--cgroup-driver` flag has been deprecated by the kubelet, if you have that in `/var/lib/kubelet/kubeadm-flags.env`
-or `/etc/default/kubelet`(`/etc/sysconfig/kubelet` for RPMs), please remove it and use the KubeletConfiguration instead
-(stored in `/var/lib/kubelet/config.yaml` by default).
-{{< /note >}}
-
-The automatic detection of cgroup driver for other container runtimes
-like CRI-O and containerd is work in progress.
+See [Configuring a cgroup driver](/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/) for more details.
+{{< /warning >}}
## Troubleshooting
@@ -330,4 +296,3 @@ If you are running into difficulties with kubeadm, please consult our [troublesh
## {{% heading "whatsnext" %}}
* [Using kubeadm to Create a Cluster](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)
-
diff --git a/content/en/docs/setup/production-environment/tools/kubeadm/self-hosting.md b/content/en/docs/setup/production-environment/tools/kubeadm/self-hosting.md
deleted file mode 100644
index d860a88bdd..0000000000
--- a/content/en/docs/setup/production-environment/tools/kubeadm/self-hosting.md
+++ /dev/null
@@ -1,68 +0,0 @@
----
-reviewers:
-- sig-cluster-lifecycle
-title: Configuring your kubernetes cluster to self-host the control plane
-content_type: concept
-weight: 100
----
-
-
-
-### Self-hosting the Kubernetes control plane {#self-hosting}
-
-kubeadm allows you to experimentally create a _self-hosted_ Kubernetes control
-plane. This means that key components such as the API server, controller
-manager, and scheduler run as [DaemonSet pods](/docs/concepts/workloads/controllers/daemonset/)
-configured via the Kubernetes API instead of [static pods](/docs/tasks/configure-pod-container/static-pod/)
-configured in the kubelet via static files.
-
-To create a self-hosted cluster see the
-[kubeadm alpha selfhosting pivot](/docs/reference/setup-tools/kubeadm/kubeadm-alpha/#cmd-selfhosting) command.
-
-
-
-#### Caveats
-
-{{< caution >}}
-This feature pivots your cluster into an unsupported state, rendering kubeadm unable
-to manage you cluster any longer. This includes `kubeadm upgrade`.
-{{< /caution >}}
-
-1. Self-hosting in 1.8 and later has some important limitations. In particular, a
- self-hosted cluster _cannot recover from a reboot of the control-plane node_
- without manual intervention.
-
-1. By default, self-hosted control plane Pods rely on credentials loaded from
- [`hostPath`](/docs/concepts/storage/volumes/#hostpath)
- volumes. Except for initial creation, these credentials are not managed by
- kubeadm.
-
-1. The self-hosted portion of the control plane does not include etcd,
- which still runs as a static Pod.
-
-#### Process
-
-The self-hosting bootstrap process is documented in the [kubeadm design
-document](https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.9.md#optional-self-hosting).
-
-In summary, `kubeadm alpha selfhosting` works as follows:
-
- 1. Waits for this bootstrap static control plane to be running and
- healthy. This is identical to the `kubeadm init` process without self-hosting.
-
- 1. Uses the static control plane Pod manifests to construct a set of
- DaemonSet manifests that will run the self-hosted control plane.
- It also modifies these manifests where necessary, for example adding new volumes
- for secrets.
-
- 1. Creates DaemonSets in the `kube-system` namespace and waits for the
- resulting Pods to be running.
-
- 1. Once self-hosted Pods are operational, their associated static Pods are deleted
- and kubeadm moves on to install the next component. This triggers kubelet to
- stop those static Pods.
-
- 1. When the original static control plane stops, the new self-hosted control
- plane is able to bind to listening ports and become active.
-
-
diff --git a/content/en/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md b/content/en/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md
index 6f62a051ad..0319ee17fc 100644
--- a/content/en/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md
+++ b/content/en/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm.md
@@ -95,7 +95,7 @@ this example.
HOST=${ETCDHOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml
- apiVersion: "kubeadm.k8s.io/v1beta2"
+ apiVersion: "kubeadm.k8s.io/v1beta3"
kind: ClusterConfiguration
etcd:
local:
@@ -246,8 +246,8 @@ this example.
```sh
root@HOST0 $ kubeadm init phase etcd local --config=/tmp/${HOST0}/kubeadmcfg.yaml
- root@HOST1 $ kubeadm init phase etcd local --config=/home/ubuntu/kubeadmcfg.yaml
- root@HOST2 $ kubeadm init phase etcd local --config=/home/ubuntu/kubeadmcfg.yaml
+ root@HOST1 $ kubeadm init phase etcd local --config=/tmp/${HOST1}/kubeadmcfg.yaml
+ root@HOST2 $ kubeadm init phase etcd local --config=/tmp/${HOST2}/kubeadmcfg.yaml
```
1. Optional: Check the cluster health
diff --git a/content/en/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm.md b/content/en/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm.md
index 58f4f4652a..8baf5e9dd6 100644
--- a/content/en/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm.md
+++ b/content/en/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm.md
@@ -89,23 +89,11 @@ If you notice that `kubeadm init` hangs after printing out the following line:
This may be caused by a number of problems. The most common are:
- network connection problems. Check that your machine has full network connectivity before continuing.
-- the default cgroup driver configuration for the kubelet differs from that used by Docker.
- Check the system log file (e.g. `/var/log/message`) or examine the output from `journalctl -u kubelet`. If you see something like the following:
-
- ```shell
- error: failed to run Kubelet: failed to create kubelet:
- misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"
- ```
-
- There are two common ways to fix the cgroup driver problem:
-
- 1. Install Docker again following instructions
- [here](/docs/setup/production-environment/container-runtimes/#docker).
-
- 1. Change the kubelet config to match the Docker cgroup driver manually, you can refer to
- [Configure cgroup driver used by kubelet on control-plane node](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#configure-cgroup-driver-used-by-kubelet-on-control-plane-node)
-
-- control plane Docker containers are crashlooping or hanging. You can check this by running `docker ps` and investigating each container by running `docker logs`.
+- the cgroup driver of the container runtime differs from that of the kubelet. To understand how to
+configure it properly see [Configuring a cgroup driver](/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/).
+- control plane containers are crashlooping or hanging. You can check this by running `docker ps`
+and investigating each container by running `docker logs`. For other container runtime see
+[Debugging Kubernetes nodes with crictl](/docs/tasks/debug-application-cluster/crictl/).
## kubeadm blocks when removing managed containers
@@ -153,7 +141,7 @@ Right after `kubeadm init` there should not be any pods in these states.
MountFlags can interfere with volumes mounted by Kubernetes, and put the Pods in `CrashLoopBackOff` state.
The error happens when Kubernetes does not find `var/run/secrets/kubernetes.io/serviceaccount` files.
-## `coredns` (or `kube-dns`) is stuck in the `Pending` state
+## `coredns` is stuck in the `Pending` state
This is **expected** and part of the design. kubeadm is network provider-agnostic, so the admin
should [install the pod network add-on](/docs/concepts/cluster-administration/addons/)
@@ -175,7 +163,7 @@ services](/docs/concepts/services-networking/service/#nodeport) or use `HostNetw
## Pods are not accessible via their Service IP
-- Many network add-ons do not yet enable [hairpin mode](/docs/tasks/debug-application-cluster/debug-service/#a-pod-cannot-reach-itself-via-service-ip)
+- Many network add-ons do not yet enable [hairpin mode](/docs/tasks/debug-application-cluster/debug-service/#a-pod-fails-to-reach-itself-via-the-service-ip)
which allows pods to access themselves via their Service IP. This is an issue related to
[CNI](https://github.com/containernetworking/cni/issues/476). Please contact the network
add-on provider to get the latest status of their support for hairpin mode.
@@ -220,6 +208,25 @@ Unable to connect to the server: x509: certificate signed by unknown authority (
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```
+## Kubelet client certificate rotation fails {#kubelet-client-cert}
+
+By default, kubeadm configures a kubelet with automatic rotation of client certificates by using the `/var/lib/kubelet/pki/kubelet-client-current.pem` symlink specified in `/etc/kubernetes/kubelet.conf`.
+If this rotation process fails you might see errors such as `x509: certificate has expired or is not yet valid`
+in kube-apiserver logs. To fix the issue you must follow these steps:
+
+1. Backup and delete `/etc/kubernetes/kubelet.conf` and `/var/lib/kubelet/pki/kubelet-client*` from the failed node.
+1. From a working control plane node in the cluster that has `/etc/kubernetes/pki/ca.key` execute
+`kubeadm kubeconfig user --org system:nodes --client-name system:node:$NODE > kubelet.conf`.
+`$NODE` must be set to the name of the existing failed node in the cluster.
+Modify the resulted `kubelet.conf` manually to adjust the cluster name and server endpoint,
+or pass `kubeconfig user --config` (it accepts `InitConfiguration`). If your cluster does not have
+the `ca.key` you must sign the embedded certificates in the `kubelet.conf` externally.
+1. Copy this resulted `kubelet.conf` to `/etc/kubernetes/kubelet.conf` on the failed node.
+1. Restart the kubelet (`systemctl restart kubelet`) on the failed node and wait for
+`/var/lib/kubelet/pki/kubelet-client-current.pem` to be recreated.
+1. Run `kubeadm init phase kubelet-finalize all` on the failed node. This will make the new
+`kubelet.conf` file use `/var/lib/kubelet/pki/kubelet-client-current.pem` and will restart the kubelet.
+1. Make sure the node becomes `Ready`.
## Default NIC When using flannel as the pod network in Vagrant
The following error might indicate that something was wrong in the pod network:
@@ -251,7 +258,12 @@ Error from server: Get https://10.19.0.41:10250/containerLogs/default/mysql-ddc6
curl http://169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/address
```
- The workaround is to tell `kubelet` which IP to use using `--node-ip`. When using DigitalOcean, it can be the public one (assigned to `eth0`) or the private one (assigned to `eth1`) should you want to use the optional private network. The [`KubeletExtraArgs` section of the kubeadm `NodeRegistrationOptions` structure](https://github.com/kubernetes/kubernetes/blob/release-1.13/cmd/kubeadm/app/apis/kubeadm/v1beta1/types.go) can be used for this.
+ The workaround is to tell `kubelet` which IP to use using `--node-ip`.
+ When using DigitalOcean, it can be the public one (assigned to `eth0`) or
+ the private one (assigned to `eth1`) should you want to use the optional
+ private network. The `kubeletExtraArgs` section of the kubeadm
+ [`NodeRegistrationOptions` structure](/docs/reference/config-api/kubeadm-config.v1beta2/#kubeadm-k8s-io-v1beta2-NodeRegistrationOptions)
+ can be used for this.
Then restart `kubelet`:
@@ -324,7 +336,7 @@ Alternatively, you can try separating the `key=value` pairs like so:
`--apiserver-extra-args "enable-admission-plugins=LimitRanger,enable-admission-plugins=NamespaceExists"`
but this will result in the key `enable-admission-plugins` only having the value of `NamespaceExists`.
-A known workaround is to use the kubeadm [configuration file](/docs/setup/production-environment/tools/kubeadm/control-plane-flags/#apiserver-flags).
+A known workaround is to use the kubeadm [configuration file](/docs/reference/config-api/kubeadm-config.v1beta2/).
## kube-proxy scheduled before node is initialized by cloud-controller-manager
@@ -348,23 +360,6 @@ kubectl -n kube-system patch ds kube-proxy -p='{ "spec": { "template": { "spec":
The tracking issue for this problem is [here](https://github.com/kubernetes/kubeadm/issues/1027).
-## The NodeRegistration.Taints field is omitted when marshalling kubeadm configuration
-
-*Note: This [issue](https://github.com/kubernetes/kubeadm/issues/1358) only applies to tools that marshal kubeadm types (e.g. to a YAML configuration file). It will be fixed in kubeadm API v1beta2.*
-
-By default, kubeadm applies the `node-role.kubernetes.io/master:NoSchedule` taint to control-plane nodes.
-If you prefer kubeadm to not taint the control-plane node, and set `InitConfiguration.NodeRegistration.Taints` to an empty slice,
-the field will be omitted when marshalling. When the field is omitted, kubeadm applies the default taint.
-
-There are at least two workarounds:
-
-1. Use the `node-role.kubernetes.io/master:PreferNoSchedule` taint instead of an empty slice. [Pods will get scheduled on masters](/docs/concepts/scheduling-eviction/taint-and-toleration/), unless other nodes have capacity.
-
-2. Remove the taint after kubeadm init exits:
-```bash
-kubectl taint nodes NODE_NAME node-role.kubernetes.io/master:NoSchedule-
-```
-
## `/usr` is mounted read-only on nodes {#usr-mounted-read-only}
On Linux distributions such as Fedora CoreOS or Flatcar Container Linux, the directory `/usr` is mounted as a read-only filesystem.
@@ -374,19 +369,19 @@ Kubernetes components like the kubelet and kube-controller-manager use the defau
for the feature to work.
To workaround this issue you can configure the flex-volume directory using the kubeadm
-[configuration file](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2).
+[configuration file](/docs/reference/config-api/kubeadm-config.v1beta3/).
On the primary control-plane Node (created using `kubeadm init`) pass the following
file using `--config`:
```yaml
-apiVersion: kubeadm.k8s.io/v1beta2
+apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
---
-apiVersion: kubeadm.k8s.io/v1beta2
+apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
controllerManager:
extraArgs:
@@ -396,7 +391,7 @@ controllerManager:
On joining Nodes:
```yaml
-apiVersion: kubeadm.k8s.io/v1beta2
+apiVersion: kubeadm.k8s.io/v1beta3
kind: JoinConfiguration
nodeRegistration:
kubeletExtraArgs:
@@ -408,7 +403,7 @@ be advised that this is modifying a design principle of the Linux distribution.
## `kubeadm upgrade plan` prints out `context deadline exceeded` error message
-This error message is shown when upgrading a Kubernetes cluster with `kubeadm` in the case of running an external etcd. This is not a critical bug and happens because older versions of kubeadm perform a version check on the external etcd cluster. You can proceed with `kubeadm upgrade apply ...`.
+This error message is shown when upgrading a Kubernetes cluster with `kubeadm` in the case of running an external etcd. This is not a critical bug and happens because older versions of kubeadm perform a version check on the external etcd cluster. You can proceed with `kubeadm upgrade apply ...`.
This issue is fixed as of version 1.19.
@@ -420,3 +415,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).
diff --git a/content/en/docs/setup/production-environment/tools/kubespray.md b/content/en/docs/setup/production-environment/tools/kubespray.md
index c4300b53a2..08893370cf 100644
--- a/content/en/docs/setup/production-environment/tools/kubespray.md
+++ b/content/en/docs/setup/production-environment/tools/kubespray.md
@@ -50,7 +50,7 @@ Kubespray provides the following utilities to help provision your environment:
### (2/5) Compose an inventory file
-After you provision your servers, create an [inventory file for Ansible](https://docs.ansible.com/ansible/intro_inventory.html). You can do this manually or via a dynamic inventory script. For more information, see "[Building your own inventory](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/getting-started.md#building-your-own-inventory)".
+After you provision your servers, create an [inventory file for Ansible](https://docs.ansible.com/ansible/latest/network/getting_started/first_inventory.html). You can do this manually or via a dynamic inventory script. For more information, see "[Building your own inventory](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/getting-started.md#building-your-own-inventory)".
### (3/5) Plan your cluster deployment
diff --git a/content/en/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md b/content/en/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md
index b8d5cd3c9b..c3757824c5 100644
--- a/content/en/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md
+++ b/content/en/docs/setup/production-environment/windows/intro-windows-in-kubernetes.md
@@ -1,33 +1,58 @@
---
+title: Intro to Windows support in Kubernetes
+content_type: concept
+weight: 65
reviewers:
- jayunit100
- jsturtevant
- marosset
- perithompson
-title: Intro to Windows support in Kubernetes
-content_type: concept
-weight: 65
---
-Windows applications constitute a large portion of the services and applications that run in many organizations. [Windows containers](https://aka.ms/windowscontainers) provide a modern way to encapsulate processes and package dependencies, making it easier to use DevOps practices and follow cloud native patterns for Windows applications. Kubernetes has become the defacto standard container orchestrator, and the release of Kubernetes 1.14 includes production support for scheduling Windows containers on Windows nodes in a Kubernetes cluster, enabling a vast ecosystem of Windows applications to leverage the power of Kubernetes. Organizations with investments in Windows-based applications and Linux-based applications don't have to look for separate orchestrators to manage their workloads, leading to increased operational efficiencies across their deployments, regardless of operating system.
+Windows applications constitute a large portion of the services and
+applications that run in many organizations.
+[Windows containers](https://aka.ms/windowscontainers) provide a modern way to
+encapsulate processes and package dependencies, making it easier to use DevOps
+practices and follow cloud native patterns for Windows applications.
+Kubernetes has become the defacto standard container orchestrator, and the
+release of Kubernetes 1.14 includes production support for scheduling Windows
+containers on Windows nodes in a Kubernetes cluster, enabling a vast ecosystem
+of Windows applications to leverage the power of Kubernetes. Organizations
+with investments in Windows-based applications and Linux-based applications
+don't have to look for separate orchestrators to manage their workloads,
+leading to increased operational efficiencies across their deployments,
+regardless of operating system.
## Windows containers in Kubernetes
-To enable the orchestration of Windows containers in Kubernetes, include Windows nodes in your existing Linux cluster. Scheduling Windows containers in {{< glossary_tooltip text="Pods" term_id="pod" >}} on Kubernetes is similar to scheduling Linux-based containers.
+To enable the orchestration of Windows containers in Kubernetes, include
+Windows nodes in your existing Linux cluster. Scheduling Windows containers in
+{{< glossary_tooltip text="Pods" term_id="pod" >}} on Kubernetes is similar to
+scheduling Linux-based containers.
-In order to run Windows containers, your Kubernetes cluster must include multiple operating systems, with control plane nodes running Linux and workers running either Windows or Linux depending on your workload needs. Windows Server 2019 is the only Windows operating system supported, enabling [Kubernetes Node](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node) on Windows (including kubelet, [container runtime](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/containerd), and kube-proxy). For a detailed explanation of Windows distribution channels see the [Microsoft documentation](https://docs.microsoft.com/en-us/windows-server/get-started-19/servicing-channels-19).
+In order to run Windows containers, your Kubernetes cluster must include
+multiple operating systems, with control plane nodes running Linux and workers
+running either Windows or Linux depending on your workload needs. Windows
+Server 2019 is the only Windows operating system supported, enabling
+[Kubernetes Node](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/architecture.md#the-kubernetes-node)
+on Windows (including kubelet,
+[container runtime](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/containerd),
+and kube-proxy). For a detailed explanation of Windows distribution channels
+see the [Microsoft documentation](https://docs.microsoft.com/en-us/windows-server/get-started-19/servicing-channels-19).
-{{< note >}}
-The Kubernetes control plane, including the [master components](/docs/concepts/overview/components/), continues to run on Linux. There are no plans to have a Windows-only Kubernetes cluster.
-{{< /note >}}
+The Kubernetes control plane, including the
+[master components](/docs/concepts/overview/components/),
+continues to run on Linux.
+There are no plans to have a Windows-only Kubernetes cluster.
-{{< note >}}
-In this document, when we talk about Windows containers we mean Windows containers with process isolation. Windows containers with [Hyper-V isolation](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/hyperv-container) is planned for a future release.
-{{< /note >}}
+In this document, when we talk about Windows containers we mean Windows
+containers with process isolation. Windows containers with
+[Hyper-V isolation](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/hyperv-container)
+is planned for a future release.
## Supported Functionality and Limitations
@@ -35,41 +60,73 @@ In this document, when we talk about Windows containers we mean Windows containe
#### Windows OS Version Support
-Refer to the following table for Windows operating system support in Kubernetes. A single heterogeneous Kubernetes cluster can have both Windows and Linux worker nodes. Windows containers have to be scheduled on Windows nodes and Linux containers on Linux nodes.
+Refer to the following table for Windows operating system support in
+Kubernetes. A single heterogeneous Kubernetes cluster can have both Windows
+and Linux worker nodes. Windows containers have to be scheduled on Windows
+nodes and Linux containers on Linux nodes.
| Kubernetes version | Windows Server LTSC releases | Windows Server SAC releases |
| --- | --- | --- | --- |
-| *Kubernetes v1.17* | Windows Server 2019 | Windows Server ver 1809 |
-| *Kubernetes v1.18* | Windows Server 2019 | Windows Server ver 1809, Windows Server ver 1903, Windows Server ver 1909 |
-| *Kubernetes v1.19* | Windows Server 2019 | Windows Server ver 1909, Windows Server ver 2004 |
| *Kubernetes v1.20* | Windows Server 2019 | Windows Server ver 1909, Windows Server ver 2004 |
+| *Kubernetes v1.21* | Windows Server 2019 | Windows Server ver 2004, Windows Server ver 20H2 |
+| *Kubernetes v1.22* | Windows Server 2019 | Windows Server ver 2004, Windows Server ver 20H2 |
-{{< note >}}
-Information on the different Windows Server servicing channels including their support models can be found at [Windows Server servicing channels](https://docs.microsoft.com/en-us/windows-server/get-started-19/servicing-channels-19).
-{{< /note >}}
-{{< note >}}
-We don't expect all Windows customers to update the operating system for their apps frequently. Upgrading your applications is what dictates and necessitates upgrading or introducing new nodes to the cluster. For the customers that chose to upgrade their operating system for containers running on Kubernetes, we will offer guidance and step-by-step instructions when we add support for a new operating system version. This guidance will include recommended upgrade procedures for upgrading user applications together with cluster nodes. Windows nodes adhere to Kubernetes [version-skew policy](/docs/setup/release/version-skew-policy/) (node to control plane versioning) the same way as Linux nodes do today.
-{{< /note >}}
-{{< note >}}
-The Windows Server Host Operating System is subject to the [Windows Server ](https://www.microsoft.com/en-us/cloud-platform/windows-server-pricing) licensing. The Windows Container images are subject to the [Supplemental License Terms for Windows containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/images-eula).
-{{< /note >}}
-{{< note >}}
-Windows containers with process isolation have strict compatibility rules, [where the host OS version must match the container base image OS version](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility). Once we support Windows containers with Hyper-V isolation in Kubernetes, the limitation and compatibility rules will change.
-{{< /note >}}
+Information on the different Windows Server servicing channels including their
+support models can be found at
+[Windows Server servicing channels](https://docs.microsoft.com/en-us/windows-server/get-started-19/servicing-channels-19).
+
+We don't expect all Windows customers to update the operating system for their
+apps frequently. Upgrading your applications is what dictates and necessitates
+upgrading or introducing new nodes to the cluster. For the customers that
+chose to upgrade their operating system for containers running on Kubernetes,
+we will offer guidance and step-by-step instructions when we add support for a
+new operating system version. This guidance will include recommended upgrade
+procedures for upgrading user applications together with cluster nodes.
+Windows nodes adhere to Kubernetes
+[version-skew policy](/docs/setup/release/version-skew-policy/) (node to control plane
+versioning) the same way as Linux nodes do today.
+
+
+The Windows Server Host Operating System is subject to the
+[Windows Server ](https://www.microsoft.com/en-us/cloud-platform/windows-server-pricing)
+licensing. The Windows Container images are subject to the
+[Supplemental License Terms for Windows containers](https://docs.microsoft.com/en-us/virtualization/windowscontainers/images-eula).
+
+Windows containers with process isolation have strict compatibility rules,
+[where the host OS version must match the container base image OS version](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility).
+Once we support Windows containers with Hyper-V isolation in Kubernetes, the
+limitation and compatibility rules will change.
#### Pause Image
-Microsoft maintains a Windows pause infrastructure container at `mcr.microsoft.com/oss/kubernetes/pause:1.4.1`.
+Kubernetes maintains a multi-architecture image that includes support for Windows.
+For Kubernetes v1.22 the recommended pause image is `k8s.gcr.io/pause:3.5`.
+The [source code](https://github.com/kubernetes/kubernetes/tree/master/build/pause)
+is available on GitHub.
+
+Microsoft maintains a multi-architecture image with Linux and Windows amd64 support at `mcr.microsoft.com/oss/kubernetes/pause:3.5`.
+This image is built from the same source as the Kubernetes maintained image but all of the Windows binaries are [authenticode signed](https://docs.microsoft.com/en-us/windows-hardware/drivers/install/authenticode) by Microsoft.
+The Microsoft maintained image is recommended for production environments when signed binaries are required.
#### Compute
-From an API and kubectl perspective, Windows containers behave in much the same way as Linux-based containers. However, there are some notable differences in key functionality which are outlined in the [limitation section](#limitations).
+From an API and kubectl perspective, Windows containers behave in much the
+same way as Linux-based containers. However, there are some notable
+differences in key functionality which are outlined in the
+[limitation section](#limitations).
-Key Kubernetes elements work the same way in Windows as they do in Linux. In this section, we talk about some of the key workload enablers and how they map to Windows.
+Key Kubernetes elements work the same way in Windows as they do in Linux. In
+this section, we talk about some of the key workload enablers and how they map
+to Windows.
* [Pods](/docs/concepts/workloads/pods/)
- A Pod is the basic building block of Kubernetes–the smallest and simplest unit in the Kubernetes object model that you create or deploy. You may not deploy Windows and Linux containers in the same Pod. All containers in a Pod are scheduled onto a single Node where each Node represents a specific platform and architecture. The following Pod capabilities, properties and events are supported with Windows containers:
+ A Pod is the basic building block of Kubernetes–the smallest and simplest
+ unit in the Kubernetes object model that you create or deploy. You may not
+ deploy Windows and Linux containers in the same Pod. All containers in a Pod
+ are scheduled onto a single Node where each Node represents a specific
+ platform and architecture. The following Pod capabilities, properties and
+ events are supported with Windows containers:
* Single or multiple containers per Pod with process isolation and volume sharing
* Pod status fields
@@ -81,7 +138,8 @@ Key Kubernetes elements work the same way in Windows as they do in Linux. In thi
* Resource limits
* [Controllers](/docs/concepts/workloads/controllers/)
- Kubernetes controllers handle the desired state of Pods. The following workload controllers are supported with Windows containers:
+ Kubernetes controllers handle the desired state of Pods. The following
+ workload controllers are supported with Windows containers:
* ReplicaSet
* ReplicationController
@@ -90,9 +148,13 @@ Key Kubernetes elements work the same way in Windows as they do in Linux. In thi
* DaemonSet
* Job
* CronJob
+
* [Services](/docs/concepts/services-networking/service/)
- A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them - sometimes called a micro-service. You can use services for cross-operating system connectivity. In Windows, services can utilize the following types, properties and capabilities:
+ A Kubernetes Service is an abstraction which defines a logical set of Pods
+ and a policy by which to access them - sometimes called a micro-service. You
+ can use services for cross-operating system connectivity. In Windows, services
+ can utilize the following types, properties and capabilities:
* Service Environment variables
* NodePort
@@ -101,7 +163,10 @@ Key Kubernetes elements work the same way in Windows as they do in Linux. In thi
* ExternalName
* Headless services
-Pods, Controllers and Services are critical elements to managing Windows workloads on Kubernetes. However, on their own they are not enough to enable the proper lifecycle management of Windows workloads in a dynamic cloud native environment. We added support for the following features:
+Pods, Controllers and Services are critical elements to managing Windows
+workloads on Kubernetes. However, on their own they are not enough to enable
+the proper lifecycle management of Windows workloads in a dynamic cloud native
+environment. We added support for the following features:
* Pod and container metrics
* Horizontal Pod Autoscaler support
@@ -115,27 +180,42 @@ Pods, Controllers and Services are critical elements to managing Windows workloa
{{< feature-state for_k8s_version="v1.14" state="stable" >}}
-Docker EE-basic 19.03+ is the recommended container runtime for all Windows Server versions. This works with the dockershim code included in the kubelet.
+Docker EE-basic 19.03+ is the recommended container runtime for all Windows
+Server versions. This works with the dockershim code included in the kubelet.
##### CRI-ContainerD
{{< feature-state for_k8s_version="v1.20" state="stable" >}}
-{{< glossary_tooltip term_id="containerd" text="ContainerD" >}} 1.4.0+ can also be used as the container runtime for Windows Kubernetes nodes.
+{{< glossary_tooltip term_id="containerd" text="ContainerD" >}} 1.4.0+ can
+also be used as the container runtime for Windows Kubernetes nodes.
-Learn how to [install ContainerD on a Windows](/docs/setup/production-environment/container-runtimes/#install-containerd).
-
-{{< caution >}}
-There is a [known limitation](/docs/tasks/configure-pod-container/configure-gmsa/#gmsa-limitations) when using GMSA with ContainerD to access Windows network shares which requires a kernel patch. Updates to address this limitation are currently available for Windows Server, Version 2004 and will be available for Windows Server 2019 in early 2021. Check for updates on the [Microsoft Windows Containers issue tracker](https://github.com/microsoft/Windows-Containers/issues/44).
-{{< /caution >}}
+Learn how to
+[install ContainerD on a Windows](/docs/setup/production-environment/container-runtimes/#install-containerd).
#### Persistent Storage
-Kubernetes [volumes](/docs/concepts/storage/volumes/) enable complex applications, with data persistence and Pod volume sharing requirements, to be deployed on Kubernetes. Management of persistent volumes associated with a specific storage back-end or protocol includes actions such as: provisioning/de-provisioning/resizing of volumes, attaching/detaching a volume to/from a Kubernetes node and mounting/dismounting a volume to/from individual containers in a pod that needs to persist data. The code implementing these volume management actions for a specific storage back-end or protocol is shipped in the form of a Kubernetes volume [plugin](/docs/concepts/storage/volumes/#types-of-volumes). The following broad classes of Kubernetes volume plugins are supported on Windows:
+Kubernetes [volumes](/docs/concepts/storage/volumes/) enable complex
+applications, with data persistence and Pod volume sharing requirements, to be
+deployed on Kubernetes. Management of persistent volumes associated with a
+specific storage back-end or protocol includes actions such as:
+provisioning/de-provisioning/resizing of volumes, attaching/detaching a volume
+to/from a Kubernetes node and mounting/dismounting a volume to/from individual
+containers in a pod that needs to persist data. The code implementing these
+volume management actions for a specific storage back-end or protocol is
+shipped in the form of a Kubernetes volume
+[plugin](/docs/concepts/storage/volumes/#types-of-volumes). The following
+broad classes of Kubernetes volume plugins are supported on Windows:
##### In-tree Volume Plugins
-Code associated with in-tree volume plugins ship as part of the core Kubernetes code base. Deployment of in-tree volume plugins do not require installation of additional scripts or deployment of separate containerized plugin components. These plugins can handle: provisioning/de-provisioning and resizing of volumes in the storage backend, attaching/detaching of volumes to/from a Kubernetes node and mounting/dismounting a volume to/from individual containers in a pod. The following in-tree plugins support Windows nodes:
+Code associated with in-tree volume plugins ship as part of the core
+Kubernetes code base. Deployment of in-tree volume plugins do not require
+installation of additional scripts or deployment of separate containerized
+plugin components. These plugins can handle: provisioning/de-provisioning and
+resizing of volumes in the storage backend, attaching/detaching of volumes
+to/from a Kubernetes node and mounting/dismounting a volume to/from individual
+containers in a pod. The following in-tree plugins support Windows nodes:
* [awsElasticBlockStore](/docs/concepts/storage/volumes/#awselasticblockstore)
* [azureDisk](/docs/concepts/storage/volumes/#azuredisk)
@@ -145,22 +225,52 @@ Code associated with in-tree volume plugins ship as part of the core Kubernetes
##### FlexVolume Plugins
-Code associated with [FlexVolume](/docs/concepts/storage/volumes/#flexVolume) plugins ship as out-of-tree scripts or binaries that need to be deployed directly on the host. FlexVolume plugins handle attaching/detaching of volumes to/from a Kubernetes node and mounting/dismounting a volume to/from individual containers in a pod. Provisioning/De-provisioning of persistent volumes associated with FlexVolume plugins may be handled through an external provisioner that is typically separate from the FlexVolume plugins. The following FlexVolume [plugins](https://github.com/Microsoft/K8s-Storage-Plugins/tree/master/flexvolume/windows), deployed as powershell scripts on the host, support Windows nodes:
+Code associated with [FlexVolume](/docs/concepts/storage/volumes/#flexVolume)
+plugins ship as out-of-tree scripts or binaries that need to be deployed
+directly on the host. FlexVolume plugins handle attaching/detaching of volumes
+to/from a Kubernetes node and mounting/dismounting a volume to/from individual
+containers in a pod. Provisioning/De-provisioning of persistent volumes
+associated with FlexVolume plugins may be handled through an external
+provisioner that is typically separate from the FlexVolume plugins. The
+following FlexVolume
+[plugins](https://github.com/Microsoft/K8s-Storage-Plugins/tree/master/flexvolume/windows),
+deployed as powershell scripts on the host, support Windows nodes:
* [SMB](https://github.com/microsoft/K8s-Storage-Plugins/tree/master/flexvolume/windows/plugins/microsoft.com~smb.cmd)
* [iSCSI](https://github.com/microsoft/K8s-Storage-Plugins/tree/master/flexvolume/windows/plugins/microsoft.com~iscsi.cmd)
##### CSI Plugins
-{{< feature-state for_k8s_version="v1.19" state="beta" >}}
+{{< feature-state for_k8s_version="v1.22" state="stable" >}}
-Code associated with {{< glossary_tooltip text="CSI" term_id="csi" >}} plugins ship as out-of-tree scripts and binaries that are typically distributed as container images and deployed using standard Kubernetes constructs like DaemonSets and StatefulSets. CSI plugins handle a wide range of volume management actions in Kubernetes: provisioning/de-provisioning/resizing of volumes, attaching/detaching of volumes to/from a Kubernetes node and mounting/dismounting a volume to/from individual containers in a pod, backup/restore of persistent data using snapshots and cloning. CSI plugins typically consist of node plugins (that run on each node as a DaemonSet) and controller plugins.
+Code associated with {{< glossary_tooltip text="CSI" term_id="csi" >}} plugins
+ship as out-of-tree scripts and binaries that are typically distributed as
+container images and deployed using standard Kubernetes constructs like
+DaemonSets and StatefulSets. CSI plugins handle a wide range of volume
+management actions in Kubernetes: provisioning/de-provisioning/resizing of
+volumes, attaching/detaching of volumes to/from a Kubernetes node and
+mounting/dismounting a volume to/from individual containers in a pod,
+backup/restore of persistent data using snapshots and cloning.
-CSI node plugins (especially those associated with persistent volumes exposed as either block devices or over a shared file-system) need to perform various privileged operations like scanning of disk devices, mounting of file systems, etc. These operations differ for each host operating system. For Linux worker nodes, containerized CSI node plugins are typically deployed as privileged containers. For Windows worker nodes, privileged operations for containerized CSI node plugins is supported using [csi-proxy](https://github.com/kubernetes-csi/csi-proxy), a community-managed, stand-alone binary that needs to be pre-installed on each Windows node. Please refer to the deployment guide of the CSI plugin you wish to deploy for further details.
+CSI plugins communicate with a CSI node plugin which performs the local storage operations.
+On Windows nodes CSI node plugins typically call APIs exposed by the community-managed
+[csi-proxy](https://github.com/kubernetes-csi/csi-proxy) which handles the local storage operations.
+
+Please refer to the deployment guide of the environment where you wish to deploy a Windows CSI plugin
+for further details around installation.
+You may also refer to the following [installation steps](https://github.com/kubernetes-csi/csi-proxy#installation).
#### Networking
-Networking for Windows containers is exposed through [CNI plugins](/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/). Windows containers function similarly to virtual machines in regards to networking. Each container has a virtual network adapter (vNIC) which is connected to a Hyper-V virtual switch (vSwitch). The Host Networking Service (HNS) and the Host Compute Service (HCS) work together to create containers and attach container vNICs to networks. HCS is responsible for the management of containers whereas HNS is responsible for the management of networking resources such as:
+Networking for Windows containers is exposed through
+[CNI plugins](/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/).
+Windows containers function similarly to virtual machines in regards to
+networking. Each container has a virtual network adapter (vNIC) which is
+connected to a Hyper-V virtual switch (vSwitch). The Host Networking Service
+(HNS) and the Host Compute Service (HCS) work together to create containers
+and attach container vNICs to networks. HCS is responsible for the management
+of containers whereas HNS is responsible for the management of networking
+resources such as:
* Virtual networks (including creation of vSwitches)
* Endpoints / vNICs
@@ -176,19 +286,155 @@ The following service spec types are supported:
##### Network modes
-Windows supports five different networking drivers/modes: L2bridge, L2tunnel, Overlay, Transparent, and NAT. In a heterogeneous cluster with Windows and Linux worker nodes, you need to select a networking solution that is compatible on both Windows and Linux. The following out-of-tree plugins are supported on Windows, with recommendations on when to use each CNI:
+Windows supports five different networking drivers/modes: L2bridge, L2tunnel,
+Overlay, Transparent, and NAT. In a heterogeneous cluster with Windows and
+Linux worker nodes, you need to select a networking solution that is
+compatible on both Windows and Linux. The following out-of-tree plugins are
+supported on Windows, with recommendations on when to use each CNI:
-| Network Driver | Description | Container Packet Modifications | Network Plugins | Network Plugin Characteristics |
-| -------------- | ----------- | ------------------------------ | --------------- | ------------------------------ |
-| L2bridge | Containers are attached to an external vSwitch. Containers are attached to the underlay network, although the physical network doesn't need to learn the container MACs because they are rewritten on ingress/egress. | MAC is rewritten to host MAC, IP may be rewritten to host IP using HNS OutboundNAT policy. | [win-bridge](https://github.com/containernetworking/plugins/tree/master/plugins/main/windows/win-bridge), [Azure-CNI](https://github.com/Azure/azure-container-networking/blob/master/docs/cni.md), Flannel host-gateway uses win-bridge | win-bridge uses L2bridge network mode, connects containers to the underlay of hosts, offering best performance. Requires user-defined routes (UDR) for inter-node connectivity. |
-| L2Tunnel | This is a special case of l2bridge, but only used on Azure. All packets are sent to the virtualization host where SDN policy is applied. | MAC rewritten, IP visible on the underlay network | [Azure-CNI](https://github.com/Azure/azure-container-networking/blob/master/docs/cni.md) | Azure-CNI allows integration of containers with Azure vNET, and allows them to leverage the set of capabilities that [Azure Virtual Network provides](https://azure.microsoft.com/en-us/services/virtual-network/). For example, securely connect to Azure services or use Azure NSGs. See [azure-cni for some examples](https://docs.microsoft.com/en-us/azure/aks/concepts-network#azure-cni-advanced-networking) |
-| Overlay (Overlay networking for Windows in Kubernetes is in *alpha* stage) | Containers are given a vNIC connected to an external vSwitch. Each overlay network gets its own IP subnet, defined by a custom IP prefix.The overlay network driver uses VXLAN encapsulation. | Encapsulated with an outer header. | [Win-overlay](https://github.com/containernetworking/plugins/tree/master/plugins/main/windows/win-overlay), Flannel VXLAN (uses win-overlay) | win-overlay should be used when virtual container networks are desired to be isolated from underlay of hosts (e.g. for security reasons). Allows for IPs to be re-used for different overlay networks (which have different VNID tags) if you are restricted on IPs in your datacenter. This option requires [KB4489899](https://support.microsoft.com/help/4489899) on Windows Server 2019. |
-| Transparent (special use case for [ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes)) | Requires an external vSwitch. Containers are attached to an external vSwitch which enables intra-pod communication via logical networks (logical switches and routers). | Packet is encapsulated either via [GENEVE](https://datatracker.ietf.org/doc/draft-gross-geneve/) or [STT](https://datatracker.ietf.org/doc/draft-davie-stt/) tunneling to reach pods which are not on the same host.
Packets are forwarded or dropped via the tunnel metadata information supplied by the ovn network controller.
NAT is done for north-south communication. | [ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes) | [Deploy via ansible](https://github.com/openvswitch/ovn-kubernetes/tree/master/contrib). Distributed ACLs can be applied via Kubernetes policies. IPAM support. Load-balancing can be achieved without kube-proxy. NATing is done without using iptables/netsh. |
-| NAT (*not used in Kubernetes*) | Containers are given a vNIC connected to an internal vSwitch. DNS/DHCP is provided using an internal component called [WinNAT](https://blogs.technet.microsoft.com/virtualization/2016/05/25/windows-nat-winnat-capabilities-and-limitations/) | MAC and IP is rewritten to host MAC/IP. | [nat](https://github.com/Microsoft/windows-container-networking/tree/master/plugins/nat) | Included here for completeness |
+
+
+
+ | Network Driver |
+ Description |
+ Container Packet Modifications |
+ Network Plugins |
+ Network Plugin Characteristics |
+
+
+
+
+ | L2bridge |
+ Containers are attached to an external vSwitch. Containers are attached
+ to the underlay network, although the physical network doesn't need to learn
+ the container. MACs because they are rewritten on ingress/egress.
+ |
+
+ MAC is rewritten to host MAC, IP may be rewritten to host IP using HNS
+ OutboundNAT policy.
+ |
+
+ win-bridge,
+ Azure-CNI,
+ Flannel host-gateway uses win-bridge
+ |
+
+ win-bridge uses L2bridge network mode,
+ connects containers to the underlay of hosts, offering best performance.
+ Requires user-defined routes (UDR) for inter-node connectivity.
+ |
+
+
+ | L2Tunnel |
+
+ This is a special case of l2bridge, but only used on Azure. All packets
+ are sent to the virtualization host where SDN policy is applied.
+ |
+
+ MAC rewritten, IP visible on the underlay network
+ |
+
+ Azure-CNI
+ |
+
+ Azure-CNI allows integration of containers with Azure vNET, and allows them
+ to leverage the set of capabilities that
+ Azure Virtual Network
+ provides. For example, securely connect to Azure services or use Azure NSGs.
+ See azure-cni
+ for some examples.
+ |
+
+
+ | Overlay (Overlay networking for Windows in Kubernetes is in Alpha stage) |
+
+ Containers are given a vNIC connected to an external vSwitch. Each overlay
+ network gets its own IP subnet, defined by a custom IP prefix.The overlay
+ network driver uses VXLAN encapsulation.
+ |
+
+ Encapsulated with an outer header.
+ |
+
+ Win-overlay,
+ Flannel VXLAN (uses win-overlay)
+ |
+
+ win-overlay should be used when virtual container networks are desired to
+ be isolated from underlay of hosts (e.g. for security reasons). Allows for IPs
+ to be re-used for different overlay networks (which have different VNID tags)
+ if you are restricted on IPs in your datacenter. This option requires
+ KB4489899 on Windows Server
+ 2019.
+ |
+
+
+ |
+ Transparent (special use case for ovn-kubernetes)
+ |
+
+ Requires an external vSwitch. Containers are attached to an external
+ vSwitch which enables intra-pod communication via logical networks (logical
+ switches and routers).
+ |
+
+ Packet is encapsulated either via
+ GENEVE,
+ STT tunneling to reach
+ pods which are not on the same host. Packets are forwarded or dropped
+ via the tunnel metadata information supplied by the ovn network controller.
+
+ NAT is done for north-south communication.
+ |
+
+ ovn-kubernetes
+ |
+
+ Deploy via Ansible.
+ Distributed ACLs can be applied via Kubernetes policies. IPAM support.
+ Load-balancing can be achieved without kube-proxy. NATing is done without
+ using iptables/netsh.
+ |
+
+
+ | NAT (not used in Kubernetes) |
+
+ Containers are given a vNIC connected to an internal vSwitch. DNS/DHCP is
+ provided using an internal component called
+ WinNAT.
+ |
+
+ MAC and IP is rewritten to host MAC/IP.
+ |
+
+ nat
+ |
+
+ Included here for completeness
+ |
+
+
+
-As outlined above, the [Flannel](https://github.com/coreos/flannel) CNI [meta plugin](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel) is also supported on [Windows](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel#windows-support-experimental) via the [VXLAN network backend](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan) (**alpha support** ; delegates to win-overlay) and [host-gateway network backend](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#host-gw) (stable support; delegates to win-bridge). This plugin supports delegating to one of the reference CNI plugins (win-overlay, win-bridge), to work in conjunction with Flannel daemon on Windows (Flanneld) for automatic node subnet lease assignment and HNS network creation. This plugin reads in its own configuration file (cni.conf), and aggregates it with the environment variables from the FlannelD generated subnet.env file. It then delegates to one of the reference CNI plugins for network plumbing, and sends the correct configuration containing the node-assigned subnet to the IPAM plugin (e.g. host-local).
+As outlined above, the [Flannel](https://github.com/coreos/flannel) CNI
+[meta plugin](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel)
+is also supported on
+[Windows](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel#windows-support-experimental)
+via the [VXLAN network backend](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan)
+(**alpha support** ; delegates to win-overlay) and
+[host-gateway network backend](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#host-gw)
+(stable support; delegates to win-bridge). This plugin supports delegating to
+one of the reference CNI plugins (win-overlay, win-bridge), to work in
+conjunction with Flannel daemon on Windows (Flanneld) for automatic node
+subnet lease assignment and HNS network creation. This plugin reads in its own
+configuration file (cni.conf), and aggregates it with the environment
+variables from the FlannelD generated subnet.env file. It then delegates to
+one of the reference CNI plugins for network plumbing, and sends the correct
+configuration containing the node-assigned subnet to the IPAM plugin (e.g.
+host-local).
-For the node, pod, and service objects, the following network flows are supported for TCP/UDP traffic:
+For the node, pod, and service objects, the following network flows are
+supported for TCP/UDP traffic:
* Pod -> Pod (IP)
* Pod -> Pod (Name)
@@ -210,86 +456,229 @@ The following IPAM options are supported on Windows:
##### Load balancing and Services
-On Windows, you can use the following settings to configure Services and load balancing behavior:
+On Windows, you can use the following settings to configure Services and load
+balancing behavior:
{{< table caption="Windows Service Settings" >}}
-| Feature | Description | Supported Kubernetes version | Supported Windows OS build | How to enable |
-| ------- | ----------- | ----------------------------- | -------------------------- | ------------- |
-| Session affinity | Ensures that connections from a particular client are passed to the same Pod each time. | v1.19+ | [Windows Server vNext Insider Preview Build 19551](https://blogs.windows.com/windowsexperience/2020/01/28/announcing-windows-server-vnext-insider-preview-build-19551/) (or higher) | Set `service.spec.sessionAffinity` to "ClientIP" |
-| Direct Server Return | Load balancing mode where the IP address fixups and the LBNAT occurs at the container vSwitch port directly; service traffic arrives with the source IP set as the originating pod IP. Promises lower latency and scalability. | v1.15+ | Windows Server, version 2004 | Set the following flags in kube-proxy: `--feature-gates="WinDSR=true" --enable-dsr=true` |
-| Preserve-Destination | Skips DNAT of service traffic, thereby preserving the virtual IP of the target service in packets reaching the backend Pod. This setting will also ensure that the client IP of incoming packets get preserved. | v1.15+ | Windows Server, version 1903 (or higher) | Set `"preserve-destination": "true"` in service annotations and enable DSR flags in kube-proxy. |
-| IPv4/IPv6 dual-stack networking | Native IPv4-to-IPv4 in parallel with IPv6-to-IPv6 communications to, from, and within a cluster | v1.19+ | Windows Server vNext Insider Preview Build 19603 (or higher) | See [IPv4/IPv6 dual-stack](#ipv4ipv6-dual-stack) |
+
+
+
+
+ | Feature |
+ Description |
+ Supported Kubernetes version |
+ Supported Windows OS build |
+ How to enable |
+
+
+
+
+ | Session affinity |
+
+ Ensures that connections from a particular client are passed to the same
+ Pod each time.
+ |
+ v1.20+ |
+
+ Windows Server vNext Insider Preview Build 19551 (or higher)
+ |
+
+ Set service.spec.sessionAffinity to "ClientIP"
+ |
+
+
+ | Direct Server Return (DSR) |
+
+ Load balancing mode where the IP address fixups and the LBNAT occurs at
+ the container vSwitch port directly; service traffic arrives with the source
+ IP set as the originating pod IP.
+ |
+ v1.20+ |
+
+ Windows Server 2019
+ |
+
+ Set the following flags in kube-proxy:
+ --feature-gates="WinDSR=true" --enable-dsr=true
+ |
+
+
+ | Preserve-Destination |
+
+ Skips DNAT of service traffic, thereby preserving the virtual IP of the target
+ service in packets reaching the backend Pod. Also disables node-node forwarding.
+ |
+ v1.20+ |
+ Windows Server, version 1903 (or higher) |
+
+ Set "preserve-destination": "true" in service annotations
+ and enable DSR in kube-proxy.
+ |
+
+
+ | IPv4/IPv6 dual-stack networking |
+
+ Native IPv4-to-IPv4 in parallel with IPv6-to-IPv6 communications to, from,
+ and within a cluster
+ |
+ v1.19+ |
+ Windows Server, version 2004 (or higher) |
+
+ See IPv4/IPv6 dual-stack
+ |
+
+
+ | Client IP preservation |
+
+ Ensures that source IP of incoming ingress traffic gets preserved. Also
+ disables node-node forwarding.
+ |
+ v1.20+ |
+ Windows Server, version 2019 (or higher) |
+
+ Set service.spec.externalTrafficPolicy to "Local" and enable
+ DSR in kube-proxy.
+ |
+
+
+
+
{{< /table >}}
#### IPv4/IPv6 dual-stack
-You can enable IPv4/IPv6 dual-stack networking for `l2bridge` networks using the `IPv6DualStack` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/). See [enable IPv4/IPv6 dual stack](/docs/concepts/services-networking/dual-stack#enable-ipv4ipv6-dual-stack) for more details.
+You can enable IPv4/IPv6 dual-stack networking for `l2bridge` networks using
+the `IPv6DualStack` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/). See
+[enable IPv4/IPv6 dual stack](/docs/concepts/services-networking/dual-stack#enable-ipv4ipv6-dual-stack)
+for more details.
-{{< note >}}
-On Windows, using IPv6 with Kubernetes require Windows Server, version 2004 (kernel version 10.0.19041.610) or later.
-{{< /note >}}
+On Windows, using IPv6 with Kubernetes require Windows Server, version 2004
+(kernel version 10.0.19041.610) or later.
-{{< note >}}
Overlay (VXLAN) networks on Windows do not support dual-stack networking today.
-{{< /note >}}
### Limitations
-Windows is only supported as a worker node in the Kubernetes architecture and component matrix. This means that a Kubernetes cluster must always include Linux master nodes, zero or more Linux worker nodes, and zero or more Windows worker nodes.
-
+Windows is only supported as a worker node in the Kubernetes architecture and
+component matrix. This means that a Kubernetes cluster must always include
+Linux master nodes, zero or more Linux worker nodes, and zero or more Windows
+worker nodes.
#### Resource Handling
- Linux cgroups are used as a pod boundary for resource controls in Linux. Containers are created within that boundary for network, process and file system isolation. The cgroups APIs can be used to gather cpu/io/memory stats. In contrast, Windows uses a Job object per container with a system namespace filter to contain all processes in a container and provide logical isolation from the host. There is no way to run a Windows container without the namespace filtering in place. This means that system privileges cannot be asserted in the context of the host, and thus privileged containers are not available on Windows. Containers cannot assume an identity from the host because the Security Account Manager (SAM) is separate.
+Linux cgroups are used as a pod boundary for resource controls in Linux.
+Containers are created within that boundary for network, process and file
+system isolation. The cgroups APIs can be used to gather cpu/io/memory stats.
+In contrast, Windows uses a Job object per container with a system namespace
+filter to contain all processes in a container and provide logical isolation
+from the host. There is no way to run a Windows container without the
+namespace filtering in place. This means that system privileges cannot be
+asserted in the context of the host, and thus privileged containers are not
+available on Windows. Containers cannot assume an identity from the host
+because the Security Account Manager (SAM) is separate.
#### Resource Reservations
##### Memory Reservations
-Windows does not have an out-of-memory process killer as Linux does. Windows always treats all user-mode memory allocations as virtual, and pagefiles are mandatory. The net effect is that Windows won't reach out of memory conditions the same way Linux does, and processes page to disk instead of being subject to out of memory (OOM) termination. If memory is over-provisioned and all physical memory is exhausted, then paging can slow down performance.
-Keeping memory usage within reasonable bounds is possible using the kubelet parameters `--kubelet-reserve` and/or `--system-reserve` to account for memory usage on the node (outside of containers). This reduces [NodeAllocatable](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable).
+Windows does not have an out-of-memory process killer as Linux does. Windows
+always treats all user-mode memory allocations as virtual, and pagefiles are
+mandatory. The net effect is that Windows won't reach out of memory conditions
+the same way Linux does, and processes page to disk instead of being subject
+to out of memory (OOM) termination. If memory is over-provisioned and all
+physical memory is exhausted, then paging can slow down performance.
-{{< note >}}
-As you deploy workloads, use resource limits (must set only limits or limits must equal requests) on containers. This also subtracts from NodeAllocatable and prevents the scheduler from adding more pods once a node is full.
-{{< /note >}}
+Keeping memory usage within reasonable bounds is possible using the kubelet
+parameters `--kubelet-reserve` and/or `--system-reserve` to account for memory
+usage on the node (outside of containers). This reduces
+[NodeAllocatable](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable).
-A best practice to avoid over-provisioning is to configure the kubelet with a system reserved memory of at least 2GB to account for Windows, Docker, and Kubernetes processes.
+As you deploy workloads, use resource limits (must set only limits or limits
+must equal requests) on containers. This also subtracts from NodeAllocatable
+and prevents the scheduler from adding more pods once a node is full.
+
+A best practice to avoid over-provisioning is to configure the kubelet with a
+system reserved memory of at least 2GB to account for Windows, Docker, and
+Kubernetes processes.
##### CPU Reservations
-To account for Windows, Docker and other Kubernetes host processes it is recommended to reserve a percentage of CPU so they are able to respond to events. This value needs to be scaled based on the number of CPU cores available on the Windows node.To determine this percentage a user should identify the maximum pod density for each of their nodes and monitor the CPU usage of the system services choosing a value that meets their workload needs.
-Keeping CPU usage within reasonable bounds is possible using the kubelet parameters `--kubelet-reserve` and/or `--system-reserve` to account for CPU usage on the node (outside of containers). This reduces [NodeAllocatable](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable).
+To account for Windows, Docker and other Kubernetes host processes it is
+recommended to reserve a percentage of CPU so they are able to respond to
+events. This value needs to be scaled based on the number of CPU cores
+available on the Windows node.To determine this percentage a user should
+identify the maximum pod density for each of their nodes and monitor the CPU
+usage of the system services choosing a value that meets their workload needs.
+
+Keeping CPU usage within reasonable bounds is possible using the kubelet
+parameters `--kubelet-reserve` and/or `--system-reserve` to account for CPU
+usage on the node (outside of containers). This reduces
+[NodeAllocatable](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable).
#### Feature Restrictions
+
* TerminationGracePeriod: not implemented
* Single file mapping: to be implemented with CRI-ContainerD
* Termination message: to be implemented with CRI-ContainerD
* Privileged Containers: not currently supported in Windows containers
* HugePages: not currently supported in Windows containers
-* The existing node problem detector is Linux-only and requires privileged containers. In general, we don't expect this to be used on Windows because privileged containers are not supported
-* Not all features of shared namespaces are supported (see API section for more details)
+* The existing node problem detector is Linux-only and requires privileged
+ containers. In general, we don't expect this to be used on Windows because
+ privileged containers are not supported
+* Not all features of shared namespaces are supported (see API section for
+ more details)
#### Difference in behavior of flags when compared to Linux
+
The behavior of the following kubelet flags is different on Windows nodes as described below:
-* `--kubelet-reserve`, `--system-reserve` , and `--eviction-hard` flags update Node Allocatable
-* Eviction by using `--enforce-node-allocable` is not implemented
-* Eviction by using `--eviction-hard` and `--eviction-soft` are not implemented
-* MemoryPressure Condition is not implemented
-* There are no OOM eviction actions taken by the kubelet
-* Kubelet running on the windows node does not have memory restrictions. `--kubelet-reserve` and `--system-reserve` do not set limits on kubelet or processes running on the host. This means kubelet or a process on the host could cause memory resource starvation outside the node-allocatable and scheduler
-* An additional flag to set the priority of the kubelet process is available on the Windows nodes called `--windows-priorityclass`. This flag allows kubelet process to get more CPU time slices when compared to other processes running on the Windows host. More information on the allowable values and their meaning is available at [Windows Priority Classes](https://docs.microsoft.com/en-us/windows/win32/procthread/scheduling-priorities#priority-class). In order for kubelet to always have enough CPU cycles it is recommended to set this flag to `ABOVE_NORMAL_PRIORITY_CLASS` and above
+* `--kubelet-reserve`, `--system-reserve` , and `--eviction-hard` flags update
+ Node Allocatable
+
+* Eviction by using `--enforce-node-allocable` is not implemented.
+
+* Eviction by using `--eviction-hard` and `--eviction-soft` are not implemented.
+
+* `MemoryPressure` Condition is not implemented.
+
+* There are no OOM eviction actions taken by the kubelet.
+
+* Kubelet running on the windows node does not have memory restrictions.
+ `--kubelet-reserve` and `--system-reserve` do not set limits on kubelet or
+ processes running on the host. This means kubelet or a process on the host
+ could cause memory resource starvation outside the node-allocatable and
+ scheduler
+
+* An additional flag to set the priority of the kubelet process is available
+ on the Windows nodes called `--windows-priorityclass`. This flag allows
+ kubelet process to get more CPU time slices when compared to other processes
+ running on the Windows host. More information on the allowable values and
+ their meaning is available at
+ [Windows Priority Classes](https://docs.microsoft.com/en-us/windows/win32/procthread/scheduling-priorities#priority-class).
+ In order for kubelet to always have enough CPU cycles it is recommended to set
+ this flag to `ABOVE_NORMAL_PRIORITY_CLASS` and above.
#### Storage
-Windows has a layered filesystem driver to mount container layers and create a copy filesystem based on NTFS. All file paths in the container are resolved only within the context of that container.
+Windows has a layered filesystem driver to mount container layers and create a
+copy filesystem based on NTFS. All file paths in the container are resolved
+only within the context of that container.
-* With Docker Volume mounts can only target a directory in the container, and not an individual file. This limitation does not exist with CRI-containerD.
-* Volume mounts cannot project files or directories back to the host filesystem
-* Read-only filesystems are not supported because write access is always required for the Windows registry and SAM database. However, read-only volumes are supported
-* Volume user-masks and permissions are not available. Because the SAM is not shared between the host & container, there's no mapping between them. All permissions are resolved within the context of the container
+* With Docker Volume mounts can only target a directory in the container, and
+ not an individual file. This limitation does not exist with CRI-containerD.
-As a result, the following storage functionality is not supported on Windows nodes
+* Volume mounts cannot project files or directories back to the host
+ filesystem
+
+* Read-only filesystems are not supported because write access is always
+ required for the Windows registry and SAM database. However, read-only
+ volumes are supported
+
+* Volume user-masks and permissions are not available. Because the SAM is not
+ shared between the host & container, there's no mapping between them. All
+ permissions are resolved within the context of the container
+
+As a result, the following storage functionality is not supported on Windows nodes:
* Volume subpath mounts. Only the entire volume can be mounted in a Windows container.
* Subpath volume mounting for Secrets
@@ -304,24 +693,61 @@ As a result, the following storage functionality is not supported on Windows nod
#### Networking {#networking-limitations}
-Windows Container Networking differs in some important ways from Linux networking. The [Microsoft documentation for Windows Container Networking](https://docs.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture) contains additional details and background.
+Windows Container Networking differs in some important ways from Linux
+networking. The [Microsoft documentation for Windows Container Networking](https://docs.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture)
+contains additional details and background.
-The Windows host networking service and virtual switch implement namespacing and can create virtual NICs as needed for a pod or container. However, many configurations such as DNS, routes, and metrics are stored in the Windows registry database rather than /etc/... files as they are on Linux. The Windows registry for the container is separate from that of the host, so concepts like mapping /etc/resolv.conf from the host into a container don't have the same effect they would on Linux. These must be configured using Windows APIs run in the context of that container. Therefore CNI implementations need to call the HNS instead of relying on file mappings to pass network details into the pod or container.
+The Windows host networking service and virtual switch implement namespacing
+and can create virtual NICs as needed for a pod or container. However, many
+configurations such as DNS, routes, and metrics are stored in the Windows
+registry database rather than /etc/... files as they are on Linux. The Windows
+registry for the container is separate from that of the host, so concepts like
+mapping /etc/resolv.conf from the host into a container don't have the same
+effect they would on Linux. These must be configured using Windows APIs run in
+the context of that container. Therefore CNI implementations need to call the
+HNS instead of relying on file mappings to pass network details into the pod
+or container.
The following networking functionality is not supported on Windows nodes
-* Host networking mode is not available for Windows pods
-* Local NodePort access from the node itself fails (works for other nodes or external clients)
-* Accessing service VIPs from nodes will be available with a future release of Windows Server
-* A single service can only support up to 64 backend pods / unique destination IPs
-* Overlay networking support in kube-proxy is an alpha release. In addition, it requires [KB4482887](https://support.microsoft.com/en-us/help/4482887/windows-10-update-kb4482887) to be installed on Windows Server 2019
-* Local Traffic Policy and DSR mode
-* Windows containers connected to l2bridge, l2tunnel, or overlay networks do not support communicating over the IPv6 stack. There is outstanding Windows platform work required to enable these network drivers to consume IPv6 addresses and subsequent Kubernetes work in kubelet, kube-proxy, and CNI plugins.
-* Outbound communication using the ICMP protocol via the win-overlay, win-bridge, and Azure-CNI plugin. Specifically, the Windows data plane ([VFP](https://www.microsoft.com/en-us/research/project/azure-virtual-filtering-platform/)) doesn't support ICMP packet transpositions. This means:
- * ICMP packets directed to destinations within the same network (e.g. pod to pod communication via ping) work as expected and without any limitations
+* Host networking mode is not available for Windows pods.
+
+* Local NodePort access from the node itself fails (works for other nodes or
+ external clients).
+
+* Accessing service VIPs from nodes will be available with a future release of
+ Windows Server.
+
+* A single service can only support up to 64 backend pods / unique destination IPs.
+
+* Overlay networking support in kube-proxy is a beta feature. In addition, it
+ requires [KB4482887](https://support.microsoft.com/en-us/help/4482887/windows-10-update-kb4482887)
+ to be installed on Windows Server 2019.
+
+* Local Traffic Policy in non-DSR mode.
+
+* Windows containers connected to overlay networks do not support
+ communicating over the IPv6 stack. There is outstanding Windows platform
+ work required to enable this network driver to consume IPv6 addresses and
+ subsequent Kubernetes work in kubelet, kube-proxy, and CNI plugins.
+
+* Outbound communication using the ICMP protocol via the win-overlay,
+ win-bridge, and Azure-CNI plugin. Specifically, the Windows data plane
+ ([VFP](https://www.microsoft.com/en-us/research/project/azure-virtual-filtering-platform/))
+ doesn't support ICMP packet transpositions. This means:
+
+ * ICMP packets directed to destinations within the same network (e.g. pod to
+ pod communication via ping) work as expected and without any limitations
+
* TCP/UDP packets work as expected and without any limitations
- * ICMP packets directed to pass through a remote network (e.g. pod to external internet communication via ping) cannot be transposed and thus will not be routed back to their source
- * Since TCP/UDP packets can still be transposed, one can substitute `ping ` with `curl ` to be able to debug connectivity to the outside world.
+
+ * ICMP packets directed to pass through a remote network (e.g. pod to
+ external internet communication via ping) cannot be transposed and thus
+ will not be routed back to their source
+
+ * Since TCP/UDP packets can still be transposed, one can substitute
+ `ping ` with `curl ` to be able to debug connectivity
+ to the outside world.
These features were added in Kubernetes v1.15:
@@ -329,334 +755,581 @@ These features were added in Kubernetes v1.15:
##### CNI Plugins
-* Windows reference network plugins win-bridge and win-overlay do not currently implement [CNI spec](https://github.com/containernetworking/cni/blob/master/SPEC.md) v0.4.0 due to missing "CHECK" implementation.
+* Windows reference network plugins `win-bridge` and `win-overlay` do not
+ currently implement [CNI spec](https://github.com/containernetworking/cni/blob/master/SPEC.md)
+ v0.4.0 due to missing "CHECK" implementation.
+
* The Flannel VXLAN CNI has the following limitations on Windows:
-1. Node-pod connectivity isn't possible by design. It's only possible for local pods with Flannel v0.12.0 (or higher).
-2. We are restricted to using VNI 4096 and UDP port 4789. The VNI limitation is being worked on and will be overcome in a future release (open-source flannel changes). See the official [Flannel VXLAN](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan) backend docs for more details on these parameters.
+ 1. Node-pod connectivity isn't possible by design. It's only possible for
+ local pods with Flannel v0.12.0 (or higher).
+
+ 1. We are restricted to using VNI 4096 and UDP port 4789. The VNI limitation
+ is being worked on and will be overcome in a future release (open-source
+ flannel changes). See the official
+ [Flannel VXLAN](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan)
+ backend docs for more details on these parameters.
##### DNS {#dns-limitations}
-* ClusterFirstWithHostNet is not supported for DNS. Windows treats all names with a '.' as a FQDN and skips PQDN resolution
-* On Linux, you have a DNS suffix list, which is used when trying to resolve PQDNs. On Windows, we only have 1 DNS suffix, which is the DNS suffix associated with that pod's namespace (mydns.svc.cluster.local for example). Windows can resolve FQDNs and services or names resolvable with only that suffix. For example, a pod spawned in the default namespace, will have the DNS suffix **default.svc.cluster.local**. On a Windows pod, you can resolve both **kubernetes.default.svc.cluster.local** and **kubernetes**, but not the in-betweens, like **kubernetes.default** or **kubernetes.default.svc**.
-* On Windows, there are multiple DNS resolvers that can be used. As these come with slightly different behaviors, using the `Resolve-DNSName` utility for name query resolutions is recommended.
+* ClusterFirstWithHostNet is not supported for DNS. Windows treats all names
+ with a '.' as a FQDN and skips PQDN resolution
+
+* On Linux, you have a DNS suffix list, which is used when trying to resolve
+ PQDNs. On Windows, we only have 1 DNS suffix, which is the DNS suffix
+ associated with that pod's namespace (mydns.svc.cluster.local for example).
+ Windows can resolve FQDNs and services or names resolvable with only that
+ suffix. For example, a pod spawned in the default namespace, will have the DNS
+ suffix `default.svc.cluster.local`. On a Windows pod, you can resolve both
+ `kubernetes.default.svc.cluster.local` and `kubernetes`, but not the
+ in-betweens, like `kubernetes.default` or `kubernetes.default.svc`.
+
+* On Windows, there are multiple DNS resolvers that can be used. As these come
+ with slightly different behaviors, using the `Resolve-DNSName` utility for
+ name query resolutions is recommended.
##### IPv6
-Kubernetes on Windows does not support single-stack "IPv6-only" networking. However,dual-stack IPv4/IPv6 networking for pods and nodes with single-family services is supported. See [IPv4/IPv6 dual-stack networking](#ipv4ipv6-dual-stack) for more details.
+Kubernetes on Windows does not support single-stack "IPv6-only" networking.
+However,dual-stack IPv4/IPv6 networking for pods and nodes with single-family
+services is supported.
+See [IPv4/IPv6 dual-stack networking](#ipv4ipv6-dual-stack) for more details.
##### Session affinity
-Setting the maximum session sticky time for Windows services using `service.spec.sessionAffinityConfig.clientIP.timeoutSeconds` is not supported.
+Setting the maximum session sticky time for Windows services using
+`service.spec.sessionAffinityConfig.clientIP.timeoutSeconds` is not supported.
##### Security
-Secrets are written in clear text on the node's volume (as compared to tmpfs/in-memory on linux). This means customers have to do two things
+Secrets are written in clear text on the node's volume (as compared to
+tmpfs/in-memory on linux). This means customers have to do two things:
1. Use file ACLs to secure the secrets file location
-2. Use volume-level encryption using [BitLocker](https://docs.microsoft.com/en-us/windows/security/information-protection/bitlocker/bitlocker-how-to-deploy-on-windows-server)
+1. Use volume-level encryption using
+ [BitLocker](https://docs.microsoft.com/en-us/windows/security/information-protection/bitlocker/bitlocker-how-to-deploy-on-windows-server)
-[RunAsUsername](/docs/tasks/configure-pod-container/configure-runasusername) can be specified for Windows Pod's or Container's to execute the Container processes as a node-default user. This is roughly equivalent to [RunAsUser](/docs/concepts/policy/pod-security-policy/#users-and-groups).
+[RunAsUsername](/docs/tasks/configure-pod-container/configure-runasusername)
+can be specified for Windows Pod's or Container's to execute the Container
+processes as a node-default user. This is roughly equivalent to
+[RunAsUser](/docs/concepts/policy/pod-security-policy/#users-and-groups).
-Linux specific pod security context privileges such as SELinux, AppArmor, Seccomp, Capabilities (POSIX Capabilities), and others are not supported.
+Linux specific pod security context privileges such as SELinux, AppArmor,
+Seccomp, Capabilities (POSIX Capabilities), and others are not supported.
-In addition, as mentioned already, privileged containers are not supported on Windows.
+In addition, as mentioned already, privileged containers are not supported on
+Windows.
#### API
-There are no differences in how most of the Kubernetes APIs work for Windows. The subtleties around what's different come down to differences in the OS and container runtime. In certain situations, some properties on workload APIs such as Pod or Container were designed with an assumption that they are implemented on Linux, failing to run on Windows.
+There are no differences in how most of the Kubernetes APIs work for Windows.
+The subtleties around what's different come down to differences in the OS and
+container runtime. In certain situations, some properties on workload APIs
+such as Pod or Container were designed with an assumption that they are
+implemented on Linux, failing to run on Windows.
At a high level, these OS concepts are different:
-* Identity - Linux uses userID (UID) and groupID (GID) which are represented as integer types. User and group names are not canonical - they are an alias in `/etc/groups` or `/etc/passwd` back to UID+GID. Windows uses a larger binary security identifier (SID) which is stored in the Windows Security Access Manager (SAM) database. This database is not shared between the host and containers, or between containers.
-* File permissions - Windows uses an access control list based on SIDs, rather than a bitmask of permissions and UID+GID
-* File paths - convention on Windows is to use `\` instead of `/`. The Go IO libraries accept both types of file path separators. However, when you're setting a path or command line that's interpreted inside a container, `\` may be needed.
-* Signals - Windows interactive apps handle termination differently, and can implement one or more of these:
- * A UI thread handles well-defined messages including WM_CLOSE
- * Console apps handle ctrl-c or ctrl-break using a Control Handler
- * Services register a Service Control Handler function that can accept SERVICE_CONTROL_STOP control codes
+* Identity - Linux uses userID (UID) and groupID (GID) which are represented
+ as integer types. User and group names are not canonical - they are an alias
+ in `/etc/groups` or `/etc/passwd` back to UID+GID. Windows uses a larger
+ binary security identifier (SID) which is stored in the Windows Security
+ Access Manager (SAM) database. This database is not shared between the host
+ and containers, or between containers.
-Exit Codes follow the same convention where 0 is success, nonzero is failure. The specific error codes may differ across Windows and Linux. However, exit codes passed from the Kubernetes components (kubelet, kube-proxy) are unchanged.
+* File permissions - Windows uses an access control list based on SIDs, rather
+ than a bitmask of permissions and UID+GID
+
+* File paths - convention on Windows is to use `\` instead of `/`. The Go IO
+ libraries accept both types of file path separators. However, when you're
+ setting a path or command line that's interpreted inside a container, `\` may
+ be needed.
+
+* Signals - Windows interactive apps handle termination differently, and can
+ implement one or more of these:
+
+ * A UI thread handles well-defined messages including `WM_CLOSE`
+
+ * Console apps handle ctrl-c or ctrl-break using a Control Handler
+
+ * Services register a Service Control Handler function that can accept
+ `SERVICE_CONTROL_STOP` control codes
+
+Exit Codes follow the same convention where 0 is success, nonzero is failure.
+The specific error codes may differ across Windows and Linux. However, exit
+codes passed from the Kubernetes components (kubelet, kube-proxy) are
+unchanged.
##### V1.Container
-* V1.Container.ResourceRequirements.limits.cpu and V1.Container.ResourceRequirements.limits.memory - Windows doesn't use hard limits for CPU allocations. Instead, a share system is used. The existing fields based on millicores are scaled into relative shares that are followed by the Windows scheduler. [see: kuberuntime/helpers_windows.go](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kuberuntime/helpers_windows.go), [see: resource controls in Microsoft docs](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/resource-controls)
- * Huge pages are not implemented in the Windows container runtime, and are not available. They require [asserting a user privilege](https://docs.microsoft.com/en-us/windows/desktop/Memory/large-page-support) that's not configurable for containers.
-* V1.Container.ResourceRequirements.requests.cpu and V1.Container.ResourceRequirements.requests.memory - Requests are subtracted from node available resources, so they can be used to avoid overprovisioning a node. However, they cannot be used to guarantee resources in an overprovisioned node. They should be applied to all containers as a best practice if the operator wants to avoid overprovisioning entirely.
-* V1.Container.SecurityContext.allowPrivilegeEscalation - not possible on Windows, none of the capabilities are hooked up
-* V1.Container.SecurityContext.Capabilities - POSIX capabilities are not implemented on Windows
-* V1.Container.SecurityContext.privileged - Windows doesn't support privileged containers
+* V1.Container.ResourceRequirements.limits.cpu and
+ V1.Container.ResourceRequirements.limits.memory - Windows doesn't use hard
+ limits for CPU allocations. Instead, a share system is used. The existing
+ fields based on millicores are scaled into relative shares that are followed
+ by the Windows scheduler.
+ See [kuberuntime/helpers_windows.go](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kuberuntime/helpers_windows.go),
+ and [resource controls in Microsoft docs](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/resource-controls)
+
+ * Huge pages are not implemented in the Windows container runtime, and are
+ not available. They require
+ [asserting a user privilege](https://docs.microsoft.com/en-us/windows/desktop/Memory/large-page-support)
+ that's not configurable for containers.
+
+* V1.Container.ResourceRequirements.requests.cpu and
+ V1.Container.ResourceRequirements.requests.memory - Requests are subtracted
+ from node available resources, so they can be used to avoid overprovisioning a
+ node. However, they cannot be used to guarantee resources in an
+ overprovisioned node. They should be applied to all containers as a best
+ practice if the operator wants to avoid overprovisioning entirely.
+
+* V1.Container.SecurityContext.allowPrivilegeEscalation - not possible on
+ Windows, none of the capabilities are hooked up
+
+* V1.Container.SecurityContext.Capabilities - POSIX capabilities are not
+ implemented on Windows
+
+* V1.Container.SecurityContext.privileged - Windows doesn't support privileged
+ containers
+
* V1.Container.SecurityContext.procMount - Windows doesn't have a /proc filesystem
-* V1.Container.SecurityContext.readOnlyRootFilesystem - not possible on Windows, write access is required for registry & system processes to run inside the container
+
+* V1.Container.SecurityContext.readOnlyRootFilesystem - not possible on
+ Windows, write access is required for registry & system processes to run
+ inside the container
+
* V1.Container.SecurityContext.runAsGroup - not possible on Windows, no GID support
-* V1.Container.SecurityContext.runAsNonRoot - Windows does not have a root user. The closest equivalent is ContainerAdministrator which is an identity that doesn't exist on the node.
-* V1.Container.SecurityContext.runAsUser - not possible on Windows, no UID support as int.
+
+* V1.Container.SecurityContext.runAsNonRoot - Windows does not have a root
+ user. The closest equivalent is ContainerAdministrator which is an identity
+ that doesn't exist on the node.
+
+* V1.Container.SecurityContext.runAsUser - not possible on Windows, no UID
+ support as int.
+
* V1.Container.SecurityContext.seLinuxOptions - not possible on Windows, no SELinux
-* V1.Container.terminationMessagePath - this has some limitations in that Windows doesn't support mapping single files. The default value is /dev/termination-log, which does work because it does not exist on Windows by default.
+
+* V1.Container.terminationMessagePath - this has some limitations in that
+ Windows doesn't support mapping single files. The default value is
+ `/dev/termination-log`, which does work because it does not exist on Windows by
+ default.
##### V1.Pod
* V1.Pod.hostIPC, v1.pod.hostpid - host namespace sharing is not possible on Windows
+
* V1.Pod.hostNetwork - There is no Windows OS support to share the host network
-* V1.Pod.dnsPolicy - ClusterFirstWithHostNet - is not supported because Host Networking is not supported on Windows.
+
+* V1.Pod.dnsPolicy - `ClusterFirstWithHostNet` is not supported because Host
+ Networking is not supported on Windows.
+
* V1.Pod.podSecurityContext - see V1.PodSecurityContext below
-* V1.Pod.shareProcessNamespace - this is a beta feature, and depends on Linux namespaces which are not implemented on Windows. Windows cannot share process namespaces or the container's root filesystem. Only the network can be shared.
-* V1.Pod.terminationGracePeriodSeconds - this is not fully implemented in Docker on Windows, see: [reference](https://github.com/moby/moby/issues/25982). The behavior today is that the ENTRYPOINT process is sent CTRL_SHUTDOWN_EVENT, then Windows waits 5 seconds by default, and finally shuts down all processes using the normal Windows shutdown behavior. The 5 second default is actually in the Windows registry [inside the container](https://github.com/moby/moby/issues/25982#issuecomment-426441183), so it can be overridden when the container is built.
-* V1.Pod.volumeDevices - this is a beta feature, and is not implemented on Windows. Windows cannot attach raw block devices to pods.
-* V1.Pod.volumes - EmptyDir, Secret, ConfigMap, HostPath - all work and have tests in TestGrid
- * V1.emptyDirVolumeSource - the Node default medium is disk on Windows. Memory is not supported, as Windows does not have a built-in RAM disk.
+
+* V1.Pod.shareProcessNamespace - this is a beta feature, and depends on Linux
+ namespaces which are not implemented on Windows. Windows cannot share
+ process namespaces or the container's root filesystem. Only the network can be
+ shared.
+
+* V1.Pod.terminationGracePeriodSeconds - this is not fully implemented in
+ Docker on Windows, see:
+ [reference](https://github.com/moby/moby/issues/25982). The behavior today is
+ that the `ENTRYPOINT` process is sent `CTRL_SHUTDOWN_EVENT`, then Windows waits 5
+ seconds by default, and finally shuts down all processes using the normal
+ Windows shutdown behavior. The 5 second default is actually in the Windows
+ registry [inside the container](https://github.com/moby/moby/issues/25982#issuecomment-426441183),
+ so it can be overridden when the container is built.
+
+* V1.Pod.volumeDevices - this is a beta feature, and is not implemented on
+ Windows. Windows cannot attach raw block devices to pods.
+
+* V1.Pod.volumes - EmptyDir, Secret, ConfigMap, HostPath - all work and have
+ tests in TestGrid
+
+ * V1.emptyDirVolumeSource - the Node default medium is disk on Windows.
+ Memory is not supported, as Windows does not have a built-in RAM disk.
+
* V1.VolumeMount.mountPropagation - mount propagation is not supported on Windows.
##### V1.PodSecurityContext
-None of the PodSecurityContext fields work on Windows. They're listed here for reference.
+None of the PodSecurityContext fields work on Windows. They're listed here for
+reference.
* V1.PodSecurityContext.SELinuxOptions - SELinux is not available on Windows
+
* V1.PodSecurityContext.RunAsUser - provides a UID, not available on Windows
+
* V1.PodSecurityContext.RunAsGroup - provides a GID, not available on Windows
-* V1.PodSecurityContext.RunAsNonRoot - Windows does not have a root user. The closest equivalent is ContainerAdministrator which is an identity that doesn't exist on the node.
+
+* V1.PodSecurityContext.RunAsNonRoot - Windows does not have a root user. The
+ closest equivalent is ContainerAdministrator which is an identity that
+ doesn't exist on the node.
+
* V1.PodSecurityContext.SupplementalGroups - provides GID, not available on Windows
-* V1.PodSecurityContext.Sysctls - these are part of the Linux sysctl interface. There's no equivalent on Windows.
+
+* V1.PodSecurityContext.Sysctls - these are part of the Linux sysctl
+ interface. There's no equivalent on Windows.
#### Operating System Version Restrictions
-Windows has strict compatibility rules, where the host OS version must match the container base image OS version. Only Windows containers with a container operating system of Windows Server 2019 are supported. Hyper-V isolation of containers, enabling some backward compatibility of Windows container image versions, is planned for a future release.
+Windows has strict compatibility rules, where the host OS version must match
+the container base image OS version. Only Windows containers with a container
+operating system of Windows Server 2019 are supported. Hyper-V isolation of
+containers, enabling some backward compatibility of Windows container image
+versions, is planned for a future release.
## Getting Help and Troubleshooting {#troubleshooting}
-Your main source of help for troubleshooting your Kubernetes cluster should start with this [section](/docs/tasks/debug-application-cluster/troubleshooting/). Some additional, Windows-specific troubleshooting help is included in this section. Logs are an important element of troubleshooting issues in Kubernetes. Make sure to include them any time you seek troubleshooting assistance from other contributors. Follow the instructions in the SIG-Windows [contributing guide on gathering logs](https://github.com/kubernetes/community/blob/master/sig-windows/CONTRIBUTING.md#gathering-logs).
+Your main source of help for troubleshooting your Kubernetes cluster should
+start with this
+[section](/docs/tasks/debug-application-cluster/troubleshooting/). Some
+additional, Windows-specific troubleshooting help is included in this section.
+Logs are an important element of troubleshooting issues in Kubernetes. Make
+sure to include them any time you seek troubleshooting assistance from other
+contributors. Follow the instructions in the SIG-Windows
+[contributing guide on gathering logs](https://github.com/kubernetes/community/blob/master/sig-windows/CONTRIBUTING.md#gathering-logs).
-1. How do I know start.ps1 completed successfully?
+* How do I know start.ps1 completed successfully?
- You should see kubelet, kube-proxy, and (if you chose Flannel as your networking solution) flanneld host-agent processes running on your node, with running logs being displayed in separate PowerShell windows. In addition to this, your Windows node should be listed as "Ready" in your Kubernetes cluster.
+ You should see kubelet, kube-proxy, and (if you chose Flannel as your
+ networking solution) flanneld host-agent processes running on your node, with
+ running logs being displayed in separate PowerShell windows. In addition to
+ this, your Windows node should be listed as "Ready" in your Kubernetes
+ cluster.
-1. Can I configure the Kubernetes node processes to run in the background as services?
+* Can I configure the Kubernetes node processes to run in the background as services?
- Kubelet and kube-proxy are already configured to run as native Windows Services, offering resiliency by re-starting the services automatically in the event of failure (for example a process crash). You have two options for configuring these node components as services.
+ Kubelet and kube-proxy are already configured to run as native Windows
+ Services, offering resiliency by re-starting the services automatically in the
+ event of failure (for example a process crash). You have two options for
+ configuring these node components as services.
- 1. As native Windows Services
+ * As native Windows Services
- Kubelet & kube-proxy can be run as native Windows Services using `sc.exe`.
-
- ```powershell
- # Create the services for kubelet and kube-proxy in two separate commands
- sc.exe create binPath= " --service "
-
- # Please note that if the arguments contain spaces, they must be escaped.
- sc.exe create kubelet binPath= "C:\kubelet.exe --service --hostname-override 'minion' "
-
- # Start the services
- Start-Service kubelet
- Start-Service kube-proxy
-
- # Stop the service
- Stop-Service kubelet (-Force)
- Stop-Service kube-proxy (-Force)
-
- # Query the service status
- Get-Service kubelet
- Get-Service kube-proxy
- ```
-
- 1. Using nssm.exe
-
- You can also always use alternative service managers like [nssm.exe](https://nssm.cc/) to run these processes (flanneld, kubelet & kube-proxy) in the background for you. You can use this [sample script](https://github.com/Microsoft/SDN/tree/master/Kubernetes/flannel/register-svc.ps1), leveraging nssm.exe to register kubelet, kube-proxy, and flanneld.exe to run as Windows services in the background.
-
- ```powershell
- register-svc.ps1 -NetworkMode -ManagementIP -ClusterCIDR -KubeDnsServiceIP -LogDir
-
- # NetworkMode = The network mode l2bridge (flannel host-gw, also the default value) or overlay (flannel vxlan) chosen as a network solution
- # ManagementIP = The IP address assigned to the Windows node. You can use ipconfig to find this
- # ClusterCIDR = The cluster subnet range. (Default value 10.244.0.0/16)
- # KubeDnsServiceIP = The Kubernetes DNS service IP (Default value 10.96.0.10)
- # LogDir = The directory where kubelet and kube-proxy logs are redirected into their respective output files (Default value C:\k)
- ```
-
- If the above referenced script is not suitable, you can manually configure nssm.exe using the following examples.
-
- ```powershell
- # Register flanneld.exe
- nssm install flanneld C:\flannel\flanneld.exe
- nssm set flanneld AppParameters --kubeconfig-file=c:\k\config --iface= --ip-masq=1 --kube-subnet-mgr=1
- nssm set flanneld AppEnvironmentExtra NODE_NAME=
- nssm set flanneld AppDirectory C:\flannel
- nssm start flanneld
-
- # Register kubelet.exe
- # Microsoft releases the pause infrastructure container at mcr.microsoft.com/oss/kubernetes/pause:1.4.1
- nssm install kubelet C:\k\kubelet.exe
- nssm set kubelet AppParameters --hostname-override= --v=6 --pod-infra-container-image=mcr.microsoft.com/oss/kubernetes/pause:1.4.1 --resolv-conf="" --allow-privileged=true --enable-debugging-handlers --cluster-dns= --cluster-domain=cluster.local --kubeconfig=c:\k\config --hairpin-mode=promiscuous-bridge --image-pull-progress-deadline=20m --cgroups-per-qos=false --log-dir= --logtostderr=false --enforce-node-allocatable="" --network-plugin=cni --cni-bin-dir=c:\k\cni --cni-conf-dir=c:\k\cni\config
- nssm set kubelet AppDirectory C:\k
- nssm start kubelet
-
- # Register kube-proxy.exe (l2bridge / host-gw)
- nssm install kube-proxy C:\k\kube-proxy.exe
- nssm set kube-proxy AppDirectory c:\k
- nssm set kube-proxy AppParameters --v=4 --proxy-mode=kernelspace --hostname-override=--kubeconfig=c:\k\config --enable-dsr=false --log-dir= --logtostderr=false
- nssm.exe set kube-proxy AppEnvironmentExtra KUBE_NETWORK=cbr0
- nssm set kube-proxy DependOnService kubelet
- nssm start kube-proxy
-
- # Register kube-proxy.exe (overlay / vxlan)
- nssm install kube-proxy C:\k\kube-proxy.exe
- nssm set kube-proxy AppDirectory c:\k
- nssm set kube-proxy AppParameters --v=4 --proxy-mode=kernelspace --feature-gates="WinOverlay=true" --hostname-override= --kubeconfig=c:\k\config --network-name=vxlan0 --source-vip= --enable-dsr=false --log-dir= --logtostderr=false
- nssm set kube-proxy DependOnService kubelet
- nssm start kube-proxy
- ```
-
- For initial troubleshooting, you can use the following flags in [nssm.exe](https://nssm.cc/) to redirect stdout and stderr to a output file:
-
- ```powershell
- nssm set AppStdout C:\k\mysvc.log
- nssm set AppStderr C:\k\mysvc.log
- ```
-
- For additional details, see official [nssm usage](https://nssm.cc/usage) docs.
-
-1. My Windows Pods do not have network connectivity
-
- If you are using virtual machines, ensure that MAC spoofing is enabled on all the VM network adapter(s).
-
-1. My Windows Pods cannot ping external resources
-
- Windows Pods do not have outbound rules programmed for the ICMP protocol today. However, TCP/UDP is supported. When trying to demonstrate connectivity to resources outside of the cluster, please substitute `ping ` with corresponding `curl ` commands.
-
- If you are still facing problems, most likely your network configuration in [cni.conf](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf) deserves some extra attention. You can always edit this static file. The configuration update will apply to any newly created Kubernetes resources.
-
- One of the Kubernetes networking requirements (see [Kubernetes model](/docs/concepts/cluster-administration/networking/)) is for cluster communication to occur without NAT internally. To honor this requirement, there is an [ExceptionList](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf#L20) for all the communication where we do not want outbound NAT to occur. However, this also means that you need to exclude the external IP you are trying to query from the ExceptionList. Only then will the traffic originating from your Windows pods be SNAT'ed correctly to receive a response from the outside world. In this regard, your ExceptionList in `cni.conf` should look as follows:
-
- ```conf
- "ExceptionList": [
- "10.244.0.0/16", # Cluster subnet
- "10.96.0.0/12", # Service subnet
- "10.127.130.0/24" # Management (host) subnet
- ]
- ```
-
-1. My Windows node cannot access NodePort service
-
- Local NodePort access from the node itself fails. This is a known limitation. NodePort access works from other nodes or external clients.
-
-1. vNICs and HNS endpoints of containers are being deleted
-
- This issue can be caused when the `hostname-override` parameter is not passed to [kube-proxy](/docs/reference/command-line-tools-reference/kube-proxy/). To resolve it, users need to pass the hostname to kube-proxy as follows:
+ Kubelet & kube-proxy can be run as native Windows Services using `sc.exe`.
```powershell
- C:\k\kube-proxy.exe --hostname-override=$(hostname)
+ # Create the services for kubelet and kube-proxy in two separate commands
+ sc.exe create binPath= " --service "
+
+ # Please note that if the arguments contain spaces, they must be escaped.
+ sc.exe create kubelet binPath= "C:\kubelet.exe --service --hostname-override 'minion' "
+
+ # Start the services
+ Start-Service kubelet
+ Start-Service kube-proxy
+
+ # Stop the service
+ Stop-Service kubelet (-Force)
+ Stop-Service kube-proxy (-Force)
+
+ # Query the service status
+ Get-Service kubelet
+ Get-Service kube-proxy
```
-1. With flannel my nodes are having issues after rejoining a cluster
+ * Using nssm.exe
- Whenever a previously deleted node is being re-joined to the cluster, flannelD tries to assign a new pod subnet to the node. Users should remove the old pod subnet configuration files in the following paths:
+ You can also always use alternative service managers like
+ [`nssm.exe`](https://nssm.cc/) to run these processes (flanneld, kubelet &
+ kube-proxy) in the background for you. You can use this
+ [sample script](https://github.com/Microsoft/SDN/tree/master/Kubernetes/flannel/register-svc.ps1),
+ leveraging `nssm.exe` to register kubelet, kube-proxy, and `flanneld.exe`
+ to run as Windows services in the background.
```powershell
- Remove-Item C:\k\SourceVip.json
- Remove-Item C:\k\SourceVipRequest.json
+ register-svc.ps1 -NetworkMode -ManagementIP -ClusterCIDR -KubeDnsServiceIP -LogDir
```
-1. After launching `start.ps1`, flanneld is stuck in "Waiting for the Network to be created"
+ The parameters are explained below:
- There are numerous reports of this [issue](https://github.com/coreos/flannel/issues/1066); most likely it is a timing issue for when the management IP of the flannel network is set. A workaround is to relaunch start.ps1 or relaunch it manually as follows:
+ - `NetworkMode`: The network mode l2bridge (flannel host-gw, also the
+ default value) or overlay (flannel vxlan) chosen as a network solution
+ - `ManagementIP`: The IP address assigned to the Windows node. You can use
+ `ipconfig` to find this.
+ - `ClusterCIDR`: The cluster subnet range. (Default: 10.244.0.0/16)
+ - `KubeDnsServiceIP`: The Kubernetes DNS service IP. (Default: 10.96.0.10)
+ - `LogDir`: The directory where kubelet and kube-proxy logs are redirected
+ into their respective output files. (Default value C:\k)
+
+ If the above referenced script is not suitable, you can manually configure
+ `nssm.exe` using the following examples.
+
+ Register flanneld.exe:
```powershell
- PS C:> [Environment]::SetEnvironmentVariable("NODE_NAME", "")
- PS C:> C:\flannel\flanneld.exe --kubeconfig-file=c:\k\config --iface= --ip-masq=1 --kube-subnet-mgr=1
+ nssm install flanneld C:\flannel\flanneld.exe
+ nssm set flanneld AppParameters --kubeconfig-file=c:\k\config --iface= --ip-masq=1 --kube-subnet-mgr=1
+ nssm set flanneld AppEnvironmentExtra NODE_NAME=
+ nssm set flanneld AppDirectory C:\flannel
+ nssm start flanneld
```
-1. My Windows Pods cannot launch because of missing `/run/flannel/subnet.env`
-
- This indicates that Flannel didn't launch correctly. You can either try to restart flanneld.exe or you can copy the files over manually from `/run/flannel/subnet.env` on the Kubernetes master to `C:\run\flannel\subnet.env` on the Windows worker node and modify the `FLANNEL_SUBNET` row to a different number. For example, if node subnet 10.244.4.1/24 is desired:
-
- ```env
- FLANNEL_NETWORK=10.244.0.0/16
- FLANNEL_SUBNET=10.244.4.1/24
- FLANNEL_MTU=1500
- FLANNEL_IPMASQ=true
- ```
-
-1. My Windows node cannot access my services using the service IP
-
- This is a known limitation of the current networking stack on Windows. Windows Pods are able to access the service IP however.
-
-1. No network adapter is found when starting kubelet
-
- The Windows networking stack needs a virtual adapter for Kubernetes networking to work. If the following commands return no results (in an admin shell), virtual network creation — a necessary prerequisite for Kubelet to work — has failed:
+ Register kubelet.exe:
```powershell
- Get-HnsNetwork | ? Name -ieq "cbr0"
- Get-NetAdapter | ? Name -Like "vEthernet (Ethernet*"
+ nssm install kubelet C:\k\kubelet.exe
+ nssm set kubelet AppParameters --hostname-override= --v=6 --pod-infra-container-image=k8s.gcr.io/pause:3.5 --resolv-conf="" --allow-privileged=true --enable-debugging-handlers --cluster-dns= --cluster-domain=cluster.local --kubeconfig=c:\k\config --hairpin-mode=promiscuous-bridge --image-pull-progress-deadline=20m --cgroups-per-qos=false --log-dir= --logtostderr=false --enforce-node-allocatable="" --network-plugin=cni --cni-bin-dir=c:\k\cni --cni-conf-dir=c:\k\cni\config
+ nssm set kubelet AppDirectory C:\k
+ nssm start kubelet
```
- Often it is worthwhile to modify the [InterfaceName](https://github.com/microsoft/SDN/blob/master/Kubernetes/flannel/start.ps1#L7) parameter of the start.ps1 script, in cases where the host's network adapter isn't "Ethernet". Otherwise, consult the output of the `start-kubelet.ps1` script to see if there are errors during virtual network creation.
+ Register kube-proxy.exe (l2bridge / host-gw):
-1. My Pods are stuck at "Container Creating" or restarting over and over
-
- Check that your pause image is compatible with your OS version. The [instructions](https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/deploying-resources) assume that both the OS and the containers are version 1803. If you have a later version of Windows, such as an Insider build, you need to adjust the images accordingly. Please refer to the Microsoft's [Docker repository](https://hub.docker.com/u/microsoft/) for images. Regardless, both the pause image Dockerfile and the sample service expect the image to be tagged as :latest.
-
-1. DNS resolution is not properly working
-
- Check the DNS limitations for Windows in this [section](#dns-limitations).
-
-1. `kubectl port-forward` fails with "unable to do port forwarding: wincat not found"
-
- This was implemented in Kubernetes 1.15 by including wincat.exe in the pause infrastructure container `mcr.microsoft.com/oss/kubernetes/pause:1.4.1`. Be sure to use these versions or newer ones.
- If you would like to build your own pause infrastructure container be sure to include [wincat](https://github.com/kubernetes-sigs/sig-windows-tools/tree/master/cmd/wincat).
-
-1. My Kubernetes installation is failing because my Windows Server node is behind a proxy
-
- If you are behind a proxy, the following PowerShell environment variables must be defined:
-
- ```PowerShell
- [Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://proxy.example.com:80/", [EnvironmentVariableTarget]::Machine)
- [Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://proxy.example.com:443/", [EnvironmentVariableTarget]::Machine)
+ ```powershell
+ nssm install kube-proxy C:\k\kube-proxy.exe
+ nssm set kube-proxy AppDirectory c:\k
+ nssm set kube-proxy AppParameters --v=4 --proxy-mode=kernelspace --hostname-override=--kubeconfig=c:\k\config --enable-dsr=false --log-dir= --logtostderr=false
+ nssm.exe set kube-proxy AppEnvironmentExtra KUBE_NETWORK=cbr0
+ nssm set kube-proxy DependOnService kubelet
+ nssm start kube-proxy
```
-1. What is a `pause` container?
+ Register kube-proxy.exe (overlay / vxlan):
- In a Kubernetes Pod, an infrastructure or "pause" container is first created to host the container endpoint. Containers that belong to the same pod, including infrastructure and worker containers, share a common network namespace and endpoint (same IP and port space). Pause containers are needed to accommodate worker containers crashing or restarting without losing any of the networking configuration.
+ ```powershell
+ nssm install kube-proxy C:\k\kube-proxy.exe
+ nssm set kube-proxy AppDirectory c:\k
+ nssm set kube-proxy AppParameters --v=4 --proxy-mode=kernelspace --feature-gates="WinOverlay=true" --hostname-override= --kubeconfig=c:\k\config --network-name=vxlan0 --source-vip= --enable-dsr=false --log-dir= --logtostderr=false
+ nssm set kube-proxy DependOnService kubelet
+ nssm start kube-proxy
+ ```
- The "pause" (infrastructure) image is hosted on Microsoft Container Registry (MCR). You can access it using `mcr.microsoft.com/oss/kubernetes/pause:1.4.1`. For more details, see the [DOCKERFILE](https://github.com/kubernetes-sigs/windows-testing/blob/master/images/pause/Dockerfile).
+ For initial troubleshooting, you can use the following flags in
+ [`nssm.exe`](https://nssm.cc/) to redirect stdout and stderr to a output file:
+
+ ```powershell
+ nssm set AppStdout C:\k\mysvc.log
+ nssm set AppStderr C:\k\mysvc.log
+ ```
+
+ For additional details, see official [nssm usage](https://nssm.cc/usage) docs.
+
+* My Windows Pods do not have network connectivity
+
+ If you are using virtual machines, ensure that MAC spoofing is enabled on
+ all the VM network adapter(s).
+
+* My Windows Pods cannot ping external resources
+
+ Windows Pods do not have outbound rules programmed for the ICMP protocol
+ today. However, TCP/UDP is supported. When trying to demonstrate connectivity
+ to resources outside of the cluster, please substitute `ping ` with
+ corresponding `curl ` commands.
+
+ If you are still facing problems, most likely your network configuration in
+ [cni.conf](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf)
+ deserves some extra attention. You can always edit this static file. The
+ configuration update will apply to any newly created Kubernetes resources.
+
+ One of the Kubernetes networking requirements (see
+ [Kubernetes network model](/docs/concepts/cluster-administration/networking/))
+ is for cluster communication to occur without NAT internally. To honor this
+ requirement, there is an
+ [ExceptionList](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/l2bridge/cni/config/cni.conf#L20)
+ for all the communication where we do not want outbound NAT to occur. However,
+ this also means that you need to exclude the external IP you are trying to
+ query from the ExceptionList. Only then will the traffic originating from your
+ Windows pods be SNAT'ed correctly to receive a response from the outside
+ world. In this regard, your ExceptionList in `cni.conf` should look as
+ follows:
+
+ ```conf
+ "ExceptionList": [
+ "10.244.0.0/16", # Cluster subnet
+ "10.96.0.0/12", # Service subnet
+ "10.127.130.0/24" # Management (host) subnet
+ ]
+ ```
+
+* My Windows node cannot access NodePort service
+
+ Local NodePort access from the node itself fails. This is a known
+ limitation. NodePort access works from other nodes or external clients.
+
+* vNICs and HNS endpoints of containers are being deleted
+
+ This issue can be caused when the `hostname-override` parameter is not
+ passed to
+ [kube-proxy](/docs/reference/command-line-tools-reference/kube-proxy/).
+ To resolve it, users need to pass the hostname to kube-proxy as follows:
+
+ ```powershell
+ C:\k\kube-proxy.exe --hostname-override=$(hostname)
+ ```
+
+* With flannel my nodes are having issues after rejoining a cluster
+
+ Whenever a previously deleted node is being re-joined to the cluster,
+ flannelD tries to assign a new pod subnet to the node. Users should remove the
+ old pod subnet configuration files in the following paths:
+
+ ```powershell
+ Remove-Item C:\k\SourceVip.json
+ Remove-Item C:\k\SourceVipRequest.json
+ ```
+
+* After launching `start.ps1`, flanneld is stuck in "Waiting for the Network
+ to be created"
+
+ There are numerous reports of this
+ [issue](https://github.com/coreos/flannel/issues/1066); most likely it is a
+ timing issue for when the management IP of the flannel network is set. A
+ workaround is to relaunch start.ps1 or relaunch it manually as follows:
+
+ ```powershell
+ PS C:> [Environment]::SetEnvironmentVariable("NODE_NAME", "")
+ PS C:> C:\flannel\flanneld.exe --kubeconfig-file=c:\k\config --iface= --ip-masq=1 --kube-subnet-mgr=1
+ ```
+
+* My Windows Pods cannot launch because of missing `/run/flannel/subnet.env`
+
+ This indicates that Flannel didn't launch correctly. You can either try to
+ restart flanneld.exe or you can copy the files over manually from
+ `/run/flannel/subnet.env` on the Kubernetes master to
+ `C:\run\flannel\subnet.env` on the Windows worker node and modify the
+ `FLANNEL_SUBNET` row to a different number. For example, if node subnet
+ 10.244.4.1/24 is desired:
+
+ ```none
+ FLANNEL_NETWORK=10.244.0.0/16
+ FLANNEL_SUBNET=10.244.4.1/24
+ FLANNEL_MTU=1500
+ FLANNEL_IPMASQ=true
+ ```
+
+* My Windows node cannot access my services using the service IP
+
+ This is a known limitation of the current networking stack on Windows.
+ Windows Pods are able to access the service IP however.
+
+* No network adapter is found when starting kubelet
+
+ The Windows networking stack needs a virtual adapter for Kubernetes
+ networking to work. If the following commands return no results (in an admin
+ shell), virtual network creation — a necessary prerequisite for Kubelet to
+ work — has failed:
+
+ ```powershell
+ Get-HnsNetwork | ? Name -ieq "cbr0"
+ Get-NetAdapter | ? Name -Like "vEthernet (Ethernet*"
+ ```
+
+ Often it is worthwhile to modify the
+ [InterfaceName](https://github.com/microsoft/SDN/blob/master/Kubernetes/flannel/start.ps1#L7)
+ parameter of the start.ps1 script, in cases where the host's network adapter
+ isn't "Ethernet". Otherwise, consult the output of the `start-kubelet.ps1`
+ script to see if there are errors during virtual network creation.
+
+* My Pods are stuck at "Container Creating" or restarting over and over
+
+ Check that your pause image is compatible with your OS version. The
+ [instructions](https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/deploying-resources)
+ assume that both the OS and the containers are version 1803. If you have a
+ later version of Windows, such as an Insider build, you need to adjust the
+ images accordingly. Please refer to the Microsoft's
+ [Docker repository](https://hub.docker.com/u/microsoft/) for images.
+ Regardless, both the pause image Dockerfile and the sample service expect
+ the image to be tagged as :latest.
+
+* DNS resolution is not properly working
+
+ Check the [DNS limitations for Windows](#dns-limitations).
+
+* `kubectl port-forward` fails with "unable to do port forwarding: wincat not found"
+
+ Port forwarding support for Windows requires wincat.exe to be available in the
+ [pause infrastructure container](#pause-image).
+ Ensure you are using a supported image that is compatable with your Windows OS version.
+ If you would like to build your own pause infrastructure container be sure to include
+ [wincat](https://github.com/kubernetes/kubernetes/tree/master/build/pause/windows/wincat).
+
+* My Kubernetes installation is failing because my Windows Server node is
+ behind a proxy
+
+ If you are behind a proxy, the following PowerShell environment variables
+ must be defined:
+
+ ```PowerShell
+ [Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://proxy.example.com:80/", [EnvironmentVariableTarget]::Machine)
+ [Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://proxy.example.com:443/", [EnvironmentVariableTarget]::Machine)
+ ```
+
+* What is a `pause` container?
+
+ In a Kubernetes Pod, an infrastructure or "pause" container is first created
+ to host the container endpoint. Containers that belong to the same pod,
+ including infrastructure and worker containers, share a common network
+ namespace and endpoint (same IP and port space). Pause containers are needed
+ to accommodate worker containers crashing or restarting without losing any of
+ the networking configuration.
+
+ Refer to the [pause image](#pause-image) section to find the recommended version
+ of the pause image.
### Further investigation
-If these steps don't resolve your problem, you can get help running Windows containers on Windows nodes in Kubernetes through:
+If these steps don't resolve your problem, you can get help running Windows
+containers on Windows nodes in Kubernetes through:
* StackOverflow [Windows Server Container](https://stackoverflow.com/questions/tagged/windows-server-container) topic
+
* Kubernetes Official Forum [discuss.kubernetes.io](https://discuss.kubernetes.io/)
+
* Kubernetes Slack [#SIG-Windows Channel](https://kubernetes.slack.com/messages/sig-windows)
## Reporting Issues and Feature Requests
-If you have what looks like a bug, or you would like to make a feature request, please use the [GitHub issue tracking system](https://github.com/kubernetes/kubernetes/issues). You can open issues on [GitHub](https://github.com/kubernetes/kubernetes/issues/new/choose) and assign them to SIG-Windows. You should first search the list of issues in case it was reported previously and comment with your experience on the issue and add additional logs. SIG-Windows Slack is also a great avenue to get some initial support and troubleshooting ideas prior to creating a ticket.
+If you have what looks like a bug, or you would like to make a feature
+request, please use the
+[GitHub issue tracking system](https://github.com/kubernetes/kubernetes/issues).
+You can open issues on
+[GitHub](https://github.com/kubernetes/kubernetes/issues/new/choose) and
+assign them to SIG-Windows. You should first search the list of issues in case
+it was reported previously and comment with your experience on the issue and
+add additional logs. SIG-Windows Slack is also a great avenue to get some
+initial support and troubleshooting ideas prior to creating a ticket.
-If filing a bug, please include detailed information about how to reproduce the problem, such as:
+If filing a bug, please include detailed information about how to reproduce
+the problem, such as:
* Kubernetes version: kubectl version
-* Environment details: Cloud provider, OS distro, networking choice and configuration, and Docker version
+* Environment details: Cloud provider, OS distro, networking choice and
+ configuration, and Docker version
* Detailed steps to reproduce the problem
* [Relevant logs](https://github.com/kubernetes/community/blob/master/sig-windows/CONTRIBUTING.md#gathering-logs)
-* Tag the issue sig/windows by commenting on the issue with `/sig windows` to bring it to a SIG-Windows member's attention
+* Tag the issue sig/windows by commenting on the issue with `/sig windows` to
+ bring it to a SIG-Windows member's attention
## {{% heading "whatsnext" %}}
-We have a lot of features in our roadmap. An abbreviated high level list is included below, but we encourage you to view our [roadmap project](https://github.com/orgs/kubernetes/projects/8) and help us make Windows support better by [contributing](https://github.com/kubernetes/community/blob/master/sig-windows/).
+We have a lot of features in our roadmap. An abbreviated high level list is
+included below, but we encourage you to view our
+[roadmap project](https://github.com/orgs/kubernetes/projects/8) and help us make
+Windows support better by
+[contributing](https://github.com/kubernetes/community/blob/master/sig-windows/).
### Hyper-V isolation
-Hyper-V isolation is required to enable the following use cases for Windows containers in Kubernetes:
+Hyper-V isolation is required to enable the following use cases for Windows
+containers in Kubernetes:
* Hypervisor-based isolation between pods for additional security
-* Backwards compatibility allowing a node to run a newer Windows Server version without requiring containers to be rebuilt
+
+* Backwards compatibility allowing a node to run a newer Windows Server
+ version without requiring containers to be rebuilt
+
* Specific CPU/NUMA settings for a pod
+
* Memory isolation and reservations
-Hyper-V isolation support will be added in a later release and will require CRI-Containerd.
+Hyper-V isolation support will be added in a later release and will require
+CRI-Containerd.
### Deployment with kubeadm and cluster API
Kubeadm is becoming the de facto standard for users to deploy a Kubernetes
cluster. Windows node support in kubeadm is currently a work-in-progress but a
-guide is available [here](/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes/).
-We are also making investments in cluster API to ensure Windows nodes are
-properly provisioned.
+guide is available
+[here](/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes/). We are
+also making investments in cluster API to ensure Windows nodes are properly
+provisioned.
diff --git a/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md b/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md
index ce7aee8a89..ec47f5637a 100644
--- a/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md
+++ b/content/en/docs/setup/production-environment/windows/user-guide-windows-containers.md
@@ -11,7 +11,8 @@ weight: 75
-Windows applications constitute a large portion of the services and applications that run in many organizations. This guide walks you through the steps to configure and deploy a Windows container in Kubernetes.
+Windows applications constitute a large portion of the services and applications that run in many organizations.
+This guide walks you through the steps to configure and deploy a Windows container in Kubernetes.
@@ -24,12 +25,18 @@ Windows applications constitute a large portion of the services and applications
## Before you begin
-* Create a Kubernetes cluster that includes a [master and a worker node running Windows Server](/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes)
-* It is important to note that creating and deploying services and workloads on Kubernetes behaves in much the same way for Linux and Windows containers. [Kubectl commands](/docs/reference/kubectl/overview/) to interface with the cluster are identical. The example in the section below is provided to jumpstart your experience with Windows containers.
+* Create a Kubernetes cluster that includes a
+control plane and a [worker node running Windows Server](/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes/)
+* It is important to note that creating and deploying services and workloads on Kubernetes
+behaves in much the same way for Linux and Windows containers.
+[Kubectl commands](/docs/reference/kubectl/overview/) to interface with the cluster are identical.
+The example in the section below is provided to jumpstart your experience with Windows containers.
## Getting Started: Deploying a Windows container
-To deploy a Windows container on Kubernetes, you must first create an example application. The example YAML file below creates a simple webserver application. Create a service spec named `win-webserver.yaml` with the contents below:
+To deploy a Windows container on Kubernetes, you must first create an example application.
+The example YAML file below creates a simple webserver application.
+Create a service spec named `win-webserver.yaml` with the contents below:
```yaml
apiVersion: v1
@@ -76,7 +83,8 @@ spec:
```
{{< note >}}
-Port mapping is also supported, but for simplicity in this example the container port 80 is exposed directly to the service.
+Port mapping is also supported, but for simplicity in this example
+the container port 80 is exposed directly to the service.
{{< /note >}}
1. Check that all nodes are healthy:
@@ -97,52 +105,86 @@ Port mapping is also supported, but for simplicity in this example the container
1. Check that the deployment succeeded. To verify:
* Two containers per pod on the Windows node, use `docker ps`
- * Two pods listed from the Linux master, use `kubectl get pods`
- * Node-to-pod communication across the network, `curl` port 80 of your pod IPs from the Linux master to check for a web server response
- * Pod-to-pod communication, ping between pods (and across hosts, if you have more than one Windows node) using docker exec or kubectl exec
- * Service-to-pod communication, `curl` the virtual service IP (seen under `kubectl get services`) from the Linux master and from individual pods
+ * Two pods listed from the Linux control plane node, use `kubectl get pods`
+ * Node-to-pod communication across the network, `curl` port 80 of your pod IPs from the Linux control plane node
+ to check for a web server response
+ * Pod-to-pod communication, ping between pods (and across hosts, if you have more than one Windows node)
+ using docker exec or kubectl exec
+ * Service-to-pod communication, `curl` the virtual service IP (seen under `kubectl get services`)
+ from the Linux control plane node and from individual pods
* Service discovery, `curl` the service name with the Kubernetes [default DNS suffix](/docs/concepts/services-networking/dns-pod-service/#services)
- * Inbound connectivity, `curl` the NodePort from the Linux master or machines outside of the cluster
+ * Inbound connectivity, `curl` the NodePort from the Linux control plane node or machines outside of the cluster
* Outbound connectivity, `curl` external IPs from inside the pod using kubectl exec
{{< note >}}
-Windows container hosts are not able to access the IP of services scheduled on them due to current platform limitations of the Windows networking stack. Only Windows pods are able to access service IPs.
+Windows container hosts are not able to access the IP of services scheduled on them due to current platform limitations of the Windows networking stack.
+Only Windows pods are able to access service IPs.
{{< /note >}}
## Observability
### Capturing logs from workloads
-Logs are an important element of observability; they enable users to gain insights into the operational aspect of workloads and are a key ingredient to troubleshooting issues. Because Windows containers and workloads inside Windows containers behave differently from Linux containers, users had a hard time collecting logs, limiting operational visibility. Windows workloads for example are usually configured to log to ETW (Event Tracing for Windows) or push entries to the application event log. [LogMonitor](https://github.com/microsoft/windows-container-tools/tree/master/LogMonitor), an open source tool by Microsoft, is the recommended way to monitor configured log sources inside a Windows container. LogMonitor supports monitoring event logs, ETW providers, and custom application logs, piping them to STDOUT for consumption by `kubectl logs `.
+Logs are an important element of observability; they enable users to gain insights
+into the operational aspect of workloads and are a key ingredient to troubleshooting issues.
+Because Windows containers and workloads inside Windows containers behave differently from Linux containers,
+users had a hard time collecting logs, limiting operational visibility.
+Windows workloads for example are usually configured to log to ETW (Event Tracing for Windows)
+or push entries to the application event log.
+[LogMonitor](https://github.com/microsoft/windows-container-tools/tree/master/LogMonitor), an open source tool by Microsoft,
+is the recommended way to monitor configured log sources inside a Windows container.
+LogMonitor supports monitoring event logs, ETW providers, and custom application logs,
+piping them to STDOUT for consumption by `kubectl logs `.
-Follow the instructions in the LogMonitor GitHub page to copy its binaries and configuration files to all your containers and add the necessary entrypoints for LogMonitor to push your logs to STDOUT.
+Follow the instructions in the LogMonitor GitHub page to copy its binaries and configuration files
+to all your containers and add the necessary entrypoints for LogMonitor to push your logs to STDOUT.
## Using configurable Container usernames
-Starting with Kubernetes v1.16, Windows containers can be configured to run their entrypoints and processes with different usernames than the image defaults. The way this is achieved is a bit different from the way it is done for Linux containers. Learn more about it [here](/docs/tasks/configure-pod-container/configure-runasusername/).
+Starting with Kubernetes v1.16, Windows containers can be configured to run their entrypoints and processes
+with different usernames than the image defaults.
+The way this is achieved is a bit different from the way it is done for Linux containers.
+Learn more about it [here](/docs/tasks/configure-pod-container/configure-runasusername/).
## Managing Workload Identity with Group Managed Service Accounts
-Starting with Kubernetes v1.14, Windows container workloads can be configured to use Group Managed Service Accounts (GMSA). Group Managed Service Accounts are a specific type of Active Directory account that provides automatic password management, simplified service principal name (SPN) management, and the ability to delegate the management to other administrators across multiple servers. Containers configured with a GMSA can access external Active Directory Domain resources while carrying the identity configured with the GMSA. Learn more about configuring and using GMSA for Windows containers [here](/docs/tasks/configure-pod-container/configure-gmsa/).
+Starting with Kubernetes v1.14, Windows container workloads can be configured to use Group Managed Service Accounts (GMSA).
+Group Managed Service Accounts are a specific type of Active Directory account that provides automatic password management,
+simplified service principal name (SPN) management, and the ability to delegate the management to other administrators across multiple servers.
+Containers configured with a GMSA can access external Active Directory Domain resources while carrying the identity configured with the GMSA.
+Learn more about configuring and using GMSA for Windows containers [here](/docs/tasks/configure-pod-container/configure-gmsa/).
## Taints and Tolerations
-Users today need to use some combination of taints and node selectors in order to keep Linux and Windows workloads on their respective OS-specific nodes. This likely imposes a burden only on Windows users. The recommended approach is outlined below, with one of its main goals being that this approach should not break compatibility for existing Linux workloads.
+Users today need to use some combination of taints and node selectors in order to
+keep Linux and Windows workloads on their respective OS-specific nodes.
+This likely imposes a burden only on Windows users. The recommended approach is outlined below,
+with one of its main goals being that this approach should not break compatibility for existing Linux workloads.
### Ensuring OS-specific workloads land on the appropriate container host
-Users can ensure Windows containers can be scheduled on the appropriate host using Taints and Tolerations. All Kubernetes nodes today have the following default labels:
+Users can ensure Windows containers can be scheduled on the appropriate host using Taints and Tolerations.
+All Kubernetes nodes today have the following default labels:
* kubernetes.io/os = [windows|linux]
* kubernetes.io/arch = [amd64|arm64|...]
-If a Pod specification does not specify a nodeSelector like `"kubernetes.io/os": windows`, it is possible the Pod can be scheduled on any host, Windows or Linux. This can be problematic since a Windows container can only run on Windows and a Linux container can only run on Linux. The best practice is to use a nodeSelector.
+If a Pod specification does not specify a nodeSelector like `"kubernetes.io/os": windows`,
+it is possible the Pod can be scheduled on any host, Windows or Linux.
+This can be problematic since a Windows container can only run on Windows and a Linux container can only run on Linux.
+The best practice is to use a nodeSelector.
-However, we understand that in many cases users have a pre-existing large number of deployments for Linux containers, as well as an ecosystem of off-the-shelf configurations, such as community Helm charts, and programmatic Pod generation cases, such as with Operators. In those situations, you may be hesitant to make the configuration change to add nodeSelectors. The alternative is to use Taints. Because the kubelet can set Taints during registration, it could easily be modified to automatically add a taint when running on Windows only.
+However, we understand that in many cases users have a pre-existing large number of deployments for Linux containers,
+as well as an ecosystem of off-the-shelf configurations, such as community Helm charts, and programmatic Pod generation cases, such as with Operators.
+In those situations, you may be hesitant to make the configuration change to add nodeSelectors.
+The alternative is to use Taints. Because the kubelet can set Taints during registration,
+it could easily be modified to automatically add a taint when running on Windows only.
For example: `--register-with-taints='os=windows:NoSchedule'`
-By adding a taint to all Windows nodes, nothing will be scheduled on them (that includes existing Linux Pods). In order for a Windows Pod to be scheduled on a Windows node, it would need both the nodeSelector to choose Windows, and the appropriate matching toleration.
+By adding a taint to all Windows nodes, nothing will be scheduled on them (that includes existing Linux Pods).
+In order for a Windows Pod to be scheduled on a Windows node,
+it would need both the nodeSelector and the appropriate matching toleration to choose Windows.
```yaml
nodeSelector:
@@ -160,9 +202,11 @@ tolerations:
The Windows Server version used by each pod must match that of the node. If you want to use multiple Windows
Server versions in the same cluster, then you should set additional node labels and nodeSelectors.
-Kubernetes 1.17 automatically adds a new label `node.kubernetes.io/windows-build` to simplify this. If you're running an older version, then it's recommended to add this label manually to Windows nodes.
+Kubernetes 1.17 automatically adds a new label `node.kubernetes.io/windows-build` to simplify this.
+If you're running an older version, then it's recommended to add this label manually to Windows nodes.
-This label reflects the Windows major, minor, and build number that need to match for compatibility. Here are values used today for each Windows Server version.
+This label reflects the Windows major, minor, and build number that need to match for compatibility.
+Here are values used today for each Windows Server version.
| Product Name | Build Number(s) |
|--------------------------------------|------------------------|
@@ -173,10 +217,12 @@ This label reflects the Windows major, minor, and build number that need to matc
### Simplifying with RuntimeClass
-[RuntimeClass] can be used to simplify the process of using taints and tolerations. A cluster administrator can create a `RuntimeClass` object which is used to encapsulate these taints and tolerations.
+[RuntimeClass] can be used to simplify the process of using taints and tolerations.
+A cluster administrator can create a `RuntimeClass` object which is used to encapsulate these taints and tolerations.
-1. Save this file to `runtimeClasses.yml`. It includes the appropriate `nodeSelector` for the Windows OS, architecture, and version.
+1. Save this file to `runtimeClasses.yml`. It includes the appropriate `nodeSelector`
+for the Windows OS, architecture, and version.
```yaml
apiVersion: node.k8s.io/v1
diff --git a/content/en/docs/setup/release/_index.md b/content/en/docs/setup/release/_index.md
deleted file mode 100755
index e6d5944331..0000000000
--- a/content/en/docs/setup/release/_index.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-title: "Release notes and version skew"
-weight: 10
----
diff --git a/content/en/docs/setup/release/notes.md b/content/en/docs/setup/release/notes.md
deleted file mode 100644
index 54146007a0..0000000000
--- a/content/en/docs/setup/release/notes.md
+++ /dev/null
@@ -1,2141 +0,0 @@
----
-title: v1.20 Release Notes
-weight: 10
-card:
- name: release-notes
- weight: 20
- anchors:
- - anchor: "#"
- title: Current Release Notes
- - anchor: "#urgent-upgrade-notes"
- title: Urgent Upgrade Notes
----
-
-
-
-# v1.20.0
-
-[Documentation](https://docs.k8s.io)
-
-## Downloads for v1.20.0
-
-filename | sha512 hash
--------- | -----------
-[kubernetes.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes.tar.gz) | `ebfe49552bbda02807034488967b3b62bf9e3e507d56245e298c4c19090387136572c1fca789e772a5e8a19535531d01dcedb61980e42ca7b0461d3864df2c14`
-[kubernetes-src.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-src.tar.gz) | `bcbd67ed0bb77840828c08c6118ad0c9bf2bcda16763afaafd8731fd6ce735be654feef61e554bcc34c77c65b02a25dae565adc5e1dc49a2daaa0d115bf1efe6`
-
-### Client Binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-client-darwin-amd64.tar.gz) | `3609f6483f4244676162232b3294d7a2dc40ae5bdd86a842a05aa768f5223b8f50e1d6420fd8afb2d0ce19de06e1d38e5e5b10154ba0cb71a74233e6dc94d5a0`
-[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-client-linux-386.tar.gz) | `e06c08016a08137d39804383fdc33a40bb2567aa77d88a5c3fd5b9d93f5b581c635b2c4faaa718ed3bb2d120cb14fe91649ed4469ba72c3a3dda1e343db545ed`
-[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-client-linux-amd64.tar.gz) | `081472833601aa4fa78e79239f67833aa4efcb4efe714426cd01d4ddf6f36fbf304ef7e1f5373bff0fdff44a845f7560165c093c108bd359b5ab4189f36b1f2f`
-[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-client-linux-arm.tar.gz) | `037f84a2f29fe62d266cab38ac5600d058cce12cbc4851bcf062fafba796c1fbe23a0c2939cd15784854ca7cd92383e5b96a11474fc71fb614b47dbf98a477d9`
-[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-client-linux-arm64.tar.gz) | `275727e1796791ca3cbe52aaa713a2660404eab6209466fdc1cfa8559c9b361fe55c64c6bcecbdeba536b6d56213ddf726e58adc60f959b6f77e4017834c5622`
-[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-client-linux-ppc64le.tar.gz) | `7a9965293029e9fcdb2b7387467f022d2026953b8461e6c84182abf35c28b7822d2389a6d8e4d8e532d2ea5d5d67c6fee5fb6c351363cb44c599dc8800649b04`
-[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-client-linux-s390x.tar.gz) | `85fc449ce1980f5f030cc32e8c8e2198c1cc91a448e04b15d27debc3ca56aa85d283f44b4f4e5fed26ac96904cc12808fa3e9af3d8bf823fc928befb9950d6f5`
-[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-client-windows-386.tar.gz) | `4c0a27dba1077aaee943e0eb7a787239dd697e1d968e78d1933c1e60b02d5d233d58541d5beec59807a4ffe3351d5152359e11da120bf64cacb3ee29fbc242e6`
-[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-client-windows-amd64.tar.gz) | `29336faf7c596539b8329afbbdceeddc843162501de4afee44a40616278fa1f284d8fc48c241fc7d52c65dab70f76280cc33cec419c8c5dbc2625d9175534af8`
-
-### Server Binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-server-linux-amd64.tar.gz) | `fb56486a55dbf7dbacb53b1aaa690bae18d33d244c72a1e2dc95fb0fcce45108c44ba79f8fa04f12383801c46813dc33d2d0eb2203035cdce1078871595e446e`
-[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-server-linux-arm.tar.gz) | `735ed9993071fe35b292bf06930ee3c0f889e3c7edb983195b1c8e4d7113047c12c0f8281fe71879fc2fcd871e1ee587f03b695a03c8512c873abad444997a19`
-[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-server-linux-arm64.tar.gz) | `ffab155531d5a9b82487ee1abf4f6ef49626ea58b2de340656a762e46cf3e0f470bdbe7821210901fe1114224957c44c1d9cc1e32efb5ee24e51fe63990785b2`
-[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-server-linux-ppc64le.tar.gz) | `9d5730d35c4ddfb4c5483173629fe55df35d1e535d96f02459468220ac2c97dc01b995f577432a6e4d1548b6edbfdc90828dc9c1f7cf7464481af6ae10aaf118`
-[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-server-linux-s390x.tar.gz) | `6e4c165306940e8b99dd6e590f8542e31aed23d2c7a6808af0357fa425cec1a57016dd66169cf2a95f8eb8ef70e1f29e2d500533aae889e2e3d9290d04ab8721`
-
-### Node Binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-node-linux-amd64.tar.gz) | `3e6c90561dd1c27fa1dff6953c503251c36001f7e0f8eff3ec918c74ae2d9aa25917d8ac87d5b4224b8229f620b1830442e6dce3b2a497043f8497eee3705696`
-[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-node-linux-arm.tar.gz) | `26db385d9ae9a97a1051a638e7e3de22c4bbff389d5a419fe40d5893f9e4fa85c8b60a2bd1d370fd381b60c3ca33c5d72d4767c90898caa9dbd4df6bd116a247`
-[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-node-linux-arm64.tar.gz) | `5b8b63f617e248432b7eb913285a8ef8ba028255216332c05db949666c3f9e9cb9f4c393bbd68d00369bda77abf9bfa2da254a5c9fe0d79ffdad855a77a9d8ed`
-[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-node-linux-ppc64le.tar.gz) | `60da7715996b4865e390640525d6e98593ba3cd45c6caeea763aa5355a7f989926da54f58cc5f657f614c8134f97cd3894b899f8b467d100dca48bc22dd4ff63`
-[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-node-linux-s390x.tar.gz) | `9407dc55412bd04633f84fcefe3a1074f3eaa772a7cb9302242b8768d6189b75d37677a959f91130e8ad9dc590f9ba8408ba6700a0ceff6827315226dd5ee1e6`
-[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0/kubernetes-node-windows-amd64.tar.gz) | `9d4261af343cc330e6359582f80dbd6efb57d41f882747a94bbf47b4f93292d43dd19a86214d4944d268941622dfbc96847585e6fec15fddc4dbd93d17015fa8`
-
-## Changelog since v1.19.0
-
-## What's New (Major Themes)
-
-### Dockershim deprecation
-
-Docker as an underlying runtime is being deprecated. Docker-produced images will continue to work in your cluster with all runtimes, as they always have.
-The Kubernetes community [has written a blog post about this in detail](https://blog.k8s.io/2020/12/02/dont-panic-kubernetes-and-docker/) with [a dedicated FAQ page for it](https://blog.k8s.io/2020/12/02/dockershim-faq/).
-
-### External credential provider for client-go
-
-The client-go credential plugins can now be passed in the current cluster information via the `KUBERNETES_EXEC_INFO` environment variable. Learn more about this on [client-go credential plugins documentation](https://docs.k8s.io/reference/access-authn-authz/authentication/#client-go-credential-plugins/).
-
-### CronJob controller v2 is available through feature gate
-
-An alternative implementation of `CronJob` controller is now available as an alpha feature in this release, which has experimental performance improvement by using informers instead of polling. While this will be the default behavior in the future, you can [try them in this release through a feature gate](https://docs.k8s.io/concepts/workloads/controllers/cron-jobs/).
-
-### PID Limits graduates to General Availability
-
-PID Limits features are now generally available on both `SupportNodePidsLimit` (node-to-pod PID isolation) and `SupportPodPidsLimit` (ability to limit PIDs per pod), after being enabled-by-default in beta stage for a year.
-
-### API Priority and Fairness graduates to Beta
-
-Initially introduced in 1.18, Kubernetes 1.20 now enables API Priority and Fairness (APF) by default. This allows `kube-apiserver` to [categorize incoming requests by priority levels](https://docs.k8s.io/concepts/cluster-administration/flow-control/).
-
-### IPv4/IPv6 run
-
-IPv4/IPv6 dual-stack has been reimplemented for 1.20 to support dual-stack Services, based on user and community feedback. If your cluster has dual-stack enabled, you can create Services which can use IPv4, IPv6, or both, and you can change this setting for existing Services. Details are available in updated [IPv4/IPv6 dual-stack docs](https://docs.k8s.io/concepts/services-networking/dual-stack/), which cover the nuanced array of options.
-
-We expect this implementation to progress from alpha to beta and GA in coming releases, so we’re eager to have you comment about your dual-stack experiences in [#k8s-dual-stack](https://kubernetes.slack.com/messages/k8s-dual-stack) or in [enhancements #563](https://features.k8s.io/563).
-
-### go1.15.5
-
-go1.15.5 has been integrated to Kubernetes project as of this release, [including other infrastructure related updates on this effort](https://github.com/kubernetes/kubernetes/pull/95776).
-
-### CSI Volume Snapshot graduates to General Availability
-
-CSI Volume Snapshot moves to GA in the 1.20 release. This feature provides a standard way to trigger volume snapshot operations in Kubernetes and allows Kubernetes users to incorporate snapshot operations in a portable manner on any Kubernetes environment regardless of supporting underlying storage providers.
-Additionally, these Kubernetes snapshot primitives act as basic building blocks that unlock the ability to develop advanced, enterprise grade, storage administration features for Kubernetes: including application or cluster level backup solutions.
-Note that snapshot support will require Kubernetes distributors to bundle the Snapshot controller, Snapshot CRDs, and validation webhook. In addition, a CSI driver supporting the snapshot functionality must also be deployed on the cluster.
-
-### Non-recursive Volume Ownership (FSGroup) graduates to Beta
-
-By default, the `fsgroup` setting, if specified, recursively updates permissions for every file in a volume on every mount. This can make mount, and pod startup, very slow if the volume has many files.
-This setting enables a pod to specify a `PodFSGroupChangePolicy` that indicates that volume ownership and permissions will be changed only when permission and ownership of the root directory does not match with expected permissions on the volume.
-
-### CSIDriver policy for FSGroup graduates to Beta
-
-The FSGroup's CSIDriver Policy is now beta in 1.20. This allows CSIDrivers to explicitly indicate if they want Kubernetes to manage permissions and ownership for their volumes via `fsgroup`.
-
-### Security Improvements for CSI Drivers (Alpha)
-
-In 1.20, we introduce a new alpha feature `CSIServiceAccountToken`. This feature allows CSI drivers to impersonate the pods that they mount the volumes for. This improves the security posture in the mounting process where the volumes are ACL’ed on the pods’ service account without handing out unnecessary permissions to the CSI drivers’ service account. This feature is especially important for secret-handling CSI drivers, such as the secrets-store-csi-driver. Since these tokens can be rotated and short-lived, this feature also provides a knob for CSI drivers to receive `NodePublishVolume` RPC calls periodically with the new token. This knob is also useful when volumes are short-lived, e.g. certificates.
-
-### Introducing Graceful Node Shutdown (Alpha)
-
-The `GracefulNodeShutdown` feature is now in Alpha. This allows kubelet to be aware of node system shutdowns, enabling graceful termination of pods during a system shutdown. This feature can be [enabled through feature gate](https://docs.k8s.io/concepts/architecture/nodes/#graceful-node-shutdown).
-
-### Runtime log sanitation
-
-Logs can now be configured to use runtime protection from leaking sensitive data. [Details for this experimental feature is available in documentation](https://docs.k8s.io/concepts/cluster-administration/system-logs/#log-sanitization).
-
-### Pod resource metrics
-
-On-demand metrics calculation is now available through `/metrics/resources`. [When enabled](
-https://docs.k8s.io/concepts/cluster-administration/system-metrics#kube-scheduler-metrics), the endpoint will report the requested resources and the desired limits of all running pods.
-
-### Introducing `RootCAConfigMap`
-
-`RootCAConfigMap` graduates to Beta, seperating from `BoundServiceAccountTokenVolume`. The `kube-root-ca.crt` ConfigMap is now available to every namespace, by default. It contains the Certificate Authority bundle for verify kube-apiserver connections.
-
-### `kubectl debug` graduates to Beta
-
-`kubectl alpha debug` graduates from alpha to beta in 1.20, becoming `kubectl debug`.
-`kubectl debug` provides support for common debugging workflows directly from kubectl. Troubleshooting scenarios supported in this release of `kubectl` include:
-Troubleshoot workloads that crash on startup by creating a copy of the pod that uses a different container image or command.
-Troubleshoot distroless containers by adding a new container with debugging tools, either in a new copy of the pod or using an ephemeral container. (Ephemeral containers are an alpha feature that are not enabled by default.)
-Troubleshoot on a node by creating a container running in the host namespaces and with access to the host’s filesystem.
-Note that as a new builtin command, `kubectl debug` takes priority over any `kubectl` plugin named “debug”. You will need to rename the affected plugin.
-Invocations using `kubectl alpha debug` are now deprecated and will be removed in a subsequent release. Update your scripts to use `kubectl debug` instead of `kubectl alpha debug`!
-For more information about kubectl debug, see Debugging Running Pods on the Kubernetes website, kubectl help debug, or reach out to SIG CLI by visiting #sig-cli or commenting on [enhancement #1441](https://features.k8s.io/1441).
-
-### Removing deprecated flags in kubeadm
-
-`kubeadm` applies a number of deprecations and removals of deprecated features in this release. More details are available in the Urgent Upgrade Notes and Kind / Deprecation sections.
-
-### Pod Hostname as FQDN graduates to Beta
-
-Previously introduced in 1.19 behind a feature gate, `SetHostnameAsFQDN` is now enabled by default. More details on this behavior is available in [documentation for DNS for Services and Pods](https://docs.k8s.io/concepts/services-networking/dns-pod-service/#pod-sethostnameasfqdn-field)
-
-### `TokenRequest` / `TokenRequestProjection` graduates to General Availability
-
-Service account tokens bound to pod is now a stable feature. The feature gates will be removed in 1.21 release. For more information, refer to notes below on the changelogs.
-
-### RuntimeClass feature graduates to General Availability.
-
-The `node.k8s.io` API groups are promoted from `v1beta1` to `v1`. `v1beta1` is now deprecated and will be removed in a future release, please start using `v1`. ([#95718](https://github.com/kubernetes/kubernetes/pull/95718), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [SIG Apps, Auth, Node, Scheduling and Testing]
-
-### Cloud Controller Manager now exclusively shipped by Cloud Provider
-
-Kubernetes will no longer ship an instance of the Cloud Controller Manager binary. Each Cloud Provider is expected to ship their own instance of this binary. Details for a Cloud Provider to create an instance of such a binary can be found under [here](https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/cloud-provider/sample). Anyone with questions on building a Cloud Controller Manager should reach out to SIG Cloud Provider. Questions about the Cloud Controller Manager on a Managed Kubernetes solution should go to the relevant Cloud Provider. Questions about the Cloud Controller Manager on a non managed solution can be brought up with SIG Cloud Provider.
-
-## Known Issues
-
-### Summary API in kubelet doesn't have accelerator metrics
-Currently, cadvisor_stats_provider provides AcceleratorStats but cri_stats_provider does not. As a result, when using cri_stats_provider, kubelet's Summary API does not have accelerator metrics. [There is an open work in progress to fix this](https://github.com/kubernetes/kubernetes/pull/96873).
-
-## Urgent Upgrade Notes
-
-### (No, really, you MUST read this before you upgrade)
-
-- A bug was fixed in kubelet where exec probe timeouts were not respected. This may result in unexpected behavior since the default timeout (if not specified) is `1s` which may be too small for some exec probes. Ensure that pods relying on this behavior are updated to correctly handle probe timeouts. See [configure probe](https://docs.k8s.io/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes) section of the documentation for more details.
-
- - This change in behavior may be unexpected for some clusters and can be disabled by turning off the `ExecProbeTimeout` feature gate. This gate will be locked and removed in future releases so that exec probe timeouts are always respected. ([#94115](https://github.com/kubernetes/kubernetes/pull/94115), [@andrewsykim](https://github.com/andrewsykim)) [SIG Node and Testing]
-- RuntimeClass feature graduates to General Availability. Promote `node.k8s.io` API groups from `v1beta1` to `v1`. `v1beta1` is now deprecated and will be removed in a future release, please start using `v1`. ([#95718](https://github.com/kubernetes/kubernetes/pull/95718), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [SIG Apps, Auth, Node, Scheduling and Testing]
-- API priority and fairness graduated to beta. 1.19 servers with APF turned on should not be run in a multi-server cluster with 1.20+ servers. ([#96527](https://github.com/kubernetes/kubernetes/pull/96527), [@adtac](https://github.com/adtac)) [SIG API Machinery and Testing]
-- For CSI drivers, kubelet no longer creates the target_path for NodePublishVolume in accordance with the CSI spec. Kubelet also no longer checks if staging and target paths are mounts or corrupted. CSI drivers need to be idempotent and do any necessary mount verification. ([#88759](https://github.com/kubernetes/kubernetes/pull/88759), [@andyzhangx](https://github.com/andyzhangx)) [SIG Storage]
-- Kubeadm: http://git.k8s.io/enhancements/keps/sig-cluster-lifecycle/kubeadm/2067-rename-master-label-taint/README.md ([#95382](https://github.com/kubernetes/kubernetes/pull/95382), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
- - The label applied to control-plane nodes "node-role.kubernetes.io/master" is now deprecated and will be removed in a future release after a GA deprecation period.
- - Introduce a new label "node-role.kubernetes.io/control-plane" that will be applied in parallel to "node-role.kubernetes.io/master" until the removal of the "node-role.kubernetes.io/master" label.
- - Make "kubeadm upgrade apply" add the "node-role.kubernetes.io/control-plane" label on existing nodes that only have the "node-role.kubernetes.io/master" label during upgrade.
- - Please adapt your tooling built on top of kubeadm to use the "node-role.kubernetes.io/control-plane" label.
- - The taint applied to control-plane nodes "node-role.kubernetes.io/master:NoSchedule" is now deprecated and will be removed in a future release after a GA deprecation period.
- - Apply toleration for a new, future taint "node-role.kubernetes.io/control-plane:NoSchedule" to the kubeadm CoreDNS / kube-dns managed manifests. Note that this taint is not yet applied to kubeadm control-plane nodes.
- - Please adapt your workloads to tolerate the same future taint preemptively.
-
-- Kubeadm: improve the validation of serviceSubnet and podSubnet.
- ServiceSubnet has to be limited in size, due to implementation details, and the mask can not allocate more than 20 bits.
- PodSubnet validates against the corresponding cluster "--node-cidr-mask-size" of the kube-controller-manager, it fail if the values are not compatible.
- kubeadm no longer sets the node-mask automatically on IPv6 deployments, you must check that your IPv6 service subnet mask is compatible with the default node mask /64 or set it accordenly.
- Previously, for IPv6, if the podSubnet had a mask lower than /112, kubeadm calculated a node-mask to be multiple of eight and splitting the available bits to maximise the number used for nodes. ([#95723](https://github.com/kubernetes/kubernetes/pull/95723), [@aojea](https://github.com/aojea)) [SIG Cluster Lifecycle]
-- The deprecated flag --experimental-kustomize is now removed from kubeadm commands. Use --experimental-patches instead, which was introduced in 1.19. Migration information available in --help description for --experimental-patches. ([#94871](https://github.com/kubernetes/kubernetes/pull/94871), [@neolit123](https://github.com/neolit123))
-- Windows hyper-v container featuregate is deprecated in 1.20 and will be removed in 1.21 ([#95505](https://github.com/kubernetes/kubernetes/pull/95505), [@wawa0210](https://github.com/wawa0210)) [SIG Node and Windows]
-- The kube-apiserver ability to serve on an insecure port, deprecated since v1.10, has been removed. The insecure address flags `--address` and `--insecure-bind-address` have no effect in kube-apiserver and will be removed in v1.24. The insecure port flags `--port` and `--insecure-port` may only be set to 0 and will be removed in v1.24. ([#95856](https://github.com/kubernetes/kubernetes/pull/95856), [@knight42](https://github.com/knight42), [SIG API Machinery, Node, Testing])
-- Add dual-stack Services (alpha). This is a BREAKING CHANGE to an alpha API.
- It changes the dual-stack API wrt Service from a single ipFamily field to 3
- fields: ipFamilyPolicy (SingleStack, PreferDualStack, RequireDualStack),
- ipFamilies (a list of families assigned), and clusterIPs (inclusive of
- clusterIP). Most users do not need to set anything at all, defaulting will
- handle it for them. Services are single-stack unless the user asks for
- dual-stack. This is all gated by the "IPv6DualStack" feature gate. ([#91824](https://github.com/kubernetes/kubernetes/pull/91824), [@khenidak](https://github.com/khenidak)) [SIG API Machinery, Apps, CLI, Network, Node, Scheduling and Testing]
-- `TokenRequest` and `TokenRequestProjection` are now GA features. The following flags are required by the API server:
- - `--service-account-issuer`, should be set to a URL identifying the API server that will be stable over the cluster lifetime.
- - `--service-account-key-file`, set to one or more files containing one or more public keys used to verify tokens.
- - `--service-account-signing-key-file`, set to a file containing a private key to use to sign service account tokens. Can be the same file given to `kube-controller-manager` with `--service-account-private-key-file`. ([#95896](https://github.com/kubernetes/kubernetes/pull/95896), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Auth, Cluster Lifecycle]
-- kubeadm: make the command "kubeadm alpha kubeconfig user" accept a "--config" flag and remove the following flags:
- - apiserver-advertise-address / apiserver-bind-port: use either localAPIEndpoint from InitConfiguration or controlPlaneEndpoint from ClusterConfiguration.
- - cluster-name: use clusterName from ClusterConfiguration
- - cert-dir: use certificatesDir from ClusterConfiguration ([#94879](https://github.com/kubernetes/kubernetes/pull/94879), [@knight42](https://github.com/knight42)) [SIG Cluster Lifecycle]
-- Resolves non-deterministic behavior of the garbage collection controller when ownerReferences with incorrect data are encountered. Events with a reason of `OwnerRefInvalidNamespace` are recorded when namespace mismatches between child and owner objects are detected. The [kubectl-check-ownerreferences](https://github.com/kubernetes-sigs/kubectl-check-ownerreferences) tool can be run prior to upgrading to locate existing objects with invalid ownerReferences.
- - A namespaced object with an ownerReference referencing a uid of a namespaced kind which does not exist in the same namespace is now consistently treated as though that owner does not exist, and the child object is deleted.
- - A cluster-scoped object with an ownerReference referencing a uid of a namespaced kind is now consistently treated as though that owner is not resolvable, and the child object is ignored by the garbage collector. ([#92743](https://github.com/kubernetes/kubernetes/pull/92743), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, Apps and Testing]
-
-
-## Changes by Kind
-
-### Deprecation
-
-- Docker support in the kubelet is now deprecated and will be removed in a future release. The kubelet uses a module called "dockershim" which implements CRI support for Docker and it has seen maintenance issues in the Kubernetes community. We encourage you to evaluate moving to a container runtime that is a full-fledged implementation of CRI (v1alpha1 or v1 compliant) as they become available. ([#94624](https://github.com/kubernetes/kubernetes/pull/94624), [@dims](https://github.com/dims)) [SIG Node]
-- Kubeadm: deprecate self-hosting support. The experimental command "kubeadm alpha self-hosting" is now deprecated and will be removed in a future release. ([#95125](https://github.com/kubernetes/kubernetes/pull/95125), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: graduate the "kubeadm alpha certs" command to a parent command "kubeadm certs". The command "kubeadm alpha certs" is deprecated and will be removed in a future release. Please migrate. ([#94938](https://github.com/kubernetes/kubernetes/pull/94938), [@yagonobre](https://github.com/yagonobre)) [SIG Cluster Lifecycle]
-- Kubeadm: remove the deprecated "kubeadm alpha kubelet config enable-dynamic" command. To continue using the feature please defer to the guide for "Dynamic Kubelet Configuration" at k8s.io. This change also removes the parent command "kubeadm alpha kubelet" as there are no more sub-commands under it for the time being. ([#94668](https://github.com/kubernetes/kubernetes/pull/94668), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: remove the deprecated --kubelet-config flag for the command "kubeadm upgrade node" ([#94869](https://github.com/kubernetes/kubernetes/pull/94869), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubectl: deprecate --delete-local-data ([#95076](https://github.com/kubernetes/kubernetes/pull/95076), [@dougsland](https://github.com/dougsland)) [SIG CLI, Cloud Provider and Scalability]
-- Kubelet's deprecated endpoint `metrics/resource/v1alpha1` has been removed, please adopt `metrics/resource`. ([#94272](https://github.com/kubernetes/kubernetes/pull/94272), [@RainbowMango](https://github.com/RainbowMango)) [SIG Instrumentation and Node]
-- Removes deprecated scheduler metrics DeprecatedSchedulingDuration, DeprecatedSchedulingAlgorithmPredicateEvaluationSecondsDuration, DeprecatedSchedulingAlgorithmPriorityEvaluationSecondsDuration ([#94884](https://github.com/kubernetes/kubernetes/pull/94884), [@arghya88](https://github.com/arghya88)) [SIG Instrumentation and Scheduling]
-- Scheduler alpha metrics binding_duration_seconds and scheduling_algorithm_preemption_evaluation_seconds are deprecated, Both of those metrics are now covered as part of framework_extension_point_duration_seconds, the former as a PostFilter the latter and a Bind plugin. The plan is to remove both in 1.21 ([#95001](https://github.com/kubernetes/kubernetes/pull/95001), [@arghya88](https://github.com/arghya88)) [SIG Instrumentation and Scheduling]
-- Support 'controlplane' as a valid EgressSelection type in the EgressSelectorConfiguration API. 'Master' is deprecated and will be removed in v1.22. ([#95235](https://github.com/kubernetes/kubernetes/pull/95235), [@andrewsykim](https://github.com/andrewsykim)) [SIG API Machinery]
-- The v1alpha1 PodPreset API and admission plugin has been removed with no built-in replacement. Admission webhooks can be used to modify pods on creation. ([#94090](https://github.com/kubernetes/kubernetes/pull/94090), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Apps, CLI, Cloud Provider, Scalability and Testing]
-
-
-### API Change
-
-- `TokenRequest` and `TokenRequestProjection` features have been promoted to GA. This feature allows generating service account tokens that are not visible in Secret objects and are tied to the lifetime of a Pod object. See https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#service-account-token-volume-projection for details on configuring and using this feature. The `TokenRequest` and `TokenRequestProjection` feature gates will be removed in v1.21.
- - kubeadm's kube-apiserver Pod manifest now includes the following flags by default "--service-account-key-file", "--service-account-signing-key-file", "--service-account-issuer". ([#93258](https://github.com/kubernetes/kubernetes/pull/93258), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Auth, Cluster Lifecycle, Storage and Testing]
-- A new `nofuzz` go build tag now disables gofuzz support. Release binaries enable this. ([#92491](https://github.com/kubernetes/kubernetes/pull/92491), [@BenTheElder](https://github.com/BenTheElder)) [SIG API Machinery]
-- Add WindowsContainerResources and Annotations to CRI-API UpdateContainerResourcesRequest ([#95741](https://github.com/kubernetes/kubernetes/pull/95741), [@katiewasnothere](https://github.com/katiewasnothere)) [SIG Node]
-- Add a `serving` and `terminating` condition to the EndpointSlice API.
- `serving` tracks the readiness of endpoints regardless of their terminating state. This is distinct from `ready` since `ready` is only true when pods are not terminating.
- `terminating` is true when an endpoint is terminating. For pods this is any endpoint with a deletion timestamp. ([#92968](https://github.com/kubernetes/kubernetes/pull/92968), [@andrewsykim](https://github.com/andrewsykim)) [SIG Apps and Network]
-- Add dual-stack Services (alpha). This is a BREAKING CHANGE to an alpha API.
- It changes the dual-stack API wrt Service from a single ipFamily field to 3
- fields: ipFamilyPolicy (SingleStack, PreferDualStack, RequireDualStack),
- ipFamilies (a list of families assigned), and clusterIPs (inclusive of
- clusterIP). Most users do not need to set anything at all, defaulting will
- handle it for them. Services are single-stack unless the user asks for
- dual-stack. This is all gated by the "IPv6DualStack" feature gate. ([#91824](https://github.com/kubernetes/kubernetes/pull/91824), [@khenidak](https://github.com/khenidak)) [SIG API Machinery, Apps, CLI, Network, Node, Scheduling and Testing]
-- Add support for hugepages to downward API ([#86102](https://github.com/kubernetes/kubernetes/pull/86102), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG API Machinery, Apps, CLI, Network, Node, Scheduling and Testing]
-- Adds kubelet alpha feature, `GracefulNodeShutdown` which makes kubelet aware of node system shutdowns and result in graceful termination of pods during a system shutdown. ([#96129](https://github.com/kubernetes/kubernetes/pull/96129), [@bobbypage](https://github.com/bobbypage)) [SIG Node]
-- AppProtocol is now GA for Endpoints and Services. The ServiceAppProtocol feature gate will be deprecated in 1.21. ([#96327](https://github.com/kubernetes/kubernetes/pull/96327), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
-- Automatic allocation of NodePorts for services with type LoadBalancer can now be disabled by setting the (new) parameter
- Service.spec.allocateLoadBalancerNodePorts=false. The default is to allocate NodePorts for services with type LoadBalancer which is the existing behavior. ([#92744](https://github.com/kubernetes/kubernetes/pull/92744), [@uablrek](https://github.com/uablrek)) [SIG Apps and Network]
-- Certain fields on Service objects will be automatically cleared when changing the service's `type` to a mode that does not need those fields. For example, changing from type=LoadBalancer to type=ClusterIP will clear the NodePort assignments, rather than forcing the user to clear them. ([#95196](https://github.com/kubernetes/kubernetes/pull/95196), [@thockin](https://github.com/thockin)) [SIG API Machinery, Apps, Network and Testing]
-- Document that ServiceTopology feature is required to use `service.spec.topologyKeys`. ([#96528](https://github.com/kubernetes/kubernetes/pull/96528), [@andrewsykim](https://github.com/andrewsykim)) [SIG Apps]
-- EndpointSlice has a new NodeName field guarded by the EndpointSliceNodeName feature gate.
- - EndpointSlice topology field will be deprecated in an upcoming release.
- - EndpointSlice "IP" address type is formally removed after being deprecated in Kubernetes 1.17.
- - The discovery.k8s.io/v1alpha1 API is deprecated and will be removed in Kubernetes 1.21. ([#96440](https://github.com/kubernetes/kubernetes/pull/96440), [@robscott](https://github.com/robscott)) [SIG API Machinery, Apps and Network]
-- External facing API podresources is now available under k8s.io/kubelet/pkg/apis/ ([#92632](https://github.com/kubernetes/kubernetes/pull/92632), [@RenaudWasTaken](https://github.com/RenaudWasTaken)) [SIG Node and Testing]
-- Fewer candidates are enumerated for preemption to improve performance in large clusters. ([#94814](https://github.com/kubernetes/kubernetes/pull/94814), [@adtac](https://github.com/adtac))
-- Fix conversions for custom metrics. ([#94481](https://github.com/kubernetes/kubernetes/pull/94481), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery and Instrumentation]
-- GPU metrics provided by kubelet are now disabled by default. ([#95184](https://github.com/kubernetes/kubernetes/pull/95184), [@RenaudWasTaken](https://github.com/RenaudWasTaken))
-- If BoundServiceAccountTokenVolume is enabled, cluster admins can use metric `serviceaccount_stale_tokens_total` to monitor workloads that are depending on the extended tokens. If there are no such workloads, turn off extended tokens by starting `kube-apiserver` with flag `--service-account-extend-token-expiration=false` ([#96273](https://github.com/kubernetes/kubernetes/pull/96273), [@zshihang](https://github.com/zshihang)) [SIG API Machinery and Auth]
-- Introduce alpha support for exec-based container registry credential provider plugins in the kubelet. ([#94196](https://github.com/kubernetes/kubernetes/pull/94196), [@andrewsykim](https://github.com/andrewsykim)) [SIG Node and Release]
-- Introduces a metric source for HPAs which allows scaling based on container resource usage. ([#90691](https://github.com/kubernetes/kubernetes/pull/90691), [@arjunrn](https://github.com/arjunrn)) [SIG API Machinery, Apps, Autoscaling and CLI]
-- Kube-apiserver now deletes expired kube-apiserver Lease objects:
- - The feature is under feature gate `APIServerIdentity`.
- - A flag is added to kube-apiserver: `identity-lease-garbage-collection-check-period-seconds` ([#95895](https://github.com/kubernetes/kubernetes/pull/95895), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery, Apps, Auth and Testing]
-- Kube-controller-manager: volume plugins can be restricted from contacting local and loopback addresses by setting `--volume-host-allow-local-loopback=false`, or from contacting specific CIDR ranges by setting `--volume-host-cidr-denylist` (for example, `--volume-host-cidr-denylist=127.0.0.1/28,feed::/16`) ([#91785](https://github.com/kubernetes/kubernetes/pull/91785), [@mattcary](https://github.com/mattcary)) [SIG API Machinery, Apps, Auth, CLI, Network, Node, Storage and Testing]
-- Migrate scheduler, controller-manager and cloud-controller-manager to use LeaseLock ([#94603](https://github.com/kubernetes/kubernetes/pull/94603), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery, Apps, Cloud Provider and Scheduling]
-- Modify DNS-1123 error messages to indicate that RFC 1123 is not followed exactly ([#94182](https://github.com/kubernetes/kubernetes/pull/94182), [@mattfenwick](https://github.com/mattfenwick)) [SIG API Machinery, Apps, Auth, Network and Node]
-- Move configurable fsgroup change policy for pods to beta ([#96376](https://github.com/kubernetes/kubernetes/pull/96376), [@gnufied](https://github.com/gnufied)) [SIG Apps and Storage]
-- New flag is introduced, i.e. --topology-manager-scope=container|pod.
- The default value is the "container" scope. ([#92967](https://github.com/kubernetes/kubernetes/pull/92967), [@cezaryzukowski](https://github.com/cezaryzukowski)) [SIG Instrumentation, Node and Testing]
-- New parameter `defaultingType` for `PodTopologySpread` plugin allows to use k8s defined or user provided default constraints ([#95048](https://github.com/kubernetes/kubernetes/pull/95048), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling]
-- NodeAffinity plugin can be configured with AddedAffinity. ([#96202](https://github.com/kubernetes/kubernetes/pull/96202), [@alculquicondor](https://github.com/alculquicondor)) [SIG Node, Scheduling and Testing]
-- Promote RuntimeClass feature to GA.
- Promote node.k8s.io API groups from v1beta1 to v1. ([#95718](https://github.com/kubernetes/kubernetes/pull/95718), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [SIG Apps, Auth, Node, Scheduling and Testing]
-- Reminder: The labels "failure-domain.beta.kubernetes.io/zone" and "failure-domain.beta.kubernetes.io/region" are deprecated in favor of "topology.kubernetes.io/zone" and "topology.kubernetes.io/region" respectively. All users of the "failure-domain.beta..." labels should switch to the "topology..." equivalents. ([#96033](https://github.com/kubernetes/kubernetes/pull/96033), [@thockin](https://github.com/thockin)) [SIG API Machinery, Apps, CLI, Cloud Provider, Network, Node, Scheduling, Storage and Testing]
-- Server Side Apply now treats LabelSelector fields as atomic (meaning the entire selector is managed by a single writer and updated together), since they contain interrelated and inseparable fields that do not merge in intuitive ways. ([#93901](https://github.com/kubernetes/kubernetes/pull/93901), [@jpbetz](https://github.com/jpbetz)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Storage and Testing]
-- Services will now have a `clusterIPs` field to go with `clusterIP`. `clusterIPs[0]` is a synonym for `clusterIP` and will be syncronized on create and update operations. ([#95894](https://github.com/kubernetes/kubernetes/pull/95894), [@thockin](https://github.com/thockin)) [SIG Network]
-- The ServiceAccountIssuerDiscovery feature gate is now Beta and enabled by default. ([#91921](https://github.com/kubernetes/kubernetes/pull/91921), [@mtaufen](https://github.com/mtaufen)) [SIG Auth]
-- The status of v1beta1 CRDs without "preserveUnknownFields:false" now shows a violation, "spec.preserveUnknownFields: Invalid value: true: must be false". ([#93078](https://github.com/kubernetes/kubernetes/pull/93078), [@vareti](https://github.com/vareti))
-- The usage of mixed protocol values in the same LoadBalancer Service is possible if the new feature gate MixedProtocolLBService is enabled. The feature gate is disabled by default. The user has to enable it for the API Server. ([#94028](https://github.com/kubernetes/kubernetes/pull/94028), [@janosi](https://github.com/janosi)) [SIG API Machinery and Apps]
-- This PR will introduce a feature gate CSIServiceAccountToken with two additional fields in `CSIDriverSpec`. ([#93130](https://github.com/kubernetes/kubernetes/pull/93130), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Apps, Auth, CLI, Network, Node, Storage and Testing]
-- Users can try the cronjob controller v2 using the feature gate. This will be the default controller in future releases. ([#93370](https://github.com/kubernetes/kubernetes/pull/93370), [@alaypatel07](https://github.com/alaypatel07)) [SIG API Machinery, Apps, Auth and Testing]
-- VolumeSnapshotDataSource moves to GA in 1.20 release ([#95282](https://github.com/kubernetes/kubernetes/pull/95282), [@xing-yang](https://github.com/xing-yang)) [SIG Apps]
-- WinOverlay feature graduated to beta ([#94807](https://github.com/kubernetes/kubernetes/pull/94807), [@ksubrmnn](https://github.com/ksubrmnn)) [SIG Windows]
-
-### Feature
-
-- **Additional documentation e.g., KEPs (Kubernetes Enhancement Proposals), usage docs, etc.**:
-- A new metric `apiserver_request_filter_duration_seconds` has been introduced that
- measures request filter latency in seconds. ([#95207](https://github.com/kubernetes/kubernetes/pull/95207), [@tkashem](https://github.com/tkashem)) [SIG API Machinery and Instrumentation]
-- A new set of alpha metrics are reported by the Kubernetes scheduler under the `/metrics/resources` endpoint that allow administrators to easily see the resource consumption (requests and limits for all resources on the pods) and compare it to actual pod usage or node capacity. ([#94866](https://github.com/kubernetes/kubernetes/pull/94866), [@smarterclayton](https://github.com/smarterclayton)) [SIG API Machinery, Instrumentation, Node and Scheduling]
-- Add --experimental-logging-sanitization flag enabling runtime protection from leaking sensitive data in logs ([#96370](https://github.com/kubernetes/kubernetes/pull/96370), [@serathius](https://github.com/serathius)) [SIG API Machinery, Cluster Lifecycle and Instrumentation]
-- Add a StorageVersionAPI feature gate that makes API server update storageversions before serving certain write requests.
- This feature allows the storage migrator to manage storage migration for built-in resources.
- Enabling internal.apiserver.k8s.io/v1alpha1 API and APIServerIdentity feature gate are required to use this feature. ([#93873](https://github.com/kubernetes/kubernetes/pull/93873), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery, Auth and Testing]
-- Add a metric for time taken to perform recursive permission change ([#95866](https://github.com/kubernetes/kubernetes/pull/95866), [@JornShen](https://github.com/JornShen)) [SIG Instrumentation and Storage]
-- Add a new `vSphere` metric: `cloudprovider_vsphere_vcenter_versions`. It's content show `vCenter` hostnames with the associated server version. ([#94526](https://github.com/kubernetes/kubernetes/pull/94526), [@Danil-Grigorev](https://github.com/Danil-Grigorev)) [SIG Cloud Provider and Instrumentation]
-- Add a new flag to set priority for the kubelet on Windows nodes so that workloads cannot overwhelm the node there by disrupting kubelet process. ([#96051](https://github.com/kubernetes/kubernetes/pull/96051), [@ravisantoshgudimetla](https://github.com/ravisantoshgudimetla)) [SIG Node and Windows]
-- Add feature to size memory backed volumes ([#94444](https://github.com/kubernetes/kubernetes/pull/94444), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG Storage and Testing]
-- Add foreground cascading deletion to kubectl with the new `kubectl delete foreground|background|orphan` option. ([#93384](https://github.com/kubernetes/kubernetes/pull/93384), [@zhouya0](https://github.com/zhouya0))
-- Add metrics for azure service operations (route and loadbalancer). ([#94124](https://github.com/kubernetes/kubernetes/pull/94124), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider and Instrumentation]
-- Add network rule support in Azure account creation. ([#94239](https://github.com/kubernetes/kubernetes/pull/94239), [@andyzhangx](https://github.com/andyzhangx))
-- Add node_authorizer_actions_duration_seconds metric that can be used to estimate load to node authorizer. ([#92466](https://github.com/kubernetes/kubernetes/pull/92466), [@mborsz](https://github.com/mborsz)) [SIG API Machinery, Auth and Instrumentation]
-- Add pod_ based CPU and memory metrics to Kubelet's /metrics/resource endpoint ([#95839](https://github.com/kubernetes/kubernetes/pull/95839), [@egernst](https://github.com/egernst)) [SIG Instrumentation, Node and Testing]
-- Added `get-users` and `delete-user` to the `kubectl config` subcommand ([#89840](https://github.com/kubernetes/kubernetes/pull/89840), [@eddiezane](https://github.com/eddiezane)) [SIG CLI]
-- Added counter metric "apiserver_request_self" to count API server self-requests with labels for verb, resource, and subresource. ([#94288](https://github.com/kubernetes/kubernetes/pull/94288), [@LogicalShark](https://github.com/LogicalShark)) [SIG API Machinery, Auth, Instrumentation and Scheduling]
-- Added new k8s.io/component-helpers repository providing shared helper code for (core) components. ([#92507](https://github.com/kubernetes/kubernetes/pull/92507), [@ingvagabund](https://github.com/ingvagabund)) [SIG Apps, Node, Release and Scheduling]
-- Adds `create ingress` command to `kubectl` ([#78153](https://github.com/kubernetes/kubernetes/pull/78153), [@amimof](https://github.com/amimof)) [SIG CLI and Network]
-- Adds a headless service on node-local-cache addon. ([#88412](https://github.com/kubernetes/kubernetes/pull/88412), [@stafot](https://github.com/stafot)) [SIG Cloud Provider and Network]
-- Allow cross compilation of kubernetes on different platforms. ([#94403](https://github.com/kubernetes/kubernetes/pull/94403), [@bnrjee](https://github.com/bnrjee)) [SIG Release]
-- Azure: Support multiple services sharing one IP address ([#94991](https://github.com/kubernetes/kubernetes/pull/94991), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- CRDs: For structural schemas, non-nullable null map fields will now be dropped and defaulted if a default is available. null items in list will continue being preserved, and fail validation if not nullable. ([#95423](https://github.com/kubernetes/kubernetes/pull/95423), [@apelisse](https://github.com/apelisse)) [SIG API Machinery]
-- Changed: default "Accept: */*" header added to HTTP probes. See https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#http-probes (https://github.com/kubernetes/website/pull/24756) ([#95641](https://github.com/kubernetes/kubernetes/pull/95641), [@fonsecas72](https://github.com/fonsecas72)) [SIG Network and Node]
-- Client-go credential plugins can now be passed in the current cluster information via the KUBERNETES_EXEC_INFO environment variable. ([#95489](https://github.com/kubernetes/kubernetes/pull/95489), [@ankeesler](https://github.com/ankeesler)) [SIG API Machinery and Auth]
-- Command to start network proxy changes from 'KUBE_ENABLE_EGRESS_VIA_KONNECTIVITY_SERVICE ./cluster/kube-up.sh' to 'KUBE_ENABLE_KONNECTIVITY_SERVICE=true ./hack/kube-up.sh' ([#92669](https://github.com/kubernetes/kubernetes/pull/92669), [@Jefftree](https://github.com/Jefftree)) [SIG Cloud Provider]
-- Configure AWS LoadBalancer health check protocol via service annotations. ([#94546](https://github.com/kubernetes/kubernetes/pull/94546), [@kishorj](https://github.com/kishorj))
-- DefaultPodTopologySpread graduated to Beta. The feature gate is enabled by default. ([#95631](https://github.com/kubernetes/kubernetes/pull/95631), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling and Testing]
-- E2e test for PodFsGroupChangePolicy ([#96247](https://github.com/kubernetes/kubernetes/pull/96247), [@saikat-royc](https://github.com/saikat-royc)) [SIG Storage and Testing]
-- Ephemeral containers now apply the same API defaults as initContainers and containers ([#94896](https://github.com/kubernetes/kubernetes/pull/94896), [@wawa0210](https://github.com/wawa0210)) [SIG Apps and CLI]
-- Gradudate the Pod Resources API to G.A
- Introduces the pod_resources_endpoint_requests_total metric which tracks the total number of requests to the pod resources API ([#92165](https://github.com/kubernetes/kubernetes/pull/92165), [@RenaudWasTaken](https://github.com/RenaudWasTaken)) [SIG Instrumentation, Node and Testing]
-- In dual-stack bare-metal clusters, you can now pass dual-stack IPs to `kubelet --node-ip`.
- eg: `kubelet --node-ip 10.1.0.5,fd01::0005`. This is not yet supported for non-bare-metal
- clusters.
-
- In dual-stack clusters where nodes have dual-stack addresses, hostNetwork pods
- will now get dual-stack PodIPs. ([#95239](https://github.com/kubernetes/kubernetes/pull/95239), [@danwinship](https://github.com/danwinship)) [SIG Network and Node]
-- Introduce api-extensions category which will return: mutating admission configs, validating admission configs, CRDs and APIServices when used in kubectl get, for example. ([#95603](https://github.com/kubernetes/kubernetes/pull/95603), [@soltysh](https://github.com/soltysh)) [SIG API Machinery]
-- Introduces a new GCE specific cluster creation variable KUBE_PROXY_DISABLE. When set to true, this will skip over the creation of kube-proxy (whether the daemonset or static pod). This can be used to control the lifecycle of kube-proxy separately from the lifecycle of the nodes. ([#91977](https://github.com/kubernetes/kubernetes/pull/91977), [@varunmar](https://github.com/varunmar)) [SIG Cloud Provider]
-- Kube-apiserver now maintains a Lease object to identify itself:
- - The feature is under feature gate `APIServerIdentity`.
- - Two flags are added to kube-apiserver: `identity-lease-duration-seconds`, `identity-lease-renew-interval-seconds` ([#95533](https://github.com/kubernetes/kubernetes/pull/95533), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery]
-- Kube-apiserver: The timeout used when making health check calls to etcd can now be configured with `--etcd-healthcheck-timeout`. The default timeout is 2 seconds, matching the previous behavior. ([#93244](https://github.com/kubernetes/kubernetes/pull/93244), [@Sh4d1](https://github.com/Sh4d1)) [SIG API Machinery]
-- Kube-apiserver: added support for compressing rotated audit log files with `--audit-log-compress` ([#94066](https://github.com/kubernetes/kubernetes/pull/94066), [@lojies](https://github.com/lojies)) [SIG API Machinery and Auth]
-- Kubeadm now prints warnings instead of throwing errors if the current system time is outside of the NotBefore and NotAfter bounds of a loaded certificate. ([#94504](https://github.com/kubernetes/kubernetes/pull/94504), [@neolit123](https://github.com/neolit123))
-- Kubeadm: Add a preflight check that the control-plane node has at least 1700MB of RAM ([#93275](https://github.com/kubernetes/kubernetes/pull/93275), [@xlgao-zju](https://github.com/xlgao-zju)) [SIG Cluster Lifecycle]
-- Kubeadm: add the "--cluster-name" flag to the "kubeadm alpha kubeconfig user" to allow configuring the cluster name in the generated kubeconfig file ([#93992](https://github.com/kubernetes/kubernetes/pull/93992), [@prabhu43](https://github.com/prabhu43)) [SIG Cluster Lifecycle]
-- Kubeadm: add the "--kubeconfig" flag to the "kubeadm init phase upload-certs" command to allow users to pass a custom location for a kubeconfig file. ([#94765](https://github.com/kubernetes/kubernetes/pull/94765), [@zhanw15](https://github.com/zhanw15)) [SIG Cluster Lifecycle]
-- Kubeadm: make etcd pod request 100m CPU, 100Mi memory and 100Mi ephemeral_storage by default ([#94479](https://github.com/kubernetes/kubernetes/pull/94479), [@knight42](https://github.com/knight42)) [SIG Cluster Lifecycle]
-- Kubeadm: make the command "kubeadm alpha kubeconfig user" accept a "--config" flag and remove the following flags:
- - apiserver-advertise-address / apiserver-bind-port: use either localAPIEndpoint from InitConfiguration or controlPlaneEndpoint from ClusterConfiguration.
- - cluster-name: use clusterName from ClusterConfiguration
- - cert-dir: use certificatesDir from ClusterConfiguration ([#94879](https://github.com/kubernetes/kubernetes/pull/94879), [@knight42](https://github.com/knight42)) [SIG Cluster Lifecycle]
-- Kubectl create now supports creating ingress objects. ([#94327](https://github.com/kubernetes/kubernetes/pull/94327), [@rikatz](https://github.com/rikatz)) [SIG CLI and Network]
-- Kubectl rollout history sts/sts-name --revision=some-revision will start showing the detailed view of the sts on that specified revision ([#86506](https://github.com/kubernetes/kubernetes/pull/86506), [@dineshba](https://github.com/dineshba)) [SIG CLI]
-- Kubectl: Previously users cannot provide arguments to a external diff tool via KUBECTL_EXTERNAL_DIFF env. This release now allow users to specify args to KUBECTL_EXTERNAL_DIFF env. ([#95292](https://github.com/kubernetes/kubernetes/pull/95292), [@dougsland](https://github.com/dougsland)) [SIG CLI]
-- Kubemark now supports both real and hollow nodes in a single cluster. ([#93201](https://github.com/kubernetes/kubernetes/pull/93201), [@ellistarn](https://github.com/ellistarn)) [SIG Scalability]
-- Kubernetes E2E test image manifest lists now contain Windows images. ([#77398](https://github.com/kubernetes/kubernetes/pull/77398), [@claudiubelu](https://github.com/claudiubelu)) [SIG Testing and Windows]
-- Kubernetes is now built using go1.15.2
- - build: Update to k/repo-infra@v0.1.1 (supports go1.15.2)
- - build: Use go-runner:buster-v2.0.1 (built using go1.15.1)
- - bazel: Replace --features with Starlark build settings flag
- - hack/lib/util.sh: some bash cleanups
-
- - switched one spot to use kube::logging
- - make kube::util::find-binary return an error when it doesn't find
- anything so that hack scripts fail fast instead of with '' binary not
- found errors.
- - this required deleting some genfeddoc stuff. the binary no longer
- exists in k/k repo since we removed federation/, and I don't see it
- in https://github.com/kubernetes-sigs/kubefed/ either. I'm assuming
- that it's gone for good now.
-
- - bazel: output go_binary rule directly from go_binary_conditional_pure
-
- From: [@mikedanese](https://github.com/mikedanese):
- Instead of aliasing. Aliases are annoying in a number of ways. This is
- specifically bugging me now because they make the action graph harder to
- analyze programmatically. By using aliases here, we would need to handle
- potentially aliased go_binary targets and dereference to the effective
- target.
-
- The comment references an issue with `pure = select(...)` which appears
- to be resolved considering this now builds.
-
- - make kube::util::find-binary not dependent on bazel-out/ structure
-
- Implement an aspect that outputs go_build_mode metadata for go binaries,
- and use that during binary selection. ([#94449](https://github.com/kubernetes/kubernetes/pull/94449), [@justaugustus](https://github.com/justaugustus)) [SIG Architecture, CLI, Cluster Lifecycle, Node, Release and Testing]
-- Kubernetes is now built using go1.15.5
- - build: Update to k/repo-infra@v0.1.2 (supports go1.15.5) ([#95776](https://github.com/kubernetes/kubernetes/pull/95776), [@justaugustus](https://github.com/justaugustus)) [SIG Cloud Provider, Instrumentation, Release and Testing]
-- New default scheduling plugins order reduces scheduling and preemption latency when taints and node affinity are used ([#95539](https://github.com/kubernetes/kubernetes/pull/95539), [@soulxu](https://github.com/soulxu)) [SIG Scheduling]
-- Only update Azure data disks when attach/detach ([#94265](https://github.com/kubernetes/kubernetes/pull/94265), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Promote SupportNodePidsLimit to GA to provide node-to-pod PID isolation.
- Promote SupportPodPidsLimit to GA to provide ability to limit PIDs per pod. ([#94140](https://github.com/kubernetes/kubernetes/pull/94140), [@derekwaynecarr](https://github.com/derekwaynecarr))
-- SCTP support in API objects (Pod, Service, NetworkPolicy) is now GA.
- Note that this has no effect on whether SCTP is enabled on nodes at the kernel level,
- and note that some cloud platforms and network plugins do not support SCTP traffic. ([#95566](https://github.com/kubernetes/kubernetes/pull/95566), [@danwinship](https://github.com/danwinship)) [SIG Apps and Network]
-- Scheduler now ignores Pod update events if the resourceVersion of old and new Pods are identical. ([#96071](https://github.com/kubernetes/kubernetes/pull/96071), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG Scheduling]
-- Scheduling Framework: expose Run[Pre]ScorePlugins functions to PreemptionHandle which can be used in PostFilter extention point. ([#93534](https://github.com/kubernetes/kubernetes/pull/93534), [@everpeace](https://github.com/everpeace)) [SIG Scheduling and Testing]
-- SelectorSpreadPriority maps to PodTopologySpread plugin when DefaultPodTopologySpread feature is enabled ([#95448](https://github.com/kubernetes/kubernetes/pull/95448), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling]
-- Send GCE node startup scripts logs to console and journal. ([#95311](https://github.com/kubernetes/kubernetes/pull/95311), [@karan](https://github.com/karan))
-- SetHostnameAsFQDN has been graduated to Beta and therefore it is enabled by default. ([#95267](https://github.com/kubernetes/kubernetes/pull/95267), [@javidiaz](https://github.com/javidiaz)) [SIG Node]
-- Support [service.beta.kubernetes.io/azure-pip-ip-tags] annotations to allow customers to specify ip-tags to influence public-ip creation in Azure [Tag1=Value1, Tag2=Value2, etc.] ([#94114](https://github.com/kubernetes/kubernetes/pull/94114), [@MarcPow](https://github.com/MarcPow)) [SIG Cloud Provider]
-- Support custom tags for cloud provider managed resources ([#96450](https://github.com/kubernetes/kubernetes/pull/96450), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Support customize load balancer health probe protocol and request path ([#96338](https://github.com/kubernetes/kubernetes/pull/96338), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Support for Windows container images (OS Versions: 1809, 1903, 1909, 2004) was added the pause:3.4 image. ([#91452](https://github.com/kubernetes/kubernetes/pull/91452), [@claudiubelu](https://github.com/claudiubelu)) [SIG Node, Release and Windows]
-- Support multiple standard load balancers in one cluster ([#96111](https://github.com/kubernetes/kubernetes/pull/96111), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- The beta `RootCAConfigMap` feature gate is enabled by default and causes kube-controller-manager to publish a "kube-root-ca.crt" ConfigMap to every namespace. This ConfigMap contains a CA bundle used for verifying connections to the kube-apiserver. ([#96197](https://github.com/kubernetes/kubernetes/pull/96197), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Apps, Auth and Testing]
-- The kubelet_runtime_operations_duration_seconds metric buckets were set to 0.005 0.0125 0.03125 0.078125 0.1953125 0.48828125 1.220703125 3.0517578125 7.62939453125 19.073486328125 47.6837158203125 119.20928955078125 298.0232238769531 and 745.0580596923828 seconds ([#96054](https://github.com/kubernetes/kubernetes/pull/96054), [@alvaroaleman](https://github.com/alvaroaleman)) [SIG Instrumentation and Node]
-- There is a new pv_collector_total_pv_count metric that counts persistent volumes by the volume plugin name and volume mode. ([#95719](https://github.com/kubernetes/kubernetes/pull/95719), [@tsmetana](https://github.com/tsmetana)) [SIG Apps, Instrumentation, Storage and Testing]
-- Volume snapshot e2e test to validate PVC and VolumeSnapshotContent finalizer ([#95863](https://github.com/kubernetes/kubernetes/pull/95863), [@RaunakShah](https://github.com/RaunakShah)) [SIG Cloud Provider, Storage and Testing]
-- Warns user when executing kubectl apply/diff to resource currently being deleted. ([#95544](https://github.com/kubernetes/kubernetes/pull/95544), [@SaiHarshaK](https://github.com/SaiHarshaK)) [SIG CLI]
-- `kubectl alpha debug` has graduated to beta and is now `kubectl debug`. ([#96138](https://github.com/kubernetes/kubernetes/pull/96138), [@verb](https://github.com/verb)) [SIG CLI and Testing]
-- `kubectl debug` gains support for changing container images when copying a pod for debugging, similar to how `kubectl set image` works. See `kubectl help debug` for more information. ([#96058](https://github.com/kubernetes/kubernetes/pull/96058), [@verb](https://github.com/verb)) [SIG CLI]
-
-### Documentation
-
-- Fake dynamic client: document that List does not preserve TypeMeta in UnstructuredList ([#95117](https://github.com/kubernetes/kubernetes/pull/95117), [@andrewsykim](https://github.com/andrewsykim)) [SIG API Machinery]
-- Kubelet: remove alpha warnings for CNI flags. ([#94508](https://github.com/kubernetes/kubernetes/pull/94508), [@andrewsykim](https://github.com/andrewsykim)) [SIG Network and Node]
-- Updates docs and guidance on cloud provider InstancesV2 and Zones interface for external cloud providers:
- - removes experimental warning for InstancesV2
- - document that implementation of InstancesV2 will disable calls to Zones
- - deprecate Zones in favor of InstancesV2 ([#96397](https://github.com/kubernetes/kubernetes/pull/96397), [@andrewsykim](https://github.com/andrewsykim)) [SIG Cloud Provider]
-
-### Failing Test
-
-- Resolves an issue running Ingress conformance tests on clusters which use finalizers on Ingress objects to manage releasing load balancer resources ([#96742](https://github.com/kubernetes/kubernetes/pull/96742), [@spencerhance](https://github.com/spencerhance)) [SIG Network and Testing]
-- The Conformance test "validates that there is no conflict between pods with same hostPort but different hostIP and protocol" now validates the connectivity to each hostPort, in addition to the functionality. ([#96627](https://github.com/kubernetes/kubernetes/pull/96627), [@aojea](https://github.com/aojea)) [SIG Scheduling and Testing]
-
-### Bug or Regression
-
-- Add kubectl wait --ignore-not-found flag ([#90969](https://github.com/kubernetes/kubernetes/pull/90969), [@zhouya0](https://github.com/zhouya0)) [SIG CLI]
-- Added support to kube-proxy for externalTrafficPolicy=Local setting via Direct Server Return (DSR) load balancers on Windows. ([#93166](https://github.com/kubernetes/kubernetes/pull/93166), [@elweb9858](https://github.com/elweb9858)) [SIG Network]
-- Alter wording to describe pods using a pvc ([#95635](https://github.com/kubernetes/kubernetes/pull/95635), [@RaunakShah](https://github.com/RaunakShah)) [SIG CLI]
-- An issues preventing volume expand controller to annotate the PVC with `volume.kubernetes.io/storage-resizer` when the PVC StorageClass is already updated to the out-of-tree provisioner is now fixed. ([#94489](https://github.com/kubernetes/kubernetes/pull/94489), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG API Machinery, Apps and Storage]
-- Azure ARM client: don't segfault on empty response and http error ([#94078](https://github.com/kubernetes/kubernetes/pull/94078), [@bpineau](https://github.com/bpineau)) [SIG Cloud Provider]
-- Azure armclient backoff step defaults to 1 (no retry). ([#94180](https://github.com/kubernetes/kubernetes/pull/94180), [@feiskyer](https://github.com/feiskyer))
-- Azure: fix a bug that kube-controller-manager would panic if wrong Azure VMSS name is configured ([#94306](https://github.com/kubernetes/kubernetes/pull/94306), [@knight42](https://github.com/knight42)) [SIG Cloud Provider]
-- Both apiserver_request_duration_seconds metrics and RequestReceivedTimestamp fields of an audit event now take into account the time a request spends in the apiserver request filters. ([#94903](https://github.com/kubernetes/kubernetes/pull/94903), [@tkashem](https://github.com/tkashem))
-- Build/lib/release: Explicitly use '--platform' in building server images
-
- When we switched to go-runner for building the apiserver,
- controller-manager, and scheduler server components, we no longer
- reference the individual architectures in the image names, specifically
- in the 'FROM' directive of the server image Dockerfiles.
-
- As a result, server images for non-amd64 images copy in the go-runner
- amd64 binary instead of the go-runner that matches that architecture.
-
- This commit explicitly sets the '--platform=linux/${arch}' to ensure
- we're pulling the correct go-runner arch from the manifest list.
-
- Before:
- `FROM ${base_image}`
-
- After:
- `FROM --platform=linux/${arch} ${base_image}` ([#94552](https://github.com/kubernetes/kubernetes/pull/94552), [@justaugustus](https://github.com/justaugustus)) [SIG Release]
-- Bump node-problem-detector version to v0.8.5 to fix OOM detection in with Linux kernels 5.1+ ([#96716](https://github.com/kubernetes/kubernetes/pull/96716), [@tosi3k](https://github.com/tosi3k)) [SIG Cloud Provider, Scalability and Testing]
-- CSIDriver object can be deployed during volume attachment. ([#93710](https://github.com/kubernetes/kubernetes/pull/93710), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Apps, Node, Storage and Testing]
-- Ceph RBD volume expansion now works even when ceph.conf was not provided. ([#92027](https://github.com/kubernetes/kubernetes/pull/92027), [@juliantaylor](https://github.com/juliantaylor))
-- Change plugin name in fsgroupapplymetrics of csi and flexvolume to distinguish different driver ([#95892](https://github.com/kubernetes/kubernetes/pull/95892), [@JornShen](https://github.com/JornShen)) [SIG Instrumentation, Storage and Testing]
-- Change the calculation of pod UIDs so that static pods get a unique value - will cause all containers to be killed and recreated after in-place upgrade. ([#87461](https://github.com/kubernetes/kubernetes/pull/87461), [@bboreham](https://github.com/bboreham)) [SIG Node]
-- Change the mount way from systemd to normal mount except ceph and glusterfs intree-volume. ([#94916](https://github.com/kubernetes/kubernetes/pull/94916), [@smileusd](https://github.com/smileusd)) [SIG Apps, Cloud Provider, Network, Node, Storage and Testing]
-- Changes to timeout parameter handling in 1.20.0-beta.2 have been reverted to avoid breaking backwards compatibility with existing clients. ([#96727](https://github.com/kubernetes/kubernetes/pull/96727), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and Testing]
-- Clear UDP conntrack entry on endpoint changes when using nodeport ([#71573](https://github.com/kubernetes/kubernetes/pull/71573), [@JacobTanenbaum](https://github.com/JacobTanenbaum)) [SIG Network]
-- Cloud node controller: handle empty providerID from getProviderID ([#95342](https://github.com/kubernetes/kubernetes/pull/95342), [@nicolehanjing](https://github.com/nicolehanjing)) [SIG Cloud Provider]
-- Disable watchcache for events ([#96052](https://github.com/kubernetes/kubernetes/pull/96052), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery]
-- Disabled `LocalStorageCapacityIsolation` feature gate is honored during scheduling. ([#96092](https://github.com/kubernetes/kubernetes/pull/96092), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG Scheduling]
-- Do not fail sorting empty elements. ([#94666](https://github.com/kubernetes/kubernetes/pull/94666), [@soltysh](https://github.com/soltysh)) [SIG CLI]
-- Dual-stack: make nodeipam compatible with existing single-stack clusters when dual-stack feature gate become enabled by default ([#90439](https://github.com/kubernetes/kubernetes/pull/90439), [@SataQiu](https://github.com/SataQiu)) [SIG API Machinery]
-- Duplicate owner reference entries in create/update/patch requests now get deduplicated by the API server. The client sending the request now receives a warning header in the API response. Clients should stop sending requests with duplicate owner references. The API server may reject such requests as early as 1.24. ([#96185](https://github.com/kubernetes/kubernetes/pull/96185), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery and Testing]
-- Endpoint slice controller now mirrors parent's service label to its corresponding endpoint slices. ([#94443](https://github.com/kubernetes/kubernetes/pull/94443), [@aojea](https://github.com/aojea))
-- Ensure getPrimaryInterfaceID not panic when network interfaces for Azure VMSS are null ([#94355](https://github.com/kubernetes/kubernetes/pull/94355), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider]
-- Exposes and sets a default timeout for the SubjectAccessReview client for DelegatingAuthorizationOptions ([#95725](https://github.com/kubernetes/kubernetes/pull/95725), [@p0lyn0mial](https://github.com/p0lyn0mial)) [SIG API Machinery and Cloud Provider]
-- Exposes and sets a default timeout for the TokenReview client for DelegatingAuthenticationOptions ([#96217](https://github.com/kubernetes/kubernetes/pull/96217), [@p0lyn0mial](https://github.com/p0lyn0mial)) [SIG API Machinery and Cloud Provider]
-- Fix CVE-2020-8555 for Quobyte client connections. ([#95206](https://github.com/kubernetes/kubernetes/pull/95206), [@misterikkit](https://github.com/misterikkit)) [SIG Storage]
-- Fix IP fragmentation of UDP and TCP packets not supported issues on LoadBalancer rules ([#96464](https://github.com/kubernetes/kubernetes/pull/96464), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Fix a bug that DefaultPreemption plugin is disabled when using (legacy) scheduler policy. ([#96439](https://github.com/kubernetes/kubernetes/pull/96439), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG Scheduling and Testing]
-- Fix a bug where loadbalancer deletion gets stuck because of missing resource group. ([#93962](https://github.com/kubernetes/kubernetes/pull/93962), [@phiphi282](https://github.com/phiphi282))
-- Fix a concurrent map writes error in kubelet ([#93773](https://github.com/kubernetes/kubernetes/pull/93773), [@knight42](https://github.com/knight42)) [SIG Node]
-- Fix a panic in `kubectl debug` when a pod has multiple init or ephemeral containers. ([#94580](https://github.com/kubernetes/kubernetes/pull/94580), [@kiyoshim55](https://github.com/kiyoshim55))
-- Fix a regression where kubeadm bails out with a fatal error when an optional version command line argument is supplied to the "kubeadm upgrade plan" command ([#94421](https://github.com/kubernetes/kubernetes/pull/94421), [@rosti](https://github.com/rosti)) [SIG Cluster Lifecycle]
-- Fix azure disk attach failure for disk size bigger than 4TB ([#95463](https://github.com/kubernetes/kubernetes/pull/95463), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix azure disk data loss issue on Windows when unmount disk ([#95456](https://github.com/kubernetes/kubernetes/pull/95456), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
-- Fix azure file migration panic ([#94853](https://github.com/kubernetes/kubernetes/pull/94853), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix bug in JSON path parser where an error occurs when a range is empty ([#95933](https://github.com/kubernetes/kubernetes/pull/95933), [@brianpursley](https://github.com/brianpursley)) [SIG API Machinery]
-- Fix client-go prometheus metrics to correctly present the API path accessed in some environments. ([#74363](https://github.com/kubernetes/kubernetes/pull/74363), [@aanm](https://github.com/aanm)) [SIG API Machinery]
-- Fix detach azure disk issue when vm not exist ([#95177](https://github.com/kubernetes/kubernetes/pull/95177), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix etcd_object_counts metric reported by kube-apiserver ([#94773](https://github.com/kubernetes/kubernetes/pull/94773), [@tkashem](https://github.com/tkashem)) [SIG API Machinery]
-- Fix incorrectly reported verbs for kube-apiserver metrics for CRD objects ([#93523](https://github.com/kubernetes/kubernetes/pull/93523), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery and Instrumentation]
-- Fix k8s.io/apimachinery/pkg/api/meta.SetStatusCondition to update ObservedGeneration ([#95961](https://github.com/kubernetes/kubernetes/pull/95961), [@KnicKnic](https://github.com/KnicKnic)) [SIG API Machinery]
-- Fix kubectl SchemaError on CRDs with schema using x-kubernetes-preserve-unknown-fields on array types. ([#94888](https://github.com/kubernetes/kubernetes/pull/94888), [@sttts](https://github.com/sttts)) [SIG API Machinery]
-- Fix memory leak in kube-apiserver when underlying time goes forth and back. ([#96266](https://github.com/kubernetes/kubernetes/pull/96266), [@chenyw1990](https://github.com/chenyw1990)) [SIG API Machinery]
-- Fix missing csi annotations on node during parallel csinode update. ([#94389](https://github.com/kubernetes/kubernetes/pull/94389), [@pacoxu](https://github.com/pacoxu)) [SIG Storage]
-- Fix network_programming_latency metric reporting for Endpoints/EndpointSlice deletions, where we don't have correct timestamp ([#95363](https://github.com/kubernetes/kubernetes/pull/95363), [@wojtek-t](https://github.com/wojtek-t)) [SIG Network and Scalability]
-- Fix paging issues when Azure API returns empty values with non-empty nextLink ([#96211](https://github.com/kubernetes/kubernetes/pull/96211), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider]
-- Fix pull image error from multiple ACRs using azure managed identity ([#96355](https://github.com/kubernetes/kubernetes/pull/96355), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix race condition on timeCache locks. ([#94751](https://github.com/kubernetes/kubernetes/pull/94751), [@auxten](https://github.com/auxten))
-- Fix regression on `kubectl portforward` when TCP and UCP services were configured on the same port. ([#94728](https://github.com/kubernetes/kubernetes/pull/94728), [@amorenoz](https://github.com/amorenoz))
-- Fix scheduler cache snapshot when a Node is deleted before its Pods ([#95130](https://github.com/kubernetes/kubernetes/pull/95130), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling]
-- Fix the `cloudprovider_azure_api_request_duration_seconds` metric buckets to correctly capture the latency metrics. Previously, the majority of the calls would fall in the "+Inf" bucket. ([#94873](https://github.com/kubernetes/kubernetes/pull/94873), [@marwanad](https://github.com/marwanad)) [SIG Cloud Provider and Instrumentation]
-- Fix vSphere volumes that could be erroneously attached to wrong node ([#96224](https://github.com/kubernetes/kubernetes/pull/96224), [@gnufied](https://github.com/gnufied)) [SIG Cloud Provider and Storage]
-- Fix verb & scope reporting for kube-apiserver metrics (LIST reported instead of GET) ([#95562](https://github.com/kubernetes/kubernetes/pull/95562), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery and Testing]
-- Fix vsphere detach failure for static PVs ([#95447](https://github.com/kubernetes/kubernetes/pull/95447), [@gnufied](https://github.com/gnufied)) [SIG Cloud Provider and Storage]
-- Fix: azure disk resize error if source does not exist ([#93011](https://github.com/kubernetes/kubernetes/pull/93011), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix: detach azure disk broken on Azure Stack ([#94885](https://github.com/kubernetes/kubernetes/pull/94885), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix: resize Azure disk issue when it's in attached state ([#96705](https://github.com/kubernetes/kubernetes/pull/96705), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix: smb valid path error ([#95583](https://github.com/kubernetes/kubernetes/pull/95583), [@andyzhangx](https://github.com/andyzhangx)) [SIG Storage]
-- Fix: use sensitiveOptions on Windows mount ([#94126](https://github.com/kubernetes/kubernetes/pull/94126), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
-- Fixed a bug causing incorrect formatting of `kubectl describe ingress`. ([#94985](https://github.com/kubernetes/kubernetes/pull/94985), [@howardjohn](https://github.com/howardjohn)) [SIG CLI and Network]
-- Fixed a bug in client-go where new clients with customized `Dial`, `Proxy`, `GetCert` config may get stale HTTP transports. ([#95427](https://github.com/kubernetes/kubernetes/pull/95427), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery]
-- Fixed a bug that prevents kubectl to validate CRDs with schema using x-kubernetes-preserve-unknown-fields on object fields. ([#96369](https://github.com/kubernetes/kubernetes/pull/96369), [@gautierdelorme](https://github.com/gautierdelorme)) [SIG API Machinery and Testing]
-- Fixed a bug that prevents the use of ephemeral containers in the presence of a validating admission webhook. ([#94685](https://github.com/kubernetes/kubernetes/pull/94685), [@verb](https://github.com/verb)) [SIG Node and Testing]
-- Fixed a bug where aggregator_unavailable_apiservice metrics were reported for deleted apiservices. ([#96421](https://github.com/kubernetes/kubernetes/pull/96421), [@dgrisonnet](https://github.com/dgrisonnet)) [SIG API Machinery and Instrumentation]
-- Fixed a bug where improper storage and comparison of endpoints led to excessive API traffic from the endpoints controller ([#94112](https://github.com/kubernetes/kubernetes/pull/94112), [@damemi](https://github.com/damemi)) [SIG Apps, Network and Testing]
-- Fixed a regression which prevented pods with `docker/default` seccomp annotations from being created in 1.19 if a PodSecurityPolicy was in place which did not allow `runtime/default` seccomp profiles. ([#95985](https://github.com/kubernetes/kubernetes/pull/95985), [@saschagrunert](https://github.com/saschagrunert)) [SIG Auth]
-- Fixed bug in reflector that couldn't recover from "Too large resource version" errors with API servers 1.17.0-1.18.5 ([#94316](https://github.com/kubernetes/kubernetes/pull/94316), [@janeczku](https://github.com/janeczku)) [SIG API Machinery]
-- Fixed bug where kubectl top pod output is not sorted when --sort-by and --containers flags are used together ([#93692](https://github.com/kubernetes/kubernetes/pull/93692), [@brianpursley](https://github.com/brianpursley)) [SIG CLI]
-- Fixed kubelet creating extra sandbox for pods with RestartPolicyOnFailure after all containers succeeded ([#92614](https://github.com/kubernetes/kubernetes/pull/92614), [@tnqn](https://github.com/tnqn)) [SIG Node and Testing]
-- Fixes an issue proxying to ipv6 pods without specifying a port ([#94834](https://github.com/kubernetes/kubernetes/pull/94834), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and Network]
-- Fixes code generation for non-namespaced create subresources fake client test. ([#96586](https://github.com/kubernetes/kubernetes/pull/96586), [@Doude](https://github.com/Doude)) [SIG API Machinery]
-- Fixes high CPU usage in kubectl drain ([#95260](https://github.com/kubernetes/kubernetes/pull/95260), [@amandahla](https://github.com/amandahla)) [SIG CLI]
-- For vSphere Cloud Provider, If VM of worker node is deleted, the node will also be deleted by node controller ([#92608](https://github.com/kubernetes/kubernetes/pull/92608), [@lubronzhan](https://github.com/lubronzhan)) [SIG Cloud Provider]
-- Gracefully delete nodes when their parent scale set went missing ([#95289](https://github.com/kubernetes/kubernetes/pull/95289), [@bpineau](https://github.com/bpineau)) [SIG Cloud Provider]
-- HTTP/2 connection health check is enabled by default in all Kubernetes clients. The feature should work out-of-the-box. If needed, users can tune the feature via the HTTP2_READ_IDLE_TIMEOUT_SECONDS and HTTP2_PING_TIMEOUT_SECONDS environment variables. The feature is disabled if HTTP2_READ_IDLE_TIMEOUT_SECONDS is set to 0. ([#95981](https://github.com/kubernetes/kubernetes/pull/95981), [@caesarxuchao](https://github.com/caesarxuchao)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Node]
-- If the user specifies an invalid timeout in the request URL, the request will be aborted with an HTTP 400.
- - If the user specifies a timeout in the request URL that exceeds the maximum request deadline allowed by the apiserver, the request will be aborted with an HTTP 400. ([#96061](https://github.com/kubernetes/kubernetes/pull/96061), [@tkashem](https://github.com/tkashem)) [SIG API Machinery, Network and Testing]
-- If we set SelectPolicy MinPolicySelect on scaleUp behavior or scaleDown behavior,Horizontal Pod Autoscaler doesn`t automatically scale the number of pods correctly ([#95647](https://github.com/kubernetes/kubernetes/pull/95647), [@JoshuaAndrew](https://github.com/JoshuaAndrew)) [SIG Apps and Autoscaling]
-- Ignore apparmor for non-linux operating systems ([#93220](https://github.com/kubernetes/kubernetes/pull/93220), [@wawa0210](https://github.com/wawa0210)) [SIG Node and Windows]
-- Ignore root user check when windows pod starts ([#92355](https://github.com/kubernetes/kubernetes/pull/92355), [@wawa0210](https://github.com/wawa0210)) [SIG Node and Windows]
-- Improve error messages related to nodePort endpoint changes conntrack entries cleanup. ([#96251](https://github.com/kubernetes/kubernetes/pull/96251), [@ravens](https://github.com/ravens)) [SIG Network]
-- In dual-stack clusters, kubelet will now set up both IPv4 and IPv6 iptables rules, which may
- fix some problems, eg with HostPorts. ([#94474](https://github.com/kubernetes/kubernetes/pull/94474), [@danwinship](https://github.com/danwinship)) [SIG Network and Node]
-- Increase maximum IOPS of AWS EBS io1 volume to current maximum (64,000). ([#90014](https://github.com/kubernetes/kubernetes/pull/90014), [@jacobmarble](https://github.com/jacobmarble))
-- Ipvs: ensure selected scheduler kernel modules are loaded ([#93040](https://github.com/kubernetes/kubernetes/pull/93040), [@cmluciano](https://github.com/cmluciano)) [SIG Network]
-- K8s.io/apimachinery: runtime.DefaultUnstructuredConverter.FromUnstructured now handles converting integer fields to typed float values ([#93250](https://github.com/kubernetes/kubernetes/pull/93250), [@liggitt](https://github.com/liggitt)) [SIG API Machinery]
-- Kube-proxy now trims extra spaces found in loadBalancerSourceRanges to match Service validation. ([#94107](https://github.com/kubernetes/kubernetes/pull/94107), [@robscott](https://github.com/robscott)) [SIG Network]
-- Kubeadm ensures "kubeadm reset" does not unmount the root "/var/lib/kubelet" directory if it is mounted by the user. ([#93702](https://github.com/kubernetes/kubernetes/pull/93702), [@thtanaka](https://github.com/thtanaka))
-- Kubeadm now makes sure the etcd manifest is regenerated upon upgrade even when no etcd version change takes place ([#94395](https://github.com/kubernetes/kubernetes/pull/94395), [@rosti](https://github.com/rosti)) [SIG Cluster Lifecycle]
-- Kubeadm now warns (instead of error out) on missing "ca.key" files for root CA, front-proxy CA and etcd CA, during "kubeadm join --control-plane" if the user has provided all certificates, keys and kubeconfig files which require signing with the given CA keys. ([#94988](https://github.com/kubernetes/kubernetes/pull/94988), [@neolit123](https://github.com/neolit123))
-- Kubeadm: add missing "--experimental-patches" flag to "kubeadm init phase control-plane" ([#95786](https://github.com/kubernetes/kubernetes/pull/95786), [@Sh4d1](https://github.com/Sh4d1)) [SIG Cluster Lifecycle]
-- Kubeadm: avoid a panic when determining if the running version of CoreDNS is supported during upgrades ([#94299](https://github.com/kubernetes/kubernetes/pull/94299), [@zouyee](https://github.com/zouyee)) [SIG Cluster Lifecycle]
-- Kubeadm: ensure the etcd data directory is created with 0700 permissions during control-plane init and join ([#94102](https://github.com/kubernetes/kubernetes/pull/94102), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: fix coredns migration should be triggered when there are newdefault configs during kubeadm upgrade ([#96907](https://github.com/kubernetes/kubernetes/pull/96907), [@pacoxu](https://github.com/pacoxu)) [SIG Cluster Lifecycle]
-- Kubeadm: fix the bug that kubeadm tries to call 'docker info' even if the CRI socket was for another CR ([#94555](https://github.com/kubernetes/kubernetes/pull/94555), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle]
-- Kubeadm: for Docker as the container runtime, make the "kubeadm reset" command stop containers before removing them ([#94586](https://github.com/kubernetes/kubernetes/pull/94586), [@BedivereZero](https://github.com/BedivereZero)) [SIG Cluster Lifecycle]
-- Kubeadm: make the kubeconfig files for the kube-controller-manager and kube-scheduler use the LocalAPIEndpoint instead of the ControlPlaneEndpoint. This makes kubeadm clusters more reseliant to version skew problems during immutable upgrades: https://kubernetes.io/docs/setup/release/version-skew-policy/#kube-controller-manager-kube-scheduler-and-cloud-controller-manager ([#94398](https://github.com/kubernetes/kubernetes/pull/94398), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: relax the validation of kubeconfig server URLs. Allow the user to define custom kubeconfig server URLs without erroring out during validation of existing kubeconfig files (e.g. when using external CA mode). ([#94816](https://github.com/kubernetes/kubernetes/pull/94816), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubectl: print error if users place flags before plugin name ([#92343](https://github.com/kubernetes/kubernetes/pull/92343), [@knight42](https://github.com/knight42)) [SIG CLI]
-- Kubelet: assume that swap is disabled when `/proc/swaps` does not exist ([#93931](https://github.com/kubernetes/kubernetes/pull/93931), [@SataQiu](https://github.com/SataQiu)) [SIG Node]
-- New Azure instance types do now have correct max data disk count information. ([#94340](https://github.com/kubernetes/kubernetes/pull/94340), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG Cloud Provider and Storage]
-- Port mapping now allows the same `containerPort` of different containers to different `hostPort` without naming the mapping explicitly. ([#94494](https://github.com/kubernetes/kubernetes/pull/94494), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev))
-- Print go stack traces at -v=4 and not -v=2 ([#94663](https://github.com/kubernetes/kubernetes/pull/94663), [@soltysh](https://github.com/soltysh)) [SIG CLI]
-- Recreate EndpointSlices on rapid Service creation. ([#94730](https://github.com/kubernetes/kubernetes/pull/94730), [@robscott](https://github.com/robscott))
-- Reduce volume name length for vsphere volumes ([#96533](https://github.com/kubernetes/kubernetes/pull/96533), [@gnufied](https://github.com/gnufied)) [SIG Storage]
-- Remove ready file and its directory (which is created during volume SetUp) during emptyDir volume TearDown. ([#95770](https://github.com/kubernetes/kubernetes/pull/95770), [@jingxu97](https://github.com/jingxu97)) [SIG Storage]
-- Reorganized iptables rules to fix a performance issue ([#95252](https://github.com/kubernetes/kubernetes/pull/95252), [@tssurya](https://github.com/tssurya)) [SIG Network]
-- Require feature flag CustomCPUCFSQuotaPeriod if setting a non-default cpuCFSQuotaPeriod in kubelet config. ([#94687](https://github.com/kubernetes/kubernetes/pull/94687), [@karan](https://github.com/karan)) [SIG Node]
-- Resolves a regression in 1.19+ with workloads targeting deprecated beta os/arch labels getting stuck in NodeAffinity status on node startup. ([#96810](https://github.com/kubernetes/kubernetes/pull/96810), [@liggitt](https://github.com/liggitt)) [SIG Node]
-- Resolves non-deterministic behavior of the garbage collection controller when ownerReferences with incorrect data are encountered. Events with a reason of `OwnerRefInvalidNamespace` are recorded when namespace mismatches between child and owner objects are detected. The [kubectl-check-ownerreferences](https://github.com/kubernetes-sigs/kubectl-check-ownerreferences) tool can be run prior to upgrading to locate existing objects with invalid ownerReferences.
- - A namespaced object with an ownerReference referencing a uid of a namespaced kind which does not exist in the same namespace is now consistently treated as though that owner does not exist, and the child object is deleted.
- - A cluster-scoped object with an ownerReference referencing a uid of a namespaced kind is now consistently treated as though that owner is not resolvable, and the child object is ignored by the garbage collector. ([#92743](https://github.com/kubernetes/kubernetes/pull/92743), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, Apps and Testing]
-- Skip [k8s.io/kubernetes@v1.19.0/test/e2e/storage/testsuites/base.go:162]: Driver azure-disk doesn't support snapshot type DynamicSnapshot -- skipping
- skip [k8s.io/kubernetes@v1.19.0/test/e2e/storage/testsuites/base.go:185]: Driver azure-disk doesn't support ntfs -- skipping ([#96144](https://github.com/kubernetes/kubernetes/pull/96144), [@qinpingli](https://github.com/qinpingli)) [SIG Storage and Testing]
-- StatefulSet Controller now waits for PersistentVolumeClaim deletion before creating pods. ([#93457](https://github.com/kubernetes/kubernetes/pull/93457), [@ymmt2005](https://github.com/ymmt2005))
-- StreamWatcher now calls HandleCrash at appropriate sequence. ([#93108](https://github.com/kubernetes/kubernetes/pull/93108), [@lixiaobing1](https://github.com/lixiaobing1))
-- Support the node label `node.kubernetes.io/exclude-from-external-load-balancers` ([#95542](https://github.com/kubernetes/kubernetes/pull/95542), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- The AWS network load balancer attributes can now be specified during service creation ([#95247](https://github.com/kubernetes/kubernetes/pull/95247), [@kishorj](https://github.com/kishorj)) [SIG Cloud Provider]
-- The `/debug/api_priority_and_fairness/dump_requests` path at an apiserver will no longer return a phantom line for each exempt priority level. ([#93406](https://github.com/kubernetes/kubernetes/pull/93406), [@MikeSpreitzer](https://github.com/MikeSpreitzer)) [SIG API Machinery]
-- The kube-apiserver will no longer serve APIs that should have been deleted in GA non-alpha levels. Alpha levels will continue to serve the removed APIs so that CI doesn't immediately break. ([#96525](https://github.com/kubernetes/kubernetes/pull/96525), [@deads2k](https://github.com/deads2k)) [SIG API Machinery]
-- The kubelet recognizes the --containerd-namespace flag to configure the namespace used by cadvisor. ([#87054](https://github.com/kubernetes/kubernetes/pull/87054), [@changyaowei](https://github.com/changyaowei)) [SIG Node]
-- Unhealthy pods covered by PDBs can be successfully evicted if enough healthy pods are available. ([#94381](https://github.com/kubernetes/kubernetes/pull/94381), [@michaelgugino](https://github.com/michaelgugino)) [SIG Apps]
-- Update Calico to v3.15.2 ([#94241](https://github.com/kubernetes/kubernetes/pull/94241), [@lmm](https://github.com/lmm)) [SIG Cloud Provider]
-- Update default etcd server version to 3.4.13 ([#94287](https://github.com/kubernetes/kubernetes/pull/94287), [@jingyih](https://github.com/jingyih)) [SIG API Machinery, Cloud Provider, Cluster Lifecycle and Testing]
-- Update max azure data disk count map ([#96308](https://github.com/kubernetes/kubernetes/pull/96308), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
-- Update the PIP when it is not in the Succeeded provisioning state during the LB update. ([#95748](https://github.com/kubernetes/kubernetes/pull/95748), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Update the frontend IP config when the service's `pipName` annotation is changed ([#95813](https://github.com/kubernetes/kubernetes/pull/95813), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Update the route table tag in the route reconcile loop ([#96545](https://github.com/kubernetes/kubernetes/pull/96545), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Use NLB Subnet CIDRs instead of VPC CIDRs in Health Check SG Rules ([#93515](https://github.com/kubernetes/kubernetes/pull/93515), [@t0rr3sp3dr0](https://github.com/t0rr3sp3dr0)) [SIG Cloud Provider]
-- Users will see increase in time for deletion of pods and also guarantee that removal of pod from api server would mean deletion of all the resources from container runtime. ([#92817](https://github.com/kubernetes/kubernetes/pull/92817), [@kmala](https://github.com/kmala)) [SIG Node]
-- Very large patches may now be specified to `kubectl patch` with the `--patch-file` flag instead of including them directly on the command line. The `--patch` and `--patch-file` flags are mutually exclusive. ([#93548](https://github.com/kubernetes/kubernetes/pull/93548), [@smarterclayton](https://github.com/smarterclayton)) [SIG CLI]
-- Volume binding: report UnschedulableAndUnresolvable status instead of an error when bound PVs not found ([#95541](https://github.com/kubernetes/kubernetes/pull/95541), [@cofyc](https://github.com/cofyc)) [SIG Apps, Scheduling and Storage]
-- Warn instead of fail when creating Roles and ClusterRoles with custom verbs via kubectl ([#92492](https://github.com/kubernetes/kubernetes/pull/92492), [@eddiezane](https://github.com/eddiezane)) [SIG CLI]
-- When creating a PVC with the volume.beta.kubernetes.io/storage-provisioner annotation already set, the PV controller might have incorrectly deleted the newly provisioned PV instead of binding it to the PVC, depending on timing and system load. ([#95909](https://github.com/kubernetes/kubernetes/pull/95909), [@pohly](https://github.com/pohly)) [SIG Apps and Storage]
-- [kubectl] Fail when local source file doesn't exist ([#90333](https://github.com/kubernetes/kubernetes/pull/90333), [@bamarni](https://github.com/bamarni)) [SIG CLI]
-
-### Other (Cleanup or Flake)
-
-- **Additional documentation e.g., KEPs (Kubernetes Enhancement Proposals), usage docs, etc.**:
-
- ([#96443](https://github.com/kubernetes/kubernetes/pull/96443), [@alaypatel07](https://github.com/alaypatel07)) [SIG Apps]
-- --redirect-container-streaming is no longer functional. The flag will be removed in v1.22 ([#95935](https://github.com/kubernetes/kubernetes/pull/95935), [@tallclair](https://github.com/tallclair)) [SIG Node]
-- A new metric `requestAbortsTotal` has been introduced that counts aborted requests for each `group`, `version`, `verb`, `resource`, `subresource` and `scope`. ([#95002](https://github.com/kubernetes/kubernetes/pull/95002), [@p0lyn0mial](https://github.com/p0lyn0mial)) [SIG API Machinery, Cloud Provider, Instrumentation and Scheduling]
-- API priority and fairness metrics use snake_case in label names ([#96236](https://github.com/kubernetes/kubernetes/pull/96236), [@adtac](https://github.com/adtac)) [SIG API Machinery, Cluster Lifecycle, Instrumentation and Testing]
-- Add fine grained debugging to intra-pod conformance test to troubleshoot networking issues for potentially unhealthy nodes when running conformance or sonobuoy tests. ([#93837](https://github.com/kubernetes/kubernetes/pull/93837), [@jayunit100](https://github.com/jayunit100))
-- Add the following metrics:
- - network_plugin_operations_total
- - network_plugin_operations_errors_total ([#93066](https://github.com/kubernetes/kubernetes/pull/93066), [@AnishShah](https://github.com/AnishShah))
-- Adds a bootstrapping ClusterRole, ClusterRoleBinding and group for /metrics, /livez/*, /readyz/*, & /healthz/- endpoints. ([#93311](https://github.com/kubernetes/kubernetes/pull/93311), [@logicalhan](https://github.com/logicalhan)) [SIG API Machinery, Auth, Cloud Provider and Instrumentation]
-- AdmissionReview objects sent for the creation of Namespace API objects now populate the `namespace` attribute consistently (previously the `namespace` attribute was empty for Namespace creation via POST requests, and populated for Namespace creation via server-side-apply PATCH requests) ([#95012](https://github.com/kubernetes/kubernetes/pull/95012), [@nodo](https://github.com/nodo)) [SIG API Machinery and Testing]
-- Applies translations on all command descriptions ([#95439](https://github.com/kubernetes/kubernetes/pull/95439), [@HerrNaN](https://github.com/HerrNaN)) [SIG CLI]
-- Base-images: Update to debian-iptables:buster-v1.3.0
- - Uses iptables 1.8.5
- - base-images: Update to debian-base:buster-v1.2.0
- - cluster/images/etcd: Build etcd:3.4.13-1 image
- - Uses debian-base:buster-v1.2.0 ([#94733](https://github.com/kubernetes/kubernetes/pull/94733), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, Release and Testing]
-- Changed: default "Accept-Encoding" header removed from HTTP probes. See https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#http-probes ([#96127](https://github.com/kubernetes/kubernetes/pull/96127), [@fonsecas72](https://github.com/fonsecas72)) [SIG Network and Node]
-- Client-go header logging (at verbosity levels >= 9) now masks `Authorization` header contents ([#95316](https://github.com/kubernetes/kubernetes/pull/95316), [@sfowl](https://github.com/sfowl)) [SIG API Machinery]
-- Decrease warning message frequency on setting volume ownership for configmap/secret. ([#92878](https://github.com/kubernetes/kubernetes/pull/92878), [@jvanz](https://github.com/jvanz))
-- Enhance log information of verifyRunAsNonRoot, add pod, container information ([#94911](https://github.com/kubernetes/kubernetes/pull/94911), [@wawa0210](https://github.com/wawa0210)) [SIG Node]
-- Fix func name NewCreateCreateDeploymentOptions ([#91931](https://github.com/kubernetes/kubernetes/pull/91931), [@lixiaobing1](https://github.com/lixiaobing1)) [SIG CLI]
-- Fix kubelet to properly log when a container is started. Previously, kubelet may log that container is dead and was restarted when it was actually started for the first time. This behavior only happened on pods with initContainers and regular containers. ([#91469](https://github.com/kubernetes/kubernetes/pull/91469), [@rata](https://github.com/rata))
-- Fixes the message about no auth for metrics in scheduler. ([#94035](https://github.com/kubernetes/kubernetes/pull/94035), [@zhouya0](https://github.com/zhouya0)) [SIG Scheduling]
-- Generators for services are removed from kubectl ([#95256](https://github.com/kubernetes/kubernetes/pull/95256), [@Git-Jiro](https://github.com/Git-Jiro)) [SIG CLI]
-- Introduce kubectl-convert plugin. ([#96190](https://github.com/kubernetes/kubernetes/pull/96190), [@soltysh](https://github.com/soltysh)) [SIG CLI and Testing]
-- Kube-scheduler now logs processed component config at startup ([#96426](https://github.com/kubernetes/kubernetes/pull/96426), [@damemi](https://github.com/damemi)) [SIG Scheduling]
-- Kubeadm: Separate argument key/value in log msg ([#94016](https://github.com/kubernetes/kubernetes/pull/94016), [@mrueg](https://github.com/mrueg)) [SIG Cluster Lifecycle]
-- Kubeadm: remove the CoreDNS check for known image digests when applying the addon ([#94506](https://github.com/kubernetes/kubernetes/pull/94506), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: update the default pause image version to 1.4.0 on Windows. With this update the image supports Windows versions 1809 (2019LTS), 1903, 1909, 2004 ([#95419](https://github.com/kubernetes/kubernetes/pull/95419), [@jsturtevant](https://github.com/jsturtevant)) [SIG Cluster Lifecycle and Windows]
-- Kubectl: the `generator` flag of `kubectl autoscale` has been deprecated and has no effect, it will be removed in a feature release ([#92998](https://github.com/kubernetes/kubernetes/pull/92998), [@SataQiu](https://github.com/SataQiu)) [SIG CLI]
-- Lock ExternalPolicyForExternalIP to default, this feature gate will be removed in 1.22. ([#94581](https://github.com/kubernetes/kubernetes/pull/94581), [@knabben](https://github.com/knabben)) [SIG Network]
-- Mask ceph RBD adminSecrets in logs when logLevel >= 4. ([#95245](https://github.com/kubernetes/kubernetes/pull/95245), [@sfowl](https://github.com/sfowl))
-- Remove offensive words from kubectl cluster-info command. ([#95202](https://github.com/kubernetes/kubernetes/pull/95202), [@rikatz](https://github.com/rikatz))
-- Remove support for "ci/k8s-master" version label in kubeadm, use "ci/latest" instead. See [kubernetes/test-infra#18517](https://github.com/kubernetes/test-infra/pull/18517). ([#93626](https://github.com/kubernetes/kubernetes/pull/93626), [@vikkyomkar](https://github.com/vikkyomkar))
-- Remove the dependency of csi-translation-lib module on apiserver/cloud-provider/controller-manager ([#95543](https://github.com/kubernetes/kubernetes/pull/95543), [@wawa0210](https://github.com/wawa0210)) [SIG Release]
-- Scheduler framework interface moved from pkg/scheduler/framework/v1alpha to pkg/scheduler/framework ([#95069](https://github.com/kubernetes/kubernetes/pull/95069), [@farah](https://github.com/farah)) [SIG Scheduling, Storage and Testing]
-- Service.beta.kubernetes.io/azure-load-balancer-disable-tcp-reset is removed. All Standard load balancers will always enable tcp resets. ([#94297](https://github.com/kubernetes/kubernetes/pull/94297), [@MarcPow](https://github.com/MarcPow)) [SIG Cloud Provider]
-- Stop propagating SelfLink (deprecated in 1.16) in kube-apiserver ([#94397](https://github.com/kubernetes/kubernetes/pull/94397), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery and Testing]
-- Strip unnecessary security contexts on Windows ([#93475](https://github.com/kubernetes/kubernetes/pull/93475), [@ravisantoshgudimetla](https://github.com/ravisantoshgudimetla)) [SIG Node, Testing and Windows]
-- To ensure the code be strong, add unit test for GetAddressAndDialer ([#93180](https://github.com/kubernetes/kubernetes/pull/93180), [@FreeZhang61](https://github.com/FreeZhang61)) [SIG Node]
-- UDP and SCTP protocols can left stale connections that need to be cleared to avoid services disruption, but they can cause problems that are hard to debug.
- Kubernetes components using a loglevel greater or equal than 4 will log the conntrack operations and its output, to show the entries that were deleted. ([#95694](https://github.com/kubernetes/kubernetes/pull/95694), [@aojea](https://github.com/aojea)) [SIG Network]
-- Update CNI plugins to v0.8.7 ([#94367](https://github.com/kubernetes/kubernetes/pull/94367), [@justaugustus](https://github.com/justaugustus)) [SIG Cloud Provider, Network, Node, Release and Testing]
-- Update cri-tools to [v1.19.0](https://github.com/kubernetes-sigs/cri-tools/releases/tag/v1.19.0) ([#94307](https://github.com/kubernetes/kubernetes/pull/94307), [@xmudrii](https://github.com/xmudrii)) [SIG Cloud Provider]
-- Update etcd client side to v3.4.13 ([#94259](https://github.com/kubernetes/kubernetes/pull/94259), [@jingyih](https://github.com/jingyih)) [SIG API Machinery and Cloud Provider]
-- Users will now be able to configure all supported values for AWS NLB health check interval and thresholds for new resources. ([#96312](https://github.com/kubernetes/kubernetes/pull/96312), [@kishorj](https://github.com/kishorj)) [SIG Cloud Provider]
-- V1helpers.MatchNodeSelectorTerms now accepts just a Node and a list of Terms ([#95871](https://github.com/kubernetes/kubernetes/pull/95871), [@damemi](https://github.com/damemi)) [SIG Apps, Scheduling and Storage]
-- Vsphere: improve logging message on node cache refresh event ([#95236](https://github.com/kubernetes/kubernetes/pull/95236), [@andrewsykim](https://github.com/andrewsykim)) [SIG Cloud Provider]
-- `MatchNodeSelectorTerms` function moved to `k8s.io/component-helpers` ([#95531](https://github.com/kubernetes/kubernetes/pull/95531), [@damemi](https://github.com/damemi)) [SIG Apps, Scheduling and Storage]
-- `kubectl api-resources` now prints the API version (as 'API group/version', same as output of `kubectl api-versions`). The column APIGROUP is now APIVERSION ([#95253](https://github.com/kubernetes/kubernetes/pull/95253), [@sallyom](https://github.com/sallyom)) [SIG CLI]
-- `kubectl get ingress` now prefers the `networking.k8s.io/v1` over `extensions/v1beta1` (deprecated since v1.14). To explicitly request the deprecated version, use `kubectl get ingress.v1beta1.extensions`. ([#94309](https://github.com/kubernetes/kubernetes/pull/94309), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and CLI]
-
-## Dependencies
-
-### Added
-- cloud.google.com/go/firestore: v1.1.0
-- github.com/Azure/go-autorest: [v14.2.0+incompatible](https://github.com/Azure/go-autorest/tree/v14.2.0)
-- github.com/armon/go-metrics: [f0300d1](https://github.com/armon/go-metrics/tree/f0300d1)
-- github.com/armon/go-radix: [7fddfc3](https://github.com/armon/go-radix/tree/7fddfc3)
-- github.com/bketelsen/crypt: [5cbc8cc](https://github.com/bketelsen/crypt/tree/5cbc8cc)
-- github.com/form3tech-oss/jwt-go: [v3.2.2+incompatible](https://github.com/form3tech-oss/jwt-go/tree/v3.2.2)
-- github.com/fvbommel/sortorder: [v1.0.1](https://github.com/fvbommel/sortorder/tree/v1.0.1)
-- github.com/hashicorp/consul/api: [v1.1.0](https://github.com/hashicorp/consul/api/tree/v1.1.0)
-- github.com/hashicorp/consul/sdk: [v0.1.1](https://github.com/hashicorp/consul/sdk/tree/v0.1.1)
-- github.com/hashicorp/errwrap: [v1.0.0](https://github.com/hashicorp/errwrap/tree/v1.0.0)
-- github.com/hashicorp/go-cleanhttp: [v0.5.1](https://github.com/hashicorp/go-cleanhttp/tree/v0.5.1)
-- github.com/hashicorp/go-immutable-radix: [v1.0.0](https://github.com/hashicorp/go-immutable-radix/tree/v1.0.0)
-- github.com/hashicorp/go-msgpack: [v0.5.3](https://github.com/hashicorp/go-msgpack/tree/v0.5.3)
-- github.com/hashicorp/go-multierror: [v1.0.0](https://github.com/hashicorp/go-multierror/tree/v1.0.0)
-- github.com/hashicorp/go-rootcerts: [v1.0.0](https://github.com/hashicorp/go-rootcerts/tree/v1.0.0)
-- github.com/hashicorp/go-sockaddr: [v1.0.0](https://github.com/hashicorp/go-sockaddr/tree/v1.0.0)
-- github.com/hashicorp/go-uuid: [v1.0.1](https://github.com/hashicorp/go-uuid/tree/v1.0.1)
-- github.com/hashicorp/go.net: [v0.0.1](https://github.com/hashicorp/go.net/tree/v0.0.1)
-- github.com/hashicorp/logutils: [v1.0.0](https://github.com/hashicorp/logutils/tree/v1.0.0)
-- github.com/hashicorp/mdns: [v1.0.0](https://github.com/hashicorp/mdns/tree/v1.0.0)
-- github.com/hashicorp/memberlist: [v0.1.3](https://github.com/hashicorp/memberlist/tree/v0.1.3)
-- github.com/hashicorp/serf: [v0.8.2](https://github.com/hashicorp/serf/tree/v0.8.2)
-- github.com/jmespath/go-jmespath/internal/testify: [v1.5.1](https://github.com/jmespath/go-jmespath/internal/testify/tree/v1.5.1)
-- github.com/mitchellh/cli: [v1.0.0](https://github.com/mitchellh/cli/tree/v1.0.0)
-- github.com/mitchellh/go-testing-interface: [v1.0.0](https://github.com/mitchellh/go-testing-interface/tree/v1.0.0)
-- github.com/mitchellh/gox: [v0.4.0](https://github.com/mitchellh/gox/tree/v0.4.0)
-- github.com/mitchellh/iochan: [v1.0.0](https://github.com/mitchellh/iochan/tree/v1.0.0)
-- github.com/pascaldekloe/goe: [57f6aae](https://github.com/pascaldekloe/goe/tree/57f6aae)
-- github.com/posener/complete: [v1.1.1](https://github.com/posener/complete/tree/v1.1.1)
-- github.com/ryanuber/columnize: [9b3edd6](https://github.com/ryanuber/columnize/tree/9b3edd6)
-- github.com/sean-/seed: [e2103e2](https://github.com/sean-/seed/tree/e2103e2)
-- github.com/subosito/gotenv: [v1.2.0](https://github.com/subosito/gotenv/tree/v1.2.0)
-- github.com/willf/bitset: [d5bec33](https://github.com/willf/bitset/tree/d5bec33)
-- gopkg.in/ini.v1: v1.51.0
-- gopkg.in/yaml.v3: 9f266ea
-- rsc.io/quote/v3: v3.1.0
-- rsc.io/sampler: v1.3.0
-
-### Changed
-- cloud.google.com/go/bigquery: v1.0.1 → v1.4.0
-- cloud.google.com/go/datastore: v1.0.0 → v1.1.0
-- cloud.google.com/go/pubsub: v1.0.1 → v1.2.0
-- cloud.google.com/go/storage: v1.0.0 → v1.6.0
-- cloud.google.com/go: v0.51.0 → v0.54.0
-- github.com/Azure/go-autorest/autorest/adal: [v0.8.2 → v0.9.5](https://github.com/Azure/go-autorest/autorest/adal/compare/v0.8.2...v0.9.5)
-- github.com/Azure/go-autorest/autorest/date: [v0.2.0 → v0.3.0](https://github.com/Azure/go-autorest/autorest/date/compare/v0.2.0...v0.3.0)
-- github.com/Azure/go-autorest/autorest/mocks: [v0.3.0 → v0.4.1](https://github.com/Azure/go-autorest/autorest/mocks/compare/v0.3.0...v0.4.1)
-- github.com/Azure/go-autorest/autorest: [v0.9.6 → v0.11.1](https://github.com/Azure/go-autorest/autorest/compare/v0.9.6...v0.11.1)
-- github.com/Azure/go-autorest/logger: [v0.1.0 → v0.2.0](https://github.com/Azure/go-autorest/logger/compare/v0.1.0...v0.2.0)
-- github.com/Azure/go-autorest/tracing: [v0.5.0 → v0.6.0](https://github.com/Azure/go-autorest/tracing/compare/v0.5.0...v0.6.0)
-- github.com/Microsoft/go-winio: [fc70bd9 → v0.4.15](https://github.com/Microsoft/go-winio/compare/fc70bd9...v0.4.15)
-- github.com/aws/aws-sdk-go: [v1.28.2 → v1.35.24](https://github.com/aws/aws-sdk-go/compare/v1.28.2...v1.35.24)
-- github.com/blang/semver: [v3.5.0+incompatible → v3.5.1+incompatible](https://github.com/blang/semver/compare/v3.5.0...v3.5.1)
-- github.com/checkpoint-restore/go-criu/v4: [v4.0.2 → v4.1.0](https://github.com/checkpoint-restore/go-criu/v4/compare/v4.0.2...v4.1.0)
-- github.com/containerd/containerd: [v1.3.3 → v1.4.1](https://github.com/containerd/containerd/compare/v1.3.3...v1.4.1)
-- github.com/containerd/ttrpc: [v1.0.0 → v1.0.2](https://github.com/containerd/ttrpc/compare/v1.0.0...v1.0.2)
-- github.com/containerd/typeurl: [v1.0.0 → v1.0.1](https://github.com/containerd/typeurl/compare/v1.0.0...v1.0.1)
-- github.com/coreos/etcd: [v3.3.10+incompatible → v3.3.13+incompatible](https://github.com/coreos/etcd/compare/v3.3.10...v3.3.13)
-- github.com/docker/docker: [aa6a989 → bd33bbf](https://github.com/docker/docker/compare/aa6a989...bd33bbf)
-- github.com/go-gl/glfw/v3.3/glfw: [12ad95a → 6f7a984](https://github.com/go-gl/glfw/v3.3/glfw/compare/12ad95a...6f7a984)
-- github.com/golang/groupcache: [215e871 → 8c9f03a](https://github.com/golang/groupcache/compare/215e871...8c9f03a)
-- github.com/golang/mock: [v1.3.1 → v1.4.1](https://github.com/golang/mock/compare/v1.3.1...v1.4.1)
-- github.com/golang/protobuf: [v1.4.2 → v1.4.3](https://github.com/golang/protobuf/compare/v1.4.2...v1.4.3)
-- github.com/google/cadvisor: [v0.37.0 → v0.38.5](https://github.com/google/cadvisor/compare/v0.37.0...v0.38.5)
-- github.com/google/go-cmp: [v0.4.0 → v0.5.2](https://github.com/google/go-cmp/compare/v0.4.0...v0.5.2)
-- github.com/google/pprof: [d4f498a → 1ebb73c](https://github.com/google/pprof/compare/d4f498a...1ebb73c)
-- github.com/google/uuid: [v1.1.1 → v1.1.2](https://github.com/google/uuid/compare/v1.1.1...v1.1.2)
-- github.com/gorilla/mux: [v1.7.3 → v1.8.0](https://github.com/gorilla/mux/compare/v1.7.3...v1.8.0)
-- github.com/gorilla/websocket: [v1.4.0 → v1.4.2](https://github.com/gorilla/websocket/compare/v1.4.0...v1.4.2)
-- github.com/jmespath/go-jmespath: [c2b33e8 → v0.4.0](https://github.com/jmespath/go-jmespath/compare/c2b33e8...v0.4.0)
-- github.com/karrick/godirwalk: [v1.7.5 → v1.16.1](https://github.com/karrick/godirwalk/compare/v1.7.5...v1.16.1)
-- github.com/opencontainers/go-digest: [v1.0.0-rc1 → v1.0.0](https://github.com/opencontainers/go-digest/compare/v1.0.0-rc1...v1.0.0)
-- github.com/opencontainers/runc: [819fcc6 → v1.0.0-rc92](https://github.com/opencontainers/runc/compare/819fcc6...v1.0.0-rc92)
-- github.com/opencontainers/runtime-spec: [237cc4f → 4d89ac9](https://github.com/opencontainers/runtime-spec/compare/237cc4f...4d89ac9)
-- github.com/opencontainers/selinux: [v1.5.2 → v1.6.0](https://github.com/opencontainers/selinux/compare/v1.5.2...v1.6.0)
-- github.com/prometheus/procfs: [v0.1.3 → v0.2.0](https://github.com/prometheus/procfs/compare/v0.1.3...v0.2.0)
-- github.com/quobyte/api: [v0.1.2 → v0.1.8](https://github.com/quobyte/api/compare/v0.1.2...v0.1.8)
-- github.com/spf13/cobra: [v1.0.0 → v1.1.1](https://github.com/spf13/cobra/compare/v1.0.0...v1.1.1)
-- github.com/spf13/viper: [v1.4.0 → v1.7.0](https://github.com/spf13/viper/compare/v1.4.0...v1.7.0)
-- github.com/storageos/go-api: [343b3ef → v2.2.0+incompatible](https://github.com/storageos/go-api/compare/343b3ef...v2.2.0)
-- github.com/stretchr/testify: [v1.4.0 → v1.6.1](https://github.com/stretchr/testify/compare/v1.4.0...v1.6.1)
-- github.com/vishvananda/netns: [52d707b → db3c7e5](https://github.com/vishvananda/netns/compare/52d707b...db3c7e5)
-- go.etcd.io/etcd: 17cef6e → dd1b699
-- go.opencensus.io: v0.22.2 → v0.22.3
-- golang.org/x/crypto: 75b2880 → 7f63de1
-- golang.org/x/exp: da58074 → 6cc2880
-- golang.org/x/lint: fdd1cda → 738671d
-- golang.org/x/net: ab34263 → 69a7880
-- golang.org/x/oauth2: 858c2ad → bf48bf1
-- golang.org/x/sys: ed371f2 → 5cba982
-- golang.org/x/text: v0.3.3 → v0.3.4
-- golang.org/x/time: 555d28b → 3af7569
-- golang.org/x/xerrors: 9bdfabe → 5ec99f8
-- google.golang.org/api: v0.15.1 → v0.20.0
-- google.golang.org/genproto: cb27e3a → 8816d57
-- google.golang.org/grpc: v1.27.0 → v1.27.1
-- google.golang.org/protobuf: v1.24.0 → v1.25.0
-- honnef.co/go/tools: v0.0.1-2019.2.3 → v0.0.1-2020.1.3
-- k8s.io/gengo: 8167cfd → 83324d8
-- k8s.io/klog/v2: v2.2.0 → v2.4.0
-- k8s.io/kube-openapi: 6aeccd4 → d219536
-- k8s.io/system-validators: v1.1.2 → v1.2.0
-- k8s.io/utils: d5654de → 67b214c
-- sigs.k8s.io/apiserver-network-proxy/konnectivity-client: v0.0.9 → v0.0.14
-- sigs.k8s.io/structured-merge-diff/v4: v4.0.1 → v4.0.2
-
-### Removed
-- github.com/armon/consul-api: [eb2c6b5](https://github.com/armon/consul-api/tree/eb2c6b5)
-- github.com/go-ini/ini: [v1.9.0](https://github.com/go-ini/ini/tree/v1.9.0)
-- github.com/ugorji/go: [v1.1.4](https://github.com/ugorji/go/tree/v1.1.4)
-- github.com/xlab/handysort: [fb3537e](https://github.com/xlab/handysort/tree/fb3537e)
-- github.com/xordataexchange/crypt: [b2862e3](https://github.com/xordataexchange/crypt/tree/b2862e3)
-- vbom.ml/util: db5cfe1
-
-
-## Dependencies
-
-### Added
-- cloud.google.com/go/firestore: v1.1.0
-- github.com/Azure/go-autorest: [v14.2.0+incompatible](https://github.com/Azure/go-autorest/tree/v14.2.0)
-- github.com/armon/go-metrics: [f0300d1](https://github.com/armon/go-metrics/tree/f0300d1)
-- github.com/armon/go-radix: [7fddfc3](https://github.com/armon/go-radix/tree/7fddfc3)
-- github.com/bketelsen/crypt: [5cbc8cc](https://github.com/bketelsen/crypt/tree/5cbc8cc)
-- github.com/form3tech-oss/jwt-go: [v3.2.2+incompatible](https://github.com/form3tech-oss/jwt-go/tree/v3.2.2)
-- github.com/fvbommel/sortorder: [v1.0.1](https://github.com/fvbommel/sortorder/tree/v1.0.1)
-- github.com/hashicorp/consul/api: [v1.1.0](https://github.com/hashicorp/consul/api/tree/v1.1.0)
-- github.com/hashicorp/consul/sdk: [v0.1.1](https://github.com/hashicorp/consul/sdk/tree/v0.1.1)
-- github.com/hashicorp/errwrap: [v1.0.0](https://github.com/hashicorp/errwrap/tree/v1.0.0)
-- github.com/hashicorp/go-cleanhttp: [v0.5.1](https://github.com/hashicorp/go-cleanhttp/tree/v0.5.1)
-- github.com/hashicorp/go-immutable-radix: [v1.0.0](https://github.com/hashicorp/go-immutable-radix/tree/v1.0.0)
-- github.com/hashicorp/go-msgpack: [v0.5.3](https://github.com/hashicorp/go-msgpack/tree/v0.5.3)
-- github.com/hashicorp/go-multierror: [v1.0.0](https://github.com/hashicorp/go-multierror/tree/v1.0.0)
-- github.com/hashicorp/go-rootcerts: [v1.0.0](https://github.com/hashicorp/go-rootcerts/tree/v1.0.0)
-- github.com/hashicorp/go-sockaddr: [v1.0.0](https://github.com/hashicorp/go-sockaddr/tree/v1.0.0)
-- github.com/hashicorp/go-uuid: [v1.0.1](https://github.com/hashicorp/go-uuid/tree/v1.0.1)
-- github.com/hashicorp/go.net: [v0.0.1](https://github.com/hashicorp/go.net/tree/v0.0.1)
-- github.com/hashicorp/logutils: [v1.0.0](https://github.com/hashicorp/logutils/tree/v1.0.0)
-- github.com/hashicorp/mdns: [v1.0.0](https://github.com/hashicorp/mdns/tree/v1.0.0)
-- github.com/hashicorp/memberlist: [v0.1.3](https://github.com/hashicorp/memberlist/tree/v0.1.3)
-- github.com/hashicorp/serf: [v0.8.2](https://github.com/hashicorp/serf/tree/v0.8.2)
-- github.com/jmespath/go-jmespath/internal/testify: [v1.5.1](https://github.com/jmespath/go-jmespath/internal/testify/tree/v1.5.1)
-- github.com/mitchellh/cli: [v1.0.0](https://github.com/mitchellh/cli/tree/v1.0.0)
-- github.com/mitchellh/go-testing-interface: [v1.0.0](https://github.com/mitchellh/go-testing-interface/tree/v1.0.0)
-- github.com/mitchellh/gox: [v0.4.0](https://github.com/mitchellh/gox/tree/v0.4.0)
-- github.com/mitchellh/iochan: [v1.0.0](https://github.com/mitchellh/iochan/tree/v1.0.0)
-- github.com/pascaldekloe/goe: [57f6aae](https://github.com/pascaldekloe/goe/tree/57f6aae)
-- github.com/posener/complete: [v1.1.1](https://github.com/posener/complete/tree/v1.1.1)
-- github.com/ryanuber/columnize: [9b3edd6](https://github.com/ryanuber/columnize/tree/9b3edd6)
-- github.com/sean-/seed: [e2103e2](https://github.com/sean-/seed/tree/e2103e2)
-- github.com/subosito/gotenv: [v1.2.0](https://github.com/subosito/gotenv/tree/v1.2.0)
-- github.com/willf/bitset: [d5bec33](https://github.com/willf/bitset/tree/d5bec33)
-- gopkg.in/ini.v1: v1.51.0
-- gopkg.in/yaml.v3: 9f266ea
-- rsc.io/quote/v3: v3.1.0
-- rsc.io/sampler: v1.3.0
-
-### Changed
-- cloud.google.com/go/bigquery: v1.0.1 → v1.4.0
-- cloud.google.com/go/datastore: v1.0.0 → v1.1.0
-- cloud.google.com/go/pubsub: v1.0.1 → v1.2.0
-- cloud.google.com/go/storage: v1.0.0 → v1.6.0
-- cloud.google.com/go: v0.51.0 → v0.54.0
-- github.com/Azure/go-autorest/autorest/adal: [v0.8.2 → v0.9.5](https://github.com/Azure/go-autorest/autorest/adal/compare/v0.8.2...v0.9.5)
-- github.com/Azure/go-autorest/autorest/date: [v0.2.0 → v0.3.0](https://github.com/Azure/go-autorest/autorest/date/compare/v0.2.0...v0.3.0)
-- github.com/Azure/go-autorest/autorest/mocks: [v0.3.0 → v0.4.1](https://github.com/Azure/go-autorest/autorest/mocks/compare/v0.3.0...v0.4.1)
-- github.com/Azure/go-autorest/autorest: [v0.9.6 → v0.11.1](https://github.com/Azure/go-autorest/autorest/compare/v0.9.6...v0.11.1)
-- github.com/Azure/go-autorest/logger: [v0.1.0 → v0.2.0](https://github.com/Azure/go-autorest/logger/compare/v0.1.0...v0.2.0)
-- github.com/Azure/go-autorest/tracing: [v0.5.0 → v0.6.0](https://github.com/Azure/go-autorest/tracing/compare/v0.5.0...v0.6.0)
-- github.com/Microsoft/go-winio: [fc70bd9 → v0.4.15](https://github.com/Microsoft/go-winio/compare/fc70bd9...v0.4.15)
-- github.com/aws/aws-sdk-go: [v1.28.2 → v1.35.24](https://github.com/aws/aws-sdk-go/compare/v1.28.2...v1.35.24)
-- github.com/blang/semver: [v3.5.0+incompatible → v3.5.1+incompatible](https://github.com/blang/semver/compare/v3.5.0...v3.5.1)
-- github.com/checkpoint-restore/go-criu/v4: [v4.0.2 → v4.1.0](https://github.com/checkpoint-restore/go-criu/v4/compare/v4.0.2...v4.1.0)
-- github.com/containerd/containerd: [v1.3.3 → v1.4.1](https://github.com/containerd/containerd/compare/v1.3.3...v1.4.1)
-- github.com/containerd/ttrpc: [v1.0.0 → v1.0.2](https://github.com/containerd/ttrpc/compare/v1.0.0...v1.0.2)
-- github.com/containerd/typeurl: [v1.0.0 → v1.0.1](https://github.com/containerd/typeurl/compare/v1.0.0...v1.0.1)
-- github.com/coreos/etcd: [v3.3.10+incompatible → v3.3.13+incompatible](https://github.com/coreos/etcd/compare/v3.3.10...v3.3.13)
-- github.com/docker/docker: [aa6a989 → bd33bbf](https://github.com/docker/docker/compare/aa6a989...bd33bbf)
-- github.com/go-gl/glfw/v3.3/glfw: [12ad95a → 6f7a984](https://github.com/go-gl/glfw/v3.3/glfw/compare/12ad95a...6f7a984)
-- github.com/golang/groupcache: [215e871 → 8c9f03a](https://github.com/golang/groupcache/compare/215e871...8c9f03a)
-- github.com/golang/mock: [v1.3.1 → v1.4.1](https://github.com/golang/mock/compare/v1.3.1...v1.4.1)
-- github.com/golang/protobuf: [v1.4.2 → v1.4.3](https://github.com/golang/protobuf/compare/v1.4.2...v1.4.3)
-- github.com/google/cadvisor: [v0.37.0 → v0.38.5](https://github.com/google/cadvisor/compare/v0.37.0...v0.38.5)
-- github.com/google/go-cmp: [v0.4.0 → v0.5.2](https://github.com/google/go-cmp/compare/v0.4.0...v0.5.2)
-- github.com/google/pprof: [d4f498a → 1ebb73c](https://github.com/google/pprof/compare/d4f498a...1ebb73c)
-- github.com/google/uuid: [v1.1.1 → v1.1.2](https://github.com/google/uuid/compare/v1.1.1...v1.1.2)
-- github.com/gorilla/mux: [v1.7.3 → v1.8.0](https://github.com/gorilla/mux/compare/v1.7.3...v1.8.0)
-- github.com/gorilla/websocket: [v1.4.0 → v1.4.2](https://github.com/gorilla/websocket/compare/v1.4.0...v1.4.2)
-- github.com/jmespath/go-jmespath: [c2b33e8 → v0.4.0](https://github.com/jmespath/go-jmespath/compare/c2b33e8...v0.4.0)
-- github.com/karrick/godirwalk: [v1.7.5 → v1.16.1](https://github.com/karrick/godirwalk/compare/v1.7.5...v1.16.1)
-- github.com/opencontainers/go-digest: [v1.0.0-rc1 → v1.0.0](https://github.com/opencontainers/go-digest/compare/v1.0.0-rc1...v1.0.0)
-- github.com/opencontainers/runc: [819fcc6 → v1.0.0-rc92](https://github.com/opencontainers/runc/compare/819fcc6...v1.0.0-rc92)
-- github.com/opencontainers/runtime-spec: [237cc4f → 4d89ac9](https://github.com/opencontainers/runtime-spec/compare/237cc4f...4d89ac9)
-- github.com/opencontainers/selinux: [v1.5.2 → v1.6.0](https://github.com/opencontainers/selinux/compare/v1.5.2...v1.6.0)
-- github.com/prometheus/procfs: [v0.1.3 → v0.2.0](https://github.com/prometheus/procfs/compare/v0.1.3...v0.2.0)
-- github.com/quobyte/api: [v0.1.2 → v0.1.8](https://github.com/quobyte/api/compare/v0.1.2...v0.1.8)
-- github.com/spf13/cobra: [v1.0.0 → v1.1.1](https://github.com/spf13/cobra/compare/v1.0.0...v1.1.1)
-- github.com/spf13/viper: [v1.4.0 → v1.7.0](https://github.com/spf13/viper/compare/v1.4.0...v1.7.0)
-- github.com/storageos/go-api: [343b3ef → v2.2.0+incompatible](https://github.com/storageos/go-api/compare/343b3ef...v2.2.0)
-- github.com/stretchr/testify: [v1.4.0 → v1.6.1](https://github.com/stretchr/testify/compare/v1.4.0...v1.6.1)
-- github.com/vishvananda/netns: [52d707b → db3c7e5](https://github.com/vishvananda/netns/compare/52d707b...db3c7e5)
-- go.etcd.io/etcd: 17cef6e → dd1b699
-- go.opencensus.io: v0.22.2 → v0.22.3
-- golang.org/x/crypto: 75b2880 → 7f63de1
-- golang.org/x/exp: da58074 → 6cc2880
-- golang.org/x/lint: fdd1cda → 738671d
-- golang.org/x/net: ab34263 → 69a7880
-- golang.org/x/oauth2: 858c2ad → bf48bf1
-- golang.org/x/sys: ed371f2 → 5cba982
-- golang.org/x/text: v0.3.3 → v0.3.4
-- golang.org/x/time: 555d28b → 3af7569
-- golang.org/x/xerrors: 9bdfabe → 5ec99f8
-- google.golang.org/api: v0.15.1 → v0.20.0
-- google.golang.org/genproto: cb27e3a → 8816d57
-- google.golang.org/grpc: v1.27.0 → v1.27.1
-- google.golang.org/protobuf: v1.24.0 → v1.25.0
-- honnef.co/go/tools: v0.0.1-2019.2.3 → v0.0.1-2020.1.3
-- k8s.io/gengo: 8167cfd → 83324d8
-- k8s.io/klog/v2: v2.2.0 → v2.4.0
-- k8s.io/kube-openapi: 6aeccd4 → d219536
-- k8s.io/system-validators: v1.1.2 → v1.2.0
-- k8s.io/utils: d5654de → 67b214c
-- sigs.k8s.io/apiserver-network-proxy/konnectivity-client: v0.0.9 → v0.0.14
-- sigs.k8s.io/structured-merge-diff/v4: v4.0.1 → v4.0.2
-
-### Removed
-- github.com/armon/consul-api: [eb2c6b5](https://github.com/armon/consul-api/tree/eb2c6b5)
-- github.com/go-ini/ini: [v1.9.0](https://github.com/go-ini/ini/tree/v1.9.0)
-- github.com/ugorji/go: [v1.1.4](https://github.com/ugorji/go/tree/v1.1.4)
-- github.com/xlab/handysort: [fb3537e](https://github.com/xlab/handysort/tree/fb3537e)
-- github.com/xordataexchange/crypt: [b2862e3](https://github.com/xordataexchange/crypt/tree/b2862e3)
-- vbom.ml/util: db5cfe1
-
-
-
-# v1.20.0-rc.0
-
-
-## Downloads for v1.20.0-rc.0
-
-### Source Code
-
-filename | sha512 hash
--------- | -----------
-[kubernetes.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes.tar.gz) | acfee8658831f9503fccda0904798405434f17be7064a361a9f34c6ed04f1c0f685e79ca40cef5fcf34e3193bacbf467665e8dc277e0562ebdc929170034b5ae
-[kubernetes-src.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-src.tar.gz) | 9d962f8845e1fa221649cf0c0e178f0f03808486c49ea15ab5ec67861ec5aa948cf18bc0ee9b2067643c8332227973dd592e6a4457456a9d9d80e8ef28d5f7c3
-
-### Client binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-client-darwin-amd64.tar.gz) | 062b57f1a450fe01d6184f104d81d376bdf5720010412821e315fd9b1b622a400ac91f996540daa66cee172006f3efade4eccc19265494f1a1d7cc9450f0b50a
-[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-client-linux-386.tar.gz) | 86e96d2c2046c5e62e02bef30a6643f25e01f1b3eba256cab7dd61252908540c26cb058490e9cecc5a9bad97d2b577f5968884e9f1a90237e302419f39e068bc
-[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-client-linux-amd64.tar.gz) | 619d3afb9ce902368390e71633396010e88e87c5fd848e3adc71571d1d4a25be002588415e5f83afee82460f8a7c9e0bd968335277cb8f8cb51e58d4bb43e64e
-[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-client-linux-arm.tar.gz) | 60965150a60ab3d05a248339786e0c7da4b89a04539c3719737b13d71302bac1dd9bcaa427d8a1f84a7b42d0c67801dce2de0005e9e47d21122868b32ac3d40f
-[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-client-linux-arm64.tar.gz) | 688e064f4ef6a17189dbb5af468c279b9de35e215c40500fb97b1d46692d222747023f9e07a7f7ba006400f9532a8912e69d7c5143f956b1dadca144c67ee711
-[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-client-linux-ppc64le.tar.gz) | 47b8abc02b42b3b1de67da184921b5801d7e3cb09befac840c85913193fc5ac4e5e3ecfcb57da6b686ff21af9a3bd42ae6949d4744dbe6ad976794340e328b83
-[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-client-linux-s390x.tar.gz) | 971b41d3169f30e6c412e0254c180636abb7ccc8dcee6641b0e9877b69752fc61aa30b76c19c108969df654fe385da3cb3a44dd59d3c28dc45561392d7e08874
-[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-client-windows-386.tar.gz) | 2d34e8387e31531d9aca5655f2f0d18e75b01825dc1c39b7beb73a7b7b610e2ba429e5ca97d5c41a71b67e75e7096c86ab63fda9baab4c0878c1ccb3a1aefac8
-[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-client-windows-amd64.tar.gz) | f909640f4140693bb871936f10a40e79b43502105d0adb318b35bb7a64a770ad9d05a3a732368ccd3d15d496d75454789165bd1f5c2571da9a00569b3e6c007c
-
-### Server binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-server-linux-amd64.tar.gz) | 0ea4458ae34108c633b4d48f1f128c6274dbc82b613492e78b3e0a2f656ac0df0bb9a75124e15d67c8e81850adcecf19f4ab0234c17247ee7ddf84f2df3e5eaa
-[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-server-linux-arm.tar.gz) | aef6a4d457faa29936603370f29a8523bb274211c3cb5101bd31aaf469c91ba6bd149ea99a4ccdd83352cf37e4d6508c5ee475ec10292bccd2f77ceea31e1c28
-[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-server-linux-arm64.tar.gz) | 4829f473e9d60f9929ad17c70fdc2b6b6509ed75418be0b23a75b28580949736cb5b0bd6382070f93aa0a2a8863f0b1596daf965186ca749996c29d03ef7d8b8
-[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-server-linux-ppc64le.tar.gz) | 9ab0790d382a3e28df1c013762c09da0085449cfd09d176d80be932806c24a715ea829be0075c3e221a2ad9cf06e726b4c39ab41987c1fb0fee2563e48206763
-[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-server-linux-s390x.tar.gz) | 98670b587e299856dd9821b7517a35f9a65835b915b153de08b66c54d82160438b66f774bf5306c07bc956d70ff709860bc23162225da5e89f995d3fdc1f0122
-
-### Node binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-node-linux-amd64.tar.gz) | 699e9c8d1837198312eade8eb6fec390f6a2fea9e08207d2f58e8bb6e3e799028aca69e4670aac0a4ba7cf0af683aee2c158bf78cc520c80edc876c8d94d521a
-[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-node-linux-arm.tar.gz) | f3b5eab0669490e3cd7e802693daf3555d08323dfff6e73a881fce00fed4690e8bdaf1610278d9de74036ca37631016075e5695a02158b7d3e7582b20ef7fa35
-[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-node-linux-arm64.tar.gz) | e5012f77363561a609aaf791baaa17d09009819c4085a57132e5feb5366275a54640094e6ed1cba527f42b586c6d62999c2a5435edf5665ff0e114db4423c2ae
-[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-node-linux-ppc64le.tar.gz) | 2a6d6501620b1a9838dff05c66a40260cc22154a28027813346eb16e18c386bc3865298a46a0f08da71cd55149c5e7d07c4c4c431b4fd231486dd9d716548adb
-[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-node-linux-s390x.tar.gz) | 5eca02777519e31428a1e5842fe540b813fb8c929c341bbc71dcfd60d98deb89060f8f37352e8977020e21e053379eead6478eb2d54ced66fb9d38d5f3142bf0
-[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-rc.0/kubernetes-node-windows-amd64.tar.gz) | 8ace02e7623dff894e863a2e0fa7dfb916368431d1723170713fe82e334c0ae0481b370855b71e2561de0fb64fed124281be604761ec08607230b66fb9ed1c03
-
-## Changelog since v1.20.0-beta.2
-
-## Changes by Kind
-
-### Feature
-
-- Kubernetes is now built using go1.15.5
- - build: Update to k/repo-infra@v0.1.2 (supports go1.15.5) ([#95776](https://github.com/kubernetes/kubernetes/pull/95776), [@justaugustus](https://github.com/justaugustus)) [SIG Cloud Provider, Instrumentation, Release and Testing]
-
-### Failing Test
-
-- Resolves an issue running Ingress conformance tests on clusters which use finalizers on Ingress objects to manage releasing load balancer resources ([#96742](https://github.com/kubernetes/kubernetes/pull/96742), [@spencerhance](https://github.com/spencerhance)) [SIG Network and Testing]
-- The Conformance test "validates that there is no conflict between pods with same hostPort but different hostIP and protocol" now validates the connectivity to each hostPort, in addition to the functionality. ([#96627](https://github.com/kubernetes/kubernetes/pull/96627), [@aojea](https://github.com/aojea)) [SIG Scheduling and Testing]
-
-### Bug or Regression
-
-- Bump node-problem-detector version to v0.8.5 to fix OOM detection in with Linux kernels 5.1+ ([#96716](https://github.com/kubernetes/kubernetes/pull/96716), [@tosi3k](https://github.com/tosi3k)) [SIG Cloud Provider, Scalability and Testing]
-- Changes to timeout parameter handling in 1.20.0-beta.2 have been reverted to avoid breaking backwards compatibility with existing clients. ([#96727](https://github.com/kubernetes/kubernetes/pull/96727), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and Testing]
-- Duplicate owner reference entries in create/update/patch requests now get deduplicated by the API server. The client sending the request now receives a warning header in the API response. Clients should stop sending requests with duplicate owner references. The API server may reject such requests as early as 1.24. ([#96185](https://github.com/kubernetes/kubernetes/pull/96185), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery and Testing]
-- Fix: resize Azure disk issue when it's in attached state ([#96705](https://github.com/kubernetes/kubernetes/pull/96705), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fixed a bug where aggregator_unavailable_apiservice metrics were reported for deleted apiservices. ([#96421](https://github.com/kubernetes/kubernetes/pull/96421), [@dgrisonnet](https://github.com/dgrisonnet)) [SIG API Machinery and Instrumentation]
-- Fixes code generation for non-namespaced create subresources fake client test. ([#96586](https://github.com/kubernetes/kubernetes/pull/96586), [@Doude](https://github.com/Doude)) [SIG API Machinery]
-- HTTP/2 connection health check is enabled by default in all Kubernetes clients. The feature should work out-of-the-box. If needed, users can tune the feature via the HTTP2_READ_IDLE_TIMEOUT_SECONDS and HTTP2_PING_TIMEOUT_SECONDS environment variables. The feature is disabled if HTTP2_READ_IDLE_TIMEOUT_SECONDS is set to 0. ([#95981](https://github.com/kubernetes/kubernetes/pull/95981), [@caesarxuchao](https://github.com/caesarxuchao)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Node]
-- Kubeadm: fix coredns migration should be triggered when there are newdefault configs during kubeadm upgrade ([#96907](https://github.com/kubernetes/kubernetes/pull/96907), [@pacoxu](https://github.com/pacoxu)) [SIG Cluster Lifecycle]
-- Reduce volume name length for vsphere volumes ([#96533](https://github.com/kubernetes/kubernetes/pull/96533), [@gnufied](https://github.com/gnufied)) [SIG Storage]
-- Resolves a regression in 1.19+ with workloads targeting deprecated beta os/arch labels getting stuck in NodeAffinity status on node startup. ([#96810](https://github.com/kubernetes/kubernetes/pull/96810), [@liggitt](https://github.com/liggitt)) [SIG Node]
-
-## Dependencies
-
-### Added
-_Nothing has changed._
-
-### Changed
-- github.com/google/cadvisor: [v0.38.4 → v0.38.5](https://github.com/google/cadvisor/compare/v0.38.4...v0.38.5)
-
-### Removed
-_Nothing has changed._
-
-
-
-# v1.20.0-beta.2
-
-
-## Downloads for v1.20.0-beta.2
-
-### Source Code
-
-filename | sha512 hash
--------- | -----------
-[kubernetes.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes.tar.gz) | fe769280aa623802a949b6a35fbddadbba1d6f9933a54132a35625683719595ecf58096a9aa0f7456f8d4931774df21bfa98e148bc3d85913f1da915134f77bd
-[kubernetes-src.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-src.tar.gz) | ce1c8d97c52e5189af335d673bd7e99c564816f6adebf249838f7e3f0e920f323b4e398a5d163ea767091497012ec38843c59ff14e6fdd07683b682135eed645
-
-### Client binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-client-darwin-amd64.tar.gz) | d6c14bd0f6702f4bbdf14a6abdfa4e5936de5b4efee38aa86c2bd7272967ec6d7868b88fc00ad4a7c3a20717a35e6be2b84e56dec04154fd702315f641409f7c
-[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-client-linux-386.tar.gz) | b923c44cb0acb91a8f6fd442c2168aa6166c848f5d037ce50a7cb11502be3698db65836b373c916f75b648d6ac8d9158807a050eecc4e1c77cffa25b386c8cdb
-[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-client-linux-amd64.tar.gz) | 8cae14146a9034dcd4e9d69d5d700f195a77aac35f629a148960ae028ed8b4fe12213993fe3e6e464b4b3e111adebe6f3dd7ca0accc70c738ed5cfd8993edd7c
-[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-client-linux-arm.tar.gz) | 1f54e5262a0432945ead57fcb924e6bfedd9ea76db1dd9ebd946787a2923c247cf16e10505307b47e365905a1b398678dac5af0f433c439c158a33e08362d97b
-[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-client-linux-arm64.tar.gz) | 31cf79c01e4878a231b4881fe3ed5ef790bd5fb5419388438d3f8c6a2129e655aba9e00b8e1d77e0bc5d05ecc75cf4ae02cf8266788822d0306c49c85ee584ed
-[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-client-linux-ppc64le.tar.gz) | 2527948c40be2e16724d939316ad5363f15aa22ebf42d59359d8b6f757d30cfef6447434cc93bc5caa5a23a6a00a2da8d8191b6441e06bba469d9d4375989a97
-[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-client-linux-s390x.tar.gz) | b777ad764b3a46651ecb0846e5b7f860bb2c1c4bd4d0fcc468c6ccffb7d3b8dcb6dcdd73b13c16ded7219f91bba9f1e92f9258527fd3bb162b54d7901ac303ff
-[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-client-windows-386.tar.gz) | 8a2f58aaab01be9fe298e4d01456536047cbdd39a37d3e325c1f69ceab3a0504998be41a9f41a894735dfc4ed22bed02591eea5f3c75ce12d9e95ba134e72ec5
-[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-client-windows-amd64.tar.gz) | 2f69cda177a178df149f5de66b7dba7f5ce14c1ffeb7c8d7dc4130c701b47d89bb2fbe74e7a262f573e4d21dee2c92414d050d7829e7c6fc3637a9d6b0b9c5c1
-
-### Server binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-server-linux-amd64.tar.gz) | 3ecaac0213d369eab691ac55376821a80df5013cb12e1263f18d1c236a9e49d42b3cea422175556d8f929cdf3109b22c0b6212ac0f2e80cc7a5f4afa3aba5f24
-[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-server-linux-arm.tar.gz) | 580030b57ff207e177208fec0801a43389cae10cc2c9306327d354e7be6a055390184531d54b6742e0983550b7a76693cc4a705c2d2f4ac30495cf63cef26b9b
-[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-server-linux-arm64.tar.gz) | 3e3286bd54671549fbef0dfdaaf1da99bc5c3efb32cc8d1e1985d9926520cea0c43bcf7cbcbbc8b1c1a95eab961255693008af3bb1ba743362998b5f0017d6d7
-[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-server-linux-ppc64le.tar.gz) | 9fa051e7e97648e97e26b09ab6d26be247b41b1a5938d2189204c9e6688e455afe76612bbcdd994ed5692935d0d960bd96dc222bce4b83f61d62557752b9d75b
-[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-server-linux-s390x.tar.gz) | fa85d432eff586f30975c95664ac130b9f5ae02dc52b97613ed7a41324496631ea11d1a267daba564cf2485a9e49707814d86bbd3175486c7efc8b58a9314af5
-
-### Node binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-node-linux-amd64.tar.gz) | 86e631f95fe670b467ead2b88d34e0364eaa275935af433d27cc378d82dcaa22041ccce40f5fa9561b9656dadaa578dc018ad458a59b1690d35f86dca4776b5c
-[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-node-linux-arm.tar.gz) | a8754ff58a0e902397056b8615ab49af07aca347ba7cc4a812c238e3812234862270f25106b6a94753b157bb153b8eae8b39a01ed67384774d798598c243583b
-[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-node-linux-arm64.tar.gz) | 28d727d7d08e2c856c9b4a574ef2dbf9e37236a0555f7ec5258b4284fa0582fb94b06783aaf50bf661f7503d101fbd70808aba6de02a2f0af94db7d065d25947
-[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-node-linux-ppc64le.tar.gz) | a1283449f1a0b155c11449275e9371add544d0bdd4609d6dc737ed5f7dd228e84e24ff249613a2a153691627368dd894ad64f4e6c0010eecc6efd2c13d4fb133
-[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-node-linux-s390x.tar.gz) | 5806028ba15a6a9c54a34f90117bc3181428dbb0e7ced30874c9f4a953ea5a0e9b2c73e6b1e2545e1b4e5253e9c7691588538b44cdfa666ce6865964b92d2fa8
-[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.2/kubernetes-node-windows-amd64.tar.gz) | d5327e3b7916c78777b9b69ba0f3758c3a8645c67af80114a0ae52babd7af27bb504febbaf51b1bfe5bd2d74c8c5c573471e1cb449f2429453f4b1be9d5e682a
-
-## Changelog since v1.20.0-beta.1
-
-## Urgent Upgrade Notes
-
-### (No, really, you MUST read this before you upgrade)
-
- - A bug was fixed in kubelet where exec probe timeouts were not respected. Ensure that pods relying on this behavior are updated to correctly handle probe timeouts.
-
- This change in behavior may be unexpected for some clusters and can be disabled by turning off the ExecProbeTimeout feature gate. This gate will be locked and removed in future releases so that exec probe timeouts are always respected. ([#94115](https://github.com/kubernetes/kubernetes/pull/94115), [@andrewsykim](https://github.com/andrewsykim)) [SIG Node and Testing]
- - For CSI drivers, kubelet no longer creates the target_path for NodePublishVolume in accordance with the CSI spec. Kubelet also no longer checks if staging and target paths are mounts or corrupted. CSI drivers need to be idempotent and do any necessary mount verification. ([#88759](https://github.com/kubernetes/kubernetes/pull/88759), [@andyzhangx](https://github.com/andyzhangx)) [SIG Storage]
- - Kubeadm:
- - The label applied to control-plane nodes "node-role.kubernetes.io/master" is now deprecated and will be removed in a future release after a GA deprecation period.
- - Introduce a new label "node-role.kubernetes.io/control-plane" that will be applied in parallel to "node-role.kubernetes.io/master" until the removal of the "node-role.kubernetes.io/master" label.
- - Make "kubeadm upgrade apply" add the "node-role.kubernetes.io/control-plane" label on existing nodes that only have the "node-role.kubernetes.io/master" label during upgrade.
- - Please adapt your tooling built on top of kubeadm to use the "node-role.kubernetes.io/control-plane" label.
-
- - The taint applied to control-plane nodes "node-role.kubernetes.io/master:NoSchedule" is now deprecated and will be removed in a future release after a GA deprecation period.
- - Apply toleration for a new, future taint "node-role.kubernetes.io/control-plane:NoSchedule" to the kubeadm CoreDNS / kube-dns managed manifests. Note that this taint is not yet applied to kubeadm control-plane nodes.
- - Please adapt your workloads to tolerate the same future taint preemptively.
-
- For more details see: http://git.k8s.io/enhancements/keps/sig-cluster-lifecycle/kubeadm/2067-rename-master-label-taint/README.md ([#95382](https://github.com/kubernetes/kubernetes/pull/95382), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-
-## Changes by Kind
-
-### Deprecation
-
-- Docker support in the kubelet is now deprecated and will be removed in a future release. The kubelet uses a module called "dockershim" which implements CRI support for Docker and it has seen maintenance issues in the Kubernetes community. We encourage you to evaluate moving to a container runtime that is a full-fledged implementation of CRI (v1alpha1 or v1 compliant) as they become available. ([#94624](https://github.com/kubernetes/kubernetes/pull/94624), [@dims](https://github.com/dims)) [SIG Node]
-- Kubectl: deprecate --delete-local-data ([#95076](https://github.com/kubernetes/kubernetes/pull/95076), [@dougsland](https://github.com/dougsland)) [SIG CLI, Cloud Provider and Scalability]
-
-### API Change
-
-- API priority and fairness graduated to beta
- 1.19 servers with APF turned on should not be run in a multi-server cluster with 1.20+ servers. ([#96527](https://github.com/kubernetes/kubernetes/pull/96527), [@adtac](https://github.com/adtac)) [SIG API Machinery and Testing]
-- Add LoadBalancerIPMode feature gate ([#92312](https://github.com/kubernetes/kubernetes/pull/92312), [@Sh4d1](https://github.com/Sh4d1)) [SIG Apps, CLI, Cloud Provider and Network]
-- Add WindowsContainerResources and Annotations to CRI-API UpdateContainerResourcesRequest ([#95741](https://github.com/kubernetes/kubernetes/pull/95741), [@katiewasnothere](https://github.com/katiewasnothere)) [SIG Node]
-- Add a 'serving' and `terminating` condition to the EndpointSlice API.
-
- `serving` tracks the readiness of endpoints regardless of their terminating state. This is distinct from `ready` since `ready` is only true when pods are not terminating.
- `terminating` is true when an endpoint is terminating. For pods this is any endpoint with a deletion timestamp. ([#92968](https://github.com/kubernetes/kubernetes/pull/92968), [@andrewsykim](https://github.com/andrewsykim)) [SIG Apps and Network]
-- Add support for hugepages to downward API ([#86102](https://github.com/kubernetes/kubernetes/pull/86102), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG API Machinery, Apps, CLI, Network, Node, Scheduling and Testing]
-- Adds kubelet alpha feature, `GracefulNodeShutdown` which makes kubelet aware of node system shutdowns and result in graceful termination of pods during a system shutdown. ([#96129](https://github.com/kubernetes/kubernetes/pull/96129), [@bobbypage](https://github.com/bobbypage)) [SIG Node]
-- AppProtocol is now GA for Endpoints and Services. The ServiceAppProtocol feature gate will be deprecated in 1.21. ([#96327](https://github.com/kubernetes/kubernetes/pull/96327), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
-- Automatic allocation of NodePorts for services with type LoadBalancer can now be disabled by setting the (new) parameter
- Service.spec.allocateLoadBalancerNodePorts=false. The default is to allocate NodePorts for services with type LoadBalancer which is the existing behavior. ([#92744](https://github.com/kubernetes/kubernetes/pull/92744), [@uablrek](https://github.com/uablrek)) [SIG Apps and Network]
-- Document that ServiceTopology feature is required to use `service.spec.topologyKeys`. ([#96528](https://github.com/kubernetes/kubernetes/pull/96528), [@andrewsykim](https://github.com/andrewsykim)) [SIG Apps]
-- EndpointSlice has a new NodeName field guarded by the EndpointSliceNodeName feature gate.
- - EndpointSlice topology field will be deprecated in an upcoming release.
- - EndpointSlice "IP" address type is formally removed after being deprecated in Kubernetes 1.17.
- - The discovery.k8s.io/v1alpha1 API is deprecated and will be removed in Kubernetes 1.21. ([#96440](https://github.com/kubernetes/kubernetes/pull/96440), [@robscott](https://github.com/robscott)) [SIG API Machinery, Apps and Network]
-- Fewer candidates are enumerated for preemption to improve performance in large clusters ([#94814](https://github.com/kubernetes/kubernetes/pull/94814), [@adtac](https://github.com/adtac)) [SIG Scheduling]
-- If BoundServiceAccountTokenVolume is enabled, cluster admins can use metric `serviceaccount_stale_tokens_total` to monitor workloads that are depending on the extended tokens. If there are no such workloads, turn off extended tokens by starting `kube-apiserver` with flag `--service-account-extend-token-expiration=false` ([#96273](https://github.com/kubernetes/kubernetes/pull/96273), [@zshihang](https://github.com/zshihang)) [SIG API Machinery and Auth]
-- Introduce alpha support for exec-based container registry credential provider plugins in the kubelet. ([#94196](https://github.com/kubernetes/kubernetes/pull/94196), [@andrewsykim](https://github.com/andrewsykim)) [SIG Node and Release]
-- Kube-apiserver now deletes expired kube-apiserver Lease objects:
- - The feature is under feature gate `APIServerIdentity`.
- - A flag is added to kube-apiserver: `identity-lease-garbage-collection-check-period-seconds` ([#95895](https://github.com/kubernetes/kubernetes/pull/95895), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery, Apps, Auth and Testing]
-- Move configurable fsgroup change policy for pods to beta ([#96376](https://github.com/kubernetes/kubernetes/pull/96376), [@gnufied](https://github.com/gnufied)) [SIG Apps and Storage]
-- New flag is introduced, i.e. --topology-manager-scope=container|pod.
- The default value is the "container" scope. ([#92967](https://github.com/kubernetes/kubernetes/pull/92967), [@cezaryzukowski](https://github.com/cezaryzukowski)) [SIG Instrumentation, Node and Testing]
-- NodeAffinity plugin can be configured with AddedAffinity. ([#96202](https://github.com/kubernetes/kubernetes/pull/96202), [@alculquicondor](https://github.com/alculquicondor)) [SIG Node, Scheduling and Testing]
-- Promote RuntimeClass feature to GA.
- Promote node.k8s.io API groups from v1beta1 to v1. ([#95718](https://github.com/kubernetes/kubernetes/pull/95718), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [SIG Apps, Auth, Node, Scheduling and Testing]
-- Reminder: The labels "failure-domain.beta.kubernetes.io/zone" and "failure-domain.beta.kubernetes.io/region" are deprecated in favor of "topology.kubernetes.io/zone" and "topology.kubernetes.io/region" respectively. All users of the "failure-domain.beta..." labels should switch to the "topology..." equivalents. ([#96033](https://github.com/kubernetes/kubernetes/pull/96033), [@thockin](https://github.com/thockin)) [SIG API Machinery, Apps, CLI, Cloud Provider, Network, Node, Scheduling, Storage and Testing]
-- The usage of mixed protocol values in the same LoadBalancer Service is possible if the new feature gate MixedProtocolLBSVC is enabled.
- "action required"
- The feature gate is disabled by default. The user has to enable it for the API Server. ([#94028](https://github.com/kubernetes/kubernetes/pull/94028), [@janosi](https://github.com/janosi)) [SIG API Machinery and Apps]
-- This PR will introduce a feature gate CSIServiceAccountToken with two additional fields in `CSIDriverSpec`. ([#93130](https://github.com/kubernetes/kubernetes/pull/93130), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Apps, Auth, CLI, Network, Node, Storage and Testing]
-- Users can try the cronjob controller v2 using the feature gate. This will be the default controller in future releases. ([#93370](https://github.com/kubernetes/kubernetes/pull/93370), [@alaypatel07](https://github.com/alaypatel07)) [SIG API Machinery, Apps, Auth and Testing]
-- VolumeSnapshotDataSource moves to GA in 1.20 release ([#95282](https://github.com/kubernetes/kubernetes/pull/95282), [@xing-yang](https://github.com/xing-yang)) [SIG Apps]
-
-### Feature
-
-- **Additional documentation e.g., KEPs (Kubernetes Enhancement Proposals), usage docs, etc.**: ([#95896](https://github.com/kubernetes/kubernetes/pull/95896), [@zshihang](https://github.com/zshihang)) [SIG API Machinery and Cluster Lifecycle]
-- A new set of alpha metrics are reported by the Kubernetes scheduler under the `/metrics/resources` endpoint that allow administrators to easily see the resource consumption (requests and limits for all resources on the pods) and compare it to actual pod usage or node capacity. ([#94866](https://github.com/kubernetes/kubernetes/pull/94866), [@smarterclayton](https://github.com/smarterclayton)) [SIG API Machinery, Instrumentation, Node and Scheduling]
-- Add --experimental-logging-sanitization flag enabling runtime protection from leaking sensitive data in logs ([#96370](https://github.com/kubernetes/kubernetes/pull/96370), [@serathius](https://github.com/serathius)) [SIG API Machinery, Cluster Lifecycle and Instrumentation]
-- Add a StorageVersionAPI feature gate that makes API server update storageversions before serving certain write requests.
- This feature allows the storage migrator to manage storage migration for built-in resources.
- Enabling internal.apiserver.k8s.io/v1alpha1 API and APIServerIdentity feature gate are required to use this feature. ([#93873](https://github.com/kubernetes/kubernetes/pull/93873), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery, Auth and Testing]
-- Add a new `vSphere` metric: `cloudprovider_vsphere_vcenter_versions`. It's content show `vCenter` hostnames with the associated server version. ([#94526](https://github.com/kubernetes/kubernetes/pull/94526), [@Danil-Grigorev](https://github.com/Danil-Grigorev)) [SIG Cloud Provider and Instrumentation]
-- Add feature to size memory backed volumes ([#94444](https://github.com/kubernetes/kubernetes/pull/94444), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG Storage and Testing]
-- Add node_authorizer_actions_duration_seconds metric that can be used to estimate load to node authorizer. ([#92466](https://github.com/kubernetes/kubernetes/pull/92466), [@mborsz](https://github.com/mborsz)) [SIG API Machinery, Auth and Instrumentation]
-- Add pod_ based CPU and memory metrics to Kubelet's /metrics/resource endpoint ([#95839](https://github.com/kubernetes/kubernetes/pull/95839), [@egernst](https://github.com/egernst)) [SIG Instrumentation, Node and Testing]
-- Adds a headless service on node-local-cache addon. ([#88412](https://github.com/kubernetes/kubernetes/pull/88412), [@stafot](https://github.com/stafot)) [SIG Cloud Provider and Network]
-- CRDs: For structural schemas, non-nullable null map fields will now be dropped and defaulted if a default is available. null items in list will continue being preserved, and fail validation if not nullable. ([#95423](https://github.com/kubernetes/kubernetes/pull/95423), [@apelisse](https://github.com/apelisse)) [SIG API Machinery]
-- E2e test for PodFsGroupChangePolicy ([#96247](https://github.com/kubernetes/kubernetes/pull/96247), [@saikat-royc](https://github.com/saikat-royc)) [SIG Storage and Testing]
-- Gradudate the Pod Resources API to G.A
- Introduces the pod_resources_endpoint_requests_total metric which tracks the total number of requests to the pod resources API ([#92165](https://github.com/kubernetes/kubernetes/pull/92165), [@RenaudWasTaken](https://github.com/RenaudWasTaken)) [SIG Instrumentation, Node and Testing]
-- Introduce api-extensions category which will return: mutating admission configs, validating admission configs, CRDs and APIServices when used in kubectl get, for example. ([#95603](https://github.com/kubernetes/kubernetes/pull/95603), [@soltysh](https://github.com/soltysh)) [SIG API Machinery]
-- Kube-apiserver now maintains a Lease object to identify itself:
- - The feature is under feature gate `APIServerIdentity`.
- - Two flags are added to kube-apiserver: `identity-lease-duration-seconds`, `identity-lease-renew-interval-seconds` ([#95533](https://github.com/kubernetes/kubernetes/pull/95533), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery]
-- Kube-apiserver: The timeout used when making health check calls to etcd can now be configured with `--etcd-healthcheck-timeout`. The default timeout is 2 seconds, matching the previous behavior. ([#93244](https://github.com/kubernetes/kubernetes/pull/93244), [@Sh4d1](https://github.com/Sh4d1)) [SIG API Machinery]
-- Kubectl: Previously users cannot provide arguments to a external diff tool via KUBECTL_EXTERNAL_DIFF env. This release now allow users to specify args to KUBECTL_EXTERNAL_DIFF env. ([#95292](https://github.com/kubernetes/kubernetes/pull/95292), [@dougsland](https://github.com/dougsland)) [SIG CLI]
-- Scheduler now ignores Pod update events if the resourceVersion of old and new Pods are identical. ([#96071](https://github.com/kubernetes/kubernetes/pull/96071), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG Scheduling]
-- Support custom tags for cloud provider managed resources ([#96450](https://github.com/kubernetes/kubernetes/pull/96450), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Support customize load balancer health probe protocol and request path ([#96338](https://github.com/kubernetes/kubernetes/pull/96338), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Support multiple standard load balancers in one cluster ([#96111](https://github.com/kubernetes/kubernetes/pull/96111), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- The beta `RootCAConfigMap` feature gate is enabled by default and causes kube-controller-manager to publish a "kube-root-ca.crt" ConfigMap to every namespace. This ConfigMap contains a CA bundle used for verifying connections to the kube-apiserver. ([#96197](https://github.com/kubernetes/kubernetes/pull/96197), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Apps, Auth and Testing]
-- The kubelet_runtime_operations_duration_seconds metric got additional buckets of 60, 300, 600, 900 and 1200 seconds ([#96054](https://github.com/kubernetes/kubernetes/pull/96054), [@alvaroaleman](https://github.com/alvaroaleman)) [SIG Instrumentation and Node]
-- There is a new pv_collector_total_pv_count metric that counts persistent volumes by the volume plugin name and volume mode. ([#95719](https://github.com/kubernetes/kubernetes/pull/95719), [@tsmetana](https://github.com/tsmetana)) [SIG Apps, Instrumentation, Storage and Testing]
-- Volume snapshot e2e test to validate PVC and VolumeSnapshotContent finalizer ([#95863](https://github.com/kubernetes/kubernetes/pull/95863), [@RaunakShah](https://github.com/RaunakShah)) [SIG Cloud Provider, Storage and Testing]
-- Warns user when executing kubectl apply/diff to resource currently being deleted. ([#95544](https://github.com/kubernetes/kubernetes/pull/95544), [@SaiHarshaK](https://github.com/SaiHarshaK)) [SIG CLI]
-- `kubectl alpha debug` has graduated to beta and is now `kubectl debug`. ([#96138](https://github.com/kubernetes/kubernetes/pull/96138), [@verb](https://github.com/verb)) [SIG CLI and Testing]
-- `kubectl debug` gains support for changing container images when copying a pod for debugging, similar to how `kubectl set image` works. See `kubectl help debug` for more information. ([#96058](https://github.com/kubernetes/kubernetes/pull/96058), [@verb](https://github.com/verb)) [SIG CLI]
-
-### Documentation
-
-- Updates docs and guidance on cloud provider InstancesV2 and Zones interface for external cloud providers:
- - removes experimental warning for InstancesV2
- - document that implementation of InstancesV2 will disable calls to Zones
- - deprecate Zones in favor of InstancesV2 ([#96397](https://github.com/kubernetes/kubernetes/pull/96397), [@andrewsykim](https://github.com/andrewsykim)) [SIG Cloud Provider]
-
-### Bug or Regression
-
-- Change plugin name in fsgroupapplymetrics of csi and flexvolume to distinguish different driver ([#95892](https://github.com/kubernetes/kubernetes/pull/95892), [@JornShen](https://github.com/JornShen)) [SIG Instrumentation, Storage and Testing]
-- Clear UDP conntrack entry on endpoint changes when using nodeport ([#71573](https://github.com/kubernetes/kubernetes/pull/71573), [@JacobTanenbaum](https://github.com/JacobTanenbaum)) [SIG Network]
-- Exposes and sets a default timeout for the TokenReview client for DelegatingAuthenticationOptions ([#96217](https://github.com/kubernetes/kubernetes/pull/96217), [@p0lyn0mial](https://github.com/p0lyn0mial)) [SIG API Machinery and Cloud Provider]
-- Fix CVE-2020-8555 for Quobyte client connections. ([#95206](https://github.com/kubernetes/kubernetes/pull/95206), [@misterikkit](https://github.com/misterikkit)) [SIG Storage]
-- Fix IP fragmentation of UDP and TCP packets not supported issues on LoadBalancer rules ([#96464](https://github.com/kubernetes/kubernetes/pull/96464), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Fix a bug that DefaultPreemption plugin is disabled when using (legacy) scheduler policy. ([#96439](https://github.com/kubernetes/kubernetes/pull/96439), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG Scheduling and Testing]
-- Fix bug in JSON path parser where an error occurs when a range is empty ([#95933](https://github.com/kubernetes/kubernetes/pull/95933), [@brianpursley](https://github.com/brianpursley)) [SIG API Machinery]
-- Fix client-go prometheus metrics to correctly present the API path accessed in some environments. ([#74363](https://github.com/kubernetes/kubernetes/pull/74363), [@aanm](https://github.com/aanm)) [SIG API Machinery]
-- Fix memory leak in kube-apiserver when underlying time goes forth and back. ([#96266](https://github.com/kubernetes/kubernetes/pull/96266), [@chenyw1990](https://github.com/chenyw1990)) [SIG API Machinery]
-- Fix paging issues when Azure API returns empty values with non-empty nextLink ([#96211](https://github.com/kubernetes/kubernetes/pull/96211), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider]
-- Fix pull image error from multiple ACRs using azure managed identity ([#96355](https://github.com/kubernetes/kubernetes/pull/96355), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix vSphere volumes that could be erroneously attached to wrong node ([#96224](https://github.com/kubernetes/kubernetes/pull/96224), [@gnufied](https://github.com/gnufied)) [SIG Cloud Provider and Storage]
-- Fixed a bug that prevents kubectl to validate CRDs with schema using x-kubernetes-preserve-unknown-fields on object fields. ([#96369](https://github.com/kubernetes/kubernetes/pull/96369), [@gautierdelorme](https://github.com/gautierdelorme)) [SIG API Machinery and Testing]
-- For vSphere Cloud Provider, If VM of worker node is deleted, the node will also be deleted by node controller ([#92608](https://github.com/kubernetes/kubernetes/pull/92608), [@lubronzhan](https://github.com/lubronzhan)) [SIG Cloud Provider]
-- HTTP/2 connection health check is enabled by default in all Kubernetes clients. The feature should work out-of-the-box. If needed, users can tune the feature via the HTTP2_READ_IDLE_TIMEOUT_SECONDS and HTTP2_PING_TIMEOUT_SECONDS environment variables. The feature is disabled if HTTP2_READ_IDLE_TIMEOUT_SECONDS is set to 0. ([#95981](https://github.com/kubernetes/kubernetes/pull/95981), [@caesarxuchao](https://github.com/caesarxuchao)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Node]
-- If the user specifies an invalid timeout in the request URL, the request will be aborted with an HTTP 400.
- - If the user specifies a timeout in the request URL that exceeds the maximum request deadline allowed by the apiserver, the request will be aborted with an HTTP 400. ([#96061](https://github.com/kubernetes/kubernetes/pull/96061), [@tkashem](https://github.com/tkashem)) [SIG API Machinery, Network and Testing]
-- Improve error messages related to nodePort endpoint changes conntrack entries cleanup. ([#96251](https://github.com/kubernetes/kubernetes/pull/96251), [@ravens](https://github.com/ravens)) [SIG Network]
-- Print go stack traces at -v=4 and not -v=2 ([#94663](https://github.com/kubernetes/kubernetes/pull/94663), [@soltysh](https://github.com/soltysh)) [SIG CLI]
-- Remove ready file and its directory (which is created during volume SetUp) during emptyDir volume TearDown. ([#95770](https://github.com/kubernetes/kubernetes/pull/95770), [@jingxu97](https://github.com/jingxu97)) [SIG Storage]
-- Resolves non-deterministic behavior of the garbage collection controller when ownerReferences with incorrect data are encountered. Events with a reason of `OwnerRefInvalidNamespace` are recorded when namespace mismatches between child and owner objects are detected.
- - A namespaced object with an ownerReference referencing a uid of a namespaced kind which does not exist in the same namespace is now consistently treated as though that owner does not exist, and the child object is deleted.
- - A cluster-scoped object with an ownerReference referencing a uid of a namespaced kind is now consistently treated as though that owner is not resolvable, and the child object is ignored by the garbage collector. ([#92743](https://github.com/kubernetes/kubernetes/pull/92743), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, Apps and Testing]
-- Skip [k8s.io/kubernetes@v1.19.0/test/e2e/storage/testsuites/base.go:162]: Driver azure-disk doesn't support snapshot type DynamicSnapshot -- skipping
- skip [k8s.io/kubernetes@v1.19.0/test/e2e/storage/testsuites/base.go:185]: Driver azure-disk doesn't support ntfs -- skipping ([#96144](https://github.com/kubernetes/kubernetes/pull/96144), [@qinpingli](https://github.com/qinpingli)) [SIG Storage and Testing]
-- The AWS network load balancer attributes can now be specified during service creation ([#95247](https://github.com/kubernetes/kubernetes/pull/95247), [@kishorj](https://github.com/kishorj)) [SIG Cloud Provider]
-- The kube-apiserver will no longer serve APIs that should have been deleted in GA non-alpha levels. Alpha levels will continue to serve the removed APIs so that CI doesn't immediately break. ([#96525](https://github.com/kubernetes/kubernetes/pull/96525), [@deads2k](https://github.com/deads2k)) [SIG API Machinery]
-- Update max azure data disk count map ([#96308](https://github.com/kubernetes/kubernetes/pull/96308), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
-- Update the route table tag in the route reconcile loop ([#96545](https://github.com/kubernetes/kubernetes/pull/96545), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Volume binding: report UnschedulableAndUnresolvable status instead of an error when bound PVs not found ([#95541](https://github.com/kubernetes/kubernetes/pull/95541), [@cofyc](https://github.com/cofyc)) [SIG Apps, Scheduling and Storage]
-- [kubectl] Fail when local source file doesn't exist ([#90333](https://github.com/kubernetes/kubernetes/pull/90333), [@bamarni](https://github.com/bamarni)) [SIG CLI]
-
-### Other (Cleanup or Flake)
-
-- Handle slow cronjob lister in cronjob controller v2 and improve memory footprint. ([#96443](https://github.com/kubernetes/kubernetes/pull/96443), [@alaypatel07](https://github.com/alaypatel07)) [SIG Apps]
-- --redirect-container-streaming is no longer functional. The flag will be removed in v1.22 ([#95935](https://github.com/kubernetes/kubernetes/pull/95935), [@tallclair](https://github.com/tallclair)) [SIG Node]
-- A new metric `requestAbortsTotal` has been introduced that counts aborted requests for each `group`, `version`, `verb`, `resource`, `subresource` and `scope`. ([#95002](https://github.com/kubernetes/kubernetes/pull/95002), [@p0lyn0mial](https://github.com/p0lyn0mial)) [SIG API Machinery, Cloud Provider, Instrumentation and Scheduling]
-- API priority and fairness metrics use snake_case in label names ([#96236](https://github.com/kubernetes/kubernetes/pull/96236), [@adtac](https://github.com/adtac)) [SIG API Machinery, Cluster Lifecycle, Instrumentation and Testing]
-- Applies translations on all command descriptions ([#95439](https://github.com/kubernetes/kubernetes/pull/95439), [@HerrNaN](https://github.com/HerrNaN)) [SIG CLI]
-- Changed: default "Accept-Encoding" header removed from HTTP probes. See https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#http-probes ([#96127](https://github.com/kubernetes/kubernetes/pull/96127), [@fonsecas72](https://github.com/fonsecas72)) [SIG Network and Node]
-- Generators for services are removed from kubectl ([#95256](https://github.com/kubernetes/kubernetes/pull/95256), [@Git-Jiro](https://github.com/Git-Jiro)) [SIG CLI]
-- Introduce kubectl-convert plugin. ([#96190](https://github.com/kubernetes/kubernetes/pull/96190), [@soltysh](https://github.com/soltysh)) [SIG CLI and Testing]
-- Kube-scheduler now logs processed component config at startup ([#96426](https://github.com/kubernetes/kubernetes/pull/96426), [@damemi](https://github.com/damemi)) [SIG Scheduling]
-- NONE ([#96179](https://github.com/kubernetes/kubernetes/pull/96179), [@bbyrne5](https://github.com/bbyrne5)) [SIG Network]
-- Users will now be able to configure all supported values for AWS NLB health check interval and thresholds for new resources. ([#96312](https://github.com/kubernetes/kubernetes/pull/96312), [@kishorj](https://github.com/kishorj)) [SIG Cloud Provider]
-
-## Dependencies
-
-### Added
-- cloud.google.com/go/firestore: v1.1.0
-- github.com/armon/go-metrics: [f0300d1](https://github.com/armon/go-metrics/tree/f0300d1)
-- github.com/armon/go-radix: [7fddfc3](https://github.com/armon/go-radix/tree/7fddfc3)
-- github.com/bketelsen/crypt: [5cbc8cc](https://github.com/bketelsen/crypt/tree/5cbc8cc)
-- github.com/hashicorp/consul/api: [v1.1.0](https://github.com/hashicorp/consul/api/tree/v1.1.0)
-- github.com/hashicorp/consul/sdk: [v0.1.1](https://github.com/hashicorp/consul/sdk/tree/v0.1.1)
-- github.com/hashicorp/errwrap: [v1.0.0](https://github.com/hashicorp/errwrap/tree/v1.0.0)
-- github.com/hashicorp/go-cleanhttp: [v0.5.1](https://github.com/hashicorp/go-cleanhttp/tree/v0.5.1)
-- github.com/hashicorp/go-immutable-radix: [v1.0.0](https://github.com/hashicorp/go-immutable-radix/tree/v1.0.0)
-- github.com/hashicorp/go-msgpack: [v0.5.3](https://github.com/hashicorp/go-msgpack/tree/v0.5.3)
-- github.com/hashicorp/go-multierror: [v1.0.0](https://github.com/hashicorp/go-multierror/tree/v1.0.0)
-- github.com/hashicorp/go-rootcerts: [v1.0.0](https://github.com/hashicorp/go-rootcerts/tree/v1.0.0)
-- github.com/hashicorp/go-sockaddr: [v1.0.0](https://github.com/hashicorp/go-sockaddr/tree/v1.0.0)
-- github.com/hashicorp/go-uuid: [v1.0.1](https://github.com/hashicorp/go-uuid/tree/v1.0.1)
-- github.com/hashicorp/go.net: [v0.0.1](https://github.com/hashicorp/go.net/tree/v0.0.1)
-- github.com/hashicorp/logutils: [v1.0.0](https://github.com/hashicorp/logutils/tree/v1.0.0)
-- github.com/hashicorp/mdns: [v1.0.0](https://github.com/hashicorp/mdns/tree/v1.0.0)
-- github.com/hashicorp/memberlist: [v0.1.3](https://github.com/hashicorp/memberlist/tree/v0.1.3)
-- github.com/hashicorp/serf: [v0.8.2](https://github.com/hashicorp/serf/tree/v0.8.2)
-- github.com/mitchellh/cli: [v1.0.0](https://github.com/mitchellh/cli/tree/v1.0.0)
-- github.com/mitchellh/go-testing-interface: [v1.0.0](https://github.com/mitchellh/go-testing-interface/tree/v1.0.0)
-- github.com/mitchellh/gox: [v0.4.0](https://github.com/mitchellh/gox/tree/v0.4.0)
-- github.com/mitchellh/iochan: [v1.0.0](https://github.com/mitchellh/iochan/tree/v1.0.0)
-- github.com/pascaldekloe/goe: [57f6aae](https://github.com/pascaldekloe/goe/tree/57f6aae)
-- github.com/posener/complete: [v1.1.1](https://github.com/posener/complete/tree/v1.1.1)
-- github.com/ryanuber/columnize: [9b3edd6](https://github.com/ryanuber/columnize/tree/9b3edd6)
-- github.com/sean-/seed: [e2103e2](https://github.com/sean-/seed/tree/e2103e2)
-- github.com/subosito/gotenv: [v1.2.0](https://github.com/subosito/gotenv/tree/v1.2.0)
-- github.com/willf/bitset: [d5bec33](https://github.com/willf/bitset/tree/d5bec33)
-- gopkg.in/ini.v1: v1.51.0
-- gopkg.in/yaml.v3: 9f266ea
-- rsc.io/quote/v3: v3.1.0
-- rsc.io/sampler: v1.3.0
-
-### Changed
-- cloud.google.com/go/bigquery: v1.0.1 → v1.4.0
-- cloud.google.com/go/datastore: v1.0.0 → v1.1.0
-- cloud.google.com/go/pubsub: v1.0.1 → v1.2.0
-- cloud.google.com/go/storage: v1.0.0 → v1.6.0
-- cloud.google.com/go: v0.51.0 → v0.54.0
-- github.com/Microsoft/go-winio: [fc70bd9 → v0.4.15](https://github.com/Microsoft/go-winio/compare/fc70bd9...v0.4.15)
-- github.com/aws/aws-sdk-go: [v1.35.5 → v1.35.24](https://github.com/aws/aws-sdk-go/compare/v1.35.5...v1.35.24)
-- github.com/blang/semver: [v3.5.0+incompatible → v3.5.1+incompatible](https://github.com/blang/semver/compare/v3.5.0...v3.5.1)
-- github.com/checkpoint-restore/go-criu/v4: [v4.0.2 → v4.1.0](https://github.com/checkpoint-restore/go-criu/v4/compare/v4.0.2...v4.1.0)
-- github.com/containerd/containerd: [v1.3.3 → v1.4.1](https://github.com/containerd/containerd/compare/v1.3.3...v1.4.1)
-- github.com/containerd/ttrpc: [v1.0.0 → v1.0.2](https://github.com/containerd/ttrpc/compare/v1.0.0...v1.0.2)
-- github.com/containerd/typeurl: [v1.0.0 → v1.0.1](https://github.com/containerd/typeurl/compare/v1.0.0...v1.0.1)
-- github.com/coreos/etcd: [v3.3.10+incompatible → v3.3.13+incompatible](https://github.com/coreos/etcd/compare/v3.3.10...v3.3.13)
-- github.com/docker/docker: [aa6a989 → bd33bbf](https://github.com/docker/docker/compare/aa6a989...bd33bbf)
-- github.com/go-gl/glfw/v3.3/glfw: [12ad95a → 6f7a984](https://github.com/go-gl/glfw/v3.3/glfw/compare/12ad95a...6f7a984)
-- github.com/golang/groupcache: [215e871 → 8c9f03a](https://github.com/golang/groupcache/compare/215e871...8c9f03a)
-- github.com/golang/mock: [v1.3.1 → v1.4.1](https://github.com/golang/mock/compare/v1.3.1...v1.4.1)
-- github.com/golang/protobuf: [v1.4.2 → v1.4.3](https://github.com/golang/protobuf/compare/v1.4.2...v1.4.3)
-- github.com/google/cadvisor: [v0.37.0 → v0.38.4](https://github.com/google/cadvisor/compare/v0.37.0...v0.38.4)
-- github.com/google/go-cmp: [v0.4.0 → v0.5.2](https://github.com/google/go-cmp/compare/v0.4.0...v0.5.2)
-- github.com/google/pprof: [d4f498a → 1ebb73c](https://github.com/google/pprof/compare/d4f498a...1ebb73c)
-- github.com/google/uuid: [v1.1.1 → v1.1.2](https://github.com/google/uuid/compare/v1.1.1...v1.1.2)
-- github.com/gorilla/mux: [v1.7.3 → v1.8.0](https://github.com/gorilla/mux/compare/v1.7.3...v1.8.0)
-- github.com/gorilla/websocket: [v1.4.0 → v1.4.2](https://github.com/gorilla/websocket/compare/v1.4.0...v1.4.2)
-- github.com/karrick/godirwalk: [v1.7.5 → v1.16.1](https://github.com/karrick/godirwalk/compare/v1.7.5...v1.16.1)
-- github.com/opencontainers/runc: [819fcc6 → v1.0.0-rc92](https://github.com/opencontainers/runc/compare/819fcc6...v1.0.0-rc92)
-- github.com/opencontainers/runtime-spec: [237cc4f → 4d89ac9](https://github.com/opencontainers/runtime-spec/compare/237cc4f...4d89ac9)
-- github.com/opencontainers/selinux: [v1.5.2 → v1.6.0](https://github.com/opencontainers/selinux/compare/v1.5.2...v1.6.0)
-- github.com/prometheus/procfs: [v0.1.3 → v0.2.0](https://github.com/prometheus/procfs/compare/v0.1.3...v0.2.0)
-- github.com/quobyte/api: [v0.1.2 → v0.1.8](https://github.com/quobyte/api/compare/v0.1.2...v0.1.8)
-- github.com/spf13/cobra: [v1.0.0 → v1.1.1](https://github.com/spf13/cobra/compare/v1.0.0...v1.1.1)
-- github.com/spf13/viper: [v1.4.0 → v1.7.0](https://github.com/spf13/viper/compare/v1.4.0...v1.7.0)
-- github.com/stretchr/testify: [v1.4.0 → v1.6.1](https://github.com/stretchr/testify/compare/v1.4.0...v1.6.1)
-- github.com/vishvananda/netns: [52d707b → db3c7e5](https://github.com/vishvananda/netns/compare/52d707b...db3c7e5)
-- go.opencensus.io: v0.22.2 → v0.22.3
-- golang.org/x/exp: da58074 → 6cc2880
-- golang.org/x/lint: fdd1cda → 738671d
-- golang.org/x/net: ab34263 → 69a7880
-- golang.org/x/oauth2: 858c2ad → bf48bf1
-- golang.org/x/sys: ed371f2 → 5cba982
-- golang.org/x/text: v0.3.3 → v0.3.4
-- golang.org/x/time: 555d28b → 3af7569
-- golang.org/x/xerrors: 9bdfabe → 5ec99f8
-- google.golang.org/api: v0.15.1 → v0.20.0
-- google.golang.org/genproto: cb27e3a → 8816d57
-- google.golang.org/grpc: v1.27.0 → v1.27.1
-- google.golang.org/protobuf: v1.24.0 → v1.25.0
-- honnef.co/go/tools: v0.0.1-2019.2.3 → v0.0.1-2020.1.3
-- k8s.io/gengo: 8167cfd → 83324d8
-- k8s.io/klog/v2: v2.2.0 → v2.4.0
-- k8s.io/kube-openapi: 8b50664 → d219536
-- k8s.io/utils: d5654de → 67b214c
-- sigs.k8s.io/apiserver-network-proxy/konnectivity-client: v0.0.12 → v0.0.14
-- sigs.k8s.io/structured-merge-diff/v4: b3cf1e8 → v4.0.2
-
-### Removed
-- github.com/armon/consul-api: [eb2c6b5](https://github.com/armon/consul-api/tree/eb2c6b5)
-- github.com/go-ini/ini: [v1.9.0](https://github.com/go-ini/ini/tree/v1.9.0)
-- github.com/ugorji/go: [v1.1.4](https://github.com/ugorji/go/tree/v1.1.4)
-- github.com/xordataexchange/crypt: [b2862e3](https://github.com/xordataexchange/crypt/tree/b2862e3)
-
-
-
-# v1.20.0-beta.1
-
-
-## Downloads for v1.20.0-beta.1
-
-### Source Code
-
-filename | sha512 hash
--------- | -----------
-[kubernetes.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes.tar.gz) | 4eddf4850c2d57751696f352d0667309339090aeb30ff93e8db8a22c6cdebf74cb2d5dc78d4ae384c4e25491efc39413e2e420a804b76b421a9ad934e56b0667
-[kubernetes-src.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-src.tar.gz) | 59de5221162e9b6d88f5abbdb99765cb2b2e501498ea853fb65f2abe390211e28d9f21e0d87be3ade550a5ea6395d04552cf093d2ce2f99fd45ad46545dd13cb
-
-### Client binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-client-darwin-amd64.tar.gz) | d69ffed19b034a4221fc084e43ac293cf392e98febf5bf580f8d92307a8421d8b3aab18f9ca70608937e836b42c7a34e829f88eba6e040218a4486986e2fca21
-[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-client-linux-386.tar.gz) | 1b542e165860c4adcd4550adc19b86c3db8cd75d2a1b8db17becc752da78b730ee48f1b0aaf8068d7bfbb1d8e023741ec293543bc3dd0f4037172a6917db8169
-[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-client-linux-amd64.tar.gz) | 90ad52785eecb43a6f9035b92b6ba39fc84e67f8bc91cf098e70f8cfdd405c4b9d5c02dccb21022f21bb5b6ce92fdef304def1da0a7255c308e2c5fb3a9cdaab
-[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-client-linux-arm.tar.gz) | d0cb3322b056e1821679afa70728ffc0d3375e8f3326dabbe8185be2e60f665ab8985b13a1a432e10281b84a929e0f036960253ac0dd6e0b44677d539e98e61b
-[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-client-linux-arm64.tar.gz) | 3aecc8197e0aa368408624add28a2dd5e73f0d8a48e5e33c19edf91d5323071d16a27353a6f3e22df4f66ed7bfbae8e56e0a9050f7bbdf927ce6aeb29bba6374
-[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-client-linux-ppc64le.tar.gz) | 6ff145058f62d478b98f1e418e272555bfb5c7861834fbbf10a8fb334cc7ff09b32f2666a54b230932ba71d2fc7d3b1c1f5e99e6fe6d6ec83926a9b931cd2474
-[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-client-linux-s390x.tar.gz) | ff7b8bb894076e05a3524f6327a4a6353b990466f3292e84c92826cb64b5c82b3855f48b8e297ccadc8bcc15552bc056419ff6ff8725fc4e640828af9cc1331b
-[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-client-windows-386.tar.gz) | 6c6dcac9c725605763a130b5a975f2b560aa976a5c809d4e0887900701b707baccb9ca1aebc10a03cfa7338a6f42922bbf838ccf6800fc2a3e231686a72568b6
-[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-client-windows-amd64.tar.gz) | d12e3a29c960f0ddd1b9aabf5426ac1259863ac6c8f2be1736ebeb57ddca6b1c747ee2c363be19e059e38cf71488c5ea3509ad4d0e67fd5087282a5ad0ae9a48
-
-### Server binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-server-linux-amd64.tar.gz) | 904e8c049179e071c6caa65f525f465260bb4d4318a6dd9cc05be2172f39f7cfc69d1672736e01d926045764fe8872e806444e3af77ffef823ede769537b7d20
-[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-server-linux-arm.tar.gz) | 5934959374868aed8d4294de84411972660bca7b2e952201a9403f37e40c60a5c53eaea8001344d0bf4a00c8cd27de6324d88161388de27f263a5761357cb82b
-[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-server-linux-arm64.tar.gz) | 4c884585970f80dc5462d9a734d7d5be9558b36c6e326a8a3139423efbd7284fa9f53fb077983647e17e19f03f5cb9bf26201450c78daecf10afa5a1ab5f9efc
-[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-server-linux-ppc64le.tar.gz) | 235b78b08440350dcb9f13b63f7722bd090c672d8e724ca5d409256e5a5d4f46d431652a1aa908c3affc5b1e162318471de443d38b93286113e79e7f90501a9b
-[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-server-linux-s390x.tar.gz) | 220fc9351702b3ecdcf79089892ceb26753a8a1deaf46922ffb3d3b62b999c93fef89440e779ca6043372b963081891b3a966d1a5df0cf261bdd44395fd28dce
-
-### Node binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-node-linux-amd64.tar.gz) | fe59d3a1f21c47bab126f689687657f77fbcb46a2caeef48eecd073b2b22879f997a466911b5c5c829e9cf27e68a36ecdf18686d42714839d4b97d6c7281578d
-[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-node-linux-arm.tar.gz) | 93e545aa963cfd11e0b2c6d47669b5ef70c5a86ef80c3353c1a074396bff1e8e7371dda25c39d78c7a9e761f2607b8b5ab843fa0c10b8ff9663098fae8d25725
-[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-node-linux-arm64.tar.gz) | 5e0f177f9bec406a668d4b37e69b191208551fdf289c82b5ec898959da4f8a00a2b0695cbf1d2de5acb809321c6e5604f5483d33556543d92b96dcf80e814dd3
-[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-node-linux-ppc64le.tar.gz) | 574412059e4d257eb904cd4892a075b6a2cde27adfa4976ee64c46d6768facece338475f1b652ad94c8df7cfcbb70ebdf0113be109c7099ab76ffdb6f023eefd
-[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-node-linux-s390x.tar.gz) | b1ffaa6d7f77d89885c642663cb14a86f3e2ec2afd223e3bb2000962758cf0f15320969ffc4be93b5826ff22d54fdbae0dbea09f9d8228eda6da50b6fdc88758
-[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.1/kubernetes-node-windows-amd64.tar.gz) | 388983765213cf3bdc1f8b27103ed79e39028767e5f1571e35ed1f91ed100e49f3027f7b7ff19b53fab7fbb6d723c0439f21fc6ed62be64532c25f5bfa7ee265
-
-## Changelog since v1.20.0-beta.0
-
-## Changes by Kind
-
-### Deprecation
-
-- ACTION REQUIRED: The kube-apiserver ability to serve on an insecure port, deprecated since v1.10, has been removed. The insecure address flags `--address` and `--insecure-bind-address` have no effect in kube-apiserver and will be removed in v1.24. The insecure port flags `--port` and `--insecure-port` may only be set to 0 and will be removed in v1.24. ([#95856](https://github.com/kubernetes/kubernetes/pull/95856), [@knight42](https://github.com/knight42)) [SIG API Machinery, Node and Testing]
-
-### API Change
-
-- + `TokenRequest` and `TokenRequestProjection` features have been promoted to GA. This feature allows generating service account tokens that are not visible in Secret objects and are tied to the lifetime of a Pod object. See https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#service-account-token-volume-projection for details on configuring and using this feature. The `TokenRequest` and `TokenRequestProjection` feature gates will be removed in v1.21.
- + kubeadm's kube-apiserver Pod manifest now includes the following flags by default "--service-account-key-file", "--service-account-signing-key-file", "--service-account-issuer". ([#93258](https://github.com/kubernetes/kubernetes/pull/93258), [@zshihang](https://github.com/zshihang)) [SIG API Machinery, Auth, Cluster Lifecycle, Storage and Testing]
-- Certain fields on Service objects will be automatically cleared when changing the service's `type` to a mode that does not need those fields. For example, changing from type=LoadBalancer to type=ClusterIP will clear the NodePort assignments, rather than forcing the user to clear them. ([#95196](https://github.com/kubernetes/kubernetes/pull/95196), [@thockin](https://github.com/thockin)) [SIG API Machinery, Apps, Network and Testing]
-- Services will now have a `clusterIPs` field to go with `clusterIP`. `clusterIPs[0]` is a synonym for `clusterIP` and will be syncronized on create and update operations. ([#95894](https://github.com/kubernetes/kubernetes/pull/95894), [@thockin](https://github.com/thockin)) [SIG Network]
-
-### Feature
-
-- A new metric `apiserver_request_filter_duration_seconds` has been introduced that
- measures request filter latency in seconds. ([#95207](https://github.com/kubernetes/kubernetes/pull/95207), [@tkashem](https://github.com/tkashem)) [SIG API Machinery and Instrumentation]
-- Add a new flag to set priority for the kubelet on Windows nodes so that workloads cannot overwhelm the node there by disrupting kubelet process. ([#96051](https://github.com/kubernetes/kubernetes/pull/96051), [@ravisantoshgudimetla](https://github.com/ravisantoshgudimetla)) [SIG Node and Windows]
-- Changed: default "Accept: */*" header added to HTTP probes. See https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#http-probes (https://github.com/kubernetes/website/pull/24756) ([#95641](https://github.com/kubernetes/kubernetes/pull/95641), [@fonsecas72](https://github.com/fonsecas72)) [SIG Network and Node]
-- Client-go credential plugins can now be passed in the current cluster information via the KUBERNETES_EXEC_INFO environment variable. ([#95489](https://github.com/kubernetes/kubernetes/pull/95489), [@ankeesler](https://github.com/ankeesler)) [SIG API Machinery and Auth]
-- Kube-apiserver: added support for compressing rotated audit log files with `--audit-log-compress` ([#94066](https://github.com/kubernetes/kubernetes/pull/94066), [@lojies](https://github.com/lojies)) [SIG API Machinery and Auth]
-
-### Documentation
-
-- Fake dynamic client: document that List does not preserve TypeMeta in UnstructuredList ([#95117](https://github.com/kubernetes/kubernetes/pull/95117), [@andrewsykim](https://github.com/andrewsykim)) [SIG API Machinery]
-
-### Bug or Regression
-
-- Added support to kube-proxy for externalTrafficPolicy=Local setting via Direct Server Return (DSR) load balancers on Windows. ([#93166](https://github.com/kubernetes/kubernetes/pull/93166), [@elweb9858](https://github.com/elweb9858)) [SIG Network]
-- Disable watchcache for events ([#96052](https://github.com/kubernetes/kubernetes/pull/96052), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery]
-- Disabled `LocalStorageCapacityIsolation` feature gate is honored during scheduling. ([#96092](https://github.com/kubernetes/kubernetes/pull/96092), [@Huang-Wei](https://github.com/Huang-Wei)) [SIG Scheduling]
-- Fix bug in JSON path parser where an error occurs when a range is empty ([#95933](https://github.com/kubernetes/kubernetes/pull/95933), [@brianpursley](https://github.com/brianpursley)) [SIG API Machinery]
-- Fix k8s.io/apimachinery/pkg/api/meta.SetStatusCondition to update ObservedGeneration ([#95961](https://github.com/kubernetes/kubernetes/pull/95961), [@KnicKnic](https://github.com/KnicKnic)) [SIG API Machinery]
-- Fixed a regression which prevented pods with `docker/default` seccomp annotations from being created in 1.19 if a PodSecurityPolicy was in place which did not allow `runtime/default` seccomp profiles. ([#95985](https://github.com/kubernetes/kubernetes/pull/95985), [@saschagrunert](https://github.com/saschagrunert)) [SIG Auth]
-- Kubectl: print error if users place flags before plugin name ([#92343](https://github.com/kubernetes/kubernetes/pull/92343), [@knight42](https://github.com/knight42)) [SIG CLI]
-- When creating a PVC with the volume.beta.kubernetes.io/storage-provisioner annotation already set, the PV controller might have incorrectly deleted the newly provisioned PV instead of binding it to the PVC, depending on timing and system load. ([#95909](https://github.com/kubernetes/kubernetes/pull/95909), [@pohly](https://github.com/pohly)) [SIG Apps and Storage]
-
-### Other (Cleanup or Flake)
-
-- Kubectl: the `generator` flag of `kubectl autoscale` has been deprecated and has no effect, it will be removed in a feature release ([#92998](https://github.com/kubernetes/kubernetes/pull/92998), [@SataQiu](https://github.com/SataQiu)) [SIG CLI]
-- V1helpers.MatchNodeSelectorTerms now accepts just a Node and a list of Terms ([#95871](https://github.com/kubernetes/kubernetes/pull/95871), [@damemi](https://github.com/damemi)) [SIG Apps, Scheduling and Storage]
-- `MatchNodeSelectorTerms` function moved to `k8s.io/component-helpers` ([#95531](https://github.com/kubernetes/kubernetes/pull/95531), [@damemi](https://github.com/damemi)) [SIG Apps, Scheduling and Storage]
-
-## Dependencies
-
-### Added
-_Nothing has changed._
-
-### Changed
-_Nothing has changed._
-
-### Removed
-_Nothing has changed._
-
-
-
-# v1.20.0-beta.0
-
-
-## Downloads for v1.20.0-beta.0
-
-### Source Code
-
-filename | sha512 hash
--------- | -----------
-[kubernetes.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes.tar.gz) | 385e49e32bbd6996f07bcadbf42285755b8a8ef9826ee1ba42bd82c65827cf13f63e5634b834451b263a93b708299cbb4b4b0b8ddbc688433deaf6bec240aa67
-[kubernetes-src.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-src.tar.gz) | 842e80f6dcad461426fb699de8a55fde8621d76a94e54288fe9939cc1a3bbd0f4799abadac2c59bcf3f91d743726dbd17e1755312ae7fec482ef560f336dbcbb
-
-### Client binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-client-darwin-amd64.tar.gz) | bde5e7d9ee3e79d1e69465a3ddb4bb36819a4f281b5c01a7976816d7c784410812dde133cdf941c47e5434e9520701b9c5e8b94d61dca77c172f87488dfaeb26
-[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-client-linux-386.tar.gz) | 721bb8444c9e0d7a9f8461e3f5428882d76fcb3def6eb11b8e8e08fae7f7383630699248660d69d4f6a774124d6437888666e1fa81298d5b5518bc4a6a6b2c92
-[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-client-linux-amd64.tar.gz) | 71e4edc41afbd65f813e7ecbc22b27c95f248446f005e288d758138dc4cc708735be7218af51bcf15e8b9893a3598c45d6a685f605b46f50af3762b02c32ed76
-[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-client-linux-arm.tar.gz) | bbefc749156f63898973f2f7c7a6f1467481329fb430d641fe659b497e64d679886482d557ebdddb95932b93de8d1e3e365c91d4bf9f110b68bd94b0ba702ded
-[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-client-linux-arm64.tar.gz) | 9803190685058b4b64d002c2fbfb313308bcea4734ed53a8c340cfdae4894d8cb13b3e819ae64051bafe0fbf8b6ecab53a6c1dcf661c57640c75b0eb60041113
-[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-client-linux-ppc64le.tar.gz) | bcdceea64cba1ae38ea2bab50d8fd77c53f6d673de12566050b0e3c204334610e6c19e4ace763e68b5e48ab9e811521208b852b1741627be30a2b17324fc1daf
-[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-client-linux-s390x.tar.gz) | 41e36d00867e90012d5d5adfabfaae8d9f5a9fd32f290811e3c368e11822916b973afaaf43961081197f2cbab234090d97d89774e674aeadc1da61f7a64708a9
-[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-client-windows-386.tar.gz) | c50fec5aec2d0e742f851f25c236cb73e76f8fc73b0908049a10ae736c0205b8fff83eb3d29b1748412edd942da00dd738195d9003f25b577d6af8359d84fb2f
-[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-client-windows-amd64.tar.gz) | 0fd6777c349908b6d627e849ea2d34c048b8de41f7df8a19898623f597e6debd35b7bcbf8e1d43a1be3a9abb45e4810bc498a0963cf780b109e93211659e9c7e
-
-### Server binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-server-linux-amd64.tar.gz) | 30d982424ca64bf0923503ae8195b2e2a59497096b2d9e58dfd491cd6639633027acfa9750bc7bccf34e1dc116d29d2f87cbd7ae713db4210ce9ac16182f0576
-[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-server-linux-arm.tar.gz) | f08b62be9bc6f0745f820b0083c7a31eedb2ce370a037c768459a59192107b944c8f4345d0bb88fc975f2e7a803ac692c9ac3e16d4a659249d4600e84ff75d9e
-[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-server-linux-arm64.tar.gz) | e3472b5b3dfae0a56e5363d52062b1e4a9fc227a05e0cf5ece38233b2c442f427970aab94a52377fb87e583663c120760d154bc1c4ac22dca1f4d0d1ebb96088
-[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-server-linux-ppc64le.tar.gz) | 06c254e0a62f755d31bc40093d86c44974f0a60308716cc3214a6b3c249a4d74534d909b82f8a3dd3a3c9720e61465b45d2bb3a327ef85d3caba865750020dfb
-[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-server-linux-s390x.tar.gz) | 2edeb4411c26a0de057a66787091ab1044f71774a464aed898ffee26634a40127181c2edddb38e786b6757cca878fd0c3a885880eec6c3448b93c645770abb12
-
-### Node binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-node-linux-amd64.tar.gz) | cc1d5b94b86070b5e7746d7aaeaeac3b3a5e5ebbff1ec33885f7eeab270a6177d593cb1975b2e56f4430b7859ad42da76f266629f9313e0f688571691ac448ed
-[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-node-linux-arm.tar.gz) | 75e82c7c9122add3b24695b94dcb0723c52420c3956abf47511e37785aa48a1fa8257db090c6601010c4475a325ccfff13eb3352b65e3aa1774f104b09b766b0
-[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-node-linux-arm64.tar.gz) | 16ef27c40bf4d678a55fcd3d3f7d09f1597eec2cc58f9950946f0901e52b82287be397ad7f65e8d162d8a9cdb4a34a610b6db8b5d0462be8e27c4b6eb5d6e5e7
-[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-node-linux-ppc64le.tar.gz) | 939865f2c4cb6a8934f22a06223e416dec5f768ffc1010314586149470420a1d62aef97527c34d8a636621c9669d6489908ce1caf96f109e8d073cee1c030b50
-[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-node-linux-s390x.tar.gz) | bbfdd844075fb816079af7b73d99bc1a78f41717cdbadb043f6f5872b4dc47bc619f7f95e2680d4b516146db492c630c17424e36879edb45e40c91bc2ae4493c
-[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-beta.0/kubernetes-node-windows-amd64.tar.gz) | a2b3ea40086fd71aed71a4858fd3fc79fd1907bc9ea8048ff3c82ec56477b0a791b724e5a52d79b3b36338c7fbd93dfd3d03b00ccea9042bda0d270fc891e4ec
-
-## Changelog since v1.20.0-alpha.3
-
-## Urgent Upgrade Notes
-
-### (No, really, you MUST read this before you upgrade)
-
- - Kubeadm: improve the validation of serviceSubnet and podSubnet.
- ServiceSubnet has to be limited in size, due to implementation details, and the mask can not allocate more than 20 bits.
- PodSubnet validates against the corresponding cluster "--node-cidr-mask-size" of the kube-controller-manager, it fail if the values are not compatible.
- kubeadm no longer sets the node-mask automatically on IPv6 deployments, you must check that your IPv6 service subnet mask is compatible with the default node mask /64 or set it accordenly.
- Previously, for IPv6, if the podSubnet had a mask lower than /112, kubeadm calculated a node-mask to be multiple of eight and splitting the available bits to maximise the number used for nodes. ([#95723](https://github.com/kubernetes/kubernetes/pull/95723), [@aojea](https://github.com/aojea)) [SIG Cluster Lifecycle]
- - Windows hyper-v container featuregate is deprecated in 1.20 and will be removed in 1.21 ([#95505](https://github.com/kubernetes/kubernetes/pull/95505), [@wawa0210](https://github.com/wawa0210)) [SIG Node and Windows]
-
-## Changes by Kind
-
-### Deprecation
-
-- Support 'controlplane' as a valid EgressSelection type in the EgressSelectorConfiguration API. 'Master' is deprecated and will be removed in v1.22. ([#95235](https://github.com/kubernetes/kubernetes/pull/95235), [@andrewsykim](https://github.com/andrewsykim)) [SIG API Machinery]
-
-### API Change
-
-- Add dual-stack Services (alpha). This is a BREAKING CHANGE to an alpha API.
- It changes the dual-stack API wrt Service from a single ipFamily field to 3
- fields: ipFamilyPolicy (SingleStack, PreferDualStack, RequireDualStack),
- ipFamilies (a list of families assigned), and clusterIPs (inclusive of
- clusterIP). Most users do not need to set anything at all, defaulting will
- handle it for them. Services are single-stack unless the user asks for
- dual-stack. This is all gated by the "IPv6DualStack" feature gate. ([#91824](https://github.com/kubernetes/kubernetes/pull/91824), [@khenidak](https://github.com/khenidak)) [SIG API Machinery, Apps, CLI, Network, Node, Scheduling and Testing]
-- Introduces a metric source for HPAs which allows scaling based on container resource usage. ([#90691](https://github.com/kubernetes/kubernetes/pull/90691), [@arjunrn](https://github.com/arjunrn)) [SIG API Machinery, Apps, Autoscaling and CLI]
-
-### Feature
-
-- Add a metric for time taken to perform recursive permission change ([#95866](https://github.com/kubernetes/kubernetes/pull/95866), [@JornShen](https://github.com/JornShen)) [SIG Instrumentation and Storage]
-- Allow cross compilation of kubernetes on different platforms. ([#94403](https://github.com/kubernetes/kubernetes/pull/94403), [@bnrjee](https://github.com/bnrjee)) [SIG Release]
-- Command to start network proxy changes from 'KUBE_ENABLE_EGRESS_VIA_KONNECTIVITY_SERVICE ./cluster/kube-up.sh' to 'KUBE_ENABLE_KONNECTIVITY_SERVICE=true ./hack/kube-up.sh' ([#92669](https://github.com/kubernetes/kubernetes/pull/92669), [@Jefftree](https://github.com/Jefftree)) [SIG Cloud Provider]
-- DefaultPodTopologySpread graduated to Beta. The feature gate is enabled by default. ([#95631](https://github.com/kubernetes/kubernetes/pull/95631), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling and Testing]
-- Kubernetes E2E test image manifest lists now contain Windows images. ([#77398](https://github.com/kubernetes/kubernetes/pull/77398), [@claudiubelu](https://github.com/claudiubelu)) [SIG Testing and Windows]
-- Support for Windows container images (OS Versions: 1809, 1903, 1909, 2004) was added the pause:3.4 image. ([#91452](https://github.com/kubernetes/kubernetes/pull/91452), [@claudiubelu](https://github.com/claudiubelu)) [SIG Node, Release and Windows]
-
-### Documentation
-
-- Fake dynamic client: document that List does not preserve TypeMeta in UnstructuredList ([#95117](https://github.com/kubernetes/kubernetes/pull/95117), [@andrewsykim](https://github.com/andrewsykim)) [SIG API Machinery]
-
-### Bug or Regression
-
-- Exposes and sets a default timeout for the SubjectAccessReview client for DelegatingAuthorizationOptions. ([#95725](https://github.com/kubernetes/kubernetes/pull/95725), [@p0lyn0mial](https://github.com/p0lyn0mial)) [SIG API Machinery and Cloud Provider]
-- Alter wording to describe pods using a pvc ([#95635](https://github.com/kubernetes/kubernetes/pull/95635), [@RaunakShah](https://github.com/RaunakShah)) [SIG CLI]
-- If we set SelectPolicy MinPolicySelect on scaleUp behavior or scaleDown behavior,Horizontal Pod Autoscaler doesn`t automatically scale the number of pods correctly ([#95647](https://github.com/kubernetes/kubernetes/pull/95647), [@JoshuaAndrew](https://github.com/JoshuaAndrew)) [SIG Apps and Autoscaling]
-- Ignore apparmor for non-linux operating systems ([#93220](https://github.com/kubernetes/kubernetes/pull/93220), [@wawa0210](https://github.com/wawa0210)) [SIG Node and Windows]
-- Ipvs: ensure selected scheduler kernel modules are loaded ([#93040](https://github.com/kubernetes/kubernetes/pull/93040), [@cmluciano](https://github.com/cmluciano)) [SIG Network]
-- Kubeadm: add missing "--experimental-patches" flag to "kubeadm init phase control-plane" ([#95786](https://github.com/kubernetes/kubernetes/pull/95786), [@Sh4d1](https://github.com/Sh4d1)) [SIG Cluster Lifecycle]
-- Reorganized iptables rules to fix a performance issue ([#95252](https://github.com/kubernetes/kubernetes/pull/95252), [@tssurya](https://github.com/tssurya)) [SIG Network]
-- Unhealthy pods covered by PDBs can be successfully evicted if enough healthy pods are available. ([#94381](https://github.com/kubernetes/kubernetes/pull/94381), [@michaelgugino](https://github.com/michaelgugino)) [SIG Apps]
-- Update the PIP when it is not in the Succeeded provisioning state during the LB update. ([#95748](https://github.com/kubernetes/kubernetes/pull/95748), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Update the frontend IP config when the service's `pipName` annotation is changed ([#95813](https://github.com/kubernetes/kubernetes/pull/95813), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-
-### Other (Cleanup or Flake)
-
-- NO ([#95690](https://github.com/kubernetes/kubernetes/pull/95690), [@nikhita](https://github.com/nikhita)) [SIG Release]
-
-## Dependencies
-
-### Added
-- github.com/form3tech-oss/jwt-go: [v3.2.2+incompatible](https://github.com/form3tech-oss/jwt-go/tree/v3.2.2)
-
-### Changed
-- github.com/Azure/go-autorest/autorest/adal: [v0.9.0 → v0.9.5](https://github.com/Azure/go-autorest/autorest/adal/compare/v0.9.0...v0.9.5)
-- github.com/Azure/go-autorest/autorest/mocks: [v0.4.0 → v0.4.1](https://github.com/Azure/go-autorest/autorest/mocks/compare/v0.4.0...v0.4.1)
-- golang.org/x/crypto: 75b2880 → 7f63de1
-
-### Removed
-_Nothing has changed._
-
-
-
-# v1.20.0-alpha.3
-
-
-## Downloads for v1.20.0-alpha.3
-
-### Source Code
-
-filename | sha512 hash
--------- | -----------
-[kubernetes.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes.tar.gz) | 542cc9e0cd97732020491456402b6e2b4f54f2714007ee1374a7d363663a1b41e82b50886176a5313aaccfbfd4df2bc611d6b32d19961cdc98b5821b75d6b17c
-[kubernetes-src.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-src.tar.gz) | 5e5d725294e552fd1d14fd6716d013222827ac2d4e2d11a7a1fdefb77b3459bbeb69931f38e1597de205dd32a1c9763ab524c2af1551faef4f502ef0890f7fbf
-
-### Client binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-client-darwin-amd64.tar.gz) | 60004939727c75d0f06adc4449e16b43303941937c0e9ea9aca7d947e93a5aed5d11e53d1fc94caeb988be66d39acab118d406dc2d6cead61181e1ced6d2be1a
-[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-client-linux-386.tar.gz) | 7edba9c4f1bf38fdf1fa5bff2856c05c0e127333ce19b17edf3119dc9b80462c027404a1f58a5eabf1de73a8f2f20aced043dda1fafd893619db1a188cda550c
-[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-client-linux-amd64.tar.gz) | db1818aa82d072cb3e32a2a988e66d76ecf7cebc6b8a29845fa2d6ec27f14a36e4b9839b1b7ed8c43d2da9cde00215eb672a7e8ee235d2e3107bc93c22e58d38
-[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-client-linux-arm.tar.gz) | d2922e70d22364b1f5a1e94a0c115f849fe2575b231b1ba268f73a9d86fc0a9fbb78dc713446839a2593acf1341cb5a115992f350870f13c1a472bb107b75af7
-[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-client-linux-arm64.tar.gz) | 2e3ae20e554c7d4fc3a8afdfcafe6bbc81d4c5e9aea036357baac7a3fdc2e8098aa8a8c3dded3951667d57f667ce3fbf37ec5ae5ceb2009a569dc9002d3a92f9
-[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-client-linux-ppc64le.tar.gz) | b54a34e572e6a86221577de376e6f7f9fcd82327f7fe94f2fc8d21f35d302db8a0f3d51e60dc89693999f5df37c96d0c3649a29f07f095efcdd59923ae285c95
-[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-client-linux-s390x.tar.gz) | 5be1b70dc437d3ba88cb0b89cd1bc555f79896c3f5b5f4fa0fb046a0d09d758b994d622ebe5cef8e65bba938c5ae945b81dc297f9dfa0d98f82ea75f344a3a0d
-[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-client-windows-386.tar.gz) | 88cf3f66168ef3bf9a5d3d2275b7f33799406e8205f2c202997ebec23d449aa4bb48b010356ab1cf52ff7b527b8df7c8b9947a43a82ebe060df83c3d21b7223a
-[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-client-windows-amd64.tar.gz) | 87d2d4ea1829da8cfa1a705a03ea26c759a03bd1c4d8b96f2c93264c4d172bb63a91d9ddda65cdc5478b627c30ae8993db5baf8be262c157d83bffcebe85474e
-
-### Server binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-server-linux-amd64.tar.gz) | 7af691fc0b13a937797912374e3b3eeb88d5262e4eb7d4ebe92a3b64b3c226cb049aedfd7e39f639f6990444f7bcf2fe58699cf0c29039daebe100d7eebf60de
-[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-server-linux-arm.tar.gz) | 557c47870ecf5c2090b2694c8f0c8e3b4ca23df5455a37945bd037bc6fb5b8f417bf737bb66e6336b285112cb52de0345240fdb2f3ce1c4fb335ca7ef1197f99
-[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-server-linux-arm64.tar.gz) | 981de6cf7679d743cdeef1e894314357b68090133814801870504ef30564e32b5675e270db20961e9a731e35241ad9b037bdaf749da87b6c4ce8889eeb1c5855
-[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-server-linux-ppc64le.tar.gz) | 506578a21601ccff609ae757a55e68634c15cbfecbf13de972c96b32a155ded29bd71aee069c77f5f721416672c7a7ac0b8274de22bfd28e1ecae306313d96c5
-[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-server-linux-s390x.tar.gz) | af0cdcd4a77a7cc8060a076641615730a802f1f02dab084e41926023489efec6102d37681c70ab0dbe7440cd3e72ea0443719a365467985360152b9aae657375
-
-### Node binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-node-linux-amd64.tar.gz) | 2d92c61596296279de1efae23b2b707415565d9d50cd61a7231b8d10325732b059bcb90f3afb36bef2575d203938c265572721e38df408e8792d3949523bd5d9
-[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-node-linux-arm.tar.gz) | c298de9b5ac1b8778729a2d8e2793ff86743033254fbc27014333880b03c519de81691caf03aa418c729297ee8942ce9ec89d11b0e34a80576b9936015dc1519
-[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-node-linux-arm64.tar.gz) | daa3c65afda6d7aff206c1494390bbcc205c2c6f8db04c10ca967a690578a01c49d49c6902b85e7158f79fd4d2a87c5d397d56524a75991c9d7db85ac53059a7
-[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-node-linux-ppc64le.tar.gz) | 05661908bb73bfcaf9c2eae96e9a6a793db5a7a100bce6df9e057985dd53a7a5248d72e81b6d13496bd38b9326c17cdb2edaf0e982b6437507245fb846e1efc6
-[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-node-linux-s390x.tar.gz) | 845e518e2c4ef0cef2c3b58f0b9ea5b5fe9b8a249717f789607752484c424c26ae854b263b7c0a004a8426feb9aa3683c177a9ed2567e6c3521f4835ea08c24a
-[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.3/kubernetes-node-windows-amd64.tar.gz) | 530e536574ed2c3e5973d3c0f0fdd2b4d48ef681a7a7c02db13e605001669eeb4f4b8a856fc08fc21436658c27b377f5d04dbcb3aae438098abc953b6eaf5712
-
-## Changelog since v1.20.0-alpha.2
-
-## Changes by Kind
-
-### API Change
-
-- New parameter `defaultingType` for `PodTopologySpread` plugin allows to use k8s defined or user provided default constraints ([#95048](https://github.com/kubernetes/kubernetes/pull/95048), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling]
-
-### Feature
-
-- Added new k8s.io/component-helpers repository providing shared helper code for (core) components. ([#92507](https://github.com/kubernetes/kubernetes/pull/92507), [@ingvagabund](https://github.com/ingvagabund)) [SIG Apps, Node, Release and Scheduling]
-- Adds `create ingress` command to `kubectl` ([#78153](https://github.com/kubernetes/kubernetes/pull/78153), [@amimof](https://github.com/amimof)) [SIG CLI and Network]
-- Kubectl create now supports creating ingress objects. ([#94327](https://github.com/kubernetes/kubernetes/pull/94327), [@rikatz](https://github.com/rikatz)) [SIG CLI and Network]
-- New default scheduling plugins order reduces scheduling and preemption latency when taints and node affinity are used ([#95539](https://github.com/kubernetes/kubernetes/pull/95539), [@soulxu](https://github.com/soulxu)) [SIG Scheduling]
-- SCTP support in API objects (Pod, Service, NetworkPolicy) is now GA.
- Note that this has no effect on whether SCTP is enabled on nodes at the kernel level,
- and note that some cloud platforms and network plugins do not support SCTP traffic. ([#95566](https://github.com/kubernetes/kubernetes/pull/95566), [@danwinship](https://github.com/danwinship)) [SIG Apps and Network]
-- Scheduling Framework: expose Run[Pre]ScorePlugins functions to PreemptionHandle which can be used in PostFilter extention point. ([#93534](https://github.com/kubernetes/kubernetes/pull/93534), [@everpeace](https://github.com/everpeace)) [SIG Scheduling and Testing]
-- SelectorSpreadPriority maps to PodTopologySpread plugin when DefaultPodTopologySpread feature is enabled ([#95448](https://github.com/kubernetes/kubernetes/pull/95448), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling]
-- SetHostnameAsFQDN has been graduated to Beta and therefore it is enabled by default. ([#95267](https://github.com/kubernetes/kubernetes/pull/95267), [@javidiaz](https://github.com/javidiaz)) [SIG Node]
-
-### Bug or Regression
-
-- An issues preventing volume expand controller to annotate the PVC with `volume.kubernetes.io/storage-resizer` when the PVC StorageClass is already updated to the out-of-tree provisioner is now fixed. ([#94489](https://github.com/kubernetes/kubernetes/pull/94489), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG API Machinery, Apps and Storage]
-- Change the mount way from systemd to normal mount except ceph and glusterfs intree-volume. ([#94916](https://github.com/kubernetes/kubernetes/pull/94916), [@smileusd](https://github.com/smileusd)) [SIG Apps, Cloud Provider, Network, Node, Storage and Testing]
-- Fix azure disk attach failure for disk size bigger than 4TB ([#95463](https://github.com/kubernetes/kubernetes/pull/95463), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix azure disk data loss issue on Windows when unmount disk ([#95456](https://github.com/kubernetes/kubernetes/pull/95456), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
-- Fix verb & scope reporting for kube-apiserver metrics (LIST reported instead of GET) ([#95562](https://github.com/kubernetes/kubernetes/pull/95562), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery and Testing]
-- Fix vsphere detach failure for static PVs ([#95447](https://github.com/kubernetes/kubernetes/pull/95447), [@gnufied](https://github.com/gnufied)) [SIG Cloud Provider and Storage]
-- Fix: smb valid path error ([#95583](https://github.com/kubernetes/kubernetes/pull/95583), [@andyzhangx](https://github.com/andyzhangx)) [SIG Storage]
-- Fixed a bug causing incorrect formatting of `kubectl describe ingress`. ([#94985](https://github.com/kubernetes/kubernetes/pull/94985), [@howardjohn](https://github.com/howardjohn)) [SIG CLI and Network]
-- Fixed a bug in client-go where new clients with customized `Dial`, `Proxy`, `GetCert` config may get stale HTTP transports. ([#95427](https://github.com/kubernetes/kubernetes/pull/95427), [@roycaihw](https://github.com/roycaihw)) [SIG API Machinery]
-- Fixes high CPU usage in kubectl drain ([#95260](https://github.com/kubernetes/kubernetes/pull/95260), [@amandahla](https://github.com/amandahla)) [SIG CLI]
-- Support the node label `node.kubernetes.io/exclude-from-external-load-balancers` ([#95542](https://github.com/kubernetes/kubernetes/pull/95542), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-
-### Other (Cleanup or Flake)
-
-- Fix func name NewCreateCreateDeploymentOptions ([#91931](https://github.com/kubernetes/kubernetes/pull/91931), [@lixiaobing1](https://github.com/lixiaobing1)) [SIG CLI]
-- Kubeadm: update the default pause image version to 1.4.0 on Windows. With this update the image supports Windows versions 1809 (2019LTS), 1903, 1909, 2004 ([#95419](https://github.com/kubernetes/kubernetes/pull/95419), [@jsturtevant](https://github.com/jsturtevant)) [SIG Cluster Lifecycle and Windows]
-- Upgrade snapshot controller to 3.0.0 ([#95412](https://github.com/kubernetes/kubernetes/pull/95412), [@saikat-royc](https://github.com/saikat-royc)) [SIG Cloud Provider]
-- Remove the dependency of csi-translation-lib module on apiserver/cloud-provider/controller-manager ([#95543](https://github.com/kubernetes/kubernetes/pull/95543), [@wawa0210](https://github.com/wawa0210)) [SIG Release]
-- Scheduler framework interface moved from pkg/scheduler/framework/v1alpha to pkg/scheduler/framework ([#95069](https://github.com/kubernetes/kubernetes/pull/95069), [@farah](https://github.com/farah)) [SIG Scheduling, Storage and Testing]
-- UDP and SCTP protocols can left stale connections that need to be cleared to avoid services disruption, but they can cause problems that are hard to debug.
- Kubernetes components using a loglevel greater or equal than 4 will log the conntrack operations and its output, to show the entries that were deleted. ([#95694](https://github.com/kubernetes/kubernetes/pull/95694), [@aojea](https://github.com/aojea)) [SIG Network]
-
-## Dependencies
-
-### Added
-_Nothing has changed._
-
-### Changed
-_Nothing has changed._
-
-### Removed
-_Nothing has changed._
-
-
-
-# v1.20.0-alpha.2
-
-
-## Downloads for v1.20.0-alpha.2
-
-### Source Code
-
-filename | sha512 hash
--------- | -----------
-[kubernetes.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes.tar.gz) | 45089a4d26d56a5d613ecbea64e356869ac738eca3cc71d16b74ea8ae1b4527bcc32f1dc35ff7aa8927e138083c7936603faf063121d965a2f0f8ba28fa128d8
-[kubernetes-src.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-src.tar.gz) | 646edd890d6df5858b90aaf68cc6e1b4589b8db09396ae921b5c400f2188234999e6c9633906692add08c6e8b4b09f12b2099132b0a7533443fb2a01cfc2bf81
-
-### Client binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-client-darwin-amd64.tar.gz) | c136273883e24a2a50b5093b9654f01cdfe57b97461d34885af4a68c2c4d108c07583c02b1cdf7f57f82e91306e542ce8f3bddb12fcce72b744458bc4796f8eb
-[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-client-linux-386.tar.gz) | 6ec59f1ed30569fa64ddb2d0de32b1ae04cda4ffe13f339050a7c9d7c63d425ee6f6d963dcf82c17281c4474da3eaf32c08117669052872a8c81bdce2c8a5415
-[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-client-linux-amd64.tar.gz) | 7b40a4c087e2ea7f8d055f297fcd39a3f1cb6c866e7a3981a9408c3c3eb5363c648613491aad11bc7d44d5530b20832f8f96f6ceff43deede911fb74aafad35f
-[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-client-linux-arm.tar.gz) | cda9955feebea5acb8f2b5b87895d24894bbbbde47041453b1f926ebdf47a258ce0496aa27d06bcbf365b5615ce68a20d659b64410c54227216726e2ee432fca
-[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-client-linux-arm64.tar.gz) | f65bd9241c7eb88a4886a285330f732448570aea4ededaebeabcf70d17ea185f51bf8a7218f146ee09fb1adceca7ee71fb3c3683834f2c415163add820fba96e
-[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-client-linux-ppc64le.tar.gz) | 1e377599af100a81d027d9199365fb8208d443a8e0a97affff1a79dc18796e14b78cb53d6e245c1c1e8defd0e050e37bf5f2a23c8a3ff45a6d18d03619709bf5
-[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-client-linux-s390x.tar.gz) | 1cdee81478246aa7e7b80ae4efc7f070a5b058083ae278f59fad088b75a8052761b0e15ab261a6e667ddafd6a69fb424fc307072ed47941cad89a85af7aee93d
-[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-client-windows-386.tar.gz) | d8774167c87b6844c348aa15e92d5033c528d6ab9e95d08a7cb22da68bafd8e46d442cf57a5f6affad62f674c10ae6947d524b94108b5e450ca78f92656d63c0
-[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-client-windows-amd64.tar.gz) | f664b47d8daa6036f8154c1dc1f881bfe683bf57c39d9b491de3848c03d051c50c6644d681baf7f9685eae45f9ce62e4c6dfea2853763cfe8256a61bdd59d894
-
-### Server binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-server-linux-amd64.tar.gz) | d6fcb4600be0beb9de222a8da64c35fe22798a0da82d41401d34d0f0fc7e2817512169524c281423d8f4a007cd77452d966317d5a1b67d2717a05ff346e8aa7d
-[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-server-linux-arm.tar.gz) | 022a76cf10801f8afbabb509572479b68fdb4e683526fa0799cdbd9bab4d3f6ecb76d1d63d0eafee93e3edf6c12892d84b9c771ef2325663b95347728fa3d6c0
-[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-server-linux-arm64.tar.gz) | 0679aadd60bbf6f607e5befad74b5267eb2d4c1b55985cc25a97e0f4c5efb7acbb3ede91bfa6a5a5713dae4d7a302f6faaf678fd6b359284c33d9a6aca2a08bb
-[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-server-linux-ppc64le.tar.gz) | 9f2cfeed543b515eafb60d9765a3afff4f3d323c0a5c8a0d75e3de25985b2627817bfcbe59a9a61d969e026e2b861adb974a09eae75b58372ed736ceaaed2a82
-[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-server-linux-s390x.tar.gz) | 937258704d7b9dcd91f35f2d34ee9dd38c18d9d4e867408c05281bfbbb919ad012c95880bee84d2674761aa44cc617fb2fae1124cf63b689289286d6eac1c407
-
-### Node binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-node-linux-amd64.tar.gz) | 076165d745d47879de68f4404eaf432920884be48277eb409e84bf2c61759633bf3575f46b0995f1fc693023d76c0921ed22a01432e756d7f8d9e246a243b126
-[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-node-linux-arm.tar.gz) | 1ff2e2e3e43af41118cdfb70c778e15035bbb1aca833ffd2db83c4bcd44f55693e956deb9e65017ebf3c553f2820ad5cd05f5baa33f3d63f3e00ed980ea4dfed
-[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-node-linux-arm64.tar.gz) | b232c7359b8c635126899beee76998078eec7a1ef6758d92bcdebe8013b0b1e4d7b33ecbf35e3f82824fe29493400845257e70ed63c1635bfa36c8b3b4969f6f
-[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-node-linux-ppc64le.tar.gz) | 51d415a068f554840f4c78d11a4fedebd7cb03c686b0ec864509b24f7a8667ebf54bb0a25debcf2b70f38be1e345e743f520695b11806539a55a3620ce21946f
-[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-node-linux-s390x.tar.gz) | b51c082d8af358233a088b632cf2f6c8cfe5421471c27f5dc9ba4839ae6ea75df25d84298f2042770097554c01742bb7686694b331ad9bafc93c86317b867728
-[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.2/kubernetes-node-windows-amd64.tar.gz) | 91b9d26620a2dde67a0edead0039814efccbdfd54594dda3597aaced6d89140dc92612ed0727bc21d63468efeef77c845e640153b09e39d8b736062e6eee0c76
-
-## Changelog since v1.20.0-alpha.1
-
-## Changes by Kind
-
-### Deprecation
-
-- Action-required: kubeadm: graduate the "kubeadm alpha certs" command to a parent command "kubeadm certs". The command "kubeadm alpha certs" is deprecated and will be removed in a future release. Please migrate. ([#94938](https://github.com/kubernetes/kubernetes/pull/94938), [@yagonobre](https://github.com/yagonobre)) [SIG Cluster Lifecycle]
-- Action-required: kubeadm: remove the deprecated feature --experimental-kustomize from kubeadm commands. The feature was replaced with --experimental-patches in 1.19. To migrate see the --help description for the --experimental-patches flag. ([#94871](https://github.com/kubernetes/kubernetes/pull/94871), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: deprecate self-hosting support. The experimental command "kubeadm alpha self-hosting" is now deprecated and will be removed in a future release. ([#95125](https://github.com/kubernetes/kubernetes/pull/95125), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Removes deprecated scheduler metrics DeprecatedSchedulingDuration, DeprecatedSchedulingAlgorithmPredicateEvaluationSecondsDuration, DeprecatedSchedulingAlgorithmPriorityEvaluationSecondsDuration ([#94884](https://github.com/kubernetes/kubernetes/pull/94884), [@arghya88](https://github.com/arghya88)) [SIG Instrumentation and Scheduling]
-- Scheduler alpha metrics binding_duration_seconds and scheduling_algorithm_preemption_evaluation_seconds are deprecated, Both of those metrics are now covered as part of framework_extension_point_duration_seconds, the former as a PostFilter the latter and a Bind plugin. The plan is to remove both in 1.21 ([#95001](https://github.com/kubernetes/kubernetes/pull/95001), [@arghya88](https://github.com/arghya88)) [SIG Instrumentation and Scheduling]
-
-### API Change
-
-- GPU metrics provided by kubelet are now disabled by default ([#95184](https://github.com/kubernetes/kubernetes/pull/95184), [@RenaudWasTaken](https://github.com/RenaudWasTaken)) [SIG Node]
-- New parameter `defaultingType` for `PodTopologySpread` plugin allows to use k8s defined or user provided default constraints ([#95048](https://github.com/kubernetes/kubernetes/pull/95048), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling]
-- Server Side Apply now treats LabelSelector fields as atomic (meaning the entire selector is managed by a single writer and updated together), since they contain interrelated and inseparable fields that do not merge in intuitive ways. ([#93901](https://github.com/kubernetes/kubernetes/pull/93901), [@jpbetz](https://github.com/jpbetz)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Storage and Testing]
-- Status of v1beta1 CRDs without "preserveUnknownFields:false" will show violation "spec.preserveUnknownFields: Invalid value: true: must be false" ([#93078](https://github.com/kubernetes/kubernetes/pull/93078), [@vareti](https://github.com/vareti)) [SIG API Machinery]
-
-### Feature
-
-- Added `get-users` and `delete-user` to the `kubectl config` subcommand ([#89840](https://github.com/kubernetes/kubernetes/pull/89840), [@eddiezane](https://github.com/eddiezane)) [SIG CLI]
-- Added counter metric "apiserver_request_self" to count API server self-requests with labels for verb, resource, and subresource. ([#94288](https://github.com/kubernetes/kubernetes/pull/94288), [@LogicalShark](https://github.com/LogicalShark)) [SIG API Machinery, Auth, Instrumentation and Scheduling]
-- Added new k8s.io/component-helpers repository providing shared helper code for (core) components. ([#92507](https://github.com/kubernetes/kubernetes/pull/92507), [@ingvagabund](https://github.com/ingvagabund)) [SIG Apps, Node, Release and Scheduling]
-- Adds `create ingress` command to `kubectl` ([#78153](https://github.com/kubernetes/kubernetes/pull/78153), [@amimof](https://github.com/amimof)) [SIG CLI and Network]
-- Allow configuring AWS LoadBalancer health check protocol via service annotations ([#94546](https://github.com/kubernetes/kubernetes/pull/94546), [@kishorj](https://github.com/kishorj)) [SIG Cloud Provider]
-- Azure: Support multiple services sharing one IP address ([#94991](https://github.com/kubernetes/kubernetes/pull/94991), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider]
-- Ephemeral containers now apply the same API defaults as initContainers and containers ([#94896](https://github.com/kubernetes/kubernetes/pull/94896), [@wawa0210](https://github.com/wawa0210)) [SIG Apps and CLI]
-- In dual-stack bare-metal clusters, you can now pass dual-stack IPs to `kubelet --node-ip`.
- eg: `kubelet --node-ip 10.1.0.5,fd01::0005`. This is not yet supported for non-bare-metal
- clusters.
-
- In dual-stack clusters where nodes have dual-stack addresses, hostNetwork pods
- will now get dual-stack PodIPs. ([#95239](https://github.com/kubernetes/kubernetes/pull/95239), [@danwinship](https://github.com/danwinship)) [SIG Network and Node]
-- Introduces a new GCE specific cluster creation variable KUBE_PROXY_DISABLE. When set to true, this will skip over the creation of kube-proxy (whether the daemonset or static pod). This can be used to control the lifecycle of kube-proxy separately from the lifecycle of the nodes. ([#91977](https://github.com/kubernetes/kubernetes/pull/91977), [@varunmar](https://github.com/varunmar)) [SIG Cloud Provider]
-- Kubeadm: do not throw errors if the current system time is outside of the NotBefore and NotAfter bounds of a loaded certificate. Print warnings instead. ([#94504](https://github.com/kubernetes/kubernetes/pull/94504), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: make the command "kubeadm alpha kubeconfig user" accept a "--config" flag and remove the following flags:
- - apiserver-advertise-address / apiserver-bind-port: use either localAPIEndpoint from InitConfiguration or controlPlaneEndpoint from ClusterConfiguration.
- - cluster-name: use clusterName from ClusterConfiguration
- - cert-dir: use certificatesDir from ClusterConfiguration ([#94879](https://github.com/kubernetes/kubernetes/pull/94879), [@knight42](https://github.com/knight42)) [SIG Cluster Lifecycle]
-- Kubectl rollout history sts/sts-name --revision=some-revision will start showing the detailed view of the sts on that specified revision ([#86506](https://github.com/kubernetes/kubernetes/pull/86506), [@dineshba](https://github.com/dineshba)) [SIG CLI]
-- Scheduling Framework: expose Run[Pre]ScorePlugins functions to PreemptionHandle which can be used in PostFilter extention point. ([#93534](https://github.com/kubernetes/kubernetes/pull/93534), [@everpeace](https://github.com/everpeace)) [SIG Scheduling and Testing]
-- Send gce node startup scripts logs to console and journal ([#95311](https://github.com/kubernetes/kubernetes/pull/95311), [@karan](https://github.com/karan)) [SIG Cloud Provider and Node]
-- Support kubectl delete orphan/foreground/background options ([#93384](https://github.com/kubernetes/kubernetes/pull/93384), [@zhouya0](https://github.com/zhouya0)) [SIG CLI and Testing]
-
-### Bug or Regression
-
-- Change the mount way from systemd to normal mount except ceph and glusterfs intree-volume. ([#94916](https://github.com/kubernetes/kubernetes/pull/94916), [@smileusd](https://github.com/smileusd)) [SIG Apps, Cloud Provider, Network, Node, Storage and Testing]
-- Cloud node controller: handle empty providerID from getProviderID ([#95342](https://github.com/kubernetes/kubernetes/pull/95342), [@nicolehanjing](https://github.com/nicolehanjing)) [SIG Cloud Provider]
-- Fix a bug where the endpoint slice controller was not mirroring the parent service labels to its corresponding endpoint slices ([#94443](https://github.com/kubernetes/kubernetes/pull/94443), [@aojea](https://github.com/aojea)) [SIG Apps and Network]
-- Fix azure disk attach failure for disk size bigger than 4TB ([#95463](https://github.com/kubernetes/kubernetes/pull/95463), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix azure disk data loss issue on Windows when unmount disk ([#95456](https://github.com/kubernetes/kubernetes/pull/95456), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
-- Fix detach azure disk issue when vm not exist ([#95177](https://github.com/kubernetes/kubernetes/pull/95177), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix network_programming_latency metric reporting for Endpoints/EndpointSlice deletions, where we don't have correct timestamp ([#95363](https://github.com/kubernetes/kubernetes/pull/95363), [@wojtek-t](https://github.com/wojtek-t)) [SIG Network and Scalability]
-- Fix scheduler cache snapshot when a Node is deleted before its Pods ([#95130](https://github.com/kubernetes/kubernetes/pull/95130), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scheduling]
-- Fix vsphere detach failure for static PVs ([#95447](https://github.com/kubernetes/kubernetes/pull/95447), [@gnufied](https://github.com/gnufied)) [SIG Cloud Provider and Storage]
-- Fixed a bug that prevents the use of ephemeral containers in the presence of a validating admission webhook. ([#94685](https://github.com/kubernetes/kubernetes/pull/94685), [@verb](https://github.com/verb)) [SIG Node and Testing]
-- Gracefully delete nodes when their parent scale set went missing ([#95289](https://github.com/kubernetes/kubernetes/pull/95289), [@bpineau](https://github.com/bpineau)) [SIG Cloud Provider]
-- In dual-stack clusters, kubelet will now set up both IPv4 and IPv6 iptables rules, which may
- fix some problems, eg with HostPorts. ([#94474](https://github.com/kubernetes/kubernetes/pull/94474), [@danwinship](https://github.com/danwinship)) [SIG Network and Node]
-- Kubeadm: for Docker as the container runtime, make the "kubeadm reset" command stop containers before removing them ([#94586](https://github.com/kubernetes/kubernetes/pull/94586), [@BedivereZero](https://github.com/BedivereZero)) [SIG Cluster Lifecycle]
-- Kubeadm: warn but do not error out on missing "ca.key" files for root CA, front-proxy CA and etcd CA, during "kubeadm join --control-plane" if the user has provided all certificates, keys and kubeconfig files which require signing with the given CA keys. ([#94988](https://github.com/kubernetes/kubernetes/pull/94988), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Port mapping allows to map the same `containerPort` to multiple `hostPort` without naming the mapping explicitly. ([#94494](https://github.com/kubernetes/kubernetes/pull/94494), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev)) [SIG Network and Node]
-- Warn instead of fail when creating Roles and ClusterRoles with custom verbs via kubectl ([#92492](https://github.com/kubernetes/kubernetes/pull/92492), [@eddiezane](https://github.com/eddiezane)) [SIG CLI]
-
-### Other (Cleanup or Flake)
-
-- Added fine grained debugging to the intra-pod conformance test for helping easily resolve networking issues for nodes that might be unhealthy when running conformance or sonobuoy tests. ([#93837](https://github.com/kubernetes/kubernetes/pull/93837), [@jayunit100](https://github.com/jayunit100)) [SIG Network and Testing]
-- AdmissionReview objects sent for the creation of Namespace API objects now populate the `namespace` attribute consistently (previously the `namespace` attribute was empty for Namespace creation via POST requests, and populated for Namespace creation via server-side-apply PATCH requests) ([#95012](https://github.com/kubernetes/kubernetes/pull/95012), [@nodo](https://github.com/nodo)) [SIG API Machinery and Testing]
-- Client-go header logging (at verbosity levels >= 9) now masks `Authorization` header contents ([#95316](https://github.com/kubernetes/kubernetes/pull/95316), [@sfowl](https://github.com/sfowl)) [SIG API Machinery]
-- Enhance log information of verifyRunAsNonRoot, add pod, container information ([#94911](https://github.com/kubernetes/kubernetes/pull/94911), [@wawa0210](https://github.com/wawa0210)) [SIG Node]
-- Errors from staticcheck:
- vendor/k8s.io/client-go/discovery/cached/memory/memcache_test.go:94:2: this value of g is never used (SA4006) ([#95098](https://github.com/kubernetes/kubernetes/pull/95098), [@phunziker](https://github.com/phunziker)) [SIG API Machinery]
-- Kubeadm: update the default pause image version to 1.4.0 on Windows. With this update the image supports Windows versions 1809 (2019LTS), 1903, 1909, 2004 ([#95419](https://github.com/kubernetes/kubernetes/pull/95419), [@jsturtevant](https://github.com/jsturtevant)) [SIG Cluster Lifecycle and Windows]
-- Masks ceph RBD adminSecrets in logs when logLevel >= 4 ([#95245](https://github.com/kubernetes/kubernetes/pull/95245), [@sfowl](https://github.com/sfowl)) [SIG Storage]
-- Upgrade snapshot controller to 3.0.0 ([#95412](https://github.com/kubernetes/kubernetes/pull/95412), [@saikat-royc](https://github.com/saikat-royc)) [SIG Cloud Provider]
-- Remove offensive words from kubectl cluster-info command ([#95202](https://github.com/kubernetes/kubernetes/pull/95202), [@rikatz](https://github.com/rikatz)) [SIG Architecture, CLI and Testing]
-- The following new metrics are available.
- - network_plugin_operations_total
- - network_plugin_operations_errors_total ([#93066](https://github.com/kubernetes/kubernetes/pull/93066), [@AnishShah](https://github.com/AnishShah)) [SIG Instrumentation, Network and Node]
-- Vsphere: improve logging message on node cache refresh event ([#95236](https://github.com/kubernetes/kubernetes/pull/95236), [@andrewsykim](https://github.com/andrewsykim)) [SIG Cloud Provider]
-- `kubectl api-resources` now prints the API version (as 'API group/version', same as output of `kubectl api-versions`). The column APIGROUP is now APIVERSION ([#95253](https://github.com/kubernetes/kubernetes/pull/95253), [@sallyom](https://github.com/sallyom)) [SIG CLI]
-
-## Dependencies
-
-### Added
-- github.com/jmespath/go-jmespath/internal/testify: [v1.5.1](https://github.com/jmespath/go-jmespath/internal/testify/tree/v1.5.1)
-
-### Changed
-- github.com/aws/aws-sdk-go: [v1.28.2 → v1.35.5](https://github.com/aws/aws-sdk-go/compare/v1.28.2...v1.35.5)
-- github.com/jmespath/go-jmespath: [c2b33e8 → v0.4.0](https://github.com/jmespath/go-jmespath/compare/c2b33e8...v0.4.0)
-- k8s.io/kube-openapi: 6aeccd4 → 8b50664
-- sigs.k8s.io/apiserver-network-proxy/konnectivity-client: v0.0.9 → v0.0.12
-- sigs.k8s.io/structured-merge-diff/v4: v4.0.1 → b3cf1e8
-
-### Removed
-_Nothing has changed._
-
-
-
-# v1.20.0-alpha.1
-
-
-## Downloads for v1.20.0-alpha.1
-
-### Source Code
-
-filename | sha512 hash
--------- | -----------
-[kubernetes.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes.tar.gz) | e7daed6502ea07816274f2371f96fe1a446d0d7917df4454b722d9eb3b5ff6163bfbbd5b92dfe7a0c1d07328b8c09c4ae966e482310d6b36de8813aaf87380b5
-[kubernetes-src.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-src.tar.gz) | e91213a0919647a1215d4691a63b12d89a3e74055463a8ebd71dc1a4cabf4006b3660881067af0189960c8dab74f4a7faf86f594df69021901213ee5b56550ea
-
-### Client binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-client-darwin-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-client-darwin-amd64.tar.gz) | 1f3add5f826fa989820d715ca38e8864b66f30b59c1abeacbb4bfb96b4e9c694eac6b3f4c1c81e0ee3451082d44828cb7515315d91ad68116959a5efbdaef1e1
-[kubernetes-client-linux-386.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-client-linux-386.tar.gz) | c62acdc8993b0a950d4b0ce0b45473bf96373d501ce61c88adf4007afb15c1d53da8d53b778a7eccac6c1624f7fdda322be9f3a8bc2d80aaad7b4237c39f5eaf
-[kubernetes-client-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-client-linux-amd64.tar.gz) | 1203ababfe00f9bc5be5c059324c17160a96530c1379a152db33564bbe644ccdb94b30eea15a0655bd652efb17895a46c31bbba19d4f5f473c2a0ff62f6e551f
-[kubernetes-client-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-client-linux-arm.tar.gz) | 31860088596e12d739c7aed94556c2d1e217971699b950c8417a3cea1bed4e78c9ff1717b9f3943354b75b4641d4b906cd910890dbf4278287c0d224837d9a7d
-[kubernetes-client-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-client-linux-arm64.tar.gz) | 8d469f37fe20d6e15b5debc13cce4c22e8b7a4f6a4ac787006b96507a85ce761f63b28140d692c54b5f7deb08697f8d5ddb9bbfa8f5ac0d9241fc7de3a3fe3cd
-[kubernetes-client-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-client-linux-ppc64le.tar.gz) | 0d62ee1729cd5884946b6c73701ad3a570fa4d642190ca0fe5c1db0fb0cba9da3ac86a948788d915b9432d28ab8cc499e28aadc64530b7d549ee752a6ed93ec1
-[kubernetes-client-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-client-linux-s390x.tar.gz) | 0fc0420e134ec0b8e0ab2654e1e102cebec47b48179703f1e1b79d51ee0d6da55a4e7304d8773d3cf830341ac2fe3cede1e6b0460fd88f7595534e0730422d5a
-[kubernetes-client-windows-386.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-client-windows-386.tar.gz) | 3fb53b5260f4888c77c0e4ff602bbcf6bf38c364d2769850afe2b8d8e8b95f7024807c15e2b0d5603e787c46af8ac53492be9e88c530f578b8a389e3bd50c099
-[kubernetes-client-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-client-windows-amd64.tar.gz) | 2f44c93463d6b5244ce0c82f147e7f32ec2233d0e29c64c3c5759e23533aebd12671bf63e986c0861e9736f9b5259bb8d138574a7c8c8efc822e35cd637416c0
-
-### Server binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-server-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-server-linux-amd64.tar.gz) | ae82d14b1214e4100f0cc2c988308b3e1edd040a65267d0eddb9082409f79644e55387889e3c0904a12c710f91206e9383edf510990bee8c9ea2e297b6472551
-[kubernetes-server-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-server-linux-arm.tar.gz) | 9a2a5828b7d1ddb16cc19d573e99a4af642f84129408e6203eeeb0558e7b8db77f3269593b5770b6a976fe9df4a64240ed27ad05a4bd43719e55fce1db0abf58
-[kubernetes-server-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-server-linux-arm64.tar.gz) | ed700dd226c999354ce05b73927388d36d08474c15333ae689427de15de27c84feb6b23c463afd9dd81993315f31eb8265938cfc7ecf6f750247aa42b9b33fa9
-[kubernetes-server-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-server-linux-ppc64le.tar.gz) | abb7a9d726538be3ccf5057a0c63ff9732b616e213c6ebb81363f0c49f1e168ce8068b870061ad7cba7ba1d49252f94cf00a5f68cec0f38dc8fce4e24edc5ca6
-[kubernetes-server-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-server-linux-s390x.tar.gz) | 3a51888af1bfdd2d5b0101d173ee589c1f39240e4428165f5f85c610344db219625faa42f00a49a83ce943fb079be873b1a114a62003fae2f328f9bf9d1227a4
-
-### Node binaries
-
-filename | sha512 hash
--------- | -----------
-[kubernetes-node-linux-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-node-linux-amd64.tar.gz) | d0f28e3c38ca59a7ff1bfecb48a1ce97116520355d9286afdca1200d346c10018f5bbdf890f130a388654635a2e83e908b263ed45f8a88defca52a7c1d0a7984
-[kubernetes-node-linux-arm.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-node-linux-arm.tar.gz) | ed9d3f13028beb3be39bce980c966f82c4b39dc73beaae38cc075fea5be30b0309e555cb2af8196014f2cc9f0df823354213c314b4d6545ff6e30dd2d00ec90e
-[kubernetes-node-linux-arm64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-node-linux-arm64.tar.gz) | ad5b3268db365dcdded9a9a4bffc90c7df0f844000349accdf2b8fb5f1081e553de9b9e9fb25d5e8a4ef7252d51fa94ef94d36d2ab31d157854e164136f662c2
-[kubernetes-node-linux-ppc64le.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-node-linux-ppc64le.tar.gz) | c4de2524e513996def5eeba7b83f7b406f17eaf89d4d557833a93bd035348c81fa9375dcd5c27cfcc55d73995449fc8ee504be1b3bd7b9f108b0b2f153cb05ae
-[kubernetes-node-linux-s390x.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-node-linux-s390x.tar.gz) | 9157b44e3e7bd5478af9f72014e54d1afa5cd19b984b4cd8b348b312c385016bb77f29db47f44aea08b58abf47d8a396b92a2d0e03f2fe8acdd30f4f9466cbdb
-[kubernetes-node-windows-amd64.tar.gz](https://dl.k8s.io/v1.20.0-alpha.1/kubernetes-node-windows-amd64.tar.gz) | 8b40a43c5e6447379ad2ee8aac06e8028555e1b370a995f6001018a62411abe5fbbca6060b3d1682c5cadc07a27d49edd3204e797af46368800d55f4ca8aa1de
-
-## Changelog since v1.20.0-alpha.0
-
-## Urgent Upgrade Notes
-
-### (No, really, you MUST read this before you upgrade)
-
- - Azure blob disk feature(`kind`: `Shared`, `Dedicated`) has been deprecated, you should use `kind`: `Managed` in `kubernetes.io/azure-disk` storage class. ([#92905](https://github.com/kubernetes/kubernetes/pull/92905), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
- - CVE-2020-8559 (Medium): Privilege escalation from compromised node to cluster. See https://github.com/kubernetes/kubernetes/issues/92914 for more details.
- The API Server will no longer proxy non-101 responses for upgrade requests. This could break proxied backends (such as an extension API server) that respond to upgrade requests with a non-101 response code. ([#92941](https://github.com/kubernetes/kubernetes/pull/92941), [@tallclair](https://github.com/tallclair)) [SIG API Machinery]
-
-## Changes by Kind
-
-### Deprecation
-
-- Kube-apiserver: the componentstatus API is deprecated. This API provided status of etcd, kube-scheduler, and kube-controller-manager components, but only worked when those components were local to the API server, and when kube-scheduler and kube-controller-manager exposed unsecured health endpoints. Instead of this API, etcd health is included in the kube-apiserver health check and kube-scheduler/kube-controller-manager health checks can be made directly against those components' health endpoints. ([#93570](https://github.com/kubernetes/kubernetes/pull/93570), [@liggitt](https://github.com/liggitt)) [SIG API Machinery, Apps and Cluster Lifecycle]
-- Kubeadm: deprecate the "kubeadm alpha kubelet config enable-dynamic" command. To continue using the feature please defer to the guide for "Dynamic Kubelet Configuration" at k8s.io. ([#92881](https://github.com/kubernetes/kubernetes/pull/92881), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: remove the deprecated "kubeadm alpha kubelet config enable-dynamic" command. To continue using the feature please defer to the guide for "Dynamic Kubelet Configuration" at k8s.io. This change also removes the parent command "kubeadm alpha kubelet" as there are no more sub-commands under it for the time being. ([#94668](https://github.com/kubernetes/kubernetes/pull/94668), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: remove the deprecated --kubelet-config flag for the command "kubeadm upgrade node" ([#94869](https://github.com/kubernetes/kubernetes/pull/94869), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubelet's deprecated endpoint `metrics/resource/v1alpha1` has been removed, please adopt to `metrics/resource`. ([#94272](https://github.com/kubernetes/kubernetes/pull/94272), [@RainbowMango](https://github.com/RainbowMango)) [SIG Instrumentation and Node]
-- The v1alpha1 PodPreset API and admission plugin has been removed with no built-in replacement. Admission webhooks can be used to modify pods on creation. ([#94090](https://github.com/kubernetes/kubernetes/pull/94090), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Apps, CLI, Cloud Provider, Scalability and Testing]
-
-### API Change
-
-- A new `nofuzz` go build tag now disables gofuzz support. Release binaries enable this. ([#92491](https://github.com/kubernetes/kubernetes/pull/92491), [@BenTheElder](https://github.com/BenTheElder)) [SIG API Machinery]
-- A new alpha-level field, `SupportsFsGroup`, has been introduced for CSIDrivers to allow them to specify whether they support volume ownership and permission modifications. The `CSIVolumeSupportFSGroup` feature gate must be enabled to allow this field to be used. ([#92001](https://github.com/kubernetes/kubernetes/pull/92001), [@huffmanca](https://github.com/huffmanca)) [SIG API Machinery, CLI and Storage]
-- Added pod version skew strategy for seccomp profile to synchronize the deprecated annotations with the new API Server fields. Please see the corresponding section [in the KEP](https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/20190717-seccomp-ga.md#version-skew-strategy) for more detailed explanations. ([#91408](https://github.com/kubernetes/kubernetes/pull/91408), [@saschagrunert](https://github.com/saschagrunert)) [SIG Apps, Auth, CLI and Node]
-- Adds the ability to disable Accelerator/GPU metrics collected by Kubelet ([#91930](https://github.com/kubernetes/kubernetes/pull/91930), [@RenaudWasTaken](https://github.com/RenaudWasTaken)) [SIG Node]
-- Custom Endpoints are now mirrored to EndpointSlices by a new EndpointSliceMirroring controller. ([#91637](https://github.com/kubernetes/kubernetes/pull/91637), [@robscott](https://github.com/robscott)) [SIG API Machinery, Apps, Auth, Cloud Provider, Instrumentation, Network and Testing]
-- External facing API podresources is now available under k8s.io/kubelet/pkg/apis/ ([#92632](https://github.com/kubernetes/kubernetes/pull/92632), [@RenaudWasTaken](https://github.com/RenaudWasTaken)) [SIG Node and Testing]
-- Fix conversions for custom metrics. ([#94481](https://github.com/kubernetes/kubernetes/pull/94481), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery and Instrumentation]
-- Generic ephemeral volumes, a new alpha feature under the `GenericEphemeralVolume` feature gate, provide a more flexible alternative to `EmptyDir` volumes: as with `EmptyDir`, volumes are created and deleted for each pod automatically by Kubernetes. But because the normal provisioning process is used (`PersistentVolumeClaim`), storage can be provided by third-party storage vendors and all of the usual volume features work. Volumes don't need to be empt; for example, restoring from snapshot is supported. ([#92784](https://github.com/kubernetes/kubernetes/pull/92784), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Auth, CLI, Instrumentation, Node, Scheduling, Storage and Testing]
-- Kube-controller-manager: volume plugins can be restricted from contacting local and loopback addresses by setting `--volume-host-allow-local-loopback=false`, or from contacting specific CIDR ranges by setting `--volume-host-cidr-denylist` (for example, `--volume-host-cidr-denylist=127.0.0.1/28,feed::/16`) ([#91785](https://github.com/kubernetes/kubernetes/pull/91785), [@mattcary](https://github.com/mattcary)) [SIG API Machinery, Apps, Auth, CLI, Network, Node, Storage and Testing]
-- Kubernetes is now built with golang 1.15.0-rc.1.
- - The deprecated, legacy behavior of treating the CommonName field on X.509 serving certificates as a host name when no Subject Alternative Names are present is now disabled by default. It can be temporarily re-enabled by adding the value x509ignoreCN=0 to the GODEBUG environment variable. ([#93264](https://github.com/kubernetes/kubernetes/pull/93264), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scalability, Storage and Testing]
-- Migrate scheduler, controller-manager and cloud-controller-manager to use LeaseLock ([#94603](https://github.com/kubernetes/kubernetes/pull/94603), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery, Apps, Cloud Provider and Scheduling]
-- Modify DNS-1123 error messages to indicate that RFC 1123 is not followed exactly ([#94182](https://github.com/kubernetes/kubernetes/pull/94182), [@mattfenwick](https://github.com/mattfenwick)) [SIG API Machinery, Apps, Auth, Network and Node]
-- The ServiceAccountIssuerDiscovery feature gate is now Beta and enabled by default. ([#91921](https://github.com/kubernetes/kubernetes/pull/91921), [@mtaufen](https://github.com/mtaufen)) [SIG Auth]
-- The kube-controller-manager managed signers can now have distinct signing certificates and keys. See the help about `--cluster-signing-[signer-name]-{cert,key}-file`. `--cluster-signing-{cert,key}-file` is still the default. ([#90822](https://github.com/kubernetes/kubernetes/pull/90822), [@deads2k](https://github.com/deads2k)) [SIG API Machinery, Apps and Auth]
-- When creating a networking.k8s.io/v1 Ingress API object, `spec.tls[*].secretName` values are required to pass validation rules for Secret API object names. ([#93929](https://github.com/kubernetes/kubernetes/pull/93929), [@liggitt](https://github.com/liggitt)) [SIG Network]
-- WinOverlay feature graduated to beta ([#94807](https://github.com/kubernetes/kubernetes/pull/94807), [@ksubrmnn](https://github.com/ksubrmnn)) [SIG Windows]
-
-### Feature
-
-- ACTION REQUIRED : In CoreDNS v1.7.0, [metrics names have been changed](https://github.com/coredns/coredns/blob/master/notes/coredns-1.7.0.md#metric-changes) which will be backward incompatible with existing reporting formulas that use the old metrics' names. Adjust your formulas to the new names before upgrading.
-
- Kubeadm now includes CoreDNS version v1.7.0. Some of the major changes include:
- - Fixed a bug that could cause CoreDNS to stop updating service records.
- - Fixed a bug in the forward plugin where only the first upstream server is always selected no matter which policy is set.
- - Remove already deprecated options `resyncperiod` and `upstream` in the Kubernetes plugin.
- - Includes Prometheus metrics name changes (to bring them in line with standard Prometheus metrics naming convention). They will be backward incompatible with existing reporting formulas that use the old metrics' names.
- - The federation plugin (allows for v1 Kubernetes federation) has been removed.
- More details are available in https://coredns.io/2020/06/15/coredns-1.7.0-release/ ([#92651](https://github.com/kubernetes/kubernetes/pull/92651), [@rajansandeep](https://github.com/rajansandeep)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle and Instrumentation]
-- Add metrics for azure service operations (route and loadbalancer). ([#94124](https://github.com/kubernetes/kubernetes/pull/94124), [@nilo19](https://github.com/nilo19)) [SIG Cloud Provider and Instrumentation]
-- Add network rule support in Azure account creation ([#94239](https://github.com/kubernetes/kubernetes/pull/94239), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Add tags support for Azure File Driver ([#92825](https://github.com/kubernetes/kubernetes/pull/92825), [@ZeroMagic](https://github.com/ZeroMagic)) [SIG Cloud Provider and Storage]
-- Added kube-apiserver metrics: apiserver_current_inflight_request_measures and, when API Priority and Fairness is enable, windowed_request_stats. ([#91177](https://github.com/kubernetes/kubernetes/pull/91177), [@MikeSpreitzer](https://github.com/MikeSpreitzer)) [SIG API Machinery, Instrumentation and Testing]
-- Audit events for API requests to deprecated API versions now include a `"k8s.io/deprecated": "true"` audit annotation. If a target removal release is identified, the audit event includes a `"k8s.io/removal-release": "."` audit annotation as well. ([#92842](https://github.com/kubernetes/kubernetes/pull/92842), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and Instrumentation]
-- Cloud node-controller use InstancesV2 ([#91319](https://github.com/kubernetes/kubernetes/pull/91319), [@gongguan](https://github.com/gongguan)) [SIG Apps, Cloud Provider, Scalability and Storage]
-- Kubeadm: Add a preflight check that the control-plane node has at least 1700MB of RAM ([#93275](https://github.com/kubernetes/kubernetes/pull/93275), [@xlgao-zju](https://github.com/xlgao-zju)) [SIG Cluster Lifecycle]
-- Kubeadm: add the "--cluster-name" flag to the "kubeadm alpha kubeconfig user" to allow configuring the cluster name in the generated kubeconfig file ([#93992](https://github.com/kubernetes/kubernetes/pull/93992), [@prabhu43](https://github.com/prabhu43)) [SIG Cluster Lifecycle]
-- Kubeadm: add the "--kubeconfig" flag to the "kubeadm init phase upload-certs" command to allow users to pass a custom location for a kubeconfig file. ([#94765](https://github.com/kubernetes/kubernetes/pull/94765), [@zhanw15](https://github.com/zhanw15)) [SIG Cluster Lifecycle]
-- Kubeadm: deprecate the "--csr-only" and "--csr-dir" flags of the "kubeadm init phase certs" subcommands. Please use "kubeadm alpha certs generate-csr" instead. This new command allows you to generate new private keys and certificate signing requests for all the control-plane components, so that the certificates can be signed by an external CA. ([#92183](https://github.com/kubernetes/kubernetes/pull/92183), [@wallrj](https://github.com/wallrj)) [SIG Cluster Lifecycle]
-- Kubeadm: make etcd pod request 100m CPU, 100Mi memory and 100Mi ephemeral_storage by default ([#94479](https://github.com/kubernetes/kubernetes/pull/94479), [@knight42](https://github.com/knight42)) [SIG Cluster Lifecycle]
-- Kubemark now supports both real and hollow nodes in a single cluster. ([#93201](https://github.com/kubernetes/kubernetes/pull/93201), [@ellistarn](https://github.com/ellistarn)) [SIG Scalability]
-- Kubernetes is now built using go1.15.2
- - build: Update to k/repo-infra@v0.1.1 (supports go1.15.2)
- - build: Use go-runner:buster-v2.0.1 (built using go1.15.1)
- - bazel: Replace --features with Starlark build settings flag
- - hack/lib/util.sh: some bash cleanups
-
- - switched one spot to use kube::logging
- - make kube::util::find-binary return an error when it doesn't find
- anything so that hack scripts fail fast instead of with '' binary not
- found errors.
- - this required deleting some genfeddoc stuff. the binary no longer
- exists in k/k repo since we removed federation/, and I don't see it
- in https://github.com/kubernetes-sigs/kubefed/ either. I'm assuming
- that it's gone for good now.
-
- - bazel: output go_binary rule directly from go_binary_conditional_pure
-
- From: @mikedanese:
- Instead of aliasing. Aliases are annoying in a number of ways. This is
- specifically bugging me now because they make the action graph harder to
- analyze programmatically. By using aliases here, we would need to handle
- potentially aliased go_binary targets and dereference to the effective
- target.
-
- The comment references an issue with `pure = select(...)` which appears
- to be resolved considering this now builds.
-
- - make kube::util::find-binary not dependent on bazel-out/ structure
-
- Implement an aspect that outputs go_build_mode metadata for go binaries,
- and use that during binary selection. ([#94449](https://github.com/kubernetes/kubernetes/pull/94449), [@justaugustus](https://github.com/justaugustus)) [SIG Architecture, CLI, Cluster Lifecycle, Node, Release and Testing]
-- Only update Azure data disks when attach/detach ([#94265](https://github.com/kubernetes/kubernetes/pull/94265), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Promote SupportNodePidsLimit to GA to provide node to pod pid isolation
- Promote SupportPodPidsLimit to GA to provide ability to limit pids per pod ([#94140](https://github.com/kubernetes/kubernetes/pull/94140), [@derekwaynecarr](https://github.com/derekwaynecarr)) [SIG Node and Testing]
-- Rename pod_preemption_metrics to preemption_metrics. ([#93256](https://github.com/kubernetes/kubernetes/pull/93256), [@ahg-g](https://github.com/ahg-g)) [SIG Instrumentation and Scheduling]
-- Server-side apply behavior has been regularized in the case where a field is removed from the applied configuration. Removed fields which have no other owners are deleted from the live object, or reset to their default value if they have one. Safe ownership transfers, such as the transfer of a `replicas` field from a user to an HPA without resetting to the default value are documented in [Transferring Ownership](/docs/reference/using-api/server-side-apply/#transferring-ownership) ([#92661](https://github.com/kubernetes/kubernetes/pull/92661), [@jpbetz](https://github.com/jpbetz)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Testing]
-- Set CSIMigrationvSphere feature gates to beta.
- Users should enable CSIMigration + CSIMigrationvSphere features and install the vSphere CSI Driver (https://github.com/kubernetes-sigs/vsphere-csi-driver) to move workload from the in-tree vSphere plugin "kubernetes.io/vsphere-volume" to vSphere CSI Driver.
-
- Requires: vSphere vCenter/ESXi Version: 7.0u1, HW Version: VM version 15 ([#92816](https://github.com/kubernetes/kubernetes/pull/92816), [@divyenpatel](https://github.com/divyenpatel)) [SIG Cloud Provider and Storage]
-- Support [service.beta.kubernetes.io/azure-pip-ip-tags] annotations to allow customers to specify ip-tags to influence public-ip creation in Azure [Tag1=Value1, Tag2=Value2, etc.] ([#94114](https://github.com/kubernetes/kubernetes/pull/94114), [@MarcPow](https://github.com/MarcPow)) [SIG Cloud Provider]
-- Support a smooth upgrade from client-side apply to server-side apply without conflicts, as well as support the corresponding downgrade. ([#90187](https://github.com/kubernetes/kubernetes/pull/90187), [@julianvmodesto](https://github.com/julianvmodesto)) [SIG API Machinery and Testing]
-- Trace output in apiserver logs is more organized and comprehensive. Traces are nested, and for all non-long running request endpoints, the entire filter chain is instrumented (e.g. authentication check is included). ([#88936](https://github.com/kubernetes/kubernetes/pull/88936), [@jpbetz](https://github.com/jpbetz)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Scheduling]
-- `kubectl alpha debug` now supports debugging nodes by creating a debugging container running in the node's host namespaces. ([#92310](https://github.com/kubernetes/kubernetes/pull/92310), [@verb](https://github.com/verb)) [SIG CLI]
-
-### Documentation
-
-- Kubelet: remove alpha warnings for CNI flags. ([#94508](https://github.com/kubernetes/kubernetes/pull/94508), [@andrewsykim](https://github.com/andrewsykim)) [SIG Network and Node]
-
-### Failing Test
-
-- Kube-proxy iptables min-sync-period defaults to 1 sec. Previously, it was 0. ([#92836](https://github.com/kubernetes/kubernetes/pull/92836), [@aojea](https://github.com/aojea)) [SIG Network]
-
-### Bug or Regression
-
-- A panic in the apiserver caused by the `informer-sync` health checker is now fixed. ([#93600](https://github.com/kubernetes/kubernetes/pull/93600), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG API Machinery]
-- Add kubectl wait --ignore-not-found flag ([#90969](https://github.com/kubernetes/kubernetes/pull/90969), [@zhouya0](https://github.com/zhouya0)) [SIG CLI]
-- Adding fix to the statefulset controller to wait for pvc deletion before creating pods. ([#93457](https://github.com/kubernetes/kubernetes/pull/93457), [@ymmt2005](https://github.com/ymmt2005)) [SIG Apps]
-- Azure ARM client: don't segfault on empty response and http error ([#94078](https://github.com/kubernetes/kubernetes/pull/94078), [@bpineau](https://github.com/bpineau)) [SIG Cloud Provider]
-- Azure: fix a bug that kube-controller-manager would panic if wrong Azure VMSS name is configured ([#94306](https://github.com/kubernetes/kubernetes/pull/94306), [@knight42](https://github.com/knight42)) [SIG Cloud Provider]
-- Azure: per VMSS VMSS VMs cache to prevent throttling on clusters having many attached VMSS ([#93107](https://github.com/kubernetes/kubernetes/pull/93107), [@bpineau](https://github.com/bpineau)) [SIG Cloud Provider]
-- Both apiserver_request_duration_seconds metrics and RequestReceivedTimestamp field of an audit event take
- into account the time a request spends in the apiserver request filters. ([#94903](https://github.com/kubernetes/kubernetes/pull/94903), [@tkashem](https://github.com/tkashem)) [SIG API Machinery, Auth and Instrumentation]
-- Build/lib/release: Explicitly use '--platform' in building server images
-
- When we switched to go-runner for building the apiserver,
- controller-manager, and scheduler server components, we no longer
- reference the individual architectures in the image names, specifically
- in the 'FROM' directive of the server image Dockerfiles.
-
- As a result, server images for non-amd64 images copy in the go-runner
- amd64 binary instead of the go-runner that matches that architecture.
-
- This commit explicitly sets the '--platform=linux/${arch}' to ensure
- we're pulling the correct go-runner arch from the manifest list.
-
- Before:
- `FROM ${base_image}`
-
- After:
- `FROM --platform=linux/${arch} ${base_image}` ([#94552](https://github.com/kubernetes/kubernetes/pull/94552), [@justaugustus](https://github.com/justaugustus)) [SIG Release]
-- CSIDriver object can be deployed during volume attachment. ([#93710](https://github.com/kubernetes/kubernetes/pull/93710), [@Jiawei0227](https://github.com/Jiawei0227)) [SIG Apps, Node, Storage and Testing]
-- CVE-2020-8557 (Medium): Node-local denial of service via container /etc/hosts file. See https://github.com/kubernetes/kubernetes/issues/93032 for more details. ([#92916](https://github.com/kubernetes/kubernetes/pull/92916), [@joelsmith](https://github.com/joelsmith)) [SIG Node]
-- Do not add nodes labeled with kubernetes.azure.com/managed=false to backend pool of load balancer. ([#93034](https://github.com/kubernetes/kubernetes/pull/93034), [@matthias50](https://github.com/matthias50)) [SIG Cloud Provider]
-- Do not fail sorting empty elements. ([#94666](https://github.com/kubernetes/kubernetes/pull/94666), [@soltysh](https://github.com/soltysh)) [SIG CLI]
-- Do not retry volume expansion if CSI driver returns FailedPrecondition error ([#92986](https://github.com/kubernetes/kubernetes/pull/92986), [@gnufied](https://github.com/gnufied)) [SIG Node and Storage]
-- Dockershim security: pod sandbox now always run with `no-new-privileges` and `runtime/default` seccomp profile
- dockershim seccomp: custom profiles can now have smaller seccomp profiles when set at pod level ([#90948](https://github.com/kubernetes/kubernetes/pull/90948), [@pjbgf](https://github.com/pjbgf)) [SIG Node]
-- Dual-stack: make nodeipam compatible with existing single-stack clusters when dual-stack feature gate become enabled by default ([#90439](https://github.com/kubernetes/kubernetes/pull/90439), [@SataQiu](https://github.com/SataQiu)) [SIG API Machinery]
-- Endpoint controller requeues service after an endpoint deletion event occurs to confirm that deleted endpoints are undesired to mitigate the effects of an out of sync endpoint cache. ([#93030](https://github.com/kubernetes/kubernetes/pull/93030), [@swetharepakula](https://github.com/swetharepakula)) [SIG Apps and Network]
-- EndpointSlice controllers now return immediately if they encounter an error creating, updating, or deleting resources. ([#93908](https://github.com/kubernetes/kubernetes/pull/93908), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
-- EndpointSliceMirroring controller now copies labels from Endpoints to EndpointSlices. ([#93442](https://github.com/kubernetes/kubernetes/pull/93442), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
-- EndpointSliceMirroring controller now mirrors Endpoints that do not have a Service associated with them. ([#94171](https://github.com/kubernetes/kubernetes/pull/94171), [@robscott](https://github.com/robscott)) [SIG Apps, Network and Testing]
-- Ensure backoff step is set to 1 for Azure armclient. ([#94180](https://github.com/kubernetes/kubernetes/pull/94180), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider]
-- Ensure getPrimaryInterfaceID not panic when network interfaces for Azure VMSS are null ([#94355](https://github.com/kubernetes/kubernetes/pull/94355), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider]
-- Eviction requests for pods that have a non-zero DeletionTimestamp will always succeed ([#91342](https://github.com/kubernetes/kubernetes/pull/91342), [@michaelgugino](https://github.com/michaelgugino)) [SIG Apps]
-- Extended DSR loadbalancer feature in winkernel kube-proxy to HNS versions 9.3-9.max, 10.2+ ([#93080](https://github.com/kubernetes/kubernetes/pull/93080), [@elweb9858](https://github.com/elweb9858)) [SIG Network]
-- Fix HandleCrash order ([#93108](https://github.com/kubernetes/kubernetes/pull/93108), [@lixiaobing1](https://github.com/lixiaobing1)) [SIG API Machinery]
-- Fix a concurrent map writes error in kubelet ([#93773](https://github.com/kubernetes/kubernetes/pull/93773), [@knight42](https://github.com/knight42)) [SIG Node]
-- Fix a regression where kubeadm bails out with a fatal error when an optional version command line argument is supplied to the "kubeadm upgrade plan" command ([#94421](https://github.com/kubernetes/kubernetes/pull/94421), [@rosti](https://github.com/rosti)) [SIG Cluster Lifecycle]
-- Fix azure file migration panic ([#94853](https://github.com/kubernetes/kubernetes/pull/94853), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix bug where loadbalancer deletion gets stuck because of missing resource group #75198 ([#93962](https://github.com/kubernetes/kubernetes/pull/93962), [@phiphi282](https://github.com/phiphi282)) [SIG Cloud Provider]
-- Fix calling AttachDisk on a previously attached EBS volume ([#93567](https://github.com/kubernetes/kubernetes/pull/93567), [@gnufied](https://github.com/gnufied)) [SIG Cloud Provider, Storage and Testing]
-- Fix detection of image filesystem, disk metrics for devicemapper, detection of OOM Kills on 5.0+ linux kernels. ([#92919](https://github.com/kubernetes/kubernetes/pull/92919), [@dashpole](https://github.com/dashpole)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation and Node]
-- Fix etcd_object_counts metric reported by kube-apiserver ([#94773](https://github.com/kubernetes/kubernetes/pull/94773), [@tkashem](https://github.com/tkashem)) [SIG API Machinery]
-- Fix incorrectly reported verbs for kube-apiserver metrics for CRD objects ([#93523](https://github.com/kubernetes/kubernetes/pull/93523), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery and Instrumentation]
-- Fix instance not found issues when an Azure Node is recreated in a short time ([#93316](https://github.com/kubernetes/kubernetes/pull/93316), [@feiskyer](https://github.com/feiskyer)) [SIG Cloud Provider]
-- Fix kube-apiserver /readyz to contain "informer-sync" check ensuring that internal informers are synced. ([#93670](https://github.com/kubernetes/kubernetes/pull/93670), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery and Testing]
-- Fix kubectl SchemaError on CRDs with schema using x-kubernetes-preserve-unknown-fields on array types. ([#94888](https://github.com/kubernetes/kubernetes/pull/94888), [@sttts](https://github.com/sttts)) [SIG API Machinery]
-- Fix memory leak in EndpointSliceTracker for EndpointSliceMirroring controller. ([#93441](https://github.com/kubernetes/kubernetes/pull/93441), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
-- Fix missing csi annotations on node during parallel csinode update. ([#94389](https://github.com/kubernetes/kubernetes/pull/94389), [@pacoxu](https://github.com/pacoxu)) [SIG Storage]
-- Fix the `cloudprovider_azure_api_request_duration_seconds` metric buckets to correctly capture the latency metrics. Previously, the majority of the calls would fall in the "+Inf" bucket. ([#94873](https://github.com/kubernetes/kubernetes/pull/94873), [@marwanad](https://github.com/marwanad)) [SIG Cloud Provider and Instrumentation]
-- Fix: azure disk resize error if source does not exist ([#93011](https://github.com/kubernetes/kubernetes/pull/93011), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix: detach azure disk broken on Azure Stack ([#94885](https://github.com/kubernetes/kubernetes/pull/94885), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fix: determine the correct ip config based on ip family ([#93043](https://github.com/kubernetes/kubernetes/pull/93043), [@aramase](https://github.com/aramase)) [SIG Cloud Provider]
-- Fix: initial delay in mounting azure disk & file ([#93052](https://github.com/kubernetes/kubernetes/pull/93052), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
-- Fix: use sensitiveOptions on Windows mount ([#94126](https://github.com/kubernetes/kubernetes/pull/94126), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider and Storage]
-- Fixed Ceph RBD volume expansion when no ceph.conf exists ([#92027](https://github.com/kubernetes/kubernetes/pull/92027), [@juliantaylor](https://github.com/juliantaylor)) [SIG Storage]
-- Fixed a bug where improper storage and comparison of endpoints led to excessive API traffic from the endpoints controller ([#94112](https://github.com/kubernetes/kubernetes/pull/94112), [@damemi](https://github.com/damemi)) [SIG Apps, Network and Testing]
-- Fixed a bug whereby the allocation of reusable CPUs and devices was not being honored when the TopologyManager was enabled ([#93189](https://github.com/kubernetes/kubernetes/pull/93189), [@klueska](https://github.com/klueska)) [SIG Node]
-- Fixed a panic in kubectl debug when pod has multiple init containers or ephemeral containers ([#94580](https://github.com/kubernetes/kubernetes/pull/94580), [@kiyoshim55](https://github.com/kiyoshim55)) [SIG CLI]
-- Fixed a regression that sometimes prevented `kubectl portforward` to work when TCP and UDP services were configured on the same port ([#94728](https://github.com/kubernetes/kubernetes/pull/94728), [@amorenoz](https://github.com/amorenoz)) [SIG CLI]
-- Fixed bug in reflector that couldn't recover from "Too large resource version" errors with API servers 1.17.0-1.18.5 ([#94316](https://github.com/kubernetes/kubernetes/pull/94316), [@janeczku](https://github.com/janeczku)) [SIG API Machinery]
-- Fixed bug where kubectl top pod output is not sorted when --sort-by and --containers flags are used together ([#93692](https://github.com/kubernetes/kubernetes/pull/93692), [@brianpursley](https://github.com/brianpursley)) [SIG CLI]
-- Fixed kubelet creating extra sandbox for pods with RestartPolicyOnFailure after all containers succeeded ([#92614](https://github.com/kubernetes/kubernetes/pull/92614), [@tnqn](https://github.com/tnqn)) [SIG Node and Testing]
-- Fixed memory leak in endpointSliceTracker ([#92838](https://github.com/kubernetes/kubernetes/pull/92838), [@tnqn](https://github.com/tnqn)) [SIG Apps and Network]
-- Fixed node data lost in kube-scheduler for clusters with imbalance on number of nodes across zones ([#93355](https://github.com/kubernetes/kubernetes/pull/93355), [@maelk](https://github.com/maelk)) [SIG Scheduling]
-- Fixed the EndpointSliceController to correctly create endpoints for IPv6-only pods.
-
- Fixed the EndpointController to allow IPv6 headless services, if the IPv6DualStack
- feature gate is enabled, by specifying `ipFamily: IPv6` on the service. (This already
- worked with the EndpointSliceController.) ([#91399](https://github.com/kubernetes/kubernetes/pull/91399), [@danwinship](https://github.com/danwinship)) [SIG Apps and Network]
-- Fixes a bug evicting pods after a taint with a limited tolerationSeconds toleration is removed from a node ([#93722](https://github.com/kubernetes/kubernetes/pull/93722), [@liggitt](https://github.com/liggitt)) [SIG Apps and Node]
-- Fixes a bug where EndpointSlices would not be recreated after rapid Service recreation. ([#94730](https://github.com/kubernetes/kubernetes/pull/94730), [@robscott](https://github.com/robscott)) [SIG Apps, Network and Testing]
-- Fixes a race condition in kubelet pod handling ([#94751](https://github.com/kubernetes/kubernetes/pull/94751), [@auxten](https://github.com/auxten)) [SIG Node]
-- Fixes an issue proxying to ipv6 pods without specifying a port ([#94834](https://github.com/kubernetes/kubernetes/pull/94834), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and Network]
-- Fixes an issue that can result in namespaced custom resources being orphaned when their namespace is deleted, if the CRD defining the custom resource is removed concurrently with namespaces being deleted, then recreated. ([#93790](https://github.com/kubernetes/kubernetes/pull/93790), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and Apps]
-- Ignore root user check when windows pod starts ([#92355](https://github.com/kubernetes/kubernetes/pull/92355), [@wawa0210](https://github.com/wawa0210)) [SIG Node and Windows]
-- Increased maximum IOPS of AWS EBS io1 volumes to 64,000 (current AWS maximum). ([#90014](https://github.com/kubernetes/kubernetes/pull/90014), [@jacobmarble](https://github.com/jacobmarble)) [SIG Cloud Provider and Storage]
-- K8s.io/apimachinery: runtime.DefaultUnstructuredConverter.FromUnstructured now handles converting integer fields to typed float values ([#93250](https://github.com/kubernetes/kubernetes/pull/93250), [@liggitt](https://github.com/liggitt)) [SIG API Machinery]
-- Kube-aggregator certificates are dynamically loaded on change from disk ([#92791](https://github.com/kubernetes/kubernetes/pull/92791), [@p0lyn0mial](https://github.com/p0lyn0mial)) [SIG API Machinery]
-- Kube-apiserver: fixed a bug returning inconsistent results from list requests which set a field or label selector and set a paging limit ([#94002](https://github.com/kubernetes/kubernetes/pull/94002), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery]
-- Kube-apiserver: jsonpath expressions with consecutive recursive descent operators are no longer evaluated for custom resource printer columns ([#93408](https://github.com/kubernetes/kubernetes/pull/93408), [@joelsmith](https://github.com/joelsmith)) [SIG API Machinery]
-- Kube-proxy now trims extra spaces found in loadBalancerSourceRanges to match Service validation. ([#94107](https://github.com/kubernetes/kubernetes/pull/94107), [@robscott](https://github.com/robscott)) [SIG Network]
-- Kube-up now includes CoreDNS version v1.7.0. Some of the major changes include:
- - Fixed a bug that could cause CoreDNS to stop updating service records.
- - Fixed a bug in the forward plugin where only the first upstream server is always selected no matter which policy is set.
- - Remove already deprecated options `resyncperiod` and `upstream` in the Kubernetes plugin.
- - Includes Prometheus metrics name changes (to bring them in line with standard Prometheus metrics naming convention). They will be backward incompatible with existing reporting formulas that use the old metrics' names.
- - The federation plugin (allows for v1 Kubernetes federation) has been removed.
- More details are available in https://coredns.io/2020/06/15/coredns-1.7.0-release/ ([#92718](https://github.com/kubernetes/kubernetes/pull/92718), [@rajansandeep](https://github.com/rajansandeep)) [SIG Cloud Provider]
-- Kubeadm now makes sure the etcd manifest is regenerated upon upgrade even when no etcd version change takes place ([#94395](https://github.com/kubernetes/kubernetes/pull/94395), [@rosti](https://github.com/rosti)) [SIG Cluster Lifecycle]
-- Kubeadm: avoid a panic when determining if the running version of CoreDNS is supported during upgrades ([#94299](https://github.com/kubernetes/kubernetes/pull/94299), [@zouyee](https://github.com/zouyee)) [SIG Cluster Lifecycle]
-- Kubeadm: ensure "kubeadm reset" does not unmount the root "/var/lib/kubelet" directory if it is mounted by the user ([#93702](https://github.com/kubernetes/kubernetes/pull/93702), [@thtanaka](https://github.com/thtanaka)) [SIG Cluster Lifecycle]
-- Kubeadm: ensure the etcd data directory is created with 0700 permissions during control-plane init and join ([#94102](https://github.com/kubernetes/kubernetes/pull/94102), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: fix the bug that kubeadm tries to call 'docker info' even if the CRI socket was for another CR ([#94555](https://github.com/kubernetes/kubernetes/pull/94555), [@SataQiu](https://github.com/SataQiu)) [SIG Cluster Lifecycle]
-- Kubeadm: make the kubeconfig files for the kube-controller-manager and kube-scheduler use the LocalAPIEndpoint instead of the ControlPlaneEndpoint. This makes kubeadm clusters more reseliant to version skew problems during immutable upgrades: https://kubernetes.io/docs/setup/release/version-skew-policy/#kube-controller-manager-kube-scheduler-and-cloud-controller-manager ([#94398](https://github.com/kubernetes/kubernetes/pull/94398), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: relax the validation of kubeconfig server URLs. Allow the user to define custom kubeconfig server URLs without erroring out during validation of existing kubeconfig files (e.g. when using external CA mode). ([#94816](https://github.com/kubernetes/kubernetes/pull/94816), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubeadm: remove duplicate DNS names and IP addresses from generated certificates ([#92753](https://github.com/kubernetes/kubernetes/pull/92753), [@QianChenglong](https://github.com/QianChenglong)) [SIG Cluster Lifecycle]
-- Kubelet: assume that swap is disabled when `/proc/swaps` does not exist ([#93931](https://github.com/kubernetes/kubernetes/pull/93931), [@SataQiu](https://github.com/SataQiu)) [SIG Node]
-- Kubelet: fix race condition in pluginWatcher ([#93622](https://github.com/kubernetes/kubernetes/pull/93622), [@knight42](https://github.com/knight42)) [SIG Node]
-- Kuberuntime security: pod sandbox now always runs with `runtime/default` seccomp profile
- kuberuntime seccomp: custom profiles can now have smaller seccomp profiles when set at pod level ([#90949](https://github.com/kubernetes/kubernetes/pull/90949), [@pjbgf](https://github.com/pjbgf)) [SIG Node]
-- NONE ([#71269](https://github.com/kubernetes/kubernetes/pull/71269), [@DeliangFan](https://github.com/DeliangFan)) [SIG Node]
-- New Azure instance types do now have correct max data disk count information. ([#94340](https://github.com/kubernetes/kubernetes/pull/94340), [@ialidzhikov](https://github.com/ialidzhikov)) [SIG Cloud Provider and Storage]
-- Pods with invalid Affinity/AntiAffinity LabelSelectors will now fail scheduling when these plugins are enabled ([#93660](https://github.com/kubernetes/kubernetes/pull/93660), [@damemi](https://github.com/damemi)) [SIG Scheduling]
-- Require feature flag CustomCPUCFSQuotaPeriod if setting a non-default cpuCFSQuotaPeriod in kubelet config. ([#94687](https://github.com/kubernetes/kubernetes/pull/94687), [@karan](https://github.com/karan)) [SIG Node]
-- Reverted devicemanager for Windows node added in 1.19rc1. ([#93263](https://github.com/kubernetes/kubernetes/pull/93263), [@liggitt](https://github.com/liggitt)) [SIG Node and Windows]
-- Scheduler bugfix: Scheduler doesn't lose pod information when nodes are quickly recreated. This could happen when nodes are restarted or quickly recreated reusing a nodename. ([#93938](https://github.com/kubernetes/kubernetes/pull/93938), [@alculquicondor](https://github.com/alculquicondor)) [SIG Scalability, Scheduling and Testing]
-- The EndpointSlice controller now waits for EndpointSlice and Node caches to be synced before starting. ([#94086](https://github.com/kubernetes/kubernetes/pull/94086), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
-- The `/debug/api_priority_and_fairness/dump_requests` path at an apiserver will no longer return a phantom line for each exempt priority level. ([#93406](https://github.com/kubernetes/kubernetes/pull/93406), [@MikeSpreitzer](https://github.com/MikeSpreitzer)) [SIG API Machinery]
-- The kubelet recognizes the --containerd-namespace flag to configure the namespace used by cadvisor. ([#87054](https://github.com/kubernetes/kubernetes/pull/87054), [@changyaowei](https://github.com/changyaowei)) [SIG Node]
-- The terminationGracePeriodSeconds from pod spec is respected for the mirror pod. ([#92442](https://github.com/kubernetes/kubernetes/pull/92442), [@tedyu](https://github.com/tedyu)) [SIG Node and Testing]
-- Update Calico to v3.15.2 ([#94241](https://github.com/kubernetes/kubernetes/pull/94241), [@lmm](https://github.com/lmm)) [SIG Cloud Provider]
-- Update default etcd server version to 3.4.13 ([#94287](https://github.com/kubernetes/kubernetes/pull/94287), [@jingyih](https://github.com/jingyih)) [SIG API Machinery, Cloud Provider, Cluster Lifecycle and Testing]
-- Updated Cluster Autoscaler to 1.19.0; ([#93577](https://github.com/kubernetes/kubernetes/pull/93577), [@vivekbagade](https://github.com/vivekbagade)) [SIG Autoscaling and Cloud Provider]
-- Use NLB Subnet CIDRs instead of VPC CIDRs in Health Check SG Rules ([#93515](https://github.com/kubernetes/kubernetes/pull/93515), [@t0rr3sp3dr0](https://github.com/t0rr3sp3dr0)) [SIG Cloud Provider]
-- Users will see increase in time for deletion of pods and also guarantee that removal of pod from api server would mean deletion of all the resources from container runtime. ([#92817](https://github.com/kubernetes/kubernetes/pull/92817), [@kmala](https://github.com/kmala)) [SIG Node]
-- Very large patches may now be specified to `kubectl patch` with the `--patch-file` flag instead of including them directly on the command line. The `--patch` and `--patch-file` flags are mutually exclusive. ([#93548](https://github.com/kubernetes/kubernetes/pull/93548), [@smarterclayton](https://github.com/smarterclayton)) [SIG CLI]
-- When creating a networking.k8s.io/v1 Ingress API object, `spec.rules[*].http` values are now validated consistently when the `host` field contains a wildcard. ([#93954](https://github.com/kubernetes/kubernetes/pull/93954), [@Miciah](https://github.com/Miciah)) [SIG CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Storage and Testing]
-
-### Other (Cleanup or Flake)
-
-- --cache-dir sets cache directory for both http and discovery, defaults to $HOME/.kube/cache ([#92910](https://github.com/kubernetes/kubernetes/pull/92910), [@soltysh](https://github.com/soltysh)) [SIG API Machinery and CLI]
-- Adds a bootstrapping ClusterRole, ClusterRoleBinding and group for /metrics, /livez/*, /readyz/*, & /healthz/- endpoints. ([#93311](https://github.com/kubernetes/kubernetes/pull/93311), [@logicalhan](https://github.com/logicalhan)) [SIG API Machinery, Auth, Cloud Provider and Instrumentation]
-- Base-images: Update to debian-iptables:buster-v1.3.0
- - Uses iptables 1.8.5
- - base-images: Update to debian-base:buster-v1.2.0
- - cluster/images/etcd: Build etcd:3.4.13-1 image
- - Uses debian-base:buster-v1.2.0 ([#94733](https://github.com/kubernetes/kubernetes/pull/94733), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, Release and Testing]
-- Build: Update to debian-base@v2.1.2 and debian-iptables@v12.1.1 ([#93667](https://github.com/kubernetes/kubernetes/pull/93667), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, Release and Testing]
-- Build: Update to debian-base@v2.1.3 and debian-iptables@v12.1.2 ([#93916](https://github.com/kubernetes/kubernetes/pull/93916), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, Release and Testing]
-- Build: Update to go-runner:buster-v2.0.0 ([#94167](https://github.com/kubernetes/kubernetes/pull/94167), [@justaugustus](https://github.com/justaugustus)) [SIG Release]
-- Fix kubelet to properly log when a container is started. Before, sometimes the log said that a container is dead and was restarted when it was started for the first time. This only happened when using pods with initContainers and regular containers. ([#91469](https://github.com/kubernetes/kubernetes/pull/91469), [@rata](https://github.com/rata)) [SIG Node]
-- Fix: license issue in blob disk feature ([#92824](https://github.com/kubernetes/kubernetes/pull/92824), [@andyzhangx](https://github.com/andyzhangx)) [SIG Cloud Provider]
-- Fixes the flooding warning messages about setting volume ownership for configmap/secret volumes ([#92878](https://github.com/kubernetes/kubernetes/pull/92878), [@jvanz](https://github.com/jvanz)) [SIG Instrumentation, Node and Storage]
-- Fixes the message about no auth for metrics in scheduler. ([#94035](https://github.com/kubernetes/kubernetes/pull/94035), [@zhouya0](https://github.com/zhouya0)) [SIG Scheduling]
-- Kube-up: defaults to limiting critical pods to the kube-system namespace to match behavior prior to 1.17 ([#93121](https://github.com/kubernetes/kubernetes/pull/93121), [@liggitt](https://github.com/liggitt)) [SIG Cloud Provider and Scheduling]
-- Kubeadm: Separate argument key/value in log msg ([#94016](https://github.com/kubernetes/kubernetes/pull/94016), [@mrueg](https://github.com/mrueg)) [SIG Cluster Lifecycle]
-- Kubeadm: remove support for the "ci/k8s-master" version label. This label has been removed in the Kubernetes CI release process and would no longer work in kubeadm. You can use the "ci/latest" version label instead. See kubernetes/test-infra#18517 ([#93626](https://github.com/kubernetes/kubernetes/pull/93626), [@vikkyomkar](https://github.com/vikkyomkar)) [SIG Cluster Lifecycle]
-- Kubeadm: remove the CoreDNS check for known image digests when applying the addon ([#94506](https://github.com/kubernetes/kubernetes/pull/94506), [@neolit123](https://github.com/neolit123)) [SIG Cluster Lifecycle]
-- Kubernetes is now built with go1.15.0 ([#93939](https://github.com/kubernetes/kubernetes/pull/93939), [@justaugustus](https://github.com/justaugustus)) [SIG Release and Testing]
-- Kubernetes is now built with go1.15.0-rc.2 ([#93827](https://github.com/kubernetes/kubernetes/pull/93827), [@justaugustus](https://github.com/justaugustus)) [SIG API Machinery, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Node, Release and Testing]
-- Lock ExternalPolicyForExternalIP to default, this feature gate will be removed in 1.22. ([#94581](https://github.com/kubernetes/kubernetes/pull/94581), [@knabben](https://github.com/knabben)) [SIG Network]
-- Service.beta.kubernetes.io/azure-load-balancer-disable-tcp-reset is removed. All Standard load balancers will always enable tcp resets. ([#94297](https://github.com/kubernetes/kubernetes/pull/94297), [@MarcPow](https://github.com/MarcPow)) [SIG Cloud Provider]
-- Stop propagating SelfLink (deprecated in 1.16) in kube-apiserver ([#94397](https://github.com/kubernetes/kubernetes/pull/94397), [@wojtek-t](https://github.com/wojtek-t)) [SIG API Machinery and Testing]
-- Strip unnecessary security contexts on Windows ([#93475](https://github.com/kubernetes/kubernetes/pull/93475), [@ravisantoshgudimetla](https://github.com/ravisantoshgudimetla)) [SIG Node, Testing and Windows]
-- To ensure the code be strong, add unit test for GetAddressAndDialer ([#93180](https://github.com/kubernetes/kubernetes/pull/93180), [@FreeZhang61](https://github.com/FreeZhang61)) [SIG Node]
-- Update CNI plugins to v0.8.7 ([#94367](https://github.com/kubernetes/kubernetes/pull/94367), [@justaugustus](https://github.com/justaugustus)) [SIG Cloud Provider, Network, Node, Release and Testing]
-- Update Golang to v1.14.5
- - Update repo-infra to 0.0.7 (to support go1.14.5 and go1.13.13)
- - Includes:
- - bazelbuild/bazel-toolchains@3.3.2
- - bazelbuild/rules_go@v0.22.7 ([#93088](https://github.com/kubernetes/kubernetes/pull/93088), [@justaugustus](https://github.com/justaugustus)) [SIG Release and Testing]
-- Update Golang to v1.14.6
- - Update repo-infra to 0.0.8 (to support go1.14.6 and go1.13.14)
- - Includes:
- - bazelbuild/bazel-toolchains@3.4.0
- - bazelbuild/rules_go@v0.22.8 ([#93198](https://github.com/kubernetes/kubernetes/pull/93198), [@justaugustus](https://github.com/justaugustus)) [SIG Release and Testing]
-- Update cri-tools to [v1.19.0](https://github.com/kubernetes-sigs/cri-tools/releases/tag/v1.19.0) ([#94307](https://github.com/kubernetes/kubernetes/pull/94307), [@xmudrii](https://github.com/xmudrii)) [SIG Cloud Provider]
-- Update default etcd server version to 3.4.9 ([#92349](https://github.com/kubernetes/kubernetes/pull/92349), [@jingyih](https://github.com/jingyih)) [SIG API Machinery, Cloud Provider, Cluster Lifecycle and Testing]
-- Update etcd client side to v3.4.13 ([#94259](https://github.com/kubernetes/kubernetes/pull/94259), [@jingyih](https://github.com/jingyih)) [SIG API Machinery and Cloud Provider]
-- `kubectl get ingress` now prefers the `networking.k8s.io/v1` over `extensions/v1beta1` (deprecated since v1.14). To explicitly request the deprecated version, use `kubectl get ingress.v1beta1.extensions`. ([#94309](https://github.com/kubernetes/kubernetes/pull/94309), [@liggitt](https://github.com/liggitt)) [SIG API Machinery and CLI]
-
-## Dependencies
-
-### Added
-- github.com/Azure/go-autorest: [v14.2.0+incompatible](https://github.com/Azure/go-autorest/tree/v14.2.0)
-- github.com/fvbommel/sortorder: [v1.0.1](https://github.com/fvbommel/sortorder/tree/v1.0.1)
-- github.com/yuin/goldmark: [v1.1.27](https://github.com/yuin/goldmark/tree/v1.1.27)
-- sigs.k8s.io/structured-merge-diff/v4: v4.0.1
-
-### Changed
-- github.com/Azure/go-autorest/autorest/adal: [v0.8.2 → v0.9.0](https://github.com/Azure/go-autorest/autorest/adal/compare/v0.8.2...v0.9.0)
-- github.com/Azure/go-autorest/autorest/date: [v0.2.0 → v0.3.0](https://github.com/Azure/go-autorest/autorest/date/compare/v0.2.0...v0.3.0)
-- github.com/Azure/go-autorest/autorest/mocks: [v0.3.0 → v0.4.0](https://github.com/Azure/go-autorest/autorest/mocks/compare/v0.3.0...v0.4.0)
-- github.com/Azure/go-autorest/autorest: [v0.9.6 → v0.11.1](https://github.com/Azure/go-autorest/autorest/compare/v0.9.6...v0.11.1)
-- github.com/Azure/go-autorest/logger: [v0.1.0 → v0.2.0](https://github.com/Azure/go-autorest/logger/compare/v0.1.0...v0.2.0)
-- github.com/Azure/go-autorest/tracing: [v0.5.0 → v0.6.0](https://github.com/Azure/go-autorest/tracing/compare/v0.5.0...v0.6.0)
-- github.com/Microsoft/hcsshim: [v0.8.9 → 5eafd15](https://github.com/Microsoft/hcsshim/compare/v0.8.9...5eafd15)
-- github.com/cilium/ebpf: [9f1617e → 1c8d4c9](https://github.com/cilium/ebpf/compare/9f1617e...1c8d4c9)
-- github.com/containerd/cgroups: [bf292b2 → 0dbf7f0](https://github.com/containerd/cgroups/compare/bf292b2...0dbf7f0)
-- github.com/coredns/corefile-migration: [v1.0.8 → v1.0.10](https://github.com/coredns/corefile-migration/compare/v1.0.8...v1.0.10)
-- github.com/evanphx/json-patch: [e83c0a1 → v4.9.0+incompatible](https://github.com/evanphx/json-patch/compare/e83c0a1...v4.9.0)
-- github.com/google/cadvisor: [8450c56 → v0.37.0](https://github.com/google/cadvisor/compare/8450c56...v0.37.0)
-- github.com/json-iterator/go: [v1.1.9 → v1.1.10](https://github.com/json-iterator/go/compare/v1.1.9...v1.1.10)
-- github.com/opencontainers/go-digest: [v1.0.0-rc1 → v1.0.0](https://github.com/opencontainers/go-digest/compare/v1.0.0-rc1...v1.0.0)
-- github.com/opencontainers/runc: [1b94395 → 819fcc6](https://github.com/opencontainers/runc/compare/1b94395...819fcc6)
-- github.com/prometheus/client_golang: [v1.6.0 → v1.7.1](https://github.com/prometheus/client_golang/compare/v1.6.0...v1.7.1)
-- github.com/prometheus/common: [v0.9.1 → v0.10.0](https://github.com/prometheus/common/compare/v0.9.1...v0.10.0)
-- github.com/prometheus/procfs: [v0.0.11 → v0.1.3](https://github.com/prometheus/procfs/compare/v0.0.11...v0.1.3)
-- github.com/rubiojr/go-vhd: [0bfd3b3 → 02e2102](https://github.com/rubiojr/go-vhd/compare/0bfd3b3...02e2102)
-- github.com/storageos/go-api: [343b3ef → v2.2.0+incompatible](https://github.com/storageos/go-api/compare/343b3ef...v2.2.0)
-- github.com/urfave/cli: [v1.22.1 → v1.22.2](https://github.com/urfave/cli/compare/v1.22.1...v1.22.2)
-- go.etcd.io/etcd: 54ba958 → dd1b699
-- golang.org/x/crypto: bac4c82 → 75b2880
-- golang.org/x/mod: v0.1.0 → v0.3.0
-- golang.org/x/net: d3edc99 → ab34263
-- golang.org/x/tools: c00d67e → c1934b7
-- k8s.io/kube-openapi: 656914f → 6aeccd4
-- k8s.io/system-validators: v1.1.2 → v1.2.0
-- k8s.io/utils: 6e3d28b → d5654de
-
-### Removed
-- github.com/godbus/dbus: [ade71ed](https://github.com/godbus/dbus/tree/ade71ed)
-- github.com/xlab/handysort: [fb3537e](https://github.com/xlab/handysort/tree/fb3537e)
-- sigs.k8s.io/structured-merge-diff/v3: v3.0.0
-- vbom.ml/util: db5cfe1
diff --git a/content/en/docs/tasks/access-application-cluster/_index.md b/content/en/docs/tasks/access-application-cluster/_index.md
old mode 100755
new mode 100644
diff --git a/content/en/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md b/content/en/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md
index e32a6ba02c..8b79d7042f 100644
--- a/content/en/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md
+++ b/content/en/docs/tasks/access-application-cluster/configure-access-multiple-clusters.md
@@ -7,7 +7,6 @@ card:
weight: 40
---
-
This page shows how to configure access to multiple clusters by using
@@ -22,19 +21,21 @@ It does not mean that there is a file named `kubeconfig`.
{{< /note >}}
+{{< warning >}}
+Only use kubeconfig files from trusted sources. Using a specially-crafted kubeconfig file could result in malicious code execution or file exposure.
+If you must use an untrusted kubeconfig file, inspect it carefully first, much as you would a shell script.
+{{< /warning>}}
+
## {{% heading "prerequisites" %}}
-
{{< include "task-tutorial-prereqs.md" >}}
To check that {{< glossary_tooltip text="kubectl" term_id="kubectl" >}} is installed,
run `kubectl version --client`. The kubectl version should be
-[within one minor version](/docs/setup/release/version-skew-policy/#kubectl) of your
+[within one minor version](/releases/version-skew-policy/#kubectl) of your
cluster's API server.
-
-
## Define clusters, users, and contexts
@@ -186,7 +187,7 @@ kubectl config --kubeconfig=config-demo view --minify
The output shows configuration information associated with the `dev-frontend` context:
-```shell
+```yaml
apiVersion: v1
clusters:
- cluster:
@@ -238,7 +239,6 @@ kubectl config --kubeconfig=config-demo use-context dev-storage
View configuration associated with the new current context, `dev-storage`.
-
```shell
kubectl config --kubeconfig=config-demo view --minify
```
@@ -247,7 +247,7 @@ kubectl config --kubeconfig=config-demo view --minify
In your `config-exercise` directory, create a file named `config-demo-2` with this content:
-```shell
+```yaml
apiVersion: v1
kind: Config
preferences: {}
@@ -269,13 +269,17 @@ current value of your `KUBECONFIG` environment variable, so you can restore it l
For example:
### Linux
+
```shell
export KUBECONFIG_SAVED=$KUBECONFIG
```
+
### Windows PowerShell
-```shell
+
+```powershell
$Env:KUBECONFIG_SAVED=$ENV:KUBECONFIG
```
+
The `KUBECONFIG` environment variable is a list of paths to configuration files. The list is
colon-delimited for Linux and Mac, and semicolon-delimited for Windows. If you have
a `KUBECONFIG` environment variable, familiarize yourself with the configuration files
@@ -284,11 +288,14 @@ in the list.
Temporarily append two paths to your `KUBECONFIG` environment variable. For example:
### Linux
+
```shell
export KUBECONFIG=$KUBECONFIG:config-demo:config-demo-2
```
+
### Windows PowerShell
-```shell
+
+```powershell
$Env:KUBECONFIG=("config-demo;config-demo-2")
```
@@ -303,7 +310,7 @@ environment variable. In particular, notice that the merged information has the
`dev-ramp-up` context from the `config-demo-2` file and the three contexts from
the `config-demo` file:
-```shell
+```yaml
contexts:
- context:
cluster: development
@@ -347,11 +354,14 @@ If you have a `$HOME/.kube/config` file, and it's not already listed in your
For example:
### Linux
+
```shell
export KUBECONFIG=$KUBECONFIG:$HOME/.kube/config
```
+
### Windows Powershell
-```shell
+
+```powershell
$Env:KUBECONFIG="$Env:KUBECONFIG;$HOME\.kube\config"
```
@@ -367,23 +377,19 @@ kubectl config view
Return your `KUBECONFIG` environment variable to its original value. For example:
### Linux
+
```shell
export KUBECONFIG=$KUBECONFIG_SAVED
```
+
### Windows PowerShell
-```shell
+
+```powershell
$Env:KUBECONFIG=$ENV:KUBECONFIG_SAVED
```
-
-
## {{% heading "whatsnext" %}}
-
* [Organizing Cluster Access Using kubeconfig Files](/docs/concepts/configuration/organize-cluster-access-kubeconfig/)
* [kubectl config](/docs/reference/generated/kubectl/kubectl-commands#config)
-
-
-
-
diff --git a/content/en/docs/tasks/access-application-cluster/create-external-load-balancer.md b/content/en/docs/tasks/access-application-cluster/create-external-load-balancer.md
index 7dcc613232..23f6f91a2c 100644
--- a/content/en/docs/tasks/access-application-cluster/create-external-load-balancer.md
+++ b/content/en/docs/tasks/access-application-cluster/create-external-load-balancer.md
@@ -4,47 +4,44 @@ content_type: task
weight: 80
---
-
-This page shows how to create an External Load Balancer.
+This page shows how to create an external load balancer.
-{{< note >}}
-This feature is only available for cloud providers or environments which support external load balancers.
-{{< /note >}}
-
-When creating a service, you have the option of automatically creating a
-cloud network load balancer. This provides an externally-accessible IP address
-that sends traffic to the correct port on your cluster nodes
+When creating a {{< glossary_tooltip text="Service" term_id="service" >}}, you have
+the option of automatically creating a cloud load balancer. This provides an
+externally-accessible IP address that sends traffic to the correct port on your cluster
+nodes,
_provided your cluster runs in a supported environment and is configured with
the correct cloud load balancer provider package_.
-For information on provisioning and using an Ingress resource that can give
-services externally-reachable URLs, load balance the traffic, terminate SSL etc.,
-please check the [Ingress](/docs/concepts/services-networking/ingress/)
+You can also use an {{< glossary_tooltip term_id="ingress" >}} in place of Service.
+For more information, check the [Ingress](/docs/concepts/services-networking/ingress/)
documentation.
-
-
## {{% heading "prerequisites" %}}
-* {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
+{{< include "task-tutorial-prereqs.md" >}}
+Your cluster must be running in a cloud or other environment that already has support
+for configuring external load balancers.
-## Configuration file
+## Create a Service
+
+### Create a Service from a manifest
To create an external load balancer, add the following line to your
-[service configuration file](/docs/concepts/services-networking/service/#loadbalancer):
+Service manifest:
```yaml
type: LoadBalancer
```
-Your configuration file might look like:
+Your manifest might then look like:
```yaml
apiVersion: v1
@@ -60,19 +57,19 @@ spec:
type: LoadBalancer
```
-## Using kubectl
+### Create a Service using kubectl
You can alternatively create the service with the `kubectl expose` command and
its `--type=LoadBalancer` flag:
```bash
-kubectl expose rc example --port=8765 --target-port=9376 \
+kubectl expose deployment example --port=8765 --target-port=9376 \
--name=example-service --type=LoadBalancer
```
-This command creates a new service using the same selectors as the referenced
-resource (in the case of the example above, a replication controller named
-`example`).
+This command creates a new Service using the same selectors as the referenced
+resource (in the case of the example above, a
+{{< glossary_tooltip text="Deployment" term_id="deployment" >}} named `example`).
For more information, including optional flags, refer to the
[`kubectl expose` reference](/docs/reference/generated/kubectl/kubectl-commands/#expose).
@@ -86,59 +83,63 @@ information through `kubectl`:
kubectl describe services example-service
```
-which should produce output like this:
+which should produce output similar to:
-```bash
- Name: example-service
- Namespace: default
- Labels:
- Annotations:
- Selector: app=example
- Type: LoadBalancer
- IP: 10.67.252.103
- LoadBalancer Ingress: 192.0.2.89
- Port: 80/TCP
- NodePort: 32445/TCP
- Endpoints: 10.64.0.4:80,10.64.1.5:80,10.64.2.4:80
- Session Affinity: None
- Events:
+```
+Name: example-service
+Namespace: default
+Labels: app=example
+Annotations:
+Selector: app=example
+Type: LoadBalancer
+IP Families:
+IP: 10.3.22.96
+IPs: 10.3.22.96
+LoadBalancer Ingress: 192.0.2.89
+Port: 8765/TCP
+TargetPort: 9376/TCP
+NodePort: 30593/TCP
+Endpoints: 172.17.0.3:9376
+Session Affinity: None
+External Traffic Policy: Cluster
+Events:
```
-The IP address is listed next to `LoadBalancer Ingress`.
+The load balancer's IP address is listed next to `LoadBalancer Ingress`.
{{< note >}}
If you are running your service on Minikube, you can find the assigned IP address and port with:
-{{< /note >}}
```bash
minikube service example-service --url
```
+{{< /note >}}
## Preserving the client source IP
-Due to the implementation of this feature, the source IP seen in the target
-container is *not the original source IP* of the client. To enable
-preservation of the client IP, the following fields can be configured in the
-service spec (supported in GCE/Google Kubernetes Engine environments):
+By default, the source IP seen in the target container is *not the original
+source IP* of the client. To enable preservation of the client IP, the following
+fields can be configured in the `.spec` of the Service:
-* `service.spec.externalTrafficPolicy` - denotes if this Service desires to route
-external traffic to node-local or cluster-wide endpoints. There are two available
-options: Cluster (default) and Local. Cluster obscures the client source
-IP and may cause a second hop to another node, but should have good overall
-load-spreading. Local preserves the client source IP and avoids a second hop
-for LoadBalancer and NodePort type services, but risks potentially imbalanced
-traffic spreading.
-* `service.spec.healthCheckNodePort` - specifies the health check node port
-(numeric port number) for the service. If `healthCheckNodePort` isn't specified,
-the service controller allocates a port from your cluster's NodePort range. You
-can configure that range by setting an API server command line option,
-`--service-node-port-range`. It will use the
-user-specified `healthCheckNodePort` value if specified by the client. It only has an
-effect when `type` is set to LoadBalancer and `externalTrafficPolicy` is set
-to Local.
+* `.spec.externalTrafficPolicy` - denotes if this Service desires to route
+ external traffic to node-local or cluster-wide endpoints. There are two available
+ options: `Cluster` (default) and `Local`. `Cluster` obscures the client source
+ IP and may cause a second hop to another node, but should have good overall
+ load-spreading. `Local` preserves the client source IP and avoids a second hop
+ for LoadBalancer and NodePort type Services, but risks potentially imbalanced
+ traffic spreading.
+* `.spec.healthCheckNodePort` - specifies the health check node port
+ (numeric port number) for the service. If you don't specify
+ `healthCheckNodePort`, the service controller allocates a port from your
+ cluster's NodePort range.
+ You can configure that range by setting an API server command line option,
+ `--service-node-port-range`. The Service will use the user-specified
+ `healthCheckNodePort` value if you specify it, provided that the
+ Service `type` is set to LoadBalancer and `externalTrafficPolicy` is set
+ to `Local`.
-Setting `externalTrafficPolicy` to Local in the Service configuration file
-activates this feature.
+Setting `externalTrafficPolicy` to Local in the Service manifest
+activates this feature. For example:
```yaml
apiVersion: v1
@@ -155,7 +156,20 @@ spec:
type: LoadBalancer
```
-## Garbage Collecting Load Balancers
+### Caveats and limitations when preserving source IPs
+
+Load balancing services from some cloud providers do not let you configure different weights for each target.
+
+With each target weighted equally in terms of sending traffic to Nodes, external
+traffic is not equally load balanced across different Pods. The external load balancer
+is unaware of the number of Pods on each node that are used as a target.
+
+Where `NumServicePods << _NumNodes` or `NumServicePods >> NumNodes`, a fairly close-to-equal
+distribution will be seen, even without weights.
+
+Internal pod to pod traffic should behave similar to ClusterIP services, with equal probability across all pods.
+
+## Garbage collecting load balancers
{{< feature-state for_k8s_version="v1.17" state="stable" >}}
@@ -172,32 +186,18 @@ The finalizer will only be removed after the load balancer resource is cleaned u
This prevents dangling load balancer resources even in corner cases such as the
service controller crashing.
-## External Load Balancer Providers
+## External load balancer providers
It is important to note that the datapath for this functionality is provided by a load balancer external to the Kubernetes cluster.
When the Service `type` is set to LoadBalancer, Kubernetes provides functionality equivalent to `type` equals ClusterIP to pods
-within the cluster and extends it by programming the (external to Kubernetes) load balancer with entries for the Kubernetes
-pods. The Kubernetes service controller automates the creation of the external load balancer, health checks (if needed),
-firewall rules (if needed) and retrieves the external IP allocated by the cloud provider and populates it in the service
-object.
-
-## Caveats and Limitations when preserving source IPs
-
-GCE/AWS load balancers do not provide weights for their target pools. This was not an issue with the old LB
-kube-proxy rules which would correctly balance across all endpoints.
-
-With the new functionality, the external traffic is not equally load balanced across pods, but rather
-equally balanced at the node level (because GCE/AWS and other external LB implementations do not have the ability
-for specifying the weight per node, they balance equally across all target nodes, disregarding the number of
-pods on each node).
-
-We can, however, state that for NumServicePods << NumNodes or NumServicePods >> NumNodes, a fairly close-to-equal
-distribution will be seen, even without weights.
-
-Once the external load balancers provide weights, this functionality can be added to the LB programming path.
-*Future Work: No support for weights is provided for the 1.4 release, but may be added at a future date*
-
-Internal pod to pod traffic should behave similar to ClusterIP services, with equal probability across all pods.
+within the cluster and extends it by programming the (external to Kubernetes) load balancer with entries for the nodes
+hosting the relevant Kubernetes pods. The Kubernetes control plane automates the creation of the external load balancer,
+health checks (if needed), and packet filtering rules (if needed). Once the cloud provider allocates an IP address for the load
+balancer, the control plane looks up that external IP address and populates it into the Service object.
+## {{% heading "whatsnext" %}}
+* Read about [Service](/docs/concepts/services-networking/service/)
+* Read about [Ingress](/docs/concepts/services-networking/ingress/)
+* Read [Connecting Applications with Services](/docs/concepts/services-networking/connect-applications-service/)
diff --git a/content/en/docs/tasks/access-application-cluster/ingress-minikube.md b/content/en/docs/tasks/access-application-cluster/ingress-minikube.md
index 5b3fd114b0..65249e8fc8 100644
--- a/content/en/docs/tasks/access-application-cluster/ingress-minikube.md
+++ b/content/en/docs/tasks/access-application-cluster/ingress-minikube.md
@@ -44,8 +44,48 @@ This page shows you how to set up a simple Ingress which routes requests to Serv
1. Verify that the NGINX Ingress controller is running
+
+ {{< tabs name="tab_with_md" >}}
+ {{% tab name="minikube v1.19 or later" %}}
+```shell
+kubectl get pods -n ingress-nginx
+```
+ {{< note >}}This can take up to a minute.{{< /note >}}
+
+Output:
+
+```
+NAME READY STATUS RESTARTS AGE
+ingress-nginx-admission-create-g9g49 0/1 Completed 0 11m
+ingress-nginx-admission-patch-rqp78 0/1 Completed 1 11m
+ingress-nginx-controller-59b45fb494-26npt 1/1 Running 0 11m
+```
+ {{% /tab %}}
+
+ {{% tab name="minikube v1.18.1 or earlier" %}}
+```shell
+kubectl get pods -n kube-system
+```
+{{< note >}}This can take up to a minute.{{< /note >}}
+
+Output:
+
+```
+NAME READY STATUS RESTARTS AGE
+default-http-backend-59868b7dd6-xb8tq 1/1 Running 0 1m
+kube-addon-manager-minikube 1/1 Running 0 3m
+kube-dns-6dcb57bcc8-n4xd4 3/3 Running 0 2m
+kubernetes-dashboard-5498ccf677-b8p5h 1/1 Running 0 2m
+nginx-ingress-controller-5984b97644-rnkrg 1/1 Running 0 1m
+storage-provisioner 1/1 Running 0 2m
+```
+ {{% /tab %}}
+ {{< /tabs >}}
+
+
+
```shell
- kubectl get pods -n kube-system
+ kubectl get pods -n ingress-nginx
```
{{< note >}}This can take up to a minute.{{< /note >}}
@@ -53,15 +93,13 @@ This page shows you how to set up a simple Ingress which routes requests to Serv
Output:
```shell
- NAME READY STATUS RESTARTS AGE
- default-http-backend-59868b7dd6-xb8tq 1/1 Running 0 1m
- kube-addon-manager-minikube 1/1 Running 0 3m
- kube-dns-6dcb57bcc8-n4xd4 3/3 Running 0 2m
- kubernetes-dashboard-5498ccf677-b8p5h 1/1 Running 0 2m
- nginx-ingress-controller-5984b97644-rnkrg 1/1 Running 0 1m
- storage-provisioner 1/1 Running 0 2m
+ NAME READY STATUS RESTARTS AGE
+ ingress-nginx-admission-create-2tgrf 0/1 Completed 0 3m28s
+ ingress-nginx-admission-patch-68b98 0/1 Completed 0 3m28s
+ ingress-nginx-controller-59b45fb494-lzmw2 1/1 Running 0 3m28s
```
+
## Deploy a hello, world app
1. Create a Deployment using the following command:
diff --git a/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md b/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md
index 3a8983eec8..133eae902b 100644
--- a/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md
+++ b/content/en/docs/tasks/access-application-cluster/list-all-running-container-images.md
@@ -23,7 +23,7 @@ of Containers for each.
- Fetch all Pods in all namespaces using `kubectl get pods --all-namespaces`
- Format the output to include only the list of Container image names
- using `-o jsonpath={..image}`. This will recursively parse out the
+ using `-o jsonpath={.items[*].spec.containers[*].image}`. This will recursively parse out the
`image` field from the returned json.
- See the [jsonpath reference](/docs/reference/kubectl/jsonpath/)
for further information on how to use jsonpath.
@@ -33,7 +33,7 @@ of Containers for each.
- Use `uniq` to aggregate image counts
```shell
-kubectl get pods --all-namespaces -o jsonpath="{..image}" |\
+kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c
@@ -80,7 +80,7 @@ To target only Pods matching a specific label, use the -l flag. The
following matches only Pods with labels matching `app=nginx`.
```shell
-kubectl get pods --all-namespaces -o=jsonpath="{..image}" -l app=nginx
+kubectl get pods --all-namespaces -o=jsonpath="{.items[*].spec.containers[*].image}" -l app=nginx
```
## List Container images filtering by Pod namespace
@@ -89,7 +89,7 @@ To target only pods in a specific namespace, use the namespace flag. The
following matches only Pods in the `kube-system` namespace.
```shell
-kubectl get pods --namespace kube-system -o jsonpath="{..image}"
+kubectl get pods --namespace kube-system -o jsonpath="{.items[*].spec.containers[*].image}"
```
## List Container images using a go-template instead of jsonpath
diff --git a/content/en/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md b/content/en/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md
index 0a6d352d2c..ba8f7b1244 100644
--- a/content/en/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md
+++ b/content/en/docs/tasks/access-application-cluster/port-forward-access-application-cluster.md
@@ -31,7 +31,7 @@ for database debugging.
1. Create a Deployment that runs MongoDB:
```shell
- kubectl apply -f https://k8s.io/examples/application/guestbook/mongo-deployment.yaml
+ kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-deployment.yaml
```
The output of a successful command verifies that the deployment was created:
@@ -84,7 +84,7 @@ for database debugging.
2. Create a Service to expose MongoDB on the network:
```shell
- kubectl apply -f https://k8s.io/examples/application/guestbook/mongo-service.yaml
+ kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-service.yaml
```
The output of a successful command verifies that the Service was created:
@@ -196,13 +196,6 @@ the slightly simpler syntax:
kubectl port-forward deployment/mongo :27017
```
-The output is similar to this:
-
-```
-Forwarding from 127.0.0.1:63753 -> 27017
-Forwarding from [::1]:63753 -> 27017
-```
-
The `kubectl` tool finds a local port number that is not in use (avoiding low ports numbers,
because these might be used by other applications). The output is similar to:
diff --git a/content/en/docs/tasks/access-application-cluster/web-ui-dashboard.md b/content/en/docs/tasks/access-application-cluster/web-ui-dashboard.md
index 47cec90f26..0182bbad73 100644
--- a/content/en/docs/tasks/access-application-cluster/web-ui-dashboard.md
+++ b/content/en/docs/tasks/access-application-cluster/web-ui-dashboard.md
@@ -2,8 +2,9 @@
reviewers:
- bryk
- mikedanese
-- rf232
-title: Web UI (Dashboard)
+title: Deploy and Access the Kubernetes Dashboard
+description: >-
+ Deploy the web UI (Kubernetes Dashboard) and access it.
content_type: concept
weight: 10
card:
@@ -34,7 +35,7 @@ Dashboard also provides information on the state of Kubernetes resources in your
The Dashboard UI is not deployed by default. To deploy it, run the following command:
```
-kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
+kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
```
## Accessing the Dashboard UI
@@ -49,7 +50,9 @@ The sample user created in the tutorial will have administrative privileges and
{{< /warning >}}
### Command line proxy
-You can access Dashboard using the kubectl command-line tool by running the following command:
+
+You can enable access to the Dashboard using the `kubectl` command-line tool,
+by running the following command:
```
kubectl proxy
@@ -60,7 +63,8 @@ Kubectl will make Dashboard available at [http://localhost:8001/api/v1/namespace
The UI can _only_ be accessed from the machine where the command is executed. See `kubectl proxy --help` for more options.
{{< note >}}
-Kubeconfig Authentication method does NOT support external identity providers or x509 certificate-based authentication.
+The kubeconfig authentication method does **not** support external identity providers
+or X.509 certificate-based authentication.
{{< /note >}}
## Welcome view
@@ -75,7 +79,7 @@ In addition, you can view which system applications are running by default in th
## Deploying containerized applications
Dashboard lets you create and deploy a containerized application as a Deployment and optional Service with a simple wizard.
-You can either manually specify application details, or upload a YAML or JSON file containing application configuration.
+You can either manually specify application details, or upload a YAML or JSON _manifest_ file containing application configuration.
Click the **CREATE** button in the upper right corner of any page to begin.
@@ -186,13 +190,14 @@ If needed, you can expand the **Advanced options** section where you can specify
### Uploading a YAML or JSON file
Kubernetes supports declarative configuration.
-In this style, all configuration is stored in YAML or JSON configuration files
-using the Kubernetes [API](/docs/concepts/overview/kubernetes-api/) resource schemas.
+In this style, all configuration is stored in manifests (YAML or JSON configuration files).
+The manifests use Kubernetes [API](/docs/concepts/overview/kubernetes-api/) resource schemas.
As an alternative to specifying application details in the deploy wizard,
-you can define your application in YAML or JSON files, and upload the files using Dashboard.
+you can define your application in one or more manifests, and upload the files using Dashboard.
## Using Dashboard
+
Following sections describe views of the Kubernetes Dashboard UI; what they provide and how can they be used.
### Navigation
@@ -203,8 +208,9 @@ this can be changed using the namespace selector located in the navigation menu.
Dashboard shows most Kubernetes object kinds and groups them in a few menu categories.
-#### Admin Overview
-For cluster and namespace administrators, Dashboard lists Nodes, Namespaces and Persistent Volumes and has detail views for them.
+#### Admin overview
+
+For cluster and namespace administrators, Dashboard lists Nodes, Namespaces and PersistentVolumes and has detail views for them.
Node list view contains CPU and memory usage metrics aggregated across all Nodes.
The details view shows the metrics for a Node, its specification, status,
allocated resources, events and pods running on the node.
@@ -212,14 +218,14 @@ allocated resources, events and pods running on the node.
#### Workloads
Shows all applications running in the selected namespace.
-The view lists applications by workload kind (e.g., Deployments, Replica Sets, Stateful Sets, etc.)
+The view lists applications by workload kind (for example: Deployments, ReplicaSets, StatefulSets).
and each workload kind can be viewed separately.
The lists summarize actionable information about the workloads,
-such as the number of ready pods for a Replica Set or current memory usage for a Pod.
+such as the number of ready pods for a ReplicaSet or current memory usage for a Pod.
Detail views for workloads show status and specification information and
surface relationships between objects.
-For example, Pods that Replica Set is controlling or New Replica Sets and Horizontal Pod Autoscalers for Deployments.
+For example, Pods that ReplicaSet is controlling or new ReplicaSets and HorizontalPodAutoscalers for Deployments.
#### Services
@@ -230,9 +236,9 @@ internal endpoints for cluster connections and external endpoints for external u
#### Storage
-Storage view shows Persistent Volume Claim resources which are used by applications for storing data.
+Storage view shows PersistentVolumeClaim resources which are used by applications for storing data.
-#### Config Maps and Secrets
+#### ConfigMaps and Secrets {#config-maps-and-secrets}
Shows all Kubernetes resources that are used for live configuration of applications running in clusters.
The view allows for editing and managing config objects and displays secrets hidden by default.
diff --git a/content/en/docs/tasks/administer-cluster/_index.md b/content/en/docs/tasks/administer-cluster/_index.md
old mode 100755
new mode 100644
diff --git a/content/en/docs/tasks/administer-cluster/access-cluster-api.md b/content/en/docs/tasks/administer-cluster/access-cluster-api.md
index 0275cadabf..827cb50f7c 100644
--- a/content/en/docs/tasks/administer-cluster/access-cluster-api.md
+++ b/content/en/docs/tasks/administer-cluster/access-cluster-api.md
@@ -30,7 +30,7 @@ Check the location and credentials that kubectl knows about with this command:
kubectl config view
```
-Many of the [examples](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/) provide an introduction to using
+Many of the [examples](https://github.com/kubernetes/examples/tree/master/) provide an introduction to using
kubectl. Complete documentation is found in the [kubectl manual](/docs/reference/kubectl/overview/).
### Directly accessing the REST API
diff --git a/content/en/docs/tasks/administer-cluster/certificates.md b/content/en/docs/tasks/administer-cluster/certificates.md
index 6361b20d16..2338b0cdc7 100644
--- a/content/en/docs/tasks/administer-cluster/certificates.md
+++ b/content/en/docs/tasks/administer-cluster/certificates.md
@@ -116,6 +116,9 @@ manually through `easyrsa`, `openssl` or `cfssl`.
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 10000 \
-extensions v3_ext -extfile csr.conf
+1. View the certificate signing request:
+
+ openssl req -noout -text -in ./server.csr
1. View the certificate:
openssl x509 -noout -text -in ./server.crt
diff --git a/content/en/docs/tasks/administer-cluster/change-pv-reclaim-policy.md b/content/en/docs/tasks/administer-cluster/change-pv-reclaim-policy.md
index be7cbf2673..6a11b4f2d3 100644
--- a/content/en/docs/tasks/administer-cluster/change-pv-reclaim-policy.md
+++ b/content/en/docs/tasks/administer-cluster/change-pv-reclaim-policy.md
@@ -26,7 +26,7 @@ volume is automatically deleted when a user deletes the corresponding
PersistentVolumeClaim. This automatic behavior might be inappropriate if the volume
contains precious data. In that case, it is more appropriate to use the "Retain"
policy. With the "Retain" policy, if a user deletes a PersistentVolumeClaim,
-the corresponding PersistentVolume is not be deleted. Instead, it is moved to the
+the corresponding PersistentVolume will not be deleted. Instead, it is moved to the
Released phase, where all of its data can be manually recovered.
## Changing the reclaim policy of a PersistentVolume
diff --git a/content/en/docs/tasks/administer-cluster/controller-manager-leader-migration.md b/content/en/docs/tasks/administer-cluster/controller-manager-leader-migration.md
new file mode 100644
index 0000000000..ddfa8e592e
--- /dev/null
+++ b/content/en/docs/tasks/administer-cluster/controller-manager-leader-migration.md
@@ -0,0 +1,126 @@
+---
+reviewers:
+- jpbetz
+- cheftako
+title: "Migrate Replicated Control Plane To Use Cloud Controller Manager"
+linkTitle: "Migrate Replicated Control Plane To Use Cloud Controller Manager"
+content_type: task
+---
+
+
+
+
+{{< feature-state state="beta" for_k8s_version="v1.22" >}}
+
+{{< glossary_definition term_id="cloud-controller-manager" length="all" prepend="The cloud-controller-manager is">}}
+
+## Background
+
+As part of the [cloud provider extraction effort](https://kubernetes.io/blog/2019/04/17/the-future-of-cloud-providers-in-kubernetes/), all cloud specific controllers must be moved out of the `kube-controller-manager`. All existing clusters that run cloud controllers in the `kube-controller-manager` must migrate to instead run the controllers in a cloud provider specific `cloud-controller-manager`.
+
+Leader Migration provides a mechanism in which HA clusters can safely migrate "cloud specific" controllers between the `kube-controller-manager` and the `cloud-controller-manager` via a shared resource lock between the two components while upgrading the replicated control plane. For a single-node control plane, or if unavailability of controller managers can be tolerated during the upgrade, Leader Migration is not needed and this guide can be ignored.
+
+Leader Migration can be enabled by setting `--enable-leader-migration` on `kube-controller-manager` or `cloud-controller-manager`. Leader Migration only applies during the upgrade and can be safely disabled or left enabled after the upgrade is complete.
+
+This guide walks you through the manual process of upgrading the control plane from `kube-controller-manager` with built-in cloud provider to running both `kube-controller-manager` and `cloud-controller-manager`. If you use a tool to administrator the cluster, please refer to the documentation of the tool and the cloud provider for more details.
+
+## {{% heading "prerequisites" %}}
+
+It is assumed that the control plane is running Kubernetes version N and to be upgraded to version N + 1. Although it is possible to migrate within the same version, ideally the migration should be performed as part of an upgrade so that changes of configuration can be aligned to each release. The exact versions of N and N + 1 depend on each cloud provider. For example, if a cloud provider builds a `cloud-controller-manager` to work with Kubernetes 1.22, then N can be 1.21 and N + 1 can be 1.22.
+
+The control plane nodes should run `kube-controller-manager` with Leader Election enabled through `--leader-elect=true`. As of version N, an in-tree cloud privider must be set with `--cloud-provider` flag and `cloud-controller-manager` should not yet be deployed.
+
+The out-of-tree cloud provider must have built a `cloud-controller-manager` with Leader Migration implementation. If the cloud provider imports `k8s.io/cloud-provider` and `k8s.io/controller-manager` of version v0.21.0 or later, Leader Migration will be available. However, for version before v0.22.0, Leader Migration is alpha and requires feature gate `ControllerManagerLeaderMigration` to be enabled.
+
+This guide assumes that kubelet of each control plane node starts `kube-controller-manager` and `cloud-controller-manager` as static pods defined by their manifests. If the components run in a different setting, please adjust the steps accordingly.
+
+For authorization, this guide assumes that the cluster uses RBAC. If another authorization mode grants permissions to `kube-controller-manager` and `cloud-controller-manager` components, please grant the needed access in a way that matches the mode.
+
+
+
+### Grant access to Migration Lease
+
+The default permissions of the controller manager allow only accesses to their main Lease. In order for the migration to work, accesses to another Lease are required.
+
+You can grant `kube-controller-manager` full access to the leases API by modifying the `system::leader-locking-kube-controller-manager` role. This task guide assumes that the name of the migration lease is `cloud-provider-extraction-migration`.
+
+`kubectl patch -n kube-system role 'system::leader-locking-kube-controller-manager' -p '{"rules": [ {"apiGroups":[ "coordination.k8s.io"], "resources": ["leases"], "resourceNames": ["cloud-provider-extraction-migration"], "verbs": ["create", "list", "get", "update"] } ]}' --type=merge`
+
+Do the same to the `system::leader-locking-cloud-controller-manager` role.
+
+`kubectl patch -n kube-system role 'system::leader-locking-cloud-controller-manager' -p '{"rules": [ {"apiGroups":[ "coordination.k8s.io"], "resources": ["leases"], "resourceNames": ["cloud-provider-extraction-migration"], "verbs": ["create", "list", "get", "update"] } ]}' --type=merge`
+
+### Initial Leader Migration configuration
+
+Leader Migration optionally takes a configuration file representing the state of controller-to-manager assignment. At this moment, with in-tree cloud provider, `kube-controller-manager` runs `route`, `service`, and `cloud-node-lifecycle`. The following example configuration shows the assignment.
+
+Leader Migration can be enabled without a configuration. Please see [Default Configuration](#default-configuration) for details.
+
+```yaml
+kind: LeaderMigrationConfiguration
+apiVersion: controllermanager.config.k8s.io/v1beta1
+leaderName: cloud-provider-extraction-migration
+resourceLock: leases
+controllerLeaders:
+ - name: route
+ component: kube-controller-manager
+ - name: service
+ component: kube-controller-manager
+ - name: cloud-node-lifecycle
+ component: kube-controller-manager
+```
+
+On each control plane node, save the content to `/etc/leadermigration.conf`, and update the manifest of `kube-controller-manager` so that the file is mounted inside the container at the same location. Also, update the same manifest to add the following arguments:
+
+- `--enable-leader-migration` to enable Leader Migration on the controller manager
+- `--leader-migration-config=/etc/leadermigration.conf` to set configuration file
+
+Restart `kube-controller-manager` on each node. At this moment, `kube-controller-manager` has leader migration enabled and is ready for the migration.
+
+### Deploy Cloud Controller Manager
+
+In version N + 1, the desired state of controller-to-manager assignment can be represented by a new configuration file, shown as follows. Please note `component` field of each `controllerLeaders` changing from `kube-controller-manager` to `cloud-controller-manager`.
+
+```yaml
+kind: LeaderMigrationConfiguration
+apiVersion: controllermanager.config.k8s.io/v1beta1
+leaderName: cloud-provider-extraction-migration
+resourceLock: leases
+controllerLeaders:
+ - name: route
+ component: cloud-controller-manager
+ - name: service
+ component: cloud-controller-manager
+ - name: cloud-node-lifecycle
+ component: cloud-controller-manager
+```
+
+When creating control plane nodes of version N + 1, the content should be deploy to `/etc/leadermigration.conf`. The manifest of `cloud-controller-manager` should be updated to mount the configuration file in the same manner as `kube-controller-manager` of version N. Similarly, add `--feature-gates=ControllerManagerLeaderMigration=true`,`--enable-leader-migration`, and `--leader-migration-config=/etc/leadermigration.conf` to the arguments of `cloud-controller-manager`.
+
+Create a new control plane node of version N + 1 with the updated `cloud-controller-manager` manifest, and with the `--cloud-provider` flag unset for `kube-controller-manager`. `kube-controller-manager` of version N + 1 MUST NOT have Leader Migration enabled because, with an external cloud provider, it does not run the migrated controllers anymore and thus it is not involved in the migration.
+
+Please refer to [Cloud Controller Manager Administration](/docs/tasks/administer-cluster/running-cloud-controller/) for more detail on how to deploy `cloud-controller-manager`.
+
+### Upgrade Control Plane
+
+The control plane now contains nodes of both version N and N + 1. The nodes of version N run `kube-controller-manager` only, and these of version N + 1 run both `kube-controller-manager` and `cloud-controller-manager`. The migrated controllers, as specified in the configuration, are running under either `kube-controller-manager` of version N or `cloud-controller-manager` of version N + 1 depending on which controller manager holds the migration lease. No controller will ever be running under both controller managers at any time.
+
+In a rolling manner, create a new control plane node of version N + 1 and bring down one of version N + 1 until the control plane contains only nodes of version N + 1.
+If a rollback from version N + 1 to N is required, add nodes of version N with Leader Migration enabled for `kube-controller-manager` back to the control plane, replacing one of version N + 1 each time until there are only nodes of version N.
+
+### (Optional) Disable Leader Migration {#disable-leader-migration}
+
+Now that the control plane has been upgraded to run both `kube-controller-manager` and `cloud-controller-manager` of version N + 1, Leader Migration has finished its job and can be safely disabled to save one Lease resource. It is safe to re-enable Leader Migration for the rollback in the future.
+
+In a rolling manager, update manifest of `cloud-controller-manager` to unset both `--enable-leader-migration` and `--leader-migration-config=` flag, also remove the mount of `/etc/leadermigration.conf`, and finally remove `/etc/leadermigration.conf`. To re-enable Leader Migration, recreate the configuration file and add its mount and the flags that enable Leader Migration back to `cloud-controller-manager`.
+
+### Default Configuration
+
+Starting Kubernetes 1.22, Leader Migration provides a default configuration suitable for the default controller-to-manager assignment.
+The default configuration can be enabled by setting `--enable-leader-migration` but without `--leader-migration-config=`.
+
+For `kube-controller-manager` and `cloud-controller-manager`, if there are no flags that enable any in-tree cloud provider or change ownership of controllers, the default configuration can be used to avoid manual creation of the configuration file.
+
+## {{% heading "whatsnext" %}}
+
+- Read the [Controller Manager Leader Migration](https://github.com/kubernetes/enhancements/tree/master/keps/sig-cloud-provider/2436-controller-manager-leader-migration) enhancement proposal
diff --git a/content/en/docs/tasks/administer-cluster/coredns.md b/content/en/docs/tasks/administer-cluster/coredns.md
index 32d4f7d7ec..54163058c8 100644
--- a/content/en/docs/tasks/administer-cluster/coredns.md
+++ b/content/en/docs/tasks/administer-cluster/coredns.md
@@ -36,7 +36,7 @@ For manual deployment or replacement of kube-dns, see the documentation at the
In Kubernetes version 1.10 and later, you can also move to CoreDNS when you use `kubeadm` to upgrade
a cluster that is using `kube-dns`. In this case, `kubeadm` will generate the CoreDNS configuration
-("Corefile") based upon the `kube-dns` ConfigMap, preserving configurations for federation,
+("Corefile") based upon the `kube-dns` ConfigMap, preserving configurations for
stub domains, and upstream name server.
If you are moving from kube-dns to CoreDNS, make sure to set the `CoreDNS` feature gate to `true`
@@ -46,8 +46,7 @@ kubeadm upgrade apply v1.11.0 --feature-gates=CoreDNS=true
```
In Kubernetes version 1.13 and later the `CoreDNS` feature gate is removed and CoreDNS
-is used by default. Follow the guide outlined [here](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase#cmd-phase-addon) if you want
-your upgraded cluster to use kube-dns.
+is used by default.
In versions prior to 1.11 the Corefile will be **overwritten** by the one created during upgrade.
**You should save your existing ConfigMap if you have customized it.** You may re-apply your
@@ -56,26 +55,7 @@ customizations after the new ConfigMap is up and running.
If you are running CoreDNS in Kubernetes version 1.11 and later, during upgrade,
your existing Corefile will be retained.
-
-### Installing kube-dns instead of CoreDNS with kubeadm
-
-{{< note >}}
-In Kubernetes 1.11, CoreDNS has graduated to General Availability (GA)
-and is installed by default.
-{{< /note >}}
-
-{{< warning >}}
-In Kubernetes 1.18, kube-dns usage with kubeadm has been deprecated and will be removed in a future version.
-{{< /warning >}}
-
-To install kube-dns on versions prior to 1.13, set the `CoreDNS` feature gate
-value to `false`:
-
-```
-kubeadm init --feature-gates=CoreDNS=false
-```
-
-For versions 1.13 and later, follow the guide outlined [here](/docs/reference/setup-tools/kubeadm/kubeadm-init-phase#cmd-phase-addon).
+In Kubernetes version 1.21, support for `kube-dns` is removed from kubeadm.
## Upgrading CoreDNS
diff --git a/content/en/docs/tasks/administer-cluster/cpu-management-policies.md b/content/en/docs/tasks/administer-cluster/cpu-management-policies.md
index 5ffc40781a..9eb7d7febb 100644
--- a/content/en/docs/tasks/administer-cluster/cpu-management-policies.md
+++ b/content/en/docs/tasks/administer-cluster/cpu-management-policies.md
@@ -58,12 +58,16 @@ frequency is set through a new Kubelet configuration value
`--cpu-manager-reconcile-period`. If not specified, it defaults to the same
duration as `--node-status-update-frequency`.
+The behavior of the static policy can be fine-tuned using the `--cpu-manager-policy-options` flag.
+The flag takes a comma-separated list of `key=value` policy options.
+
### None policy
The `none` policy explicitly enables the existing default CPU
affinity scheme, providing no affinity beyond what the OS scheduler does
automatically. Limits on CPU usage for
-[Guaranteed pods](/docs/tasks/configure-pod-container/quality-service-pod/)
+[Guaranteed pods](/docs/tasks/configure-pod-container/quality-service-pod/) and
+[Burstable pods](/docs/tasks/configure-pod-container/quality-service-pod/)
are enforced using CFS quota.
### Static policy
@@ -212,4 +216,14 @@ and `requests` are set equal to `limits` when not explicitly specified. And the
container's resource limit for the CPU resource is an integer greater than or
equal to one. The `nginx` container is granted 2 exclusive CPUs.
+#### Static policy options
+If the `full-pcpus-only` policy option is specified, the static policy will always allocate full physical cores.
+You can enable this option by adding `full-pcups-only=true` to the CPUManager policy options.
+By default, without this option, the static policy allocates CPUs using a topology-aware best-fit allocation.
+On SMT enabled systems, the policy can allocate individual virtual cores, which correspond to hardware threads.
+This can lead to different containers sharing the same physical cores; this behaviour in turn contributes
+to the [noisy neighbours problem](https://en.wikipedia.org/wiki/Cloud_computing_issues#Performance_interference_and_noisy_neighbors).
+With the option enabled, the pod will be admitted by the kubelet only if the CPU request of all its containers
+can be fulfilled by allocating full physical cores.
+If the pod does not pass the admission, it will be put in Failed state with the message `SMTAlignmentError`.
diff --git a/content/en/docs/tasks/administer-cluster/declare-network-policy.md b/content/en/docs/tasks/administer-cluster/declare-network-policy.md
index fed4a77f9d..7acbaa9e7d 100644
--- a/content/en/docs/tasks/administer-cluster/declare-network-policy.md
+++ b/content/en/docs/tasks/administer-cluster/declare-network-policy.md
@@ -18,6 +18,7 @@ This document helps you get started using the Kubernetes [NetworkPolicy API](/do
Make sure you've configured a network provider with network policy support. There are a number of network providers that support NetworkPolicy, including:
+* [Antrea](/docs/tasks/administer-cluster/network-policy-provider/antrea-network-policy/)
* [Calico](/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy/)
* [Cilium](/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy/)
* [Kube-router](/docs/tasks/administer-cluster/network-policy-provider/kube-router-network-policy/)
diff --git a/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md b/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md
index 06de85b305..bd2fb3684c 100644
--- a/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md
+++ b/content/en/docs/tasks/administer-cluster/dns-custom-nameservers.md
@@ -28,13 +28,13 @@ explains how to use `kubeadm` to migrate from `kube-dns`.
DNS is a built-in Kubernetes service launched automatically
using the _addon manager_
-[cluster add-on](http://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/README.md).
+[cluster add-on](http://releases.k8s.io/master/cluster/addons/README.md).
As of Kubernetes v1.12, CoreDNS is the recommended DNS Server, replacing kube-dns. If your cluster
originally used kube-dns, you may still have `kube-dns` deployed rather than CoreDNS.
{{< note >}}
-Both the CoreDNS and kube-dns Service are named `kube-dns` in the `metadata.name` field.
+The CoreDNS Service is named `kube-dns` in the `metadata.name` field.
This is so that there is greater interoperability with workloads that relied on the legacy `kube-dns` Service name to resolve addresses internal to the cluster. Using a Service named `kube-dns` abstracts away the implementation detail of which DNS provider is running behind that common name.
{{< /note >}}
@@ -179,17 +179,14 @@ During translation, all FQDN nameservers will be omitted from the CoreDNS config
CoreDNS supports the features of kube-dns and more.
A ConfigMap created for kube-dns to support `StubDomains`and `upstreamNameservers` translates to the `forward` plugin in CoreDNS.
-Similarly, the `Federations` plugin in kube-dns translates to the `federation` plugin in CoreDNS.
### Example
-This example ConfigMap for kube-dns specifies federations, stubdomains and upstreamnameservers:
+This example ConfigMap for kube-dns specifies stubdomains and upstreamnameservers:
```yaml
apiVersion: v1
data:
- federations: |
- {"foo" : "foo.feddomain.com"}
stubDomains: |
{"abc.com" : ["1.2.3.4"], "my.cluster.local" : ["2.3.4.5"]}
upstreamNameservers: |
@@ -199,13 +196,6 @@ kind: ConfigMap
The equivalent configuration in CoreDNS creates a Corefile:
-* For federations:
-```
-federation cluster.local {
- foo foo.feddomain.com
-}
-```
-
* For stubDomains:
```yaml
abc.com:53 {
diff --git a/content/en/docs/tasks/administer-cluster/dns-debugging-resolution.md b/content/en/docs/tasks/administer-cluster/dns-debugging-resolution.md
index faed4e1cb1..6bc41d2170 100644
--- a/content/en/docs/tasks/administer-cluster/dns-debugging-resolution.md
+++ b/content/en/docs/tasks/administer-cluster/dns-debugging-resolution.md
@@ -288,6 +288,13 @@ This should probably be implemented eventually.
Linux's libc (a.k.a. glibc) has a limit for the DNS `nameserver` records to 3 by default. What's more, for the glibc versions which are older than glibc-2.17-222 ([the new versions update see this issue](https://access.redhat.com/solutions/58028)), the allowed number of DNS `search` records has been limited to 6 ([see this bug from 2005](https://bugzilla.redhat.com/show_bug.cgi?id=168253)). Kubernetes needs to consume 1 `nameserver` record and 3 `search` records. This means that if a local installation already uses 3 `nameserver`s or uses more than 3 `search`es while your glibc version is in the affected list, some of those settings will be lost. To work around the DNS `nameserver` records limit, the node can run `dnsmasq`, which will provide more `nameserver` entries. You can also use kubelet's `--resolv-conf` flag. To fix the DNS `search` records limit, consider upgrading your linux distribution or upgrading to an unaffected version of glibc.
+{{< note >}}
+
+With [Expanded DNS Configuration](/docs/concepts/services-networking/dns-pod-service/#expanded-dns-configuration),
+Kubernetes allows more DNS `search` records.
+
+{{< /note >}}
+
If you are using Alpine version 3.3 or earlier as your base image, DNS may not
work properly due to a known issue with Alpine.
Kubernetes [issue 30215](https://github.com/kubernetes/kubernetes/issues/30215)
diff --git a/content/en/docs/tasks/administer-cluster/enabling-endpointslices.md b/content/en/docs/tasks/administer-cluster/enabling-endpointslices.md
deleted file mode 100644
index d984652de8..0000000000
--- a/content/en/docs/tasks/administer-cluster/enabling-endpointslices.md
+++ /dev/null
@@ -1,89 +0,0 @@
----
-reviewers:
-- bowei
-- freehan
-title: Enabling EndpointSlices
-content_type: task
----
-
-
-This page provides an overview of enabling EndpointSlices in Kubernetes.
-
-
-
-## {{% heading "prerequisites" %}}
-
- {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
-
-
-
-
-## Introduction
-
-EndpointSlices provide a scalable and extensible alternative to Endpoints in
-Kubernetes. They build on top of the base of functionality provided by Endpoints
-and extend that in a scalable way. When Services have a large number (>100) of
-network endpoints, they will be split into multiple smaller EndpointSlice
-resources instead of a single large Endpoints resource.
-
-## Enabling EndpointSlices
-
-{{< feature-state for_k8s_version="v1.17" state="beta" >}}
-
-{{< note >}}
-The EndpointSlice resource was designed to address shortcomings in a earlier
-resource: Endpoints. Some Kubernetes components and third-party applications
-continue to use and rely on Endpoints. Whilst that remains the case,
-EndpointSlices should be seen as an addition to Endpoints in a cluster, not as
-an outright replacement.
-{{< /note >}}
-
-EndpointSlice functionality in Kubernetes is made up of several different
-components, most are enabled by default:
-* _The EndpointSlice API_: EndpointSlices are part of the
- `discovery.k8s.io/v1beta1` API. This is beta and enabled by default since
- Kubernetes 1.17. All components listed below are dependent on this API being
- enabled.
-* _The EndpointSlice Controller_: This {{< glossary_tooltip text="controller"
- term_id="controller" >}} maintains EndpointSlices for Services and the Pods
- they reference. This is controlled by the `EndpointSlice` feature gate. It has
- been enabled by default since Kubernetes 1.18.
-* _The EndpointSliceMirroring Controller_: This {{< glossary_tooltip
- text="controller" term_id="controller" >}} mirrors custom Endpoints to
- EndpointSlices. This is controlled by the `EndpointSlice` feature gate. It has
- been enabled by default since Kubernetes 1.19.
-* _Kube-Proxy_: When {{< glossary_tooltip text="kube-proxy" term_id="kube-proxy">}}
- is configured to use EndpointSlices, it can support higher numbers of Service
- endpoints. This is controlled by the `EndpointSliceProxying` feature gate on
- Linux and `WindowsEndpointSliceProxying` on Windows. It has been enabled by
- default on Linux since Kubernetes 1.19. It is not enabled by default for
- Windows nodes. To configure kube-proxy to use EndpointSlices on Windows, you
- can enable the `WindowsEndpointSliceProxying` [feature
- gate](/docs/reference/command-line-tools-reference/feature-gates/) on
- kube-proxy.
-
-
-## API fields
-
-Some fields in the EndpointSlice API are feature-gated.
-
-- The `EndpointSliceNodeName` feature gate controls access to the `nodeName`
- field. This is an alpha feature that is disabled by default.
-- The `EndpointSliceTerminating` feature gate controls access to the `serving`
- and `terminating` condition fields. This is an alpha feature that is disabled
- by default.
-
-## Using EndpointSlices
-
-With EndpointSlices fully enabled in your cluster, you should see corresponding
-EndpointSlice resources for each Endpoints resource. In addition to supporting
-existing Endpoints functionality, EndpointSlices will allow for greater
-scalability and extensibility of network endpoints in your cluster.
-
-## {{% heading "whatsnext" %}}
-
-
-* Read about [EndpointSlices](/docs/concepts/services-networking/endpoint-slices/)
-* Read [Connecting Applications with Services](/docs/concepts/services-networking/connect-applications-service/)
-
-
diff --git a/content/en/docs/tasks/administer-cluster/enabling-service-topology.md b/content/en/docs/tasks/administer-cluster/enabling-service-topology.md
index 998bb8b2e5..8fd39a7e50 100644
--- a/content/en/docs/tasks/administer-cluster/enabling-service-topology.md
+++ b/content/en/docs/tasks/administer-cluster/enabling-service-topology.md
@@ -5,52 +5,51 @@ reviewers:
- imroc
title: Enabling Service Topology
content_type: task
+min-kubernetes-server-version: 1.17
---
-This page provides an overview of enabling Service Topology in Kubernetes.
+{{< feature-state for_k8s_version="v1.21" state="deprecated" >}}
+This feature, specifically the alpha `topologyKeys` field, is deprecated since
+Kubernetes v1.21.
+[Topology Aware Hints](/docs/concepts/services-networking/topology-aware-hints/),
+introduced in Kubernetes v1.21, provide similar functionality.
+_Service Topology_ enables a {{< glossary_tooltip term_id="service">}} to route traffic based upon the Node
+topology of the cluster. For example, a service can specify that traffic be
+preferentially routed to endpoints that are on the same Node as the client, or
+in the same availability zone.
## {{% heading "prerequisites" %}}
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
-
-
-
-## Introduction
-
-_Service Topology_ enables a service to route traffic based upon the Node
-topology of the cluster. For example, a service can specify that traffic be
-preferentially routed to endpoints that are on the same Node as the client, or
-in the same availability zone.
-
-## Prerequisites
-
The following prerequisites are needed in order to enable topology aware service
routing:
- * Kubernetes 1.17 or later
- * {{< glossary_tooltip text="Kube-proxy" term_id="kube-proxy" >}} running in iptables mode or IPVS mode
- * Enable [Endpoint Slices](/docs/concepts/services-networking/endpoint-slices/)
+ * Kubernetes v1.17 or later
+ * Configure {{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}} to run in iptables mode or IPVS mode
+
+
+
## Enable Service Topology
-{{< feature-state for_k8s_version="v1.17" state="alpha" >}}
+{{< feature-state for_k8s_version="v1.21" state="deprecated" >}}
-To enable service topology, enable the `ServiceTopology` and `EndpointSlice` feature gate for all Kubernetes components:
+To enable service topology, enable the `ServiceTopology`
+[feature gate](/docs/reference/command-line-tools-reference/feature-gates/) for all Kubernetes components:
```
---feature-gates="ServiceTopology=true,EndpointSlice=true"
+--feature-gates="ServiceTopology=true`
```
-
## {{% heading "whatsnext" %}}
-
-* Read about the [Service Topology](/docs/concepts/services-networking/service-topology) concept
-* Read about [Endpoint Slices](/docs/concepts/services-networking/endpoint-slices)
+* Read about [Topology Aware Hints](/docs/concepts/services-networking/topology-aware-hints/), the replacement for the `topologyKeys` field.
+* Read about [EndpointSlices](/docs/concepts/services-networking/endpoint-slices/)
+* Read about the [Service Topology](/docs/concepts/services-networking/service-topology/) concept
* Read [Connecting Applications with Services](/docs/concepts/services-networking/connect-applications-service/)
diff --git a/content/en/docs/tasks/administer-cluster/enabling-topology-aware-hints.md b/content/en/docs/tasks/administer-cluster/enabling-topology-aware-hints.md
new file mode 100644
index 0000000000..dadc653f4e
--- /dev/null
+++ b/content/en/docs/tasks/administer-cluster/enabling-topology-aware-hints.md
@@ -0,0 +1,40 @@
+---
+reviewers:
+- robscott
+title: Enabling Topology Aware Hints
+content_type: task
+min-kubernetes-server-version: 1.21
+---
+
+
+{{< feature-state for_k8s_version="v1.21" state="alpha" >}}
+
+_Topology Aware Hints_ enable topology aware routing with topology hints
+included in {{< glossary_tooltip text="EndpointSlices" term_id="endpoint-slice" >}}.
+This approach tries to keep traffic close to where it originated from;
+you might do this to reduce costs, or to improve network performance.
+
+## {{% heading "prerequisites" %}}
+
+ {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
+
+The following prerequisite is needed in order to enable topology aware hints:
+
+* Configure the {{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}} to run in
+ iptables mode or IPVS mode
+* Ensure that you have not disabled EndpointSlices
+
+## Enable Topology Aware Hints
+
+To enable service topology hints, enable the `TopologyAwareHints` [feature
+gate](/docs/reference/command-line-tools-reference/feature-gates/) for the
+kube-apiserver, kube-controller-manager, and kube-proxy:
+
+```
+--feature-gates="TopologyAwareHints=true"
+```
+
+## {{% heading "whatsnext" %}}
+
+* Read about [Topology Aware Hints](/docs/concepts/services-networking/topology-aware-hints) for Services
+* Read [Connecting Applications with Services](/docs/concepts/services-networking/connect-applications-service/)
diff --git a/content/en/docs/tasks/administer-cluster/encrypt-data.md b/content/en/docs/tasks/administer-cluster/encrypt-data.md
index 8499855bb0..66427133b2 100644
--- a/content/en/docs/tasks/administer-cluster/encrypt-data.md
+++ b/content/en/docs/tasks/administer-cluster/encrypt-data.md
@@ -157,7 +157,7 @@ program to retrieve the contents of your secret.
kubectl describe secret secret1 -n default
```
- should match `mykey: bXlkYXRh`, mydata is encoded, check [decoding a secret](/docs/concepts/configuration/secret#decoding-a-secret) to
+ should match `mykey: bXlkYXRh`, mydata is encoded, check [decoding a secret](/docs/tasks/configmap-secret/managing-secret-using-kubectl/#decoding-secret) to
completely decode the secret.
diff --git a/content/en/docs/tasks/administer-cluster/highly-available-master.md b/content/en/docs/tasks/administer-cluster/highly-available-control-plane.md
similarity index 52%
rename from content/en/docs/tasks/administer-cluster/highly-available-master.md
rename to content/en/docs/tasks/administer-cluster/highly-available-control-plane.md
index 141b4ee9cd..6f57b441e7 100644
--- a/content/en/docs/tasks/administer-cluster/highly-available-master.md
+++ b/content/en/docs/tasks/administer-cluster/highly-available-control-plane.md
@@ -1,16 +1,17 @@
---
reviewers:
- jszczepkowski
-title: Set up High-Availability Kubernetes Masters
+title: Set up a High-Availability Control Plane
content_type: task
+aliases: [ '/docs/tasks/administer-cluster/highly-available-master/' ]
---
{{< feature-state for_k8s_version="v1.5" state="alpha" >}}
-You can replicate Kubernetes masters in `kube-up` or `kube-down` scripts for Google Compute Engine.
-This document describes how to use kube-up/down scripts to manage highly available (HA) masters and how HA masters are implemented for use with GCE.
+You can replicate Kubernetes control plane nodes in `kube-up` or `kube-down` scripts for Google Compute Engine. However this scripts are not suitable for any sort of production use, it's widely used in the project's CI.
+This document describes how to use kube-up/down scripts to manage a highly available (HA) control plane and how HA control planes are implemented for use with GCE.
@@ -28,17 +29,17 @@ This document describes how to use kube-up/down scripts to manage highly availab
To create a new HA-compatible cluster, you must set the following flags in your `kube-up` script:
-* `MULTIZONE=true` - to prevent removal of master replicas kubelets from zones different than server's default zone.
-Required if you want to run master replicas in different zones, which is recommended.
+* `MULTIZONE=true` - to prevent removal of control plane kubelets from zones different than server's default zone.
+Required if you want to run control plane nodes in different zones, which is recommended.
* `ENABLE_ETCD_QUORUM_READ=true` - to ensure that reads from all API servers will return most up-to-date data.
If true, reads will be directed to leader etcd replica.
Setting this value to true is optional: reads will be more reliable but will also be slower.
-Optionally, you can specify a GCE zone where the first master replica is to be created.
+Optionally, you can specify a GCE zone where the first control plane node is to be created.
Set the following flag:
-* `KUBE_GCE_ZONE=zone` - zone where the first master replica will run.
+* `KUBE_GCE_ZONE=zone` - zone where the first control plane node will run.
The following sample command sets up a HA-compatible cluster in the GCE zone europe-west1-b:
@@ -46,50 +47,52 @@ The following sample command sets up a HA-compatible cluster in the GCE zone eur
MULTIZONE=true KUBE_GCE_ZONE=europe-west1-b ENABLE_ETCD_QUORUM_READS=true ./cluster/kube-up.sh
```
-Note that the commands above create a cluster with one master;
-however, you can add new master replicas to the cluster with subsequent commands.
+Note that the commands above create a cluster with one control plane node;
+however, you can add new control plane nodes to the cluster with subsequent commands.
-## Adding a new master replica
+## Adding a new control plane node
-After you have created an HA-compatible cluster, you can add master replicas to it.
-You add master replicas by using a `kube-up` script with the following flags:
+After you have created an HA-compatible cluster, you can add control plane nodes to it.
+You add control plane nodes by using a `kube-up` script with the following flags:
-* `KUBE_REPLICATE_EXISTING_MASTER=true` - to create a replica of an existing
-master.
+* `KUBE_REPLICATE_EXISTING_MASTER=true` - to create a replica of an existing control plane
+node.
-* `KUBE_GCE_ZONE=zone` - zone where the master replica will run.
-Must be in the same region as other replicas' zones.
+* `KUBE_GCE_ZONE=zone` - zone where the control plane node will run.
+Must be in the same region as other control plane nodes' zones.
You don't need to set the `MULTIZONE` or `ENABLE_ETCD_QUORUM_READS` flags,
as those are inherited from when you started your HA-compatible cluster.
-The following sample command replicates the master on an existing HA-compatible cluster:
+The following sample command replicates the control plane node on an existing
+HA-compatible cluster:
```shell
KUBE_GCE_ZONE=europe-west1-c KUBE_REPLICATE_EXISTING_MASTER=true ./cluster/kube-up.sh
```
-## Removing a master replica
+## Removing a control plane node
-You can remove a master replica from an HA cluster by using a `kube-down` script with the following flags:
+You can remove a control plane node from an HA cluster by using a `kube-down` script with the following flags:
* `KUBE_DELETE_NODES=false` - to restrain deletion of kubelets.
-* `KUBE_GCE_ZONE=zone` - the zone from where master replica will be removed.
+* `KUBE_GCE_ZONE=zone` - the zone from where the control plane node will be removed.
-* `KUBE_REPLICA_NAME=replica_name` - (optional) the name of master replica to remove.
-If empty: any replica from the given zone will be removed.
+* `KUBE_REPLICA_NAME=replica_name` - (optional) the name of control plane node to
+remove. If empty: any replica from the given zone will be removed.
-The following sample command removes a master replica from an existing HA cluster:
+The following sample command removes a control plane node from an existing HA cluster:
```shell
KUBE_DELETE_NODES=false KUBE_GCE_ZONE=europe-west1-c ./cluster/kube-down.sh
```
-## Handling master replica failures
+## Handling control plane node failures
-If one of the master replicas in your HA cluster fails,
-the best practice is to remove the replica from your cluster and add a new replica in the same zone.
+If one of the control plane nodes in your HA cluster fails,
+the best practice is to remove the node from your cluster and add a new control plane
+node in the same zone.
The following sample commands demonstrate this process:
1. Remove the broken replica:
@@ -98,26 +101,31 @@ The following sample commands demonstrate this process:
KUBE_DELETE_NODES=false KUBE_GCE_ZONE=replica_zone KUBE_REPLICA_NAME=replica_name ./cluster/kube-down.sh
```
-- Add a new replica in place of the old one:
+- Add a new node in place of the old one:
```shell
KUBE_GCE_ZONE=replica-zone KUBE_REPLICATE_EXISTING_MASTER=true ./cluster/kube-up.sh
```
-## Best practices for replicating masters for HA clusters
+## Best practices for replicating control plane nodes for HA clusters
-* Try to place master replicas in different zones. During a zone failure, all masters placed inside the zone will fail.
+* Try to place control plane nodes in different zones. During a zone failure, all
+control plane nodes placed inside the zone will fail.
To survive zone failure, also place nodes in multiple zones
(see [multiple-zones](/docs/setup/best-practices/multiple-zones/) for details).
-* Do not use a cluster with two master replicas. Consensus on a two-replica cluster requires both replicas running when changing persistent state.
-As a result, both replicas are needed and a failure of any replica turns cluster into majority failure state.
-A two-replica cluster is thus inferior, in terms of HA, to a single replica cluster.
+* Do not use a cluster with two control plane nodes. Consensus on a two-node
+control plane requires both nodes running when changing persistent state.
+As a result, both nodes are needed and a failure of any node turns the cluster
+into majority failure state.
+A two-node control plane is thus inferior, in terms of HA, to a cluster with
+one control plane node.
-* When you add a master replica, cluster state (etcd) is copied to a new instance.
+* When you add a control plane node, cluster state (etcd) is copied to a new instance.
If the cluster is large, it may take a long time to duplicate its state.
-This operation may be sped up by migrating etcd data directory, as described [here](https://coreos.com/etcd/docs/latest/admin_guide.html#member-migration)
-(we are considering adding support for etcd data dir migration in future).
+This operation may be sped up by migrating the etcd data directory, as described in
+the [etcd administration guide](https://etcd.io/docs/v2.3/admin_guide/#member-migration)
+(we are considering adding support for etcd data dir migration in the future).
@@ -125,11 +133,19 @@ This operation may be sped up by migrating etcd data directory, as described [he
## Implementation notes
-
+
### Overview
+The figure above illustrates three control plane nodes and their components in a highly available cluster. The control plane node’s components employ the following methods:
-Each of master replicas will run the following components in the following mode:
+- etcd: instances are clustered together using consensus.
+
+- Controllers, scheduler and cluster auto-scaler: only one instance of each will be active in a cluster using a lease mechanism.
+
+- Add-on manager: each works independently to keep add-ons in sync.
+
+In addition, a load balancer operating in front of the API servers routes external and internal traffic to the control plane nodes.
+Each of the control plane nodes will run the following components in the following mode:
* etcd instance: all instances will be clustered together using consensus;
@@ -143,27 +159,27 @@ In addition, there will be a load balancer in front of API servers that will rou
### Load balancing
-When starting the second master replica, a load balancer containing the two replicas will be created
+When starting the second control plane node, a load balancer containing the two replicas will be created
and the IP address of the first replica will be promoted to IP address of load balancer.
-Similarly, after removal of the penultimate master replica, the load balancer will be removed and its IP address will be assigned to the last remaining replica.
+Similarly, after removal of the penultimate control plane node, the load balancer will be removed and its IP address will be assigned to the last remaining replica.
Please note that creation and removal of load balancer are complex operations and it may take some time (~20 minutes) for them to propagate.
-### Master service & kubelets
+### Control plane service & kubelets
Instead of trying to keep an up-to-date list of Kubernetes apiserver in the Kubernetes service,
the system directs all traffic to the external IP:
-* in one master cluster the IP points to the single master,
+* in case of a single node control plane, the IP points to the control plane node,
-* in multi-master cluster the IP points to the load balancer in-front of the masters.
+* in case of an HA control plane, the IP points to the load balancer in-front of the control plane nodes.
-Similarly, the external IP will be used by kubelets to communicate with master.
+Similarly, the external IP will be used by kubelets to communicate with the control plane.
-### Master certificates
+### Control plane node certificates
-Kubernetes generates Master TLS certificates for the external public IP and local IP for each replica.
-There are no certificates for the ephemeral public IP for replicas;
-to access a replica via its ephemeral public IP, you must skip TLS verification.
+Kubernetes generates TLS certificates for the external public IP and local IP for each control plane node.
+There are no certificates for the ephemeral public IP for control plane nodes;
+to access a control plane node via its ephemeral public IP, you must skip TLS verification.
### Clustering etcd
@@ -172,7 +188,7 @@ To make such deployment secure, communication between etcd instances is authoriz
### API server identity
-{{< feature-state state="alpha" for_k8s_version="v1.20" >}}
+{{< feature-state state="alpha" for_k8s_version="v1.20" >}}
The API Server Identity feature is controlled by a
[feature gate](/docs/reference/command-line-tools-reference/feature-gates/)
@@ -207,4 +223,3 @@ server coordination (for example, the `StorageVersionAPI` feature gate).
[Automated HA master deployment - design doc](https://git.k8s.io/community/contributors/design-proposals/cluster-lifecycle/ha_master.md)
-
diff --git a/content/en/docs/tasks/administer-cluster/kubeadm/_index.md b/content/en/docs/tasks/administer-cluster/kubeadm/_index.md
old mode 100755
new mode 100644
diff --git a/content/en/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes.md b/content/en/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes.md
index aad5f13909..56af353f89 100644
--- a/content/en/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes.md
+++ b/content/en/docs/tasks/administer-cluster/kubeadm/adding-windows-nodes.md
@@ -163,7 +163,7 @@ Instructions to do so are available at [Install Docker Engine - Enterprise on Wi
#### Install wins, kubelet, and kubeadm
```PowerShell
-curl.exe -LO https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/PrepareNode.ps1
+curl.exe -LO https://raw.githubusercontent.com/kubernetes-sigs/sig-windows-tools/master/kubeadm/scripts/PrepareNode.ps1
.\PrepareNode.ps1 -KubernetesVersion {{< param "fullversion" >}}
```
@@ -188,7 +188,7 @@ To install a specific version of containerD specify the version with -ContainerD
```powershell
# Example
-.\Install-Containerd.ps1 -ContainerDVersion v1.4.1
+.\Install-Containerd.ps1 -ContainerDVersion 1.4.1
```
{{< /note >}}
@@ -206,7 +206,7 @@ If you're using a different interface rather than Ethernet (i.e. "Ethernet0 2")
#### Install wins, kubelet, and kubeadm
```PowerShell
-curl.exe -LO https://github.com/kubernetes-sigs/sig-windows-tools/releases/latest/download/PrepareNode.ps1
+curl.exe -LO https://raw.githubusercontent.com/kubernetes-sigs/sig-windows-tools/master/kubeadm/scripts/PrepareNode.ps1
.\PrepareNode.ps1 -KubernetesVersion {{< param "fullversion" >}} -ContainerRuntime containerD
```
diff --git a/content/en/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver.md b/content/en/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver.md
new file mode 100644
index 0000000000..31a9ff0e33
--- /dev/null
+++ b/content/en/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver.md
@@ -0,0 +1,125 @@
+---
+title: Configuring a cgroup driver
+content_type: task
+weight: 10
+---
+
+
+
+This page explains how to configure the kubelet cgroup driver to match the container
+runtime cgroup driver for kubeadm clusters.
+
+## {{% heading "prerequisites" %}}
+
+You should be familiar with the Kubernetes
+[container runtime requirements](/docs/setup/production-environment/container-runtimes).
+
+
+
+## Configuring the container runtime cgroup driver
+
+The [Container runtimes](/docs/setup/production-environment/container-runtimes) page
+explains that the `systemd` driver is recommended for kubeadm based setups instead
+of the `cgroupfs` driver, because kubeadm manages the kubelet as a systemd service.
+
+The page also provides details on how to setup a number of different container runtimes with the
+`systemd` driver by default.
+
+## Configuring the kubelet cgroup driver
+
+kubeadm allows you to pass a `KubeletConfiguration` structure during `kubeadm init`.
+This `KubeletConfiguration` can include the `cgroupDriver` field which controls the cgroup
+driver of the kubelet.
+
+{{< note >}}
+
+In v1.22, if the user is not setting the `cgroupDriver` field under `KubeletConfiguration`,
+`kubeadm` will default it to `systemd`.
+{{< /note >}}
+
+A minimal example of configuring the field explicitly:
+
+```yaml
+# kubeadm-config.yaml
+kind: ClusterConfiguration
+apiVersion: kubeadm.k8s.io/v1beta3
+kubernetesVersion: v1.21.0
+---
+kind: KubeletConfiguration
+apiVersion: kubelet.config.k8s.io/v1beta1
+cgroupDriver: systemd
+```
+
+Such a configuration file can then be passed to the kubeadm command:
+
+```shell
+kubeadm init --config kubeadm-config.yaml
+```
+
+{{< note >}}
+Kubeadm uses the same `KubeletConfiguration` for all nodes in the cluster.
+The `KubeletConfiguration` is stored in a [ConfigMap](/docs/concepts/configuration/configmap)
+object under the `kube-system` namespace.
+
+Executing the sub commands `init`, `join` and `upgrade` would result in kubeadm
+writing the `KubeletConfiguration` as a file under `/var/lib/kubelet/config.yaml`
+and passing it to the local node kubelet.
+{{< /note >}}
+
+## Using the `cgroupfs` driver
+
+As this guide explains using the `cgroupfs` driver with kubeadm is not recommended.
+
+To continue using `cgroupfs` and to prevent `kubeadm upgrade` from modifying the
+`KubeletConfiguration` cgroup driver on existing setups, you must be explicit
+about its value. This applies to a case where you do not wish future versions
+of kubeadm to apply the `systemd` driver by default.
+
+See the below section on "Modify the kubelet ConfigMap" for details on
+how to be explicit about the value.
+
+If you wish to configure a container runtime to use the `cgroupfs` driver,
+you must refer to the documentation of the container runtime of your choice.
+
+## Migrating to the `systemd` driver
+
+To change the cgroup driver of an existing kubeadm cluster to `systemd` in-place,
+a similar procedure to a kubelet upgrade is required. This must include both
+steps outlined below.
+
+{{< note >}}
+Alternatively, it is possible to replace the old nodes in the cluster with new ones
+that use the `systemd` driver. This requires executing only the first step below
+before joining the new nodes and ensuring the workloads can safely move to the new
+nodes before deleting the old nodes.
+{{< /note >}}
+
+### Modify the kubelet ConfigMap
+
+- Find the kubelet ConfigMap name using `kubectl get cm -n kube-system | grep kubelet-config`.
+- Call `kubectl edit cm kubelet-config-x.yy -n kube-system` (replace `x.yy` with
+the Kubernetes version).
+- Either modify the existing `cgroupDriver` value or add a new field that looks like this:
+
+ ```yaml
+ cgroupDriver: systemd
+ ```
+ This field must be present under the `kubelet:` section of the ConfigMap.
+
+### Update the cgroup driver on all nodes
+
+For each node in the cluster:
+
+- [Drain the node](/docs/tasks/administer-cluster/safely-drain-node) using `kubectl drain --ignore-daemonsets`
+- Stop the kubelet using `systemctl stop kubelet`
+- Stop the container runtime
+- Modify the container runtime cgroup driver to `systemd`
+- Set `cgroupDriver: systemd` in `/var/lib/kubelet/config.yaml`
+- Start the container runtime
+- Start the kubelet using `systemctl start kubelet`
+- [Uncordon the node](/docs/tasks/administer-cluster/safely-drain-node) using `kubectl uncordon `
+
+Execute these steps on nodes one at a time to ensure workloads
+have sufficient time to schedule on different nodes.
+
+Once the process is complete ensure that all nodes and workloads are healthy.
diff --git a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md
index dc7af4a329..3d4959b536 100644
--- a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md
+++ b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-certs.md
@@ -85,7 +85,11 @@ Additionally, kubeadm informs the user if the certificate is externally managed;
{{< /warning >}}
{{< note >}}
-`kubelet.conf` is not included in the list above because kubeadm configures kubelet for automatic certificate renewal.
+`kubelet.conf` is not included in the list above because kubeadm configures kubelet
+for [automatic certificate renewal](/docs/tasks/tls/certificate-rotation/)
+with rotatable certificates under `/var/lib/kubelet/pki`.
+To repair an expired kubelet client certificate see
+[Kubelet client certificate rotation fails](/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/#kubelet-client-cert).
{{< /note >}}
{{< warning >}}
@@ -122,7 +126,17 @@ command. In that case, you should explicitly set `--certificate-renewal=true`.
You can renew your certificates manually at any time with the `kubeadm certs renew` command.
-This command performs the renewal using CA (or front-proxy-CA) certificate and key stored in `/etc/kubernetes/pki`.
+This command performs the renewal using CA (or front-proxy-CA) certificate and key stored in `/etc/kubernetes/pki`.
+
+After running the command you should restart the control plane Pods. This is required since
+dynamic certificate reload is currently not supported for all components and certificates.
+[Static Pods](/docs/tasks/configure-pod-container/static-pod/) are managed by the local kubelet
+and not by the API Server, thus kubectl cannot be used to delete and restart them.
+To restart a static Pod you can temporarily remove its manifest file from `/etc/kubernetes/manifests/`
+and wait for 20 seconds (see the `fileCheckFrequency` value in [KubeletConfiguration struct](/docs/reference/config-api/kubelet-config.v1beta1/).
+The kubelet will terminate the Pod if it's no longer in the manifest directory.
+You can then move the file back and after another `fileCheckFrequency` period, the kubelet will recreate
+the Pod and the certificate renewal for the component can complete.
{{< warning >}}
If you are running an HA cluster, this command needs to be executed on all the control-plane nodes.
@@ -142,7 +156,7 @@ The Kubernetes certificates normally reach their expiration date after one year.
## Renew certificates with the Kubernetes certificates API
-This section provide more details about how to execute manual certificate renewal using the Kubernetes certificates API.
+This section provides more details about how to execute manual certificate renewal using the Kubernetes certificates API.
{{< caution >}}
These are advanced topics for users who need to integrate their organization's certificate infrastructure into a kubeadm-built cluster. If the default kubeadm configuration satisfies your needs, you should let kubeadm manage certificates instead.
@@ -157,10 +171,10 @@ The built-in signer is part of [`kube-controller-manager`](/docs/reference/comma
To activate the built-in signer, you must pass the `--cluster-signing-cert-file` and `--cluster-signing-key-file` flags.
-If you're creating a new cluster, you can use a kubeadm [configuration file](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2):
+If you're creating a new cluster, you can use a kubeadm [configuration file](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3):
```yaml
-apiVersion: kubeadm.k8s.io/v1beta2
+apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
controllerManager:
extraArgs:
@@ -207,3 +221,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/v1beta3
+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 `kubelet` 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`](/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
+```
+
+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.
diff --git a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade.md b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade.md
index 47ea403e9a..0b0139151a 100644
--- a/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade.md
+++ b/content/en/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade.md
@@ -9,17 +9,17 @@ weight: 20
This page explains how to upgrade a Kubernetes cluster created with kubeadm from version
-{{< skew latestVersionAddMinor -1 >}}.x to version {{< skew latestVersion >}}.x, and from version
-{{< skew latestVersion >}}.x to {{< skew latestVersion >}}.y (where `y > x`). Skipping MINOR versions
+{{< skew currentVersionAddMinor -1 >}}.x to version {{< skew currentVersion >}}.x, and from version
+{{< skew currentVersion >}}.x to {{< skew currentVersion >}}.y (where `y > x`). Skipping MINOR versions
when upgrading is unsupported.
To see information about upgrading clusters created using older versions of kubeadm,
please refer to following pages instead:
-- [Upgrading a kubeadm cluster from {{< skew latestVersionAddMinor -2 >}} to {{< skew latestVersionAddMinor -1 >}}](https://v{{< skew latestVersionAddMinor -1 "-" >}}.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)
-- [Upgrading a kubeadm cluster from {{< skew latestVersionAddMinor -3 >}} to {{< skew latestVersionAddMinor -2 >}}](https://v{{< skew latestVersionAddMinor -2 "-" >}}.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)
-- [Upgrading a kubeadm cluster from {{< skew latestVersionAddMinor -4 >}} to {{< skew latestVersionAddMinor -3 >}}](https://v{{< skew latestVersionAddMinor -3 "-" >}}.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)
-- [Upgrading a kubeadm cluster from {{< skew latestVersionAddMinor -5 >}} to {{< skew latestVersionAddMinor -4 >}}](https://v{{< skew latestVersionAddMinor -4 "-" >}}.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)
+- [Upgrading a kubeadm cluster from {{< skew currentVersionAddMinor -2 >}} to {{< skew currentVersionAddMinor -1 >}}](https://v{{< skew currentVersionAddMinor -1 "-" >}}.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)
+- [Upgrading a kubeadm cluster from {{< skew currentVersionAddMinor -3 >}} to {{< skew currentVersionAddMinor -2 >}}](https://v{{< skew currentVersionAddMinor -2 "-" >}}.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)
+- [Upgrading a kubeadm cluster from {{< skew currentVersionAddMinor -4 >}} to {{< skew currentVersionAddMinor -3 >}}](https://v{{< skew currentVersionAddMinor -3 "-" >}}.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)
+- [Upgrading a kubeadm cluster from {{< skew currentVersionAddMinor -5 >}} to {{< skew currentVersionAddMinor -4 >}}](https://v{{< skew currentVersionAddMinor -4 "-" >}}.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/)
The upgrade workflow at high level is the following:
@@ -45,19 +45,19 @@ The upgrade workflow at high level is the following:
## Determine which version to upgrade to
-Find the latest stable {{< skew latestVersion >}} version using the OS package manager:
+Find the latest patch release for Kubernetes {{< skew currentVersion >}} using the OS package manager:
{{< tabs name="k8s_install_versions" >}}
{{% tab name="Ubuntu, Debian or HypriotOS" %}}
apt update
apt-cache madison kubeadm
- # find the latest {{< skew latestVersion >}} version in the list
- # it should look like {{< skew latestVersion >}}.x-00, where x is the latest patch
+ # find the latest {{< skew currentVersion >}} version in the list
+ # it should look like {{< skew currentVersion >}}.x-00, where x is the latest patch
{{% /tab %}}
{{% tab name="CentOS, RHEL or Fedora" %}}
yum list --showduplicates kubeadm --disableexcludes=kubernetes
- # find the latest {{< skew latestVersion >}} version in the list
- # it should look like {{< skew latestVersion >}}.x-0, where x is the latest patch
+ # find the latest {{< skew currentVersion >}} version in the list
+ # it should look like {{< skew currentVersion >}}.x-0, where x is the latest patch
{{% /tab %}}
{{< /tabs >}}
@@ -74,20 +74,21 @@ Pick a control plane node that you wish to upgrade first. It must have the `/etc
{{< tabs name="k8s_install_kubeadm_first_cp" >}}
{{% tab name="Ubuntu, Debian or HypriotOS" %}}
- # replace x in {{< skew latestVersion >}}.x-00 with the latest patch version
+ # replace x in {{< skew currentVersion >}}.x-00 with the latest patch version
apt-mark unhold kubeadm && \
- apt-get update && apt-get install -y kubeadm={{< skew latestVersion >}}.x-00 && \
+ apt-get update && apt-get install -y kubeadm={{< skew currentVersion >}}.x-00 && \
apt-mark hold kubeadm
-
# since apt-get version 1.1 you can also use the following method
apt-get update && \
- apt-get install -y --allow-change-held-packages kubeadm={{< skew latestVersion >}}.x-00
+ apt-get install -y --allow-change-held-packages kubeadm={{< skew currentVersion >}}.x-00
{{% /tab %}}
{{% tab name="CentOS, RHEL or Fedora" %}}
- # replace x in {{< skew latestVersion >}}.x-0 with the latest patch version
- yum install -y kubeadm-{{< skew latestVersion >}}.x-0 --disableexcludes=kubernetes
+ # replace x in {{< skew currentVersion >}}.x-0 with the latest patch version
+ yum install -y kubeadm-{{< skew currentVersion >}}.x-0 --disableexcludes=kubernetes
{{% /tab %}}
{{< /tabs >}}
+
- Verify that the download works and has the expected version:
@@ -120,13 +121,13 @@ Failing to do so will cause `kubeadm upgrade apply` to exit with an error and no
```shell
# replace x with the patch version you picked for this upgrade
- sudo kubeadm upgrade apply v{{< skew latestVersion >}}.x
+ sudo kubeadm upgrade apply v{{< skew currentVersion >}}.x
```
Once the command finishes you should see:
```
- [upgrade/successful] SUCCESS! Your cluster was upgraded to "v{{< skew latestVersion >}}.x". Enjoy!
+ [upgrade/successful] SUCCESS! Your cluster was upgraded to "v{{< skew currentVersion >}}.x". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
```
@@ -166,28 +167,25 @@ Also calling `kubeadm upgrade plan` and upgrading the CNI provider plugin is no
### Upgrade kubelet and kubectl
-- Upgrade the kubelet and kubectl
+- Upgrade the kubelet and kubectl:
{{< tabs name="k8s_install_kubelet" >}}
-{{< tab name="Ubuntu, Debian or HypriotOS" >}}
-
- # replace x in {{< skew latestVersion >}}.x-00 with the latest patch version
+{{% tab name="Ubuntu, Debian or HypriotOS" %}}
+ # replace x in {{< skew currentVersion >}}.x-00 with the latest patch version
apt-mark unhold kubelet kubectl && \
- apt-get update && apt-get install -y kubelet={{< skew latestVersion >}}.x-00 kubectl={{< skew latestVersion >}}.x-00 && \
+ apt-get update && apt-get install -y kubelet={{< skew currentVersion >}}.x-00 kubectl={{< skew currentVersion >}}.x-00 && \
apt-mark hold kubelet kubectl
-
# since apt-get version 1.1 you can also use the following method
apt-get update && \
- apt-get install -y --allow-change-held-packages kubelet={{< skew latestVersion >}}.x-00 kubectl={{< skew latestVersion >}}.x-00
-
-{{< /tab >}}
-{{< tab name="CentOS, RHEL or Fedora" >}}
-
- # replace x in {{< skew latestVersion >}}.x-0 with the latest patch version
- yum install -y kubelet-{{< skew latestVersion >}}.x-0 kubectl-{{< skew latestVersion >}}.x-0 --disableexcludes=kubernetes
-
-{{< /tab >}}
+ apt-get install -y --allow-change-held-packages kubelet={{< skew currentVersion >}}.x-00 kubectl={{< skew currentVersion >}}.x-00
+{{% /tab %}}
+{{% tab name="CentOS, RHEL or Fedora" %}}
+ # replace x in {{< skew currentVersion >}}.x-0 with the latest patch version
+ yum install -y kubelet-{{< skew currentVersion >}}.x-0 kubectl-{{< skew currentVersion >}}.x-0 --disableexcludes=kubernetes
+{{% /tab %}}
{{< /tabs >}}
+
- Restart the kubelet:
@@ -216,18 +214,18 @@ without compromising the minimum required capacity for running your workloads.
{{< tabs name="k8s_install_kubeadm_worker_nodes" >}}
{{% tab name="Ubuntu, Debian or HypriotOS" %}}
- # replace x in {{< skew latestVersion >}}.x-00 with the latest patch version
+ # replace x in {{< skew currentVersion >}}.x-00 with the latest patch version
apt-mark unhold kubeadm && \
- apt-get update && apt-get install -y kubeadm={{< skew latestVersion >}}.x-00 && \
+ apt-get update && apt-get install -y kubeadm={{< skew currentVersion >}}.x-00 && \
apt-mark hold kubeadm
-
# since apt-get version 1.1 you can also use the following method
apt-get update && \
- apt-get install -y --allow-change-held-packages kubeadm={{< skew latestVersion >}}.x-00
+ apt-get install -y --allow-change-held-packages kubeadm={{< skew currentVersion >}}.x-00
{{% /tab %}}
{{% tab name="CentOS, RHEL or Fedora" %}}
- # replace x in {{< skew latestVersion >}}.x-0 with the latest patch version
- yum install -y kubeadm-{{< skew latestVersion >}}.x-0 --disableexcludes=kubernetes
+ # replace x in {{< skew currentVersion >}}.x-0 with the latest patch version
+ yum install -y kubeadm-{{< skew currentVersion >}}.x-0 --disableexcludes=kubernetes
{{% /tab %}}
{{< /tabs >}}
@@ -254,20 +252,21 @@ without compromising the minimum required capacity for running your workloads.
{{< tabs name="k8s_kubelet_and_kubectl" >}}
{{% tab name="Ubuntu, Debian or HypriotOS" %}}
- # replace x in {{< skew latestVersion >}}.x-00 with the latest patch version
+ # replace x in {{< skew currentVersion >}}.x-00 with the latest patch version
apt-mark unhold kubelet kubectl && \
- apt-get update && apt-get install -y kubelet={{< skew latestVersion >}}.x-00 kubectl={{< skew latestVersion >}}.x-00 && \
+ apt-get update && apt-get install -y kubelet={{< skew currentVersion >}}.x-00 kubectl={{< skew currentVersion >}}.x-00 && \
apt-mark hold kubelet kubectl
-
# since apt-get version 1.1 you can also use the following method
apt-get update && \
- apt-get install -y --allow-change-held-packages kubelet={{< skew latestVersion >}}.x-00 kubectl={{< skew latestVersion >}}.x-00
+ apt-get install -y --allow-change-held-packages kubelet={{< skew currentVersion >}}.x-00 kubectl={{< skew currentVersion >}}.x-00
{{% /tab %}}
{{% tab name="CentOS, RHEL or Fedora" %}}
- # replace x in {{< skew latestVersion >}}.x-0 with the latest patch version
- yum install -y kubelet-{{< skew latestVersion >}}.x-0 kubectl-{{< skew latestVersion >}}.x-0 --disableexcludes=kubernetes
+ # replace x in {{< skew currentVersion >}}.x-0 with the latest patch version
+ yum install -y kubelet-{{< skew currentVersion >}}.x-0 kubectl-{{< skew currentVersion >}}.x-0 --disableexcludes=kubernetes
{{% /tab %}}
{{< /tabs >}}
+
- Restart the kubelet:
@@ -328,7 +327,7 @@ and post-upgrade manifest file for a certain component, a backup file for it wil
- Makes sure the control plane images are available or available to pull to the machine.
- Generates replacements and/or uses user supplied overwrites if component configs require version upgrades.
- Upgrades the control plane components or rollbacks if any of them fails to come up.
-- Applies the new `kube-dns` and `kube-proxy` manifests and makes sure that all necessary RBAC rules are created.
+- Applies the new `CoreDNS` and `kube-proxy` manifests and makes sure that all necessary RBAC rules are created.
- Creates new certificate and key files of the API server and backs up old files if they're about to expire in 180 days.
`kubeadm upgrade node` does the following on additional control plane nodes:
diff --git a/content/en/docs/tasks/administer-cluster/kubelet-config-file.md b/content/en/docs/tasks/administer-cluster/kubelet-config-file.md
index b49c84220a..668f4532a5 100644
--- a/content/en/docs/tasks/administer-cluster/kubelet-config-file.md
+++ b/content/en/docs/tasks/administer-cluster/kubelet-config-file.md
@@ -30,17 +30,18 @@ Here is an example of what this file might look like:
```
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
+address: "192.168.0.8",
+port: 20250,
+serializeImagePulls: false,
evictionHard:
memory.available: "200Mi"
```
-In the example, the Kubelet is configured to evict Pods when available memory drops below 200Mi.
+In the example, the Kubelet is configured to serve on IP address 192.168.0.8 and port 20250, pull images in parallel,
+and evict Pods when available memory drops below 200Mi.
All other Kubelet configuration values are left at their built-in defaults, unless overridden
by flags. Command line flags which target the same value as a config file will override that value.
-For a trick to generate a configuration file from a live node, see
-[Reconfigure a Node's Kubelet in a Live Cluster](/docs/tasks/administer-cluster/reconfigure-kubelet).
-
## Start a Kubelet process configured via the config file
{{< note >}}
@@ -65,12 +66,6 @@ In the above example, this version is `kubelet.config.k8s.io/v1beta1`.
-## Relationship to Dynamic Kubelet Config
-
-If you are using the [Dynamic Kubelet Configuration](/docs/tasks/administer-cluster/reconfigure-kubelet)
-feature, the combination of configuration provided via `--config` and any flags which override these values
-is considered the default "last known good" configuration by the automatic rollback mechanism.
-
## {{% heading "whatsnext" %}}
- Learn more about kubelet configuration by checking the
diff --git a/content/en/docs/tasks/administer-cluster/kubelet-in-userns.md b/content/en/docs/tasks/administer-cluster/kubelet-in-userns.md
new file mode 100644
index 0000000000..bed842b6a4
--- /dev/null
+++ b/content/en/docs/tasks/administer-cluster/kubelet-in-userns.md
@@ -0,0 +1,259 @@
+---
+title: Running Kubernetes Node Components as a Non-root User
+content_type: task
+min-kubernetes-server-version: 1.22
+---
+
+
+
+{{< feature-state for_k8s_version="v1.22" state="alpha" >}}
+
+This document describes how to run Kubernetes Node components such as kubelet, CRI, OCI, and CNI
+without root privileges, by using a {{< glossary_tooltip text="user namespace" term_id="userns" >}}.
+
+This technique is also known as _rootless mode_.
+
+{{< note >}}
+This document describes how to run Kubernetes Node components (and hence pods) a non-root user.
+
+If you are just looking for how to run a pod as a non-root user, see [SecurityContext](/docs/tasks/configure-pod-container/security-context/).
+{{< /note >}}
+
+## {{% heading "prerequisites" %}}
+
+{{% version-check %}}
+
+* [Enable Cgroup v2](https://rootlesscontaine.rs/getting-started/common/cgroup2/)
+* [Enable systemd with user session](https://rootlesscontaine.rs/getting-started/common/login/)
+* [Configure several sysctl values, depending on host Linux distribution](https://rootlesscontaine.rs/getting-started/common/sysctl/)
+* [Ensure that your unprivileged user is listed in `/etc/subuid` and `/etc/subgid`](https://rootlesscontaine.rs/getting-started/common/subuid/)
+
+* `KubeletInUserNamespace` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/)
+
+
+
+## Running Kubernetes inside Rootless Docker/Podman
+
+### kind
+
+[kind](https://kind.sigs.k8s.io/) supports running Kubernetes inside Rootless Docker or Rootless Podman.
+
+See [Running kind with Rootless Docker](https://kind.sigs.k8s.io/docs/user/rootless/).
+
+### minikube
+
+[minikube](https://minikube.sigs.k8s.io/) also supports running Kubernetes inside Rootless Docker.
+
+See the page about the [docker](https://minikube.sigs.k8s.io/docs/drivers/docker/) driver in the Minikube documentation.
+
+Rootless Podman is not supported.
+
+
+
+## Running Rootless Kubernetes directly on a host
+
+{{% thirdparty-content %}}
+
+### K3s
+
+[K3s](https://k3s.io/) experimentally supports rootless mode.
+
+See [Running K3s with Rootless mode](https://rancher.com/docs/k3s/latest/en/advanced/#running-k3s-with-rootless-mode-experimental) for the usage.
+
+### Usernetes
+[Usernetes](https://github.com/rootless-containers/usernetes) is a reference distribution of Kubernetes that can be installed under `$HOME` directory without the root privilege.
+
+Usernetes supports both containerd and CRI-O as CRI runtimes.
+Usernetes supports multi-node clusters using Flannel (VXLAN).
+
+See [the Usernetes repo](https://github.com/rootless-containers/usernetes) for the usage.
+
+## Manually deploy a node that runs the kubelet in a user namespace {#userns-the-hard-way}
+
+This section provides hints for running Kubernetes in a user namespace manually.
+
+{{< note >}}
+This section is intended to be read by developers of Kubernetes distributions, not by end users.
+{{< /note >}}
+
+### Creating a user namespace
+
+The first step is to create a {{< glossary_tooltip text="user namespace" term_id="userns" >}}.
+
+If you are trying to run Kubernetes in a user-namespaced container such as
+Rootless Docker/Podman or LXC/LXD, you are all set, and you can go to the next subsection.
+
+Otherwise you have to create a user namespace by yourself, by calling `unshare(2)` with `CLONE_NEWUSER`.
+
+A user namespace can be also unshared by using command line tools such as:
+- [RootlessKit](https://github.com/rootless-containers/rootlesskit)
+- [become-root](https://github.com/giuseppe/become-root)
+- [`unshare(1)`](https://man7.org/linux/man-pages/man1/unshare.1.html)
+
+After unsharing the user namespace, you will also have to unshare other namespaces such as mount namespace.
+
+You do *not* need to call `chroot()` nor `pivot_root()` after unsharing the mount namespace,
+however, you have to mount writable filesystems on several directories *in* the namespace.
+
+At least, the following directories need to be writable *in* the namespace (not *outside* the namespace):
+
+- `/etc`
+- `/run`
+- `/var/logs`
+- `/var/lib/kubelet`
+- `/var/lib/cni`
+- `/var/lib/containerd` (for containerd)
+- `/var/lib/containers` (for CRI-O)
+
+### Creating a delegated cgroup tree
+
+In addition to the user namespace, you also need to have a writable cgroup tree with cgroup v2.
+
+{{< note >}}
+Kubernetes support for running Node components in user namespaces requires cgroup v2.
+Cgroup v1 is not supported.
+{{< /note >}}
+
+If you are trying to run Kubernetes in Rootless Docker/Podman or LXC/LXD on a systemd-based host, you are all set.
+
+Otherwise you have to create a systemd unit with `Delegate=yes` property to delegate a cgroup tree with writable permission.
+
+On your node, systemd must already be configured to allow delegation; for more details, see
+[cgroup v2](https://rootlesscontaine.rs/getting-started/common/cgroup2/) in the Rootless
+Containers documentation.
+
+### Configuring network
+{{% thirdparty-content %}}
+
+The network namespace of the Node components has to have a non-loopback interface, which can be for example configured with
+slirp4netns, VPNKit, or lxc-user-nic.
+
+The network namespaces of the Pods can be configured with regular CNI plugins.
+For multi-node networking, Flannel (VXLAN, 8472/UDP) is known to work.
+
+Ports such as the kubelet port (10250/TCP) and `NodePort` service ports have to be exposed from the Node network namespace to
+the host with an external port forwarder, such as RootlessKit, slirp4netns, or socat.
+
+You can use the port forwarder from K3s; see https://github.com/k3s-io/k3s/blob/v1.21.2+k3s1/pkg/rootlessports/controller.go
+
+### Configuring CRI
+
+The kubelet relies on a container runtime. You should deploy a container runtime such as containerd or CRI-O and ensure that it is running within the user namespace before the kubelet starts.
+
+{{< tabs name="cri" >}}
+{{% tab name="containerd" %}}
+
+Running CRI plugin of containerd in a user namespace is supported since containerd 1.4.
+
+Running containerd within a user namespace requires the following configuration:
+
+```toml
+version = 2
+
+[plugins."io.containerd.grpc.v1.cri"]
+# Disable AppArmor
+ disable_apparmor = true
+# Ignore an error during setting oom_score_adj
+ restrict_oom_score_adj = true
+# Disable hugetlb cgroup v2 controller (because systemd does not support delegating hugetlb controller)
+ disable_hugetlb_controller = true
+
+[plugins."io.containerd.grpc.v1.cri".containerd]
+# Using non-fuse overlayfs is also possible for kernel >= 5.11, but requires SELinux to be disabled
+ snapshotter = "fuse-overlayfs"
+
+[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
+# We use cgroupfs that is delegated by systemd, so we do not use SystemdCgroup driver
+# (unless you run another systemd in the namespace)
+ SystemdCgroup = false
+```
+
+{{% /tab %}}
+{{% tab name="CRI-O" %}}
+
+Running CRI-O in a user namespace is supported since CRI-O 1.22.
+
+CRI-O requires an environment variable `_CRIO_ROOTLESS=1` to be set.
+
+The following configuration is also recommended:
+
+```toml
+[crio]
+ storage_driver = "overlay"
+# Using non-fuse overlayfs is also possible for kernel >= 5.11, but requires SELinux to be disabled
+ storage_option = ["overlay.mount_program=/usr/local/bin/fuse-overlayfs"]
+
+[crio.runtime]
+# We use cgroupfs that is delegated by systemd, so we do not use "systemd" driver
+# (unless you run another systemd in the namespace)
+ cgroup_manager = "cgroupfs"
+```
+
+{{% /tab %}}
+{{< /tabs >}}
+
+### Configuring kubelet
+
+Running kubelet in a user namespace requires the following configuration:
+
+```yaml
+kind: KubeletConfiguration
+apiVersion: kubelet.config.k8s.io/v1beta1
+featureGates:
+ KubeletInUserNamespace: true
+# We use cgroupfs that is delegated by systemd, so we do not use "systemd" driver
+# (unless you run another systemd in the namespace)
+cgroupDriver: "cgroupfs"
+```
+
+When the `KubeletInUserNamespace` feature gate is enabled, kubelet ignores errors that may happen during setting the following sysctl values:
+- `vm.overcommit_memory`
+- `vm.panic_on_oom`
+- `kernel.panic`
+- `kernel.panic_on_oops`
+- `kernel.keys.root_maxkeys`
+- `kernel.keys.root_maxbytes`.
+ (these are sysctl values for the host, not for the containers).
+
+Within a user namespace, the kubelet also ignores any error raised from trying to open `/dev/kmsg`.
+This feature gate also allows kube-proxy to ignore an error during setting `RLIMIT_NOFILE`.
+
+The `KubeletInUserNamespace` feature gate was introduced in Kubernetes v1.22 with "alpha" status.
+
+Running kubelet in a user namespace without using this feature gate is also possible by mounting a specially crafted proc filesystem,
+but not officially supported.
+
+### Configuring kube-proxy
+
+Running kube-proxy in a user namespace requires the following configuration:
+
+```yaml
+apiVersion: kubeproxy.config.k8s.io/v1alpha1
+kind: KubeProxyConfiguration
+mode: "iptables" # or "userspace"
+conntrack:
+# Skip setting sysctl value "net.netfilter.nf_conntrack_max"
+ maxPerCore: 0
+# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established"
+ tcpEstablishedTimeout: 0s
+# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close"
+ tcpCloseWaitTimeout: 0s
+```
+
+## Caveats
+
+- Most of "non-local" volume drivers such as `nfs` and `iscsi` do not work.
+ Local volumes like `local`, `hostPath`, `emptyDir`, `configMap`, `secret`, and `downwardAPI` are known to work.
+
+- Some CNI plugins may not work. Flannel (VXLAN) is known to work.
+
+For more on this, see the [Caveats and Future work](https://rootlesscontaine.rs/caveats/) page
+on the rootlesscontaine.rs website.
+
+## {{% heading "seealso" %}}
+- [rootlesscontaine.rs](https://rootlesscontaine.rs/)
+- [Rootless Containers 2020 (KubeCon NA 2020)](https://www.slideshare.net/AkihiroSuda/kubecon-na-2020-containerd-rootless-containers-2020)
+- [Running kind with Rootless Docker](https://kind.sigs.k8s.io/docs/user/rootless/)
+- [Usernetes](https://github.com/rootless-containers/usernetes)
+- [Running K3s with rootless mode](https://rancher.com/docs/k3s/latest/en/advanced/#running-k3s-with-rootless-mode-experimental)
+- [KEP-2033: Kubelet-in-UserNS (aka Rootless mode)](https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2033-kubelet-in-userns-aka-rootless)
diff --git a/content/en/docs/tasks/administer-cluster/memory-manager.md b/content/en/docs/tasks/administer-cluster/memory-manager.md
new file mode 100644
index 0000000000..27a0ed2405
--- /dev/null
+++ b/content/en/docs/tasks/administer-cluster/memory-manager.md
@@ -0,0 +1,390 @@
+---
+title: Utilizing the NUMA-aware Memory Manager
+
+reviewers:
+- klueska
+- derekwaynecarr
+
+content_type: task
+min-kubernetes-server-version: v1.21
+---
+
+
+
+{{< feature-state state="beta" for_k8s_version="v1.22" >}}
+
+The Kubernetes *Memory Manager* enables the feature of guaranteed memory (and hugepages) allocation for pods in the `Guaranteed` {{< glossary_tooltip text="QoS class" term_id="qos-class" >}}.
+
+The Memory Manager employs hint generation protocol to yield the most suitable NUMA affinity for a pod. The Memory Manager feeds the central manager (*Topology Manager*) with these affinity hints. Based on both the hints and Topology Manager policy, the pod is rejected or admitted to the node.
+
+Moreover, the Memory Manager ensures that the memory which a pod requests is allocated from a minimum number of NUMA nodes.
+
+The Memory Manager is only pertinent to Linux based hosts.
+
+## {{% heading "prerequisites" %}}
+
+{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
+
+To align memory resources with other requested resources in a Pod Spec:
+- the CPU Manager should be enabled and proper CPU Manager policy should be configured on a Node. See [control CPU Management Policies](/docs/tasks/administer-cluster/cpu-management-policies/);
+- the Topology Manager should be enabled and proper Topology Manager policy should be configured on a Node. See [control Topology Management Policies](/docs/tasks/administer-cluster/topology-manager/).
+
+Starting from v1.22, the Memory Manager is enabled by default through `MemoryManager` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/).
+
+Preceding v1.22, the `kubelet` must be started with the following flag:
+
+`--feature-gates=MemoryManager=true`
+
+in order to enable the Memory Manager feature.
+
+## How Memory Manager Operates?
+
+The Memory Manager currently offers the guaranteed memory (and hugepages) allocation for Pods in Guaranteed QoS class. To immediately put the Memory Manager into operation follow the guidelines in the section [Memory Manager configuration](#memory-manager-configuration), and subsequently, prepare and deploy a `Guaranteed` pod as illustrated in the section [Placing a Pod in the Guaranteed QoS class](#placing-a-pod-in-the-guaranteed-qos-class).
+
+The Memory Manager is a Hint Provider, and it provides topology hints for the Topology Manager which then aligns the requested resources according to these topology hints. It also enforces `cgroups` (i.e. `cpuset.mems`) for pods. The complete flow diagram concerning pod admission and deployment process is illustrated in [Memory Manager KEP: Design Overview][4] and below:
+
+
+
+During this process, the Memory Manager updates its internal counters stored in [Node Map and Memory Maps][2] to manage guaranteed memory allocation.
+
+The Memory Manager updates the Node Map during the startup and runtime as follows.
+
+### Startup
+
+This occurs once a node administrator employs `--reserved-memory` (section [Reserved memory flag](#reserved-memory-flag)). In this case, the Node Map becomes updated to reflect this reservation as illustrated in [Memory Manager KEP: Memory Maps at start-up (with examples)][5].
+
+The administrator must provide `--reserved-memory` flag when `Static` policy is configured.
+
+### Runtime
+
+Reference [Memory Manager KEP: Memory Maps at runtime (with examples)][6] illustrates how a successful pod deployment affects the Node Map, and it also relates to how potential Out-of-Memory (OOM) situations are handled further by Kubernetes or operating system.
+
+Important topic in the context of Memory Manager operation is the management of NUMA groups. Each time pod's memory request is in excess of single NUMA node capacity, the Memory Manager attempts to create a group that comprises several NUMA nodes and features extend memory capacity. The problem has been solved as elaborated in [Memory Manager KEP: How to enable the guaranteed memory allocation over many NUMA nodes?][3]. Also, reference [Memory Manager KEP: Simulation - how the Memory Manager works? (by examples)][1] illustrates how the management of groups occurs.
+
+## Memory Manager configuration
+
+Other Managers should be first pre-configured (section [Pre-configuration](#pre-configuration)). Next, the Memory Manger feature should be enabled (section [Enable the Memory Manager feature](#enable-the-memory-manager-feature)) and be run with `Static` policy (section [Static policy](#static-policy)). Optionally, some amount of memory can be reserved for system or kubelet processes to increase node stability (section [Reserved memory flag](#reserved-memory-flag)).
+
+### Policies
+
+Memory Manager supports two policies. You can select a policy via a `kubelet` flag `--memory-manager-policy`.
+
+Two policies can be selected:
+
+* `None` (default)
+* `Static`
+
+#### None policy {#policy-none}
+
+This is the default policy and does not affect the memory allocation in any way.
+It acts the same as if the Memory Manager is not present at all.
+
+The `None` policy returns default topology hint. This special hint denotes that Hint Provider (Memory Manger in this case) has no preference for NUMA affinity with any resource.
+
+#### Static policy {#policy-static}
+
+In the case of the `Guaranteed` pod, the `Static` Memory Manger policy returns topology hints relating to the set of NUMA nodes where the memory can be guaranteed, and reserves the memory through updating the internal [NodeMap][2] object.
+
+In the case of the `BestEffort` or `Burstable` pod, the `Static` Memory Manager policy sends back the default topology hint as there is no request for the guaranteed memory, and does not reserve the memory in the internal [NodeMap][2] object.
+
+### Reserved memory flag
+
+The [Node Allocatable](/docs/tasks/administer-cluster/reserve-compute-resources/) mechanism is commonly used by node administrators to reserve K8S node system resources for the kubelet or operating system processes in order to enhance the node stability. A dedicated set of flags can be used for this purpose to set the total amount of reserved memory for a node. This pre-configured value is subsequently utilized to calculate the real amount of node's "allocatable" memory available to pods.
+
+The Kubernetes scheduler incorporates "allocatable" to optimise pod scheduling process. The foregoing flags include `--kube-reserved`, `--system-reserved` and `--eviction-threshold`. The sum of their values will account for the total amount of reserved memory.
+
+
+A new `--reserved-memory` flag was added to Memory Manager to allow for this total reserved memory to be split (by a node administrator) and accordingly reserved across many NUMA nodes.
+
+The flag specifies a comma-separated list of memory reservations per NUMA node.
+This parameter is only useful in the context of the Memory Manager feature.
+The Memory Manager will not use this reserved memory for the allocation of container workloads.
+
+For example, if you have a NUMA node "NUMA0" with `10Gi` of memory available, and the `--reserved-memory` was specified to reserve `1Gi` of memory at "NUMA0", the Memory Manager assumes that only `9Gi` is available for containers.
+
+You can omit this parameter, however, you should be aware that the quantity of reserved memory from all NUMA nodes should be equal to the quantity of memory specified by the [Node Allocatable feature](/docs/tasks/administer-cluster/reserve-compute-resources/). If at least one node allocatable parameter is non-zero, you will need to specify `--reserved-memory` for at least one NUMA node. In fact, `eviction-hard` threshold value is equal to `100Mi` by default, so if `Static` policy is used, `--reserved-memory` is obligatory.
+
+Also, avoid the following configurations:
+1. duplicates, i.e. the same NUMA node or memory type, but with a different value;
+2. setting zero limit for any of memory types;
+3. NUMA node IDs that do not exist in the machine hardware;
+4. memory type names different than `memory` or `hugepages-` (hugepages of particular `` should also exist).
+
+Syntax:
+
+`--reserved-memory N:memory-type1=value1,memory-type2=value2,...`
+* `N` (integer) - NUMA node index, e.g. `0`
+* `memory-type` (string) - represents memory type:
+ * `memory` - conventional memory
+ * `hugepages-2Mi` or `hugepages-1Gi` - hugepages
+* `value` (string) - the quantity of reserved memory, e.g. `1Gi`
+
+Example usage:
+
+`--reserved-memory 0:memory=1Gi,hugepages-1Gi=2Gi`
+
+or
+
+`--reserved-memory 0:memory=1Gi --reserved-memory 1:memory=2Gi`
+
+When you specify values for `--reserved-memory` flag, you must comply with the setting that you prior provided via Node Allocatable Feature flags. That is, the following rule must be obeyed for each memory type:
+
+`sum(reserved-memory(i)) = kube-reserved + system-reserved + eviction-threshold`,
+
+where `i` is an index of a NUMA node.
+
+If you do not follow the formula above, the Memory Manager will show an error on startup.
+
+In other words, the example above illustrates that for the conventional memory (`type=memory`), we reserve `3Gi` in total, i.e.:
+
+`sum(reserved-memory(i)) = reserved-memory(0) + reserved-memory(1) = 1Gi + 2Gi = 3Gi`
+
+An example of kubelet command-line arguments relevant to the node Allocatable configuration:
+* `--kube-reserved=cpu=500m,memory=50Mi`
+* `--system-reserved=cpu=123m,memory=333Mi`
+* `--eviction-hard=memory.available<500Mi`
+
+{{< note >}}
+The default hard eviction threshold is 100MiB, and **not** zero. Remember to increase the quantity of memory that you reserve by setting `--reserved-memory` by that hard eviction threshold. Otherwise, the kubelet will not start Memory Manager and display an error.
+{{< /note >}}
+
+Here is an example of a correct configuration:
+
+```shell
+--feature-gates=MemoryManager=true
+--kube-reserved=cpu=4,memory=4Gi
+--system-reserved=cpu=1,memory=1Gi
+--memory-manager-policy=Static
+--reserved-memory 0:memory=3Gi --reserved-memory 1:memory=2148Mi
+```
+Let us validate the configuration above:
+1. `kube-reserved + system-reserved + eviction-hard(default) = reserved-memory(0) + reserved-memory(1)`
+2. `4GiB + 1GiB + 100MiB = 3GiB + 2148MiB`
+3. `5120MiB + 100MiB = 3072MiB + 2148MiB`
+4. `5220MiB = 5220MiB` (which is correct)
+
+## Placing a Pod in the Guaranteed QoS class
+
+If the selected policy is anything other than `None`, the Memory Manager identifies pods that are in the `Guaranteed` QoS class. The Memory Manager provides specific topology hints to the Topology Manager for each `Guaranteed` pod. For pods in a QoS class other than `Guaranteed`, the Memory Manager provides default topology hints to the Topology Manager.
+
+The following excerpts from pod manifests assign a pod to the `Guaranteed` QoS class.
+
+Pod with integer CPU(s) runs in the `Guaranteed` QoS class, when `requests` are equal to `limits`:
+
+```yaml
+spec:
+ containers:
+ - name: nginx
+ image: nginx
+ resources:
+ limits:
+ memory: "200Mi"
+ cpu: "2"
+ example.com/device: "1"
+ requests:
+ memory: "200Mi"
+ cpu: "2"
+ example.com/device: "1"
+```
+
+Also, a pod sharing CPU(s) runs in the `Guaranteed` QoS class, when `requests` are equal to `limits`.
+
+```yaml
+spec:
+ containers:
+ - name: nginx
+ image: nginx
+ resources:
+ limits:
+ memory: "200Mi"
+ cpu: "300m"
+ example.com/device: "1"
+ requests:
+ memory: "200Mi"
+ cpu: "300m"
+ example.com/device: "1"
+```
+
+Notice that both CPU and memory requests must be specified for a Pod to lend it to Guaranteed QoS class.
+
+## Troubleshooting
+
+The following means can be used to troubleshoot the reason why a pod could not be deployed or became rejected at a node:
+- pod status - indicates topology affinity errors
+- system logs - include valuable information for debugging, e.g., about generated hints
+- state file - the dump of internal state of the Memory Manager (includes [Node Map and Memory Maps][2])
+- starting from v1.22, the [device plugin resource API](#device-plugin-resource-api) can be used
+ to retrieve information about the memory reserved for containers
+
+
+
+### Pod status (TopologyAffinityError) {#TopologyAffinityError}
+
+This error typically occurs in the following situations:
+* a node has not enough resources available to satisfy the pod's request
+* the pod's request is rejected due to particular Topology Manager policy constraints
+
+The error appears in the status of a pod:
+```shell
+# kubectl get pods
+NAME READY STATUS RESTARTS AGE
+guaranteed 0/1 TopologyAffinityError 0 113s
+```
+
+Use `kubectl describe pod ` or `kubectl get events` to obtain detailed error message:
+```shell
+Warning TopologyAffinityError 10m kubelet, dell8 Resources cannot be allocated with Topology locality
+```
+
+### System logs
+
+Search system logs with respect to a particular pod.
+
+The set of hints that Memory Manager generated for the pod can be found in the logs.
+Also, the set of hints generated by CPU Manager should be present in the logs.
+
+Topology Manager merges these hints to calculate a single best hint.
+The best hint should be also present in the logs.
+
+The best hint indicates where to allocate all the resources. Topology Manager tests this hint against its current policy, and based on the verdict, it either admits the pod to the node or rejects it.
+
+Also, search the logs for occurrences associated with the Memory Manager, e.g. to find out information about `cgroups` and `cpuset.mems` updates.
+
+### Examine the memory manager state on a node
+
+Let us first deploy a sample `Guaranteed` pod whose specification is as follows:
+```yaml
+apiVersion: v1
+kind: Pod
+metadata:
+ name: guaranteed
+spec:
+ containers:
+ - name: guaranteed
+ image: consumer
+ imagePullPolicy: Never
+ resources:
+ limits:
+ cpu: "2"
+ memory: 150Gi
+ requests:
+ cpu: "2"
+ memory: 150Gi
+ command: ["sleep","infinity"]
+```
+
+Next, let us log into the node where it was deployed and examine the state file in `/var/lib/kubelet/memory_manager_state`:
+```json
+{
+ "policyName":"Static",
+ "machineState":{
+ "0":{
+ "numberOfAssignments":1,
+ "memoryMap":{
+ "hugepages-1Gi":{
+ "total":0,
+ "systemReserved":0,
+ "allocatable":0,
+ "reserved":0,
+ "free":0
+ },
+ "memory":{
+ "total":134987354112,
+ "systemReserved":3221225472,
+ "allocatable":131766128640,
+ "reserved":131766128640,
+ "free":0
+ }
+ },
+ "nodes":[
+ 0,
+ 1
+ ]
+ },
+ "1":{
+ "numberOfAssignments":1,
+ "memoryMap":{
+ "hugepages-1Gi":{
+ "total":0,
+ "systemReserved":0,
+ "allocatable":0,
+ "reserved":0,
+ "free":0
+ },
+ "memory":{
+ "total":135286722560,
+ "systemReserved":2252341248,
+ "allocatable":133034381312,
+ "reserved":29295144960,
+ "free":103739236352
+ }
+ },
+ "nodes":[
+ 0,
+ 1
+ ]
+ }
+ },
+ "entries":{
+ "fa9bdd38-6df9-4cf9-aa67-8c4814da37a8":{
+ "guaranteed":[
+ {
+ "numaAffinity":[
+ 0,
+ 1
+ ],
+ "type":"memory",
+ "size":161061273600
+ }
+ ]
+ }
+ },
+ "checksum":4142013182
+}
+```
+
+It can be deduced from the state file that the pod was pinned to both NUMA nodes, i.e.:
+
+```json
+"numaAffinity":[
+ 0,
+ 1
+],
+```
+
+Pinned term means that pod's memory consumption is constrained (through `cgroups` configuration) to these NUMA nodes.
+
+This automatically implies that Memory Manager instantiated a new group that comprises these two NUMA nodes, i.e. `0` and `1` indexed NUMA nodes.
+
+Notice that the management of groups is handled in a relatively complex manner, and further elaboration is provided in Memory Manager KEP in [this][1] and [this][3] sections.
+
+In order to analyse memory resources available in a group, the corresponding entries from NUMA nodes belonging to the group must be added up.
+
+For example, the total amount of free "conventional" memory in the group can be computed by adding up the free memory available at every NUMA node in the group, i.e., in the `"memory"` section of NUMA node `0` (`"free":0`) and NUMA node `1` (`"free":103739236352`). So, the total amount of free "conventional" memory in this group is equal to `0 + 103739236352` bytes.
+
+The line `"systemReserved":3221225472` indicates that the administrator of this node reserved `3221225472` bytes (i.e. `3Gi`) to serve kubelet and system processes at NUMA node `0`, by using `--reserved-memory` flag.
+
+### Device plugin resource API
+
+By employing the [API](/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/), the information about reserved memory for each container can be retrieved, which is contained in protobuf `ContainerMemory` message. This information can be retrieved solely for pods in Guaranteed QoS class.
+
+## {{% heading "whatsnext" %}}
+
+- [Memory Manager KEP: Design Overview][4]
+
+- [Memory Manager KEP: Memory Maps at start-up (with examples)][5]
+
+- [Memory Manager KEP: Memory Maps at runtime (with examples)][6]
+
+- [Memory Manager KEP: Simulation - how the Memory Manager works? (by examples)][1]
+
+- [Memory Manager KEP: The Concept of Node Map and Memory Maps][2]
+
+- [Memory Manager KEP: How to enable the guaranteed memory allocation over many NUMA nodes?][3]
+
+[1]: https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1769-memory-manager#simulation---how-the-memory-manager-works-by-examples
+[2]: https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1769-memory-manager#the-concept-of-node-map-and-memory-maps
+[3]: https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1769-memory-manager#how-to-enable-the-guaranteed-memory-allocation-over-many-numa-nodes
+[4]: https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1769-memory-manager#design-overview
+[5]: https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1769-memory-manager#memory-maps-at-start-up-with-examples
+[6]: https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1769-memory-manager#memory-maps-at-runtime-with-examples
diff --git a/content/en/docs/tasks/administer-cluster/migrating-from-dockershim/_index.md b/content/en/docs/tasks/administer-cluster/migrating-from-dockershim/_index.md
old mode 100755
new mode 100644
diff --git a/content/en/docs/tasks/administer-cluster/migrating-from-dockershim/migrating-telemetry-and-security-agents.md b/content/en/docs/tasks/administer-cluster/migrating-from-dockershim/migrating-telemetry-and-security-agents.md
index dd813754e4..ddfefb6f49 100644
--- a/content/en/docs/tasks/administer-cluster/migrating-from-dockershim/migrating-telemetry-and-security-agents.md
+++ b/content/en/docs/tasks/administer-cluster/migrating-from-dockershim/migrating-telemetry-and-security-agents.md
@@ -78,3 +78,4 @@ telemetry agents on the node, make sure to check with the vendor of the agent wh
We keep the work in progress version of migration instructions for various telemetry and security agent vendors
in [Google doc](https://docs.google.com/document/d/1ZFi4uKit63ga5sxEiZblfb-c23lFhvy6RXVPikS8wf0/edit#).
Please contact the vendor to get up to date instructions for migrating from dockershim.
+
diff --git a/content/en/docs/tasks/administer-cluster/namespaces.md b/content/en/docs/tasks/administer-cluster/namespaces.md
index 2934e1c0f7..231de37e26 100644
--- a/content/en/docs/tasks/administer-cluster/namespaces.md
+++ b/content/en/docs/tasks/administer-cluster/namespaces.md
@@ -78,7 +78,8 @@ A namespace can be in one of two phases:
* `Active` the namespace is in use
* `Terminating` the namespace is being deleted, and can not be used for new objects
-See the [design doc](https://git.k8s.io/community/contributors/design-proposals/architecture/namespaces.md#phases) for more details.
+For more details, see [Namespace](/docs/reference/kubernetes-api/cluster-resources/namespace-v1/)
+in the API reference.
## Creating a new namespace
@@ -313,7 +314,7 @@ across namespaces, you need to use the fully qualified domain name (FQDN).
* Learn more about [setting the namespace preference](/docs/concepts/overview/working-with-objects/namespaces/#setting-the-namespace-preference).
* Learn more about [setting the namespace for a request](/docs/concepts/overview/working-with-objects/namespaces/#setting-the-namespace-for-a-request)
-* See [namespaces design](https://github.com/kubernetes/community/blob/{{< param "githubbranch" >}}/contributors/design-proposals/architecture/namespaces.md).
+* See [namespaces design](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/namespaces.md).
diff --git a/content/en/docs/tasks/administer-cluster/network-policy-provider/antrea-network-policy.md b/content/en/docs/tasks/administer-cluster/network-policy-provider/antrea-network-policy.md
new file mode 100644
index 0000000000..36da1839e9
--- /dev/null
+++ b/content/en/docs/tasks/administer-cluster/network-policy-provider/antrea-network-policy.md
@@ -0,0 +1,24 @@
+---
+title: Use Antrea for NetworkPolicy
+content_type: task
+weight: 10
+---
+
+
+This page shows how to install and use Antrea CNI plugin on Kubernetes.
+For background on Project Antrea, read the [Introduction to Antrea](https://antrea.io/docs/).
+
+## {{% heading "prerequisites" %}}
+
+You need to have a Kubernetes cluster. Follow the
+[kubeadm getting started guide](/docs/reference/setup-tools/kubeadm/) to bootstrap one.
+
+
+
+## Deploying Antrea with kubeadm
+
+Follow [Getting Started](https://github.com/vmware-tanzu/antrea/blob/main/docs/getting-started.md) guide to deploy Antrea for kubeadm.
+
+## {{% heading "whatsnext" %}}
+
+Once your cluster is running, you can follow the [Declare Network Policy](/docs/tasks/administer-cluster/declare-network-policy/) to try out Kubernetes NetworkPolicy.
diff --git a/content/en/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy.md b/content/en/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy.md
index 948893d3ea..74b8d2182e 100644
--- a/content/en/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy.md
+++ b/content/en/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy.md
@@ -24,45 +24,59 @@ For background on Cilium, read the [Introduction to Cilium](https://docs.cilium.
## Deploying Cilium on Minikube for Basic Testing
To get familiar with Cilium easily you can follow the
-[Cilium Kubernetes Getting Started Guide](https://docs.cilium.io/en/stable/gettingstarted/minikube/)
+[Cilium Kubernetes Getting Started Guide](https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/)
to perform a basic DaemonSet installation of Cilium in minikube.
-To start minikube, minimal version required is >= v1.3.1, run the with the
+To start minikube, minimal version required is >= v1.5.2, run the with the
following arguments:
```shell
minikube version
```
```
-minikube version: v1.3.1
+minikube version: v1.5.2
```
```shell
-minikube start --network-plugin=cni --memory=4096
+minikube start --network-plugin=cni
```
-Mount the BPF filesystem:
+For minikube you can install Cilium using its CLI tool. Cilium will
+automatically detect the cluster configuration and will install the appropriate
+components for a successful installation:
```shell
-minikube ssh -- sudo mount bpffs -t bpf /sys/fs/bpf
-```
-
-For minikube you can deploy this simple ''all-in-one'' YAML file that includes
-DaemonSet configurations for Cilium as well as appropriate RBAC settings:
-
-```shell
-kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.8/install/kubernetes/quick-install.yaml
+curl -LO https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
+sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
+rm cilium-linux-amd64.tar.gz
+cilium install
```
```
-configmap/cilium-config created
-serviceaccount/cilium created
-serviceaccount/cilium-operator created
-clusterrole.rbac.authorization.k8s.io/cilium created
-clusterrole.rbac.authorization.k8s.io/cilium-operator created
-clusterrolebinding.rbac.authorization.k8s.io/cilium created
-clusterrolebinding.rbac.authorization.k8s.io/cilium-operator created
-daemonset.apps/cilium create
-deployment.apps/cilium-operator created
+🔮 Auto-detected Kubernetes kind: minikube
+✨ Running "minikube" validation checks
+✅ Detected minikube version "1.20.0"
+ℹ️ Cilium version not set, using default version "v1.10.0"
+🔮 Auto-detected cluster name: minikube
+🔮 Auto-detected IPAM mode: cluster-pool
+🔮 Auto-detected datapath mode: tunnel
+🔑 Generating CA...
+2021/05/27 02:54:44 [INFO] generate received request
+2021/05/27 02:54:44 [INFO] received CSR
+2021/05/27 02:54:44 [INFO] generating key: ecdsa-256
+2021/05/27 02:54:44 [INFO] encoded CSR
+2021/05/27 02:54:44 [INFO] signed certificate with serial number 48713764918856674401136471229482703021230538642
+🔑 Generating certificates for Hubble...
+2021/05/27 02:54:44 [INFO] generate received request
+2021/05/27 02:54:44 [INFO] received CSR
+2021/05/27 02:54:44 [INFO] generating key: ecdsa-256
+2021/05/27 02:54:44 [INFO] encoded CSR
+2021/05/27 02:54:44 [INFO] signed certificate with serial number 3514109734025784310086389188421560613333279574
+🚀 Creating Service accounts...
+🚀 Creating Cluster roles...
+🚀 Creating ConfigMap...
+🚀 Creating Agent DaemonSet...
+🚀 Creating Operator Deployment...
+⌛ Waiting for Cilium to be installed...
```
The remainder of the Getting Started Guide explains how to enforce both L3/L4
@@ -85,14 +99,14 @@ Deploying a cluster with Cilium adds Pods to the `kube-system` namespace. To see
this list of Pods run:
```shell
-kubectl get pods --namespace=kube-system
+kubectl get pods --namespace=kube-system -l k8s-app=cilium
```
You'll see a list of Pods similar to this:
```console
-NAME READY STATUS RESTARTS AGE
-cilium-6rxbd 1/1 Running 0 1m
+NAME READY STATUS RESTARTS AGE
+cilium-kkdhz 1/1 Running 0 3m23s
...
```
diff --git a/content/en/docs/tasks/administer-cluster/nodelocaldns.md b/content/en/docs/tasks/administer-cluster/nodelocaldns.md
index b0f0596599..33417b00ad 100644
--- a/content/en/docs/tasks/administer-cluster/nodelocaldns.md
+++ b/content/en/docs/tasks/administer-cluster/nodelocaldns.md
@@ -79,7 +79,7 @@ If you are using the sample manifest from the previous point, this will require
* If kube-proxy is running in IPVS mode:
``` bash
- sed -i "s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/__PILLAR__DNS__SERVER__//g; s/__PILLAR__CLUSTER__DNS__/$kubedns/g" nodelocaldns.yaml
+ sed -i "s/__PILLAR__LOCAL__DNS__/$localdns/g; s/__PILLAR__DNS__DOMAIN__/$domain/g; s/,__PILLAR__DNS__SERVER__//g; s/__PILLAR__CLUSTER__DNS__/$kubedns/g" nodelocaldns.yaml
```
In this mode, node-local-dns pods listen only on ``. The node-local-dns interface cannot bind the kube-dns cluster IP since the interface used for IPVS loadbalancing already uses this address.
`__PILLAR__UPSTREAM__SERVERS__` will be populated by the node-local-dns pods.
diff --git a/content/en/docs/tasks/administer-cluster/out-of-resource.md b/content/en/docs/tasks/administer-cluster/out-of-resource.md
deleted file mode 100644
index f750dd2585..0000000000
--- a/content/en/docs/tasks/administer-cluster/out-of-resource.md
+++ /dev/null
@@ -1,354 +0,0 @@
----
-reviewers:
-- derekwaynecarr
-- vishh
-- timstclair
-title: Configure Out of Resource Handling
-content_type: concept
----
-
-
-
-This page explains how to configure out of resource handling with `kubelet`.
-
-The `kubelet` needs to preserve node stability when available compute resources
-are low. This is especially important when dealing with incompressible
-compute resources, such as memory or disk space. If such resources are exhausted,
-nodes become unstable.
-
-
-
-### Eviction Signals
-
-The `kubelet` supports eviction decisions based on the signals described in the following
-table. The value of each signal is described in the Description column, which is based on
-the `kubelet` summary API.
-
-| Eviction Signal | Description |
-|----------------------|---------------------------------------------------------------------------------------|
-| `memory.available` | `memory.available` := `node.status.capacity[memory]` - `node.stats.memory.workingSet` |
-| `nodefs.available` | `nodefs.available` := `node.stats.fs.available` |
-| `nodefs.inodesFree` | `nodefs.inodesFree` := `node.stats.fs.inodesFree` |
-| `imagefs.available` | `imagefs.available` := `node.stats.runtime.imagefs.available` |
-| `imagefs.inodesFree` | `imagefs.inodesFree` := `node.stats.runtime.imagefs.inodesFree` |
-| `pid.available` | `pid.available` := `node.stats.rlimit.maxpid` - `node.stats.rlimit.curproc` |
-
-Each of the above signals supports either a literal or percentage based value.
-The percentage based value is calculated relative to the total capacity
-associated with each signal.
-
-The value for `memory.available` is derived from the cgroupfs instead of tools
-like `free -m`. This is important because `free -m` does not work in a
-container, and if users use the [node
-allocatable](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable) feature, out of resource decisions
-are made local to the end user Pod part of the cgroup hierarchy as well as the
-root node. This [script](/examples/admin/resource/memory-available.sh)
-reproduces the same set of steps that the `kubelet` performs to calculate
-`memory.available`. The `kubelet` excludes inactive_file (i.e. # of bytes of
-file-backed memory on inactive LRU list) from its calculation as it assumes that
-memory is reclaimable under pressure.
-
-`kubelet` supports only two filesystem partitions.
-
-1. The `nodefs` filesystem that kubelet uses for volumes, daemon logs, etc.
-1. The `imagefs` filesystem that container runtimes uses for storing images and
- container writable layers.
-
-`imagefs` is optional. `kubelet` auto-discovers these filesystems using
-cAdvisor. `kubelet` does not care about any other filesystems. Any other types
-of configurations are not currently supported by the kubelet. For example, it is
-_not OK_ to store volumes and logs in a dedicated `filesystem`.
-
-In future releases, the `kubelet` will deprecate the existing [garbage
-collection](/docs/concepts/cluster-administration/kubelet-garbage-collection/)
-support in favor of eviction in response to disk pressure.
-
-### Eviction Thresholds
-
-The `kubelet` supports the ability to specify eviction thresholds that trigger the `kubelet` to reclaim resources.
-
-Each threshold has the following form:
-
-`[eviction-signal][operator][quantity]`
-
-where:
-
-* `eviction-signal` is an eviction signal token as defined in the previous table.
-* `operator` is the desired relational operator, such as `<` (less than).
-* `quantity` is the eviction threshold quantity, such as `1Gi`. These tokens must match the quantity representation used by Kubernetes. An eviction threshold can also be expressed as a percentage using the `%` token.
-
-For example, if a node has `10Gi` of total memory and you want trigger eviction if
-the available memory falls below `1Gi`, you can define the eviction threshold as
-either `memory.available<10%` or `memory.available<1Gi`. You cannot use both.
-
-#### Soft Eviction Thresholds
-
-A soft eviction threshold pairs an eviction threshold with a required
-administrator-specified grace period. No action is taken by the `kubelet`
-to reclaim resources associated with the eviction signal until that grace
-period has been exceeded. If no grace period is provided, the `kubelet`
-returns an error on startup.
-
-In addition, if a soft eviction threshold has been met, an operator can
-specify a maximum allowed Pod termination grace period to use when evicting
-pods from the node. If specified, the `kubelet` uses the lesser value among
-the `pod.Spec.TerminationGracePeriodSeconds` and the max allowed grace period.
-If not specified, the `kubelet` kills Pods immediately with no graceful
-termination.
-
-To configure soft eviction thresholds, the following flags are supported:
-
-* `eviction-soft` describes a set of eviction thresholds (e.g. `memory.available<1.5Gi`) that if met over a corresponding grace period would trigger a Pod eviction.
-* `eviction-soft-grace-period` describes a set of eviction grace periods (e.g. `memory.available=1m30s`) that correspond to how long a soft eviction threshold must hold before triggering a Pod eviction.
-* `eviction-max-pod-grace-period` describes the maximum allowed grace period (in seconds) to use when terminating pods in response to a soft eviction threshold being met.
-
-#### Hard Eviction Thresholds
-
-A hard eviction threshold has no grace period, and if observed, the `kubelet`
-will take immediate action to reclaim the associated starved resource. If a
-hard eviction threshold is met, the `kubelet` kills the Pod immediately
-with no graceful termination.
-
-To configure hard eviction thresholds, the following flag is supported:
-
-* `eviction-hard` describes a set of eviction thresholds (e.g. `memory.available<1Gi`) that if met would trigger a Pod eviction.
-
-The `kubelet` has the following default hard eviction threshold:
-
-* `memory.available<100Mi`
-* `nodefs.available<10%`
-* `imagefs.available<15%`
-
-On a Linux node, the default value also includes `nodefs.inodesFree<5%`.
-
-### Eviction Monitoring Interval
-
-The `kubelet` evaluates eviction thresholds per its configured housekeeping interval.
-
-* `housekeeping-interval` is the interval between container housekeepings which defaults to `10s`.
-
-### Node Conditions
-
-The `kubelet` maps one or more eviction signals to a corresponding node condition.
-
-If a hard eviction threshold has been met, or a soft eviction threshold has been met
-independent of its associated grace period, the `kubelet` reports a condition that
-reflects the node is under pressure.
-
-The following node conditions are defined that correspond to the specified eviction signal.
-
-| Node Condition | Eviction Signal | Description |
-|-------------------|---------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------|
-| `MemoryPressure` | `memory.available` | Available memory on the node has satisfied an eviction threshold |
-| `DiskPressure` | `nodefs.available`, `nodefs.inodesFree`, `imagefs.available`, or `imagefs.inodesFree` | Available disk space and inodes on either the node's root filesystem or image filesystem has satisfied an eviction threshold |
-| `PIDPressure` | `pid.available` | Available processes identifiers on the (Linux) node has fallen below an eviction threshold | |
-
-The `kubelet` continues to report node status updates at the frequency specified by
-`--node-status-update-frequency` which defaults to `10s`.
-
-### Oscillation of node conditions
-
-If a node is oscillating above and below a soft eviction threshold, but not exceeding
-its associated grace period, it would cause the corresponding node condition to
-constantly oscillate between true and false, and could cause poor scheduling decisions
-as a consequence.
-
-To protect against this oscillation, the following flag is defined to control how
-long the `kubelet` must wait before transitioning out of a pressure condition.
-
-* `eviction-pressure-transition-period` is the duration for which the `kubelet` has to wait before transitioning out of an eviction pressure condition.
-
-The `kubelet` would ensure that it has not observed an eviction threshold being met
-for the specified pressure condition for the period specified before toggling the
-condition back to `false`.
-
-### Reclaiming node level resources
-
-If an eviction threshold has been met and the grace period has passed,
-the `kubelet` initiates the process of reclaiming the pressured resource
-until it has observed the signal has gone below its defined threshold.
-
-The `kubelet` attempts to reclaim node level resources prior to evicting end-user Pods. If
-disk pressure is observed, the `kubelet` reclaims node level resources differently if the
-machine has a dedicated `imagefs` configured for the container runtime.
-
-#### With `imagefs`
-
-If `nodefs` filesystem has met eviction thresholds, `kubelet` frees up disk space by deleting the dead Pods and their containers.
-
-If `imagefs` filesystem has met eviction thresholds, `kubelet` frees up disk space by deleting all unused images.
-
-#### Without `imagefs`
-
-If `nodefs` filesystem has met eviction thresholds, `kubelet` frees up disk space in the following order:
-
-1. Delete dead Pods and their containers
-1. Delete all unused images
-
-### Evicting end-user Pods
-
-If the `kubelet` is unable to reclaim sufficient resource on the node, `kubelet` begins evicting Pods.
-
-The `kubelet` ranks Pods for eviction first by whether or not their usage of the starved resource exceeds requests,
-then by [Priority](/docs/concepts/configuration/pod-priority-preemption/), and then by the consumption of the starved compute resource relative to the Pods' scheduling requests.
-
-As a result, `kubelet` ranks and evicts Pods in the following order:
-
-* `BestEffort` or `Burstable` Pods whose usage of a starved resource exceeds its request. Such pods are ranked by Priority, and then usage above request.
-* `Guaranteed` pods and `Burstable` pods whose usage is beneath requests are evicted last. `Guaranteed` Pods are guaranteed only when requests and limits are specified for all the containers and they are equal. Such pods are guaranteed to never be evicted because of another Pod's resource consumption. If a system daemon (such as `kubelet`, `docker`, and `journald`) is consuming more resources than were reserved via `system-reserved` or `kube-reserved` allocations, and the node only has `Guaranteed` or `Burstable` Pods using less than requests remaining, then the node must choose to evict such a Pod in order to preserve node stability and to limit the impact of the unexpected consumption to other Pods. In this case, it will choose to evict pods of Lowest Priority first.
-
-If necessary, `kubelet` evicts Pods one at a time to reclaim disk when `DiskPressure`
-is encountered. If the `kubelet` is responding to `inode` starvation, it reclaims
-`inodes` by evicting Pods with the lowest quality of service first. If the `kubelet`
-is responding to lack of available disk, it ranks Pods within a quality of service
-that consumes the largest amount of disk and kills those first.
-
-#### With `imagefs`
-
-If `nodefs` is triggering evictions, `kubelet` sorts Pods based on the usage on `nodefs`
-
-- local volumes + logs of all its containers.
-
-If `imagefs` is triggering evictions, `kubelet` sorts Pods based on the writable layer usage of all its containers.
-
-#### Without `imagefs`
-
-If `nodefs` is triggering evictions, `kubelet` sorts Pods based on their total disk usage
-
-- local volumes + logs & writable layer of all its containers.
-
-### Minimum eviction reclaim
-
-In certain scenarios, eviction of Pods could result in reclamation of small amount of resources. This can result in
-`kubelet` hitting eviction thresholds in repeated successions. In addition to that, eviction of resources like `disk`, is time consuming.
-
-To mitigate these issues, `kubelet` can have a per-resource `minimum-reclaim`. Whenever `kubelet` observes
-resource pressure, `kubelet` attempts to reclaim at least `minimum-reclaim` amount of resource below
-the configured eviction threshold.
-
-For example, with the following configuration:
-
-```
---eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi
---eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"`
-```
-
-If an eviction threshold is triggered for `memory.available`, the `kubelet` works to ensure
-that `memory.available` is at least `500Mi`. For `nodefs.available`, the `kubelet` works
-to ensure that `nodefs.available` is at least `1.5Gi`, and for `imagefs.available` it
-works to ensure that `imagefs.available` is at least `102Gi` before no longer reporting pressure
-on their associated resources.
-
-The default `eviction-minimum-reclaim` is `0` for all resources.
-
-### Scheduler
-
-The node reports a condition when a compute resource is under pressure. The
-scheduler views that condition as a signal to dissuade placing additional
-pods on the node.
-
-| Node Condition | Scheduler Behavior |
-| ------------------| ----------------------------------------------------|
-| `MemoryPressure` | No new `BestEffort` Pods are scheduled to the node. |
-| `DiskPressure` | No new Pods are scheduled to the node. |
-
-## Node OOM Behavior
-
-If the node experiences a system OOM (out of memory) event prior to the `kubelet` being able to reclaim memory,
-the node depends on the [oom_killer](https://lwn.net/Articles/391222/) to respond.
-
-The `kubelet` sets a `oom_score_adj` value for each container based on the quality of service for the Pod.
-
-| Quality of Service | oom_score_adj |
-|--------------------|-----------------------------------------------------------------------------------|
-| `Guaranteed` | -998 |
-| `BestEffort` | 1000 |
-| `Burstable` | min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999) |
-
-If the `kubelet` is unable to reclaim memory prior to a node experiencing system OOM, the `oom_killer` calculates
-an `oom_score` based on the percentage of memory it's using on the node, and then add the `oom_score_adj` to get an
-effective `oom_score` for the container, and then kills the container with the highest score.
-
-The intended behavior should be that containers with the lowest quality of service that
-are consuming the largest amount of memory relative to the scheduling request should be killed first in order
-to reclaim memory.
-
-Unlike Pod eviction, if a Pod container is OOM killed, it may be restarted by the `kubelet` based on its `RestartPolicy`.
-
-## Best Practices
-
-The following sections describe best practices for out of resource handling.
-
-### Schedulable resources and eviction policies
-
-Consider the following scenario:
-
-* Node memory capacity: `10Gi`
-* Operator wants to reserve 10% of memory capacity for system daemons (kernel, `kubelet`, etc.)
-* Operator wants to evict Pods at 95% memory utilization to reduce incidence of system OOM.
-
-To facilitate this scenario, the `kubelet` would be launched as follows:
-
-```
---eviction-hard=memory.available<500Mi
---system-reserved=memory=1.5Gi
-```
-
-Implicit in this configuration is the understanding that "System reserved" should include the amount of memory
-covered by the eviction threshold.
-
-To reach that capacity, either some Pod is using more than its request, or the system is using more than `1.5Gi - 500Mi = 1Gi`.
-
-This configuration ensures that the scheduler does not place Pods on a node that immediately induce memory pressure
-and trigger eviction assuming those Pods use less than their configured request.
-
-### DaemonSet
-
-As `Priority` is a key factor in the eviction strategy, if you do not want pods belonging to a `DaemonSet` to be evicted, specify a sufficiently high priorityClass in the pod spec template. If you want pods belonging to a `DaemonSet` to run only if there are sufficient resources, specify a lower or default priorityClass.
-
-
-## Deprecation of existing feature flags to reclaim disk
-
-`kubelet` has been freeing up disk space on demand to keep the node stable.
-
-As disk based eviction matures, the following `kubelet` flags are marked for deprecation
-in favor of the simpler configuration supported around eviction.
-
-| Existing Flag | New Flag |
-| ------------------------------------------ | ----------------------------------------|
-| `--image-gc-high-threshold` | `--eviction-hard` or `eviction-soft` |
-| `--image-gc-low-threshold` | `--eviction-minimum-reclaim` |
-| `--maximum-dead-containers` | deprecated |
-| `--maximum-dead-containers-per-container` | deprecated |
-| `--minimum-container-ttl-duration` | deprecated |
-| `--low-diskspace-threshold-mb` | `--eviction-hard` or `eviction-soft` |
-| `--outofdisk-transition-frequency` | `--eviction-pressure-transition-period` |
-
-## Known issues
-
-The following sections describe known issues related to out of resource handling.
-
-### kubelet may not observe memory pressure right away
-
-The `kubelet` currently polls `cAdvisor` to collect memory usage stats at a regular interval. If memory usage
-increases within that window rapidly, the `kubelet` may not observe `MemoryPressure` fast enough, and the `OOMKiller`
-will still be invoked. We intend to integrate with the `memcg` notification API in a future release to reduce this
-latency, and instead have the kernel tell us when a threshold has been crossed immediately.
-
-If you are not trying to achieve extreme utilization, but a sensible measure of overcommit, a viable workaround for
-this issue is to set eviction thresholds at approximately 75% capacity. This increases the ability of this feature
-to prevent system OOMs, and promote eviction of workloads so cluster state can rebalance.
-
-### kubelet may evict more Pods than needed
-
-The Pod eviction may evict more Pods than needed due to stats collection timing gap. This can be mitigated by adding
-the ability to get root container stats on an on-demand basis [(https://github.com/google/cadvisor/issues/1247)](https://github.com/google/cadvisor/issues/1247) in the future.
-
-### active_file memory is not considered as available memory
-
-On Linux, the kernel tracks the number of bytes of file-backed memory on active LRU list as the `active_file` statistic. The kubelet treats `active_file` memory areas as not reclaimable. For workloads that make intensive use of block-backed local storage, including ephemeral local storage, kernel-level caches of file and block data means that many recently accessed cache pages are likely to be counted as `active_file`. If enough of these kernel block buffers are on the active LRU list, the kubelet is liable to observe this as high resource use and taint the node as experiencing memory pressure - triggering Pod eviction.
-
-For more more details, see [https://github.com/kubernetes/kubernetes/issues/43916](https://github.com/kubernetes/kubernetes/issues/43916)
-
-You can work around that behavior by setting the memory limit and memory request the same for containers likely to perform intensive I/O activity. You will need to estimate or measure an optimal memory limit value for that container.
-
diff --git a/content/en/docs/tasks/administer-cluster/reconfigure-kubelet.md b/content/en/docs/tasks/administer-cluster/reconfigure-kubelet.md
index 4ec3b428d0..466910f30f 100644
--- a/content/en/docs/tasks/administer-cluster/reconfigure-kubelet.md
+++ b/content/en/docs/tasks/administer-cluster/reconfigure-kubelet.md
@@ -8,7 +8,14 @@ min-kubernetes-server-version: v1.11
---
-{{< feature-state for_k8s_version="v1.11" state="beta" >}}
+{{< feature-state for_k8s_version="v1.22" state="deprecated" >}}
+
+{{< caution >}}
+[Dynamic Kubelet Configuration](https://github.com/kubernetes/enhancements/issues/281)
+feature is deprecated and should not be used.
+Please switch to alternative means distributing configuration to the Nodes of your cluster.
+{{< /caution >}}
+
[Dynamic Kubelet Configuration](https://github.com/kubernetes/enhancements/issues/281)
allows you to change the configuration of each
diff --git a/content/en/docs/tasks/administer-cluster/reserve-compute-resources.md b/content/en/docs/tasks/administer-cluster/reserve-compute-resources.md
index a5661263f2..d4cce14870 100644
--- a/content/en/docs/tasks/administer-cluster/reserve-compute-resources.md
+++ b/content/en/docs/tasks/administer-cluster/reserve-compute-resources.md
@@ -17,33 +17,27 @@ itself. Unless resources are set aside for these system daemons, pods and system
daemons compete for resources and lead to resource starvation issues on the
node.
-The `kubelet` exposes a feature named `Node Allocatable` that helps to reserve
+The `kubelet` exposes a feature named 'Node Allocatable' that helps to reserve
compute resources for system daemons. Kubernetes recommends cluster
-administrators to configure `Node Allocatable` based on their workload density
+administrators to configure 'Node Allocatable' based on their workload density
on each node.
-
-
-
## {{% heading "prerequisites" %}}
-
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
Your Kubernetes server must be at or later than version 1.17 to use
the kubelet command line option `--reserved-cpus` to set an
[explicitly reserved CPU list](#explicitly-reserved-cpu-list).
-
-
## Node Allocatable

-`Allocatable` on a Kubernetes node is defined as the amount of compute resources
+'Allocatable' on a Kubernetes node is defined as the amount of compute resources
that are available for pods. The scheduler does not over-subscribe
-`Allocatable`. `CPU`, `memory` and `ephemeral-storage` are supported as of now.
+'Allocatable'. 'CPU', 'memory' and 'ephemeral-storage' are supported as of now.
Node Allocatable is exposed as part of `v1.Node` object in the API and as part
of `kubectl describe node` in the CLI.
@@ -97,8 +91,7 @@ flag.
It is recommended that the kubernetes system daemons are placed under a top
level control group (`runtime.slice` on systemd machines for example). Each
system daemon should ideally run within its own child control group. Refer to
-[this
-doc](https://git.k8s.io/community/contributors/design-proposals/node/node-allocatable.md#recommended-cgroups-setup)
+[the design proposal](https://git.k8s.io/community/contributors/design-proposals/node/node-allocatable.md#recommended-cgroups-setup)
for more details on recommended control group hierarchy.
Note that Kubelet **does not** create `--kube-reserved-cgroup` if it doesn't
@@ -109,7 +102,6 @@ exist. Kubelet will fail if an invalid cgroup is specified.
- **Kubelet Flag**: `--system-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]`
- **Kubelet Flag**: `--system-reserved-cgroup=`
-
`system-reserved` is meant to capture resource reservation for OS system daemons
like `sshd`, `udev`, etc. `system-reserved` should reserve `memory` for the
`kernel` too since `kernel` memory is not accounted to pods in Kubernetes at this time.
@@ -127,13 +119,14 @@ kubelet flag.
It is recommended that the OS system daemons are placed under a top level
control group (`system.slice` on systemd machines for example).
-Note that Kubelet **does not** create `--system-reserved-cgroup` if it doesn't
-exist. Kubelet will fail if an invalid cgroup is specified.
+Note that `kubelet` **does not** create `--system-reserved-cgroup` if it doesn't
+exist. `kubelet` will fail if an invalid cgroup is specified.
### Explicitly Reserved CPU List
+
{{< feature-state for_k8s_version="v1.17" state="stable" >}}
-- **Kubelet Flag**: `--reserved-cpus=0-3`
+**Kubelet Flag**: `--reserved-cpus=0-3`
`reserved-cpus` is meant to define an explicit CPU set for OS system daemons and
kubernetes system daemons. `reserved-cpus` is for systems that do not intend to
@@ -154,14 +147,15 @@ For example: in Centos, you can do this using the tuned toolset.
### Eviction Thresholds
-- **Kubelet Flag**: `--eviction-hard=[memory.available<500Mi]`
+**Kubelet Flag**: `--eviction-hard=[memory.available<500Mi]`
Memory pressure at the node level leads to System OOMs which affects the entire
node and all pods running on it. Nodes can go offline temporarily until memory
has been reclaimed. To avoid (or reduce the probability of) system OOMs kubelet
-provides [`Out of Resource`](/docs/tasks/administer-cluster/out-of-resource/) management. Evictions are
+provides [out of resource](/docs/concepts/scheduling-eviction/node-pressure-eviction/)
+management. Evictions are
supported for `memory` and `ephemeral-storage` only. By reserving some memory via
-`--eviction-hard` flag, the `kubelet` attempts to `evict` pods whenever memory
+`--eviction-hard` flag, the `kubelet` attempts to evict pods whenever memory
availability on the node drops below the reserved value. Hypothetically, if
system daemons did not exist on a node, pods cannot use more than `capacity -
eviction-hard`. For this reason, resources reserved for evictions are not
@@ -169,17 +163,17 @@ available for pods.
### Enforcing Node Allocatable
-- **Kubelet Flag**: `--enforce-node-allocatable=pods[,][system-reserved][,][kube-reserved]`
+**Kubelet Flag**: `--enforce-node-allocatable=pods[,][system-reserved][,][kube-reserved]`
-The scheduler treats `Allocatable` as the available `capacity` for pods.
+The scheduler treats 'Allocatable' as the available `capacity` for pods.
-`kubelet` enforce `Allocatable` across pods by default. Enforcement is performed
+`kubelet` enforce 'Allocatable' across pods by default. Enforcement is performed
by evicting pods whenever the overall usage across all pods exceeds
-`Allocatable`. More details on eviction policy can be found
-[here](/docs/tasks/administer-cluster/out-of-resource/#eviction-policy). This enforcement is controlled by
+'Allocatable'. More details on eviction policy can be found
+on the [node pressure eviction](/docs/concepts/scheduling-eviction/node-pressure-eviction/)
+page. This enforcement is controlled by
specifying `pods` value to the kubelet flag `--enforce-node-allocatable`.
-
Optionally, `kubelet` can be made to enforce `kube-reserved` and
`system-reserved` by specifying `kube-reserved` & `system-reserved` values in
the same flag. Note that to enforce `kube-reserved` or `system-reserved`,
@@ -188,10 +182,10 @@ respectively.
## General Guidelines
-System daemons are expected to be treated similar to `Guaranteed` pods. System
+System daemons are expected to be treated similar to 'Guaranteed' pods. System
daemons can burst within their bounding control groups and this behavior needs
to be managed as part of kubernetes deployments. For example, `kubelet` should
-have its own control group and share `Kube-reserved` resources with the
+have its own control group and share `kube-reserved` resources with the
container runtime. However, Kubelet cannot burst and use up all available Node
resources if `kube-reserved` is enforced.
@@ -200,9 +194,9 @@ to critical system services being CPU starved, OOM killed, or unable
to fork on the node. The
recommendation is to enforce `system-reserved` only if a user has profiled their
nodes exhaustively to come up with precise estimates and is confident in their
-ability to recover if any process in that group is oom_killed.
+ability to recover if any process in that group is oom-killed.
-* To begin with enforce `Allocatable` on `pods`.
+* To begin with enforce 'Allocatable' on `pods`.
* Once adequate monitoring and alerting is in place to track kube system
daemons, attempt to enforce `kube-reserved` based on usage heuristics.
* If absolutely necessary, enforce `system-reserved` over time.
@@ -212,8 +206,6 @@ more features are added. Over time, kubernetes project will attempt to bring
down utilization of node system daemons, but that is not a priority as of now.
So expect a drop in `Allocatable` capacity in future releases.
-
-
## Example Scenario
@@ -225,15 +217,15 @@ Here is an example to illustrate Node Allocatable computation:
* `--system-reserved` is set to `cpu=500m,memory=1Gi,ephemeral-storage=1Gi`
* `--eviction-hard` is set to `memory.available<500Mi,nodefs.available<10%`
-Under this scenario, `Allocatable` will be `14.5 CPUs`, `28.5Gi` of memory and
+Under this scenario, 'Allocatable' will be 14.5 CPUs, 28.5Gi of memory and
`88Gi` of local storage.
Scheduler ensures that the total memory `requests` across all pods on this node does
-not exceed `28.5Gi` and storage doesn't exceed `88Gi`.
-Kubelet evicts pods whenever the overall memory usage across pods exceeds `28.5Gi`,
-or if overall disk usage exceeds `88Gi` If all processes on the node consume as
-much CPU as they can, pods together cannot consume more than `14.5 CPUs`.
+not exceed 28.5Gi and storage doesn't exceed 88Gi.
+Kubelet evicts pods whenever the overall memory usage across pods exceeds 28.5Gi,
+or if overall disk usage exceeds 88Gi If all processes on the node consume as
+much CPU as they can, pods together cannot consume more than 14.5 CPUs.
If `kube-reserved` and/or `system-reserved` is not enforced and system daemons
exceed their reservation, `kubelet` evicts pods whenever the overall node memory
-usage is higher than `31.5Gi` or `storage` is greater than `90Gi`
+usage is higher than 31.5Gi or `storage` is greater than 90Gi.
diff --git a/content/en/docs/tasks/administer-cluster/safely-drain-node.md b/content/en/docs/tasks/administer-cluster/safely-drain-node.md
index 0fc0a97ffc..04c908c592 100644
--- a/content/en/docs/tasks/administer-cluster/safely-drain-node.md
+++ b/content/en/docs/tasks/administer-cluster/safely-drain-node.md
@@ -29,7 +29,7 @@ This task also assumes that you have met the following prerequisites:
## (Optional) Configure a disruption budget {#configure-poddisruptionbudget}
-To endure that your workloads remain available during maintenance, you can
+To ensure that your workloads remain available during maintenance, you can
configure a [PodDisruptionBudget](/docs/concepts/workloads/pods/disruptions/).
If availability is important for any applications that run or could run on the node(s)
@@ -109,6 +109,28 @@ Pod can be thought of as a kind of policy-controlled DELETE operation on the Pod
itself. To attempt an eviction (more precisely: to attempt to
*create* an Eviction), you POST an attempted operation. Here's an example:
+{{< tabs name="Eviction_example" >}}
+{{% tab name="policy/v1" %}}
+{{< note >}}
+`policy/v1` Eviction is available in v1.22+. Use `policy/v1beta1` with prior releases.
+{{< /note >}}
+
+```json
+{
+ "apiVersion": "policy/v1",
+ "kind": "Eviction",
+ "metadata": {
+ "name": "quux",
+ "namespace": "default"
+ }
+}
+```
+{{% /tab %}}
+{{% tab name="policy/v1beta1" %}}
+{{< note >}}
+Deprecated in v1.22 in favor of `policy/v1`
+{{< /note >}}
+
```json
{
"apiVersion": "policy/v1beta1",
@@ -119,6 +141,8 @@ itself. To attempt an eviction (more precisely: to attempt to
}
}
```
+{{% /tab %}}
+{{< /tabs >}}
You can attempt an eviction using `curl`:
diff --git a/content/en/docs/tasks/administer-cluster/securing-a-cluster.md b/content/en/docs/tasks/administer-cluster/securing-a-cluster.md
index 090e292966..ba820cbe0a 100644
--- a/content/en/docs/tasks/administer-cluster/securing-a-cluster.md
+++ b/content/en/docs/tasks/administer-cluster/securing-a-cluster.md
@@ -26,7 +26,7 @@ and provides recommendations on overall security.
## Controlling access to the Kubernetes API
-As Kubernetes is entirely API driven, controlling and limiting who can access the cluster and what actions
+As Kubernetes is entirely API-driven, controlling and limiting who can access the cluster and what actions
they are allowed to perform is the first line of defense.
### Use Transport Layer Security (TLS) for all API traffic
@@ -40,7 +40,7 @@ potentially unsecured traffic.
### API Authentication
Choose an authentication mechanism for the API servers to use that matches the common access patterns
-when you install a cluster. For instance, small single user clusters may wish to use a simple certificate
+when you install a cluster. For instance, small, single-user clusters may wish to use a simple certificate
or static Bearer token approach. Larger clusters may wish to integrate an existing OIDC or LDAP server that
allow users to be subdivided into groups.
@@ -54,7 +54,7 @@ Consult the [authentication reference document](/docs/reference/access-authn-aut
Once authenticated, every API call is also expected to pass an authorization check. Kubernetes ships
an integrated [Role-Based Access Control (RBAC)](/docs/reference/access-authn-authz/rbac/) component that matches an incoming user or group to a
set of permissions bundled into roles. These permissions combine verbs (get, create, delete) with
-resources (pods, services, nodes) and can be namespace or cluster scoped. A set of out of the box
+resources (pods, services, nodes) and can be namespace-scoped or cluster-scoped. A set of out-of-the-box
roles are provided that offer reasonable default separation of responsibility depending on what
actions a client might want to perform. It is recommended that you use the
[Node](/docs/reference/access-authn-authz/node/) and
@@ -69,8 +69,8 @@ With authorization, it is important to understand how updates on one object may
other places. For instance, a user may not be able to create pods directly, but allowing them to
create a deployment, which creates pods on their behalf, will let them create those pods
indirectly. Likewise, deleting a node from the API will result in the pods scheduled to that node
-being terminated and recreated on other nodes. The out of the box roles represent a balance
-between flexibility and the common use cases, but more limited roles should be carefully reviewed
+being terminated and recreated on other nodes. The out-of-the box roles represent a balance
+between flexibility and common use cases, but more limited roles should be carefully reviewed
to prevent accidental escalation. You can make roles specific to your use case if the out-of-box ones don't meet your needs.
Consult the [authorization reference section](/docs/reference/access-authn-authz/authorization/) for more information.
@@ -104,7 +104,7 @@ reserved resources like memory, or to provide default limits when none are speci
### Controlling what privileges containers run with
A pod definition contains a [security context](/docs/tasks/configure-pod-container/security-context/)
-that allows it to request access to running as a specific Linux user on a node (like root),
+that allows it to request access to run as a specific Linux user on a node (like root),
access to run privileged or access the host network, and other controls that would otherwise
allow it to run unfettered on a hosting node. [Pod security policies](/docs/concepts/policy/pod-security-policy/)
can limit which users or service accounts can provide dangerous security context settings. For example, pod security policies can limit volume mounts, especially `hostPath`, which are aspects of a pod that should be controlled.
@@ -155,10 +155,10 @@ within their namespaces. Many of the supported [Kubernetes networking providers]
now respect network policy.
Quota and limit ranges can also be used to control whether users may request node ports or
-load balanced services, which on many clusters can control whether those users applications
+load-balanced services, which on many clusters can control whether those users applications
are visible outside of the cluster.
-Additional protections may be available that control network rules on a per plugin or per
+Additional protections may be available that control network rules on a per-plugin or per-
environment basis, such as per-node firewalls, physically separating cluster nodes to
prevent cross talk, or advanced networking policy.
@@ -169,7 +169,7 @@ By default these APIs are accessible by pods running on an instance and can cont
credentials for that node, or provisioning data such as kubelet credentials. These credentials
can be used to escalate within the cluster or to other cloud services under the same account.
-When running Kubernetes on a cloud platform limit permissions given to instance credentials, use
+When running Kubernetes on a cloud platform, limit permissions given to instance credentials, use
[network policies](/docs/tasks/administer-cluster/declare-network-policy/) to restrict pod access
to the metadata API, and avoid using provisioning data to deliver secrets.
@@ -177,7 +177,7 @@ to the metadata API, and avoid using provisioning data to deliver secrets.
By default, there are no restrictions on which nodes may run a pod. Kubernetes offers a
[rich set of policies for controlling placement of pods onto nodes](/docs/concepts/scheduling-eviction/assign-pod-node/)
-and the [taint based pod placement and eviction](/docs/concepts/scheduling-eviction/taint-and-toleration/)
+and the [taint-based pod placement and eviction](/docs/concepts/scheduling-eviction/taint-and-toleration/)
that are available to end users. For many clusters use of these policies to separate workloads
can be a convention that authors adopt or enforce via tooling.
@@ -223,8 +223,9 @@ do not use.
The shorter the lifetime of a secret or credential the harder it is for an attacker to make
use of that credential. Set short lifetimes on certificates and automate their rotation. Use
an authentication provider that can control how long issued tokens are available and use short
-lifetimes where possible. If you use service account tokens in external integrations, plan to
-rotate those tokens frequently. For example, once the bootstrap phase is complete, a bootstrap token used for setting up nodes should be revoked or its authorization removed.
+lifetimes where possible. If you use service-account tokens in external integrations, plan to
+rotate those tokens frequently. For example, once the bootstrap phase is complete, a bootstrap
+token used for setting up nodes should be revoked or its authorization removed.
### Review third party integrations before enabling them
@@ -246,7 +247,8 @@ and may grant an attacker significant visibility into the state of your cluster.
your backups using a well reviewed backup and encryption solution, and consider using full disk
encryption where possible.
-Kubernetes supports [encryption at rest](/docs/tasks/administer-cluster/encrypt-data/), a feature introduced in 1.7, and beta since 1.13. This will encrypt `Secret` resources in etcd, preventing
+Kubernetes supports [encryption at rest](/docs/tasks/administer-cluster/encrypt-data/), a feature
+introduced in 1.7, and beta since 1.13. This will encrypt `Secret` resources in etcd, preventing
parties that gain access to your etcd backups from viewing the content of those secrets. While
this feature is currently beta, it offers an additional level of defense when backups
are not encrypted or an attacker gains read access to etcd.
diff --git a/content/en/docs/tasks/administer-cluster/sysctl-cluster.md b/content/en/docs/tasks/administer-cluster/sysctl-cluster.md
index 60af560e30..f81623982f 100644
--- a/content/en/docs/tasks/administer-cluster/sysctl-cluster.md
+++ b/content/en/docs/tasks/administer-cluster/sysctl-cluster.md
@@ -6,19 +6,20 @@ content_type: task
---
-{{< feature-state for_k8s_version="v1.12" state="beta" >}}
+
+{{< feature-state for_k8s_version="v1.21" state="stable" >}}
This document describes how to configure and use kernel parameters within a
Kubernetes cluster using the {{< glossary_tooltip term_id="sysctl" >}}
interface.
-
-
## {{% heading "prerequisites" %}}
-{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
+{{< include "task-tutorial-prereqs.md" >}}
+For some steps, you also need to be able to reconfigure the command line
+options for the kubelets running on your cluster.
@@ -166,6 +167,8 @@ to schedule those pods onto the right nodes.
## PodSecurityPolicy
+{{< feature-state for_k8s_version="v1.21" state="deprecated" >}}
+
You can further control which sysctls can be set in pods by specifying lists of
sysctls or sysctl patterns in the `forbiddenSysctls` and/or
`allowedUnsafeSysctls` fields of the PodSecurityPolicy. A sysctl pattern ends
diff --git a/content/en/docs/tasks/administer-cluster/topology-manager.md b/content/en/docs/tasks/administer-cluster/topology-manager.md
index 7d3f017940..e8d2e7c19d 100644
--- a/content/en/docs/tasks/administer-cluster/topology-manager.md
+++ b/content/en/docs/tasks/administer-cluster/topology-manager.md
@@ -69,6 +69,10 @@ Details on the various `scopes` and `policies` available today can be found belo
To align CPU resources with other requested resources in a Pod Spec, the CPU Manager should be enabled and proper CPU Manager policy should be configured on a Node. See [control CPU Management Policies](/docs/tasks/administer-cluster/cpu-management-policies/).
{{< /note >}}
+{{< note >}}
+To align memory (and hugepages) resources with other requested resources in a Pod Spec, the Memory Manager should be enabled and proper Memory Manager policy should be configured on a Node. Examine [Memory Manager](/docs/tasks/administer-cluster/memory-manager/) documentation.
+{{< /note >}}
+
### Topology Manager Scopes
The Topology Manager can deal with the alignment of resources in a couple of distinct scopes:
@@ -263,8 +267,4 @@ Using this information the Topology Manager calculates the optimal hint for the
### Known Limitations
1. The maximum number of NUMA nodes that Topology Manager allows is 8. With more than 8 NUMA nodes there will be a state explosion when trying to enumerate the possible NUMA affinities and generating their hints.
-2. The scheduler is not topology-aware, so it is possible to be scheduled on a node and then fail on the node due to the Topology Manager.
-
-3. The Device Manager and the CPU Manager are the only components to adopt the Topology Manager's HintProvider interface. This means that NUMA alignment can only be achieved for resources managed by the CPU Manager and the Device Manager. Memory or Hugepages are not considered by the Topology Manager for NUMA alignment.
-
-
+2. The scheduler is not topology-aware, so it is possible to be scheduled on a node and then fail on the node due to the Topology Manager.
\ No newline at end of file
diff --git a/content/en/docs/tasks/administer-cluster/use-cascading-deletion.md b/content/en/docs/tasks/administer-cluster/use-cascading-deletion.md
new file mode 100644
index 0000000000..977278ae60
--- /dev/null
+++ b/content/en/docs/tasks/administer-cluster/use-cascading-deletion.md
@@ -0,0 +1,352 @@
+---
+title: Use Cascading Deletion in a Cluster
+content_type: task
+---
+
+
+
+This page shows you how to specify the type of [cascading deletion](/docs/concepts/workloads/controllers/garbage-collection/#cascading-deletion)
+to use in your cluster during {{}}.
+
+## {{% heading "prerequisites" %}}
+
+{{< include "task-tutorial-prereqs.md" >}}
+
+You also need to [create a sample Deployment](/docs/tasks/run-application/run-stateless-application-deployment/#creating-and-exploring-an-nginx-deployment)
+to experiment with the different types of cascading deletion. You will need to
+recreate the Deployment for each type.
+
+## Check owner references on your pods
+
+Check that the `ownerReferences` field is present on your pods:
+
+```shell
+kubectl get pods -l app=nginx --output=yaml
+```
+
+The output has an `ownerReferences` field similar to this:
+
+```
+apiVersion: v1
+ ...
+ ownerReferences:
+ - apiVersion: apps/v1
+ blockOwnerDeletion: true
+ controller: true
+ kind: ReplicaSet
+ name: nginx-deployment-6b474476c4
+ uid: 4fdcd81c-bd5d-41f7-97af-3a3b759af9a7
+ ...
+```
+
+## Use foreground cascading deletion {#use-foreground-cascading-deletion}
+
+By default, Kubernetes uses [background cascading deletion](/docs/concepts/workloads/controllers/garbage-collection/#background-deletion)
+to delete dependents of an object. You can switch to foreground cascading deletion
+using either `kubectl` or the Kubernetes API, depending on the Kubernetes
+version your cluster runs. {{}}
+
+{{}}
+{{% tab name="Kubernetes 1.20.x and later" %}}
+You can delete objects using foreground cascading deletion using `kubectl` or the
+Kubernetes API.
+
+**Using kubectl**
+
+Run the following command:
+
+
+```shell
+kubectl delete deployment nginx-deployment --cascade=foreground
+```
+
+**Using the Kubernetes API**
+
+1. Start a local proxy session:
+
+ ```shell
+ kubectl proxy --port=8080
+ ```
+
+1. Use `curl` to trigger deletion:
+
+ ```shell
+ curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
+ -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \
+ -H "Content-Type: application/json"
+ ```
+
+ The output contains a `foregroundDeletion` {{}}
+ like this:
+
+ ```
+ "kind": "Deployment",
+ "apiVersion": "apps/v1",
+ "metadata": {
+ "name": "nginx-deployment",
+ "namespace": "default",
+ "uid": "d1ce1b02-cae8-4288-8a53-30e84d8fa505",
+ "resourceVersion": "1363097",
+ "creationTimestamp": "2021-07-08T20:24:37Z",
+ "deletionTimestamp": "2021-07-08T20:27:39Z",
+ "finalizers": [
+ "foregroundDeletion"
+ ]
+ ...
+ ```
+
+{{% /tab %}}
+{{% tab name="Versions prior to Kubernetes 1.20.x" %}}
+You can delete objects using foreground cascading deletion by calling the
+Kubernetes API.
+
+For details, read the [documentation for your Kubernetes version](/docs/home/supported-doc-versions/).
+
+1. Start a local proxy session:
+
+ ```shell
+ kubectl proxy --port=8080
+ ```
+
+1. Use `curl` to trigger deletion:
+
+ ```shell
+ curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
+ -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \
+ -H "Content-Type: application/json"
+ ```
+
+ The output contains a `foregroundDeletion` {{}}
+ like this:
+
+ ```
+ "kind": "Deployment",
+ "apiVersion": "apps/v1",
+ "metadata": {
+ "name": "nginx-deployment",
+ "namespace": "default",
+ "uid": "d1ce1b02-cae8-4288-8a53-30e84d8fa505",
+ "resourceVersion": "1363097",
+ "creationTimestamp": "2021-07-08T20:24:37Z",
+ "deletionTimestamp": "2021-07-08T20:27:39Z",
+ "finalizers": [
+ "foregroundDeletion"
+ ]
+ ...
+ ```
+{{% /tab %}}
+{{}}
+
+## Use background cascading deletion {#use-background-cascading-deletion}
+
+1. [Create a sample Deployment](/docs/tasks/run-application/run-stateless-application-deployment/#creating-and-exploring-an-nginx-deployment).
+1. Use either `kubectl` or the Kubernetes API to delete the Deployment,
+ depending on the Kubernetes version your cluster runs. {{}}
+
+{{}}
+{{% tab name="Kubernetes version 1.20.x and later" %}}
+
+You can delete objects using background cascading deletion using `kubectl`
+or the Kubernetes API.
+
+Kubernetes uses background cascading deletion by default, and does so
+even if you run the following commands without the `--cascade` flag or the
+`propagationPolicy` argument.
+
+**Using kubectl**
+
+Run the following command:
+
+```shell
+kubectl delete deployment nginx-deployment --cascade=background
+```
+
+**Using the Kubernetes API**
+
+1. Start a local proxy session:
+
+ ```shell
+ kubectl proxy --port=8080
+ ```
+
+1. Use `curl` to trigger deletion:
+
+ ```shell
+ curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
+ -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Background"}' \
+ -H "Content-Type: application/json"
+ ```
+
+ The output is similar to this:
+
+ ```
+ "kind": "Status",
+ "apiVersion": "v1",
+ ...
+ "status": "Success",
+ "details": {
+ "name": "nginx-deployment",
+ "group": "apps",
+ "kind": "deployments",
+ "uid": "cc9eefb9-2d49-4445-b1c1-d261c9396456"
+ }
+ ```
+{{% /tab %}}
+{{% tab name="Versions prior to Kubernetes 1.20.x" %}}
+Kubernetes uses background cascading deletion by default, and does so
+even if you run the following commands without the `--cascade` flag or the
+`propagationPolicy: Background` argument.
+
+For details, read the [documentation for your Kubernetes version](/docs/home/supported-doc-versions/).
+
+**Using kubectl**
+
+Run the following command:
+
+```shell
+kubectl delete deployment nginx-deployment --cascade=true
+```
+
+**Using the Kubernetes API**
+
+1. Start a local proxy session:
+
+ ```shell
+ kubectl proxy --port=8080
+ ```
+
+1. Use `curl` to trigger deletion:
+
+ ```shell
+ curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
+ -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Background"}' \
+ -H "Content-Type: application/json"
+ ```
+
+ The output is similar to this:
+
+ ```
+ "kind": "Status",
+ "apiVersion": "v1",
+ ...
+ "status": "Success",
+ "details": {
+ "name": "nginx-deployment",
+ "group": "apps",
+ "kind": "deployments",
+ "uid": "cc9eefb9-2d49-4445-b1c1-d261c9396456"
+ }
+ ```
+{{% /tab %}}
+{{}}
+
+
+## Delete owner objects and orphan dependents {#set-orphan-deletion-policy}
+
+By default, when you tell Kubernetes to delete an object, the
+{{}} also deletes
+dependent objects. You can make Kubernetes *orphan* these dependents using
+`kubectl` or the Kubernetes API, depending on the Kubernetes version your
+cluster runs. {{}}
+
+{{}}
+{{% tab name="Kubernetes version 1.20.x and later" %}}
+
+**Using kubectl**
+
+Run the following command:
+
+```shell
+kubectl delete deployment nginx-deployment --cascade=orphan
+```
+
+**Using the Kubernetes API**
+
+1. Start a local proxy session:
+
+ ```shell
+ kubectl proxy --port=8080
+ ```
+
+1. Use `curl` to trigger deletion:
+
+ ```shell
+ curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
+ -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \
+ -H "Content-Type: application/json"
+ ```
+
+ The output contains `orphan` in the `finalizers` field, similar to this:
+
+ ```
+ "kind": "Deployment",
+ "apiVersion": "apps/v1",
+ "namespace": "default",
+ "uid": "6f577034-42a0-479d-be21-78018c466f1f",
+ "creationTimestamp": "2021-07-09T16:46:37Z",
+ "deletionTimestamp": "2021-07-09T16:47:08Z",
+ "deletionGracePeriodSeconds": 0,
+ "finalizers": [
+ "orphan"
+ ],
+ ...
+ ```
+
+{{% /tab %}}
+{{% tab name="Versions prior to Kubernetes 1.20.x" %}}
+
+For details, read the [documentation for your Kubernetes version](/docs/home/supported-doc-versions/).
+
+**Using kubectl**
+
+Run the following command:
+
+```shell
+kubectl delete deployment nginx-deployment --cascade=orphan
+```
+
+**Using the Kubernetes API**
+
+1. Start a local proxy session:
+
+ ```shell
+ kubectl proxy --port=8080
+ ```
+
+1. Use `curl` to trigger deletion:
+
+ ```shell
+ curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/deployments/nginx-deployment \
+ -d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \
+ -H "Content-Type: application/json"
+ ```
+
+ The output contains `orphan` in the `finalizers` field, similar to this:
+
+ ```
+ "kind": "Deployment",
+ "apiVersion": "apps/v1",
+ "namespace": "default",
+ "uid": "6f577034-42a0-479d-be21-78018c466f1f",
+ "creationTimestamp": "2021-07-09T16:46:37Z",
+ "deletionTimestamp": "2021-07-09T16:47:08Z",
+ "deletionGracePeriodSeconds": 0,
+ "finalizers": [
+ "orphan"
+ ],
+ ...
+ ```
+{{% /tab %}}
+{{}}
+
+You can check that the Pods managed by the Deployment are still running:
+
+```shell
+kubectl get pods -l app=nginx
+```
+
+## {{% heading "whatsnext" %}}
+
+* Learn about [owners and dependents](/docs/concepts/overview/working-with-objects/owners-dependents/) in Kubernetes.
+* Learn about Kubernetes [finalizers](/docs/concepts/overview/working-with-objects/finalizers/).
+* Learn about [garbage collection](/docs/concepts/workloads/controllers/garbage-collection/).
\ No newline at end of file
diff --git a/content/en/docs/tasks/configmap-secret/_index.md b/content/en/docs/tasks/configmap-secret/_index.md
old mode 100755
new mode 100644
diff --git a/content/en/docs/tasks/configmap-secret/managing-secret-using-config-file.md b/content/en/docs/tasks/configmap-secret/managing-secret-using-config-file.md
index b405d57baf..6fb5cdca3d 100644
--- a/content/en/docs/tasks/configmap-secret/managing-secret-using-config-file.md
+++ b/content/en/docs/tasks/configmap-secret/managing-secret-using-config-file.md
@@ -1,5 +1,5 @@
---
-title: Managing Secret using Configuration File
+title: Managing Secrets using Configuration File
content_type: task
weight: 20
description: Creating Secret objects using resource configuration file.
@@ -131,6 +131,8 @@ The output is similar to:
```yaml
apiVersion: v1
+data:
+ config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
kind: Secret
metadata:
creationTimestamp: 2018-11-15T20:40:59Z
@@ -139,8 +141,6 @@ metadata:
resourceVersion: "7225"
uid: c280ad2e-e916-11e8-98f2-025000000001
type: Opaque
-data:
- config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
```
The commands `kubectl get` and `kubectl describe` avoid showing the contents of a `Secret` by
@@ -168,6 +168,8 @@ Results in the following Secret:
```yaml
apiVersion: v1
+data:
+ username: YWRtaW5pc3RyYXRvcg==
kind: Secret
metadata:
creationTimestamp: 2018-11-15T20:46:46Z
@@ -176,8 +178,6 @@ metadata:
resourceVersion: "7579"
uid: 91460ecb-e917-11e8-98f2-025000000001
type: Opaque
-data:
- username: YWRtaW5pc3RyYXRvcg==
```
Where `YWRtaW5pc3RyYXRvcg==` decodes to `administrator`.
@@ -193,6 +193,6 @@ kubectl delete secret mysecret
## {{% heading "whatsnext" %}}
- Read more about the [Secret concept](/docs/concepts/configuration/secret/)
-- Learn how to [manage Secret with the `kubectl` command](/docs/tasks/configmap-secret/managing-secret-using-kubectl/)
-- Learn how to [manage Secret using kustomize](/docs/tasks/configmap-secret/managing-secret-using-kustomize/)
+- Learn how to [manage Secrets with the `kubectl` command](/docs/tasks/configmap-secret/managing-secret-using-kubectl/)
+- Learn how to [manage Secrets using kustomize](/docs/tasks/configmap-secret/managing-secret-using-kustomize/)
diff --git a/content/en/docs/tasks/configmap-secret/managing-secret-using-kubectl.md b/content/en/docs/tasks/configmap-secret/managing-secret-using-kubectl.md
index 293915736e..dad86e36df 100644
--- a/content/en/docs/tasks/configmap-secret/managing-secret-using-kubectl.md
+++ b/content/en/docs/tasks/configmap-secret/managing-secret-using-kubectl.md
@@ -1,5 +1,5 @@
---
-title: Managing Secret using kubectl
+title: Managing Secrets using kubectl
content_type: task
weight: 10
description: Creating Secret objects using kubectl command line.
@@ -15,7 +15,7 @@ description: Creating Secret objects using kubectl command line.
## Create a Secret
-A `Secret` can contain user credentials required by Pods to access a database.
+A `Secret` can contain user credentials required by pods to access a database.
For example, a database connection string consists of a username and password.
You can store the username in a file `./username.txt` and the password in a
file `./password.txt` on your local machine.
@@ -24,11 +24,10 @@ file `./password.txt` on your local machine.
echo -n 'admin' > ./username.txt
echo -n '1f2d1e2e67df' > ./password.txt
```
-
-The `-n` flag in the above two commands ensures that the generated files will
-not contain an extra newline character at the end of the text. This is
-important because when `kubectl` reads a file and encode the content into
-base64 string, the extra newline character gets encoded too.
+In these commands, the `-n` flag ensures that the generated files do not have
+an extra newline character at the end of the text. This is important because
+when `kubectl` reads a file and encodes the content into a base64 string, the
+extra newline character gets encoded too.
The `kubectl create secret` command packages these files into a Secret and creates
the object on the API server.
@@ -45,7 +44,7 @@ The output is similar to:
secret/db-user-pass created
```
-Default key name is the filename. You may optionally set the key name using
+The default key name is the filename. You can optionally set the key name using
`--from-file=[key=]source`. For example:
```shell
@@ -54,27 +53,28 @@ kubectl create secret generic db-user-pass \
--from-file=password=./password.txt
```
-You do not need to escape special characters in passwords from files
-(`--from-file`).
+You do not need to escape special characters in password strings that you
+include in a file.
You can also provide Secret data using the `--from-literal==` tag.
This tag can be specified more than once to provide multiple key-value pairs.
Note that special characters such as `$`, `\`, `*`, `=`, and `!` will be
interpreted by your [shell](https://en.wikipedia.org/wiki/Shell_(computing))
and require escaping.
+
In most shells, the easiest way to escape the password is to surround it with
-single quotes (`'`). For example, if your actual password is `S!B\*d$zDsb=`,
-you should execute the command this way:
+single quotes (`'`). For example, if your password is `S!B\*d$zDsb=`,
+run the following command:
```shell
-kubectl create secret generic dev-db-secret \
+kubectl create secret generic db-user-pass \
--from-literal=username=devuser \
--from-literal=password='S!B\*d$zDsb='
```
## Verify the Secret
-You can check that the secret was created:
+Check that the Secret was created:
```shell
kubectl get secrets
@@ -111,7 +111,7 @@ username: 5 bytes
The commands `kubectl get` and `kubectl describe` avoid showing the contents
of a `Secret` by default. This is to protect the `Secret` from being exposed
-accidentally to an onlooker, or from being stored in a terminal log.
+accidentally, or from being stored in a terminal log.
## Decoding the Secret {#decoding-secret}
@@ -141,7 +141,7 @@ The output is similar to:
## Clean Up
-To delete the Secret you have created:
+Delete the Secret you created:
```shell
kubectl delete secret db-user-pass
@@ -152,5 +152,5 @@ kubectl delete secret db-user-pass
## {{% heading "whatsnext" %}}
- Read more about the [Secret concept](/docs/concepts/configuration/secret/)
-- Learn how to [manage Secret using config file](/docs/tasks/configmap-secret/managing-secret-using-config-file/)
-- Learn how to [manage Secret using kustomize](/docs/tasks/configmap-secret/managing-secret-using-kustomize/)
+- Learn how to [manage Secrets using config files](/docs/tasks/configmap-secret/managing-secret-using-config-file/)
+- Learn how to [manage Secrets using kustomize](/docs/tasks/configmap-secret/managing-secret-using-kustomize/)
diff --git a/content/en/docs/tasks/configmap-secret/managing-secret-using-kustomize.md b/content/en/docs/tasks/configmap-secret/managing-secret-using-kustomize.md
index fb257a6026..db9f5b40f3 100644
--- a/content/en/docs/tasks/configmap-secret/managing-secret-using-kustomize.md
+++ b/content/en/docs/tasks/configmap-secret/managing-secret-using-kustomize.md
@@ -1,5 +1,5 @@
---
-title: Managing Secret using Kustomize
+title: Managing Secrets using Kustomize
content_type: task
weight: 30
description: Creating Secret objects using kustomization.yaml file.
@@ -48,7 +48,19 @@ secretGenerator:
- password=1f2d1e2e67df
```
-Note that in both cases, you don't need to base64 encode the values.
+You can also define the `secretGenerator` in the `kustomization.yaml`
+file by providing `.env` files.
+For example, the following `kustomization.yaml` file pulls in data from
+`.env.secret` file:
+
+```yaml
+secretGenerator:
+- name: db-user-pass
+ envs:
+ - .env.secret
+```
+
+Note that in all cases, you don't need to base64 encode the values.
## Create the Secret
@@ -123,6 +135,6 @@ kubectl delete secret db-user-pass-96mffmfh4k
## {{% heading "whatsnext" %}}
- Read more about the [Secret concept](/docs/concepts/configuration/secret/)
-- Learn how to [manage Secret with the `kubectl` command](/docs/tasks/configmap-secret/managing-secret-using-kubectl/)
-- Learn how to [manage Secret using config file](/docs/tasks/configmap-secret/managing-secret-using-config-file/)
+- Learn how to [manage Secrets with the `kubectl` command](/docs/tasks/configmap-secret/managing-secret-using-kubectl/)
+- Learn how to [manage Secrets using config file](/docs/tasks/configmap-secret/managing-secret-using-config-file/)
diff --git a/content/en/docs/tasks/configure-pod-container/_index.md b/content/en/docs/tasks/configure-pod-container/_index.md
old mode 100755
new mode 100644
diff --git a/content/en/docs/tasks/configure-pod-container/configure-gmsa.md b/content/en/docs/tasks/configure-pod-container/configure-gmsa.md
index 360deada02..0073feea24 100644
--- a/content/en/docs/tasks/configure-pod-container/configure-gmsa.md
+++ b/content/en/docs/tasks/configure-pod-container/configure-gmsa.md
@@ -197,21 +197,70 @@ As Pod specs with GMSA fields populated (as described above) are applied in a cl
1. The container runtime configures each Windows container with the specified GMSA credential spec so that the container can assume the identity of the GMSA in Active Directory and access services in the domain using that identity.
+## Containerd
+
+On Windows Server 2019, in order to use GMSA with containerd, you must be running OS Build 17763.1817 (or later) which can be installed using the patch [KB5000822](https://support.microsoft.com/en-us/topic/march-9-2021-kb5000822-os-build-17763-1817-2eb6197f-e3b1-4f42-ab51-84345e063564).
+
+There is also a known issue with containerd that occurs when trying to connect to SMB shares from Pods. Once you have configured GMSA, the pod will be unable to connect to the share using the hostname or FQDN, but connecting to the share using an IP address works as expected.
+
+```PowerShell
+ping adserver.ad.local
+```
+and correctly resolves the hostname to an IPv4 address. The output is similar to:
+
+```
+Pinging adserver.ad.local [192.168.111.18] with 32 bytes of data:
+Reply from 192.168.111.18: bytes=32 time=6ms TTL=124
+Reply from 192.168.111.18: bytes=32 time=5ms TTL=124
+Reply from 192.168.111.18: bytes=32 time=5ms TTL=124
+Reply from 192.168.111.18: bytes=32 time=5ms TTL=124
+```
+
+However, when attempting to browse the directory using the hostname
+
+```PowerShell
+cd \\adserver.ad.local\test
+```
+
+you see an error that implies the target share doesn't exist:
+
+```
+cd : Cannot find path '\\adserver.ad.local\test' because it does not exist.
+At line:1 char:1
++ cd \\adserver.ad.local\test
++ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ + CategoryInfo : ObjectNotFound: (\\adserver.ad.local\test:String) [Set-Location], ItemNotFoundException
+ + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetLocationCommand
+```
+
+but you notice that the error disappears if you browse to the share using its IPv4 address instead; for example:
+
+```PowerShell
+cd \\192.168.111.18\test
+```
+
+After you change into a directory within the share, you see a prompt similar to:
+
+```
+Microsoft.PowerShell.Core\FileSystem::\\192.168.111.18\test>
+```
+
+To correct the behaviour you must run the following on the node `reg add "HKLM\SYSTEM\CurrentControlSet\Services\hns\State" /v EnableCompartmentNamespace /t REG_DWORD /d 1` to add the required registry key. This node change will only take effect in newly created pods, meaning you must now recreate any running pods which require access to SMB shares.
+
## Troubleshooting
If you are having difficulties getting GMSA to work in your environment, there are a few troubleshooting steps you can take.
-First, make sure the credspec has been passed to the Pod. To do this you will need to `exec` into one of your Pods and check the output of the `nltest.exe /parentdomain` command. In the example below the Pod did not get the credspec correctly:
+First, make sure the credspec has been passed to the Pod. To do this you will need to `exec` into one of your Pods and check the output of the `nltest.exe /parentdomain` command.
-```shell
+In the example below the Pod did not get the credspec correctly:
+
+```PowerShell
kubectl exec -it iis-auth-7776966999-n5nzr powershell.exe
-
-Windows PowerShell
-Copyright (C) Microsoft Corporation. All rights reserved.
-
-PS C:\> nltest.exe /parentdomain
+```
+nltest.exe /parentdomain` results in the following error:
+```
Getting parent domain failed: Status = 1722 0x6ba RPC_S_SERVER_UNAVAILABLE
-PS C:\>
```
If your Pod did get the credspec correctly, then next check communication with the domain. First, from inside of your Pod, quickly do an nslookup to find the root of your domain.
@@ -224,23 +273,30 @@ This will tell us 3 things:
If the DNS and communication test passes, next you will need to check if the Pod has established secure channel communication with the domain. To do this, again, `exec` into your Pod and run the `nltest.exe /query` command.
-```shell
-PS C:\> nltest.exe /query
+```PowerShell
+nltest.exe /query
+```
+
+Results in the following output:
+```
I_NetLogonControl failed: Status = 1722 0x6ba RPC_S_SERVER_UNAVAILABLE
```
-This tells us that for some reason, the Pod was unable to logon to the domain using the account specified in the credspec. You can try to repair the secure channel by running the `nltest.exe /sc_reset:domain.example` command.
+This tells us that for some reason, the Pod was unable to logon to the domain using the account specified in the credspec. You can try to repair the secure channel by running the following:
-```shell
-PS C:\> nltest /sc_reset:domain.example
+```PowerShell
+nltest /sc_reset:domain.example
+```
+
+If the command is successful you will see and output similar to this:
+```
Flags: 30 HAS_IP HAS_TIMESERV
Trusted DC Name \\dc10.domain.example
Trusted DC Connection Status Status = 0 0x0 NERR_Success
The command completed successfully
-PS C:\>
```
-If the above command corrects the error, you can automate the step by adding the following lifecycle hook to your Pod spec. If it did not correct the error, you will need to examine your credspec again and confirm that it is correct and complete.
+If the above corrects the error, you can automate the step by adding the following lifecycle hook to your Pod spec. If it did not correct the error, you will need to examine your credspec again and confirm that it is correct and complete.
```yaml
image: registry.domain.example/iis-auth:1809v1
@@ -252,6 +308,3 @@ If the above command corrects the error, you can automate the step by adding the
```
If you add the `lifecycle` section show above to your Pod spec, the Pod will execute the commands listed to restart the `netlogon` service until the `nltest.exe /query` command exits without error.
-
-## GMSA limitations
-When using the [ContainerD runtime for Windows](/docs/setup/production-environment/windows/intro-windows-in-kubernetes/#cri-containerd) accessing restricted network shares via the GMSA domain identity fails. The container will receive the identity of and calls from `nltest.exe /query` will work. It is recommended to use the [Docker EE runtime](/docs/setup/production-environment/windows/intro-windows-in-kubernetes/#docker-ee) if access to network shares is required. The Windows Server team is working on resolving the issue in the Windows Kernel and will release a patch to resolve this issue in the future. Look for updates on the [Microsoft Windows Containers issue tracker](https://github.com/microsoft/Windows-Containers/issues/44).
diff --git a/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md b/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md
index 918a5bf33e..d9ab2056da 100644
--- a/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md
+++ b/content/en/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes.md
@@ -30,7 +30,7 @@ getting killed by the kubelet before they are up and running.
## {{% heading "prerequisites" %}}
-{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
+{{< include "task-tutorial-prereqs.md" >}}
@@ -145,7 +145,7 @@ Any code greater than or equal to 200 and less than 400 indicates success. Any
other code indicates failure.
You can see the source code for the server in
-[server.go](https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/test/images/agnhost/liveness/server.go).
+[server.go](https://github.com/kubernetes/kubernetes/blob/master/test/images/agnhost/liveness/server.go).
For the first 10 seconds that the container is alive, the `/healthz` handler
returns a status of 200. After that, the handler returns a status of 500.
@@ -427,7 +427,63 @@ For a TCP probe, the kubelet makes the probe connection at the node, not in the
means that you can not use a service name in the `host` parameter since the kubelet is unable
to resolve it.
+### Probe-level `terminationGracePeriodSeconds`
+{{< feature-state for_k8s_version="v1.22" state="beta" >}}
+
+Prior to release 1.21, the pod-level `terminationGracePeriodSeconds` was used
+for terminating a container that failed its liveness or startup probe. This
+coupling was unintended and may have resulted in failed containers taking an
+unusually long time to restart when a pod-level `terminationGracePeriodSeconds`
+was set.
+
+In 1.21 and beyond, when the feature gate `ProbeTerminationGracePeriod` is
+enabled, users can specify a probe-level `terminationGracePeriodSeconds` as
+part of the probe specification. When the feature gate is enabled, and both a
+pod- and probe-level `terminationGracePeriodSeconds` are set, the kubelet will
+use the probe-level value.
+
+{{< note >}}
+As of Kubernetes 1.22, the `ProbeTerminationGracePeriod` feature gate is only
+available on the API Server. The kubelet always honors the probe-level
+`terminationGracePeriodSeconds` field if it is present on a Pod.
+
+If you have existing Pods where the `terminationGracePeriodSeconds` field is set and
+you no longer wish to use per-probe termination grace periods, you must delete
+those existing Pods.
+
+When you (or the control plane, or some other component) create replacement
+Pods, and the feature gate `ProbeTerminationGracePeriod` is disabled, then the
+API server ignores the Pod-level `terminationGracePeriodSeconds` field, even if
+a Pod or pod template specifies it.
+{{< /note >}}
+
+For example,
+
+```yaml
+spec:
+ terminationGracePeriodSeconds: 3600 # pod-level
+ containers:
+ - name: test
+ image: ...
+
+ ports:
+ - name: liveness-port
+ containerPort: 8080
+ hostPort: 8080
+
+ livenessProbe:
+ httpGet:
+ path: /healthz
+ port: liveness-port
+ failureThreshold: 1
+ periodSeconds: 60
+ # Override pod-level terminationGracePeriodSeconds #
+ terminationGracePeriodSeconds: 60
+```
+
+Probe-level `terminationGracePeriodSeconds` cannot be set for readiness probes.
+It will be rejected by the API server.
## {{% heading "whatsnext" %}}
diff --git a/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md b/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md
index 40987152e8..d52a4acc66 100644
--- a/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md
+++ b/content/en/docs/tasks/configure-pod-container/configure-pod-configmap.md
@@ -624,9 +624,20 @@ Like before, all previous files in the `/etc/config/` directory will be deleted.
You can project keys to specific paths and specific permissions on a per-file
basis. The [Secrets](/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod) user guide explains the syntax.
+### Optional References
+
+A ConfigMap reference may be marked "optional". If the ConfigMap is non-existent, the mounted volume will be empty. If the ConfigMap exists, but the referenced
+key is non-existent the path will be absent beneath the mount point.
+
### Mounted ConfigMaps are updated automatically
-When a ConfigMap already being consumed in a volume is updated, projected keys are eventually updated as well. Kubelet is checking whether the mounted ConfigMap is fresh on every periodic sync. However, it is using its local ttl-based cache for getting the current value of the ConfigMap. As a result, the total delay from the moment when the ConfigMap is updated to the moment when new keys are projected to the pod can be as long as kubelet sync period (1 minute by default) + ttl of ConfigMaps cache (1 minute by default) in kubelet. You can trigger an immediate refresh by updating one of the pod's annotations.
+When a mounted ConfigMap is updated, the projected content is eventually updated too. This applies in the case where an optionally referenced ConfigMap comes into
+existence after a pod has started.
+
+Kubelet checks whether the mounted ConfigMap is fresh on every periodic sync. However, it uses its local TTL-based cache for getting the current value of the
+ConfigMap. As a result, the total delay from the moment when the ConfigMap is updated to the moment when new keys are projected to the pod can be as long as
+kubelet sync period (1 minute by default) + TTL of ConfigMaps cache (1 minute by default) in kubelet. You can trigger an immediate refresh by updating one of
+the pod's annotations.
{{< note >}}
A container using a ConfigMap as a [subPath](/docs/concepts/storage/volumes/#using-subpath) volume will not receive ConfigMap updates.
diff --git a/content/en/docs/tasks/configure-pod-container/configure-projected-volume-storage.md b/content/en/docs/tasks/configure-pod-container/configure-projected-volume-storage.md
index ad99a05c27..ca71e7a721 100644
--- a/content/en/docs/tasks/configure-pod-container/configure-projected-volume-storage.md
+++ b/content/en/docs/tasks/configure-pod-container/configure-projected-volume-storage.md
@@ -83,5 +83,5 @@ kubectl delete secret user pass
## {{% heading "whatsnext" %}}
* Learn more about [`projected`](/docs/concepts/storage/volumes/#projected) volumes.
-* Read the [all-in-one volume](https://github.com/kubernetes/community/blob/{{< param "githubbranch" >}}/contributors/design-proposals/node/all-in-one-volume.md) design document.
+* Read the [all-in-one volume](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/all-in-one-volume.md) design document.
diff --git a/content/en/docs/tasks/configure-pod-container/configure-runasusername.md b/content/en/docs/tasks/configure-pod-container/configure-runasusername.md
index 12c10a9ddf..9ddcac270f 100644
--- a/content/en/docs/tasks/configure-pod-container/configure-runasusername.md
+++ b/content/en/docs/tasks/configure-pod-container/configure-runasusername.md
@@ -23,7 +23,7 @@ You need to have a Kubernetes cluster and the kubectl command-line tool must be
## Set the Username for a Pod
-To specify the username with which to execute the Pod's container processes, include the `securityContext` field ([PodSecurityContext](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podsecuritycontext-v1-core) in the Pod specification, and within it, the `windowsOptions` ([WindowsSecurityContextOptions](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#windowssecuritycontextoptions-v1-core) field containing the `runAsUserName` field.
+To specify the username with which to execute the Pod's container processes, include the `securityContext` field ([PodSecurityContext](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podsecuritycontext-v1-core)) in the Pod specification, and within it, the `windowsOptions` ([WindowsSecurityContextOptions](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#windowssecuritycontextoptions-v1-core)) field containing the `runAsUserName` field.
The Windows security context options that you specify for a Pod apply to all Containers and init Containers in the Pod.
@@ -63,7 +63,7 @@ ContainerUser
## Set the Username for a Container
-To specify the username with which to execute a Container's processes, include the `securityContext` field ([SecurityContext](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#securitycontext-v1-core)) in the Container manifest, and within it, the `windowsOptions` ([WindowsSecurityContextOptions](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#windowssecuritycontextoptions-v1-core) field containing the `runAsUserName` field.
+To specify the username with which to execute a Container's processes, include the `securityContext` field ([SecurityContext](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#securitycontext-v1-core)) in the Container manifest, and within it, the `windowsOptions` ([WindowsSecurityContextOptions](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#windowssecuritycontextoptions-v1-core)) field containing the `runAsUserName` field.
The Windows security context options that you specify for a Container apply only to that individual Container, and they override the settings made at the Pod level.
diff --git a/content/en/docs/tasks/configure-pod-container/configure-service-account.md b/content/en/docs/tasks/configure-pod-container/configure-service-account.md
index d96a5c8270..e5a0e26ea0 100644
--- a/content/en/docs/tasks/configure-pod-container/configure-service-account.md
+++ b/content/en/docs/tasks/configure-pod-container/configure-service-account.md
@@ -167,8 +167,8 @@ The output is similar to this:
Name: build-robot-secret
Namespace: default
Labels:
-Annotations: kubernetes.io/service-account.name=build-robot
- kubernetes.io/service-account.uid=da68f9c6-9d26-11e7-b84e-002dc52800da
+Annotations: kubernetes.io/service-account.name: build-robot
+ kubernetes.io/service-account.uid: da68f9c6-9d26-11e7-b84e-002dc52800da
Type: kubernetes.io/service-account-token
@@ -323,11 +323,10 @@ The application is responsible for reloading the token when it rotates. Periodic
## Service Account Issuer Discovery
-{{< feature-state for_k8s_version="v1.20" state="beta" >}}
+{{< feature-state for_k8s_version="v1.21" state="stable" >}}
-The Service Account Issuer Discovery feature is enabled by enabling the
-`ServiceAccountIssuerDiscovery` [feature gate](/docs/reference/command-line-tools-reference/feature-gates)
-and then enabling the Service Account Token Projection feature as described
+The Service Account Issuer Discovery feature is enabled when the Service Account
+Token Projection feature is enabled, as described
[above](#service-account-token-volume-projection).
{{< note >}}
@@ -349,9 +348,12 @@ Configuration document at `/.well-known/openid-configuration` and the associated
JSON Web Key Set (JWKS) at `/openid/v1/jwks`. The OpenID Provider Configuration
is sometimes referred to as the _discovery document_.
-When enabled, the cluster is also configured with a default RBAC ClusterRole
-called `system:service-account-issuer-discovery`. No role bindings are provided
-by default. Administrators may, for example, choose whether to bind the role to
+Clusters include a default RBAC ClusterRole called
+`system:service-account-issuer-discovery`. A default RBAC ClusterRoleBinding
+assigns this role to the `system:serviceaccounts` group, which all service
+accounts implicitly belong to. This allows pods running on the cluster to access
+the service account discovery document via their mounted service account token.
+Administrators may, additionally, choose to bind the role to
`system:authenticated` or `system:unauthenticated` depending on their security
requirements and which external systems they intend to federate with.
@@ -381,5 +383,5 @@ JWKS URI is required to use the `https` scheme.
See also:
- [Cluster Admin Guide to Service Accounts](/docs/reference/access-authn-authz/service-accounts-admin/)
-- [Service Account Signing Key Retrieval KEP](https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/20190730-oidc-discovery.md)
+- [Service Account Signing Key Retrieval KEP](https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/1393-oidc-discovery)
- [OIDC Discovery Spec](https://openid.net/specs/openid-connect-discovery-1_0.html)
diff --git a/content/en/docs/tasks/configure-pod-container/create-hostprocess-pod.md b/content/en/docs/tasks/configure-pod-container/create-hostprocess-pod.md
new file mode 100644
index 0000000000..2ab2bd3661
--- /dev/null
+++ b/content/en/docs/tasks/configure-pod-container/create-hostprocess-pod.md
@@ -0,0 +1,214 @@
+---
+title: Create a Windows HostProcess Pod
+content_type: task
+weight: 20
+min-kubernetes-server-version: 1.22
+---
+
+
+
+{{< feature-state for_k8s_version="v1.22" state="alpha" >}}
+
+Windows HostProcess containers enable you to run containerized
+workloads on a Windows host. These containers operate as
+normal processes but have access to the host network namespace,
+storage, and devices when given the appropriate user privileges.
+HostProcess containers can be used to deploy network plugins,
+storage configurations, device plugins, kube-proxy, and other
+components to Windows nodes without the need for dedicated proxies or
+the direct installation of host services.
+
+Administrative tasks such as installation of security patches, event
+log collection, and more can be performed without requiring cluster operators to
+log onto each Window node. HostProcess containers can run as any user that is
+available on the host or is in the domain of the host machine, allowing administrators
+to restrict resource access through user permissions. While neither filesystem or process
+isolation are supported, a new volume is created on the host upon starting the container
+to give it a clean and consolidated workspace. HostProcess containers can also be built on
+top of existing Windows base images and do not inherit the same
+[compatibility requirements](https://docs.microsoft.com/virtualization/windowscontainers/deploy-containers/version-compatibility)
+as Windows server containers, meaning that the version of the base images does not need
+to match that of the host. HostProcess containers also support
+[volume mounts](./create-hostprocess-pod#volume-mounts) within the container volume.
+
+### When should I use a Windows HostProcess container?
+
+- When you need to perform tasks which require the networking namespace of the host.
+HostProcess containers have access to the host's network interfaces and IP addresses.
+- You need access to resources on the host such as the filesystem, event logs, etc.
+- Installation of specific device drivers or Windows services.
+- Consolidation of administrative tasks and security policies. This reduces the degree of
+privileges needed by Windows nodes.
+
+
+## {{% heading "prerequisites" %}}
+
+{{% version-check %}}
+
+To enable HostProcess containers while in Alpha you need to pass the following feature gate flag to
+**kubelet** and **kube-apiserver**.
+See [Features Gates](/docs/reference/command-line-tools-reference/feature-gates/#overview)
+documentation for more details.
+
+```
+--feature-gates=WindowsHostProcessContainers=true
+```
+
+You can use the latest version of Containerd (v1.5.4+) with the following settings using the containerd
+v2 configuration. Add these annotations to any runtime configurations were you wish to enable the
+HostProcess container feature.
+
+
+```
+[plugins]
+ [plugins."io.containerd.grpc.v1.cri"]
+ [plugins."io.containerd.grpc.v1.cri".containerd]
+ [plugins."io.containerd.grpc.v1.cri".containerd.default_runtime]
+ container_annotations = ["microsoft.com/hostprocess-container"]
+ pod_annotations = ["microsoft.com/hostprocess-container"]
+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runhcs-wcow-process]
+ container_annotations = ["microsoft.com/hostprocess-container"]
+ pod_annotations = ["microsoft.com/hostprocess-container"]
+```
+
+The current versions of containerd ship with a version of hcsshim that does not have support.
+You will need to build a version of hcsshim from the main branch following the
+[instructions in hcsshim](https://github.com/Microsoft/hcsshim/#containerd-shim).
+Once the containerd shim is built you can replace the file in your contianerd installation.
+For example if you followed the instructions to
+[install containerd](/docs/setup/production-environment/container-runtimes/#containerd)
+replace the `containerd-shim-runhcs-v1.exe` is installed at `$Env:ProgramFiles\containerd` with the newly built shim.
+
+## Limitations
+
+- HostProcess containers require version 1.5.4 or higher of the containerd {{< glossary_tooltip text="container runtime" term_id="container-runtime" >}}.
+- As of v1.22 HostProcess pods can only contain HostProcess containers. This is a current limitation
+of the Windows OS; non-privileged Windows containers cannot share a vNIC with the host IP namespace.
+- HostProcess containers run as a process on the host and do not have any degree of
+isolation other than resource constraints imposed on the HostProcess user account. Neither
+filesystem or Hyper-V isolation are supported for HostProcess containers.
+- Volume mounts are supported and are mounted under the container volume.
+See [Volume Mounts](#volume-mounts)
+- A limited set of host user accounts are available for HostProcess containers by default.
+See [Choosing a User Account](#choosing-a-user-account).
+- Resource limits (disk, memory, cpu count) are supported in the same fashion as processes
+on the host.
+- Both Named pipe mounts and Unix domain sockets are **not** currently supported and should instead
+be accessed via their path on the host (e.g. \\\\.\\pipe\\\*)
+
+## HostProcess Pod configuration requirements
+
+Enabling a Windows HostProcess pod requires setting the right configurations in the pod security
+configuration. Of the policies defined in the [Pod Security Standards](/docs/concepts/security/pod-security-standards)
+HostProcess pods are disallowed by the baseline and restricted policies. It is therefore recommended
+that HostProcess pods run in alignment with the privileged profile.
+
+When running under the privileged policy, here are
+the configurations which need to be set to enable the creation of a HostProcess pod:
+
+
+ Privileged policy specification
+
+
+ | Control |
+ Policy |
+
+
+ | Windows HostProcess |
+
+ Windows pods offer the ability to run
+ HostProcess containers which enables privileged access to the Windows node.
+ Allowed Values
+
+ |
+
+
+ | Host Networking |
+
+ Will be in host network by default initially. Support
+ to set network to a different compartment may be desirable in
+ the future.
+ Allowed Values
+
+ |
+
+
+ | runAsUsername |
+
+ Specification of which user the HostProcess container should run as is required for the pod spec.
+ Allowed Values
+
+ NT AUTHORITY\SYSTEM
+ NT AUTHORITY\Local service
+ NT AUTHORITY\NetworkService
+
+ |
+
+
+ | runAsNonRoot |
+
+ Because HostProcess containers have privileged access to the host, the runAsNonRoot field cannot be set to true.
+ Allowed Values
+
+ - Undefined/Nil
+ false
+
+ |
+
+
+
+
+### Example Manifest (excerpt)
+
+```yaml
+spec:
+ securityContext:
+ windowsOptions:
+ hostProcess: true
+ runAsUserName: "NT AUTHORITY\\Local service"
+ hostNetwork: true
+ containers:
+ - name: test
+ image: image1:latest
+ command:
+ - ping
+ - -t
+ - 127.0.0.1
+ nodeSelector:
+ "kubernetes.io/os": windows
+```
+
+## Volume Mounts
+
+HostProcess containers support the ability to mount volumes within the container volume space.
+Applications running inside the container can access volume mounts directly via relative or
+absolute paths. An environment variable `$CONTAINER_SANDBOX_MOUNT_POINT` is set upon container
+creation and provides the absolute host path to the container volume. Relative paths are based
+upon the `Pod.containers.volumeMounts.mountPath` configuration.
+
+### Example {#volume-mount-example}
+
+To access service account tokens the following path structures are supported within the container:
+
+`.\var\run\secrets\kubernetes.io\serviceaccount\`
+
+`$CONTAINER_SANDBOX_MOUNT_POINT\var\run\secrets\kubernetes.io\serviceaccount\`
+
+## Choosing a User Account
+
+HostProcess containers support the ability to run as one of three supported Windows service accounts:
+
+- **[LocalSystem](https://docs.microsoft.com/en-us/windows/win32/services/localsystem-account)**
+- **[LocalService](https://docs.microsoft.com/en-us/windows/win32/services/localservice-account)**
+- **[NetworkService](https://docs.microsoft.com/en-us/windows/win32/services/networkservice-account)**
+
+You should select an appropriate Windows service account for each HostProcess
+container, aiming to limit the degree of privileges so as to avoid accidental (or even
+malicious) damage to the host. The LocalSystem service account has the highest level
+of privilege of the three and should be used only if absolutely necessary. Where possible,
+use the LocalService service account as it is the least privileged of the three options.
diff --git a/content/en/docs/tasks/configure-pod-container/enforce-standards-admission-controller.md b/content/en/docs/tasks/configure-pod-container/enforce-standards-admission-controller.md
new file mode 100644
index 0000000000..ef8206b1b6
--- /dev/null
+++ b/content/en/docs/tasks/configure-pod-container/enforce-standards-admission-controller.md
@@ -0,0 +1,54 @@
+---
+title: Enforce Pod Security Standards by Configuring the Built-in Admission Controller
+reviewers:
+- tallclair
+- liggitt
+content_type: task
+min-kubernetes-server-version: v1.22
+---
+
+As of v1.22, Kubernetes provides a built-in [admission controller](/docs/reference/access-authn-authz/admission-controllers/#podsecurity)
+to enforce the [Pod Security Standards](/docs/concepts/security/pod-security-standards).
+You can configure this admission controller to set cluster-wide defaults and [exemptions](/docs/concepts/security/pod-security-admission/#exemptions).
+
+## {{% heading "prerequisites" %}}
+
+{{% version-check %}}
+
+- Enable the `PodSecurity` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/#feature-gates-for-alpha-or-beta-features).
+
+## Configure the Admission Controller
+
+```yaml
+apiVersion: apiserver.config.k8s.io/v1
+kind: AdmissionConfiguration
+plugins:
+- name: PodSecurity
+ configuration:
+ apiVersion: pod-security.admission.config.k8s.io/v1alpha1
+ kind: PodSecurityConfiguration
+ # Defaults applied when a mode label is not set.
+ #
+ # Level label values must be one of:
+ # - "privileged" (default)
+ # - "baseline"
+ # - "restricted"
+ #
+ # Version label values must be one of:
+ # - "latest" (default)
+ # - specific version like "v{{< skew latestVersion >}}"
+ defaults:
+ enforce: "privileged"
+ enforce-version: "latest"
+ audit: "privileged"
+ audit-version: "latest"
+ warn: "privileged"
+ warn-version: "latest"
+ exemptions:
+ # Array of authenticated usernames to exempt.
+ usernames: []
+ # Array of runtime class names to exempt.
+ runtimeClassNames: []
+ # Array of namespaces to exempt.
+ namespaces: []
+```
\ No newline at end of file
diff --git a/content/en/docs/tasks/configure-pod-container/enforce-standards-namespace-labels.md b/content/en/docs/tasks/configure-pod-container/enforce-standards-namespace-labels.md
new file mode 100644
index 0000000000..9a4c3a44ed
--- /dev/null
+++ b/content/en/docs/tasks/configure-pod-container/enforce-standards-namespace-labels.md
@@ -0,0 +1,87 @@
+---
+title: Enforce Pod Security Standards with Namespace Labels
+reviewers:
+- tallclair
+- liggitt
+content_type: task
+min-kubernetes-server-version: v1.22
+---
+
+Namespaces can be labeled to enforce the [Pod Security Standards](/docs/concepts/security/pod-security-standards).
+
+## {{% heading "prerequisites" %}}
+
+{{% version-check %}}
+
+- Enable the `PodSecurity` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/#feature-gates-for-alpha-or-beta-features).
+
+## Requiring the `baseline` Pod Security Standard with namespace labels
+
+This manifest defines a Namespace `my-baseline-namespace` that:
+
+- _Blocks_ any pods that don't satisfy the `baseline` policy requirements.
+- Generates a user-facing warning and adds an audit annotation to any created pod that does not
+ meet the `restricted` policy requirements.
+- Pins the versions of the `baseline` and `restricted` policies to v{{< skew latestVersion >}}.
+
+```yaml
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: my-baseline-namespace
+ labels:
+ pod-security.kubernetes.io/enforce: baseline
+ pod-security.kubernetes.io/enforce-version: v{{< skew latestVersion >}}
+
+ # We are setting these to our _desired_ `enforce` level.
+ pod-security.kubernetes.io/audit: restricted
+ pod-security.kubernetes.io/audit-version: v{{< skew latestVersion >}}
+ pod-security.kubernetes.io/warn: restricted
+ pod-security.kubernetes.io/warn-version: v{{< skew latestVersion >}}
+```
+
+## Add labels to existing namespaces with `kubectl label`
+
+{{< note >}}
+When an `enforce` policy (or version) label is added or changed, the admission plugin will test
+each pod in the namespace against the new policy. Violations are returned to the user as warnings.
+{{< /note >}}
+
+It is helpful to apply the `--dry-run` flag when initially evaluating security profile changes for
+namespaces. The Pod Security Standard checks will still be run in _dry run_ mode, giving you
+information about how the new policy would treat existing pods, without actually updating a policy.
+
+```shell
+kubectl label --dry-run=server --overwrite ns --all \
+ pod-security.kubernetes.io/enforce=baseline
+```
+
+### Applying to all namespaces
+
+If you're just getting started with the Pod Security Standards, a suitable first step would be to
+configure all namespaces with audit annotations for a stricter level such as `baseline`:
+
+```shell
+kubectl label --overwrite ns --all \
+ pod-security.kubernetes.io/audit=baseline \
+ pod-security.kubernetes.io/warn=baseline
+```
+
+Note that this is not setting an enforce level, so that namespaces that haven't been explicitly
+evaluated can be distinguished. You can list namespaces without an explicitly set enforce level
+using this command:
+
+```shell
+kubectl get namespaces --selector='!pod-security.kubernetes.io/enforce'
+```
+
+### Applying to a single namespace
+
+You can update a specific namespace as well. This command adds the `enforce=restricted`
+policy to `my-existing-namespace`, pinning the restricted policy version to v{{< skew latestVersion >}}.
+
+```shell
+kubectl label --overwrite ns my-existing-namespace \
+ pod-security.kubernetes.io/enforce=restricted \
+ pod-security.kubernetes.io/enforce-version=v{{< skew latestVersion >}}
+```
diff --git a/content/en/docs/tasks/configure-pod-container/migrate-from-psp.md b/content/en/docs/tasks/configure-pod-container/migrate-from-psp.md
new file mode 100644
index 0000000000..f0ea2d02df
--- /dev/null
+++ b/content/en/docs/tasks/configure-pod-container/migrate-from-psp.md
@@ -0,0 +1,48 @@
+---
+title: Migrate from PodSecurityPolicy to the Built-In PodSecurity Admission Controller
+reviewers:
+- tallclair
+- liggitt
+content_type: task
+min-kubernetes-server-version: v1.22
+---
+
+
+
+This page describes the process of migrating from PodSecurityPolicies to the built-in PodSecurity
+admission controller. This can be done effectively using a combination of dry-run and `audit` and
+`warn` modes, although this becomes harder if mutating PSPs are used.
+
+## {{% heading "prerequisites" %}}
+
+{{% version-check %}}
+
+- Enable the `PodSecurity` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/#feature-gates-for-alpha-or-beta-features).
+
+
+
+## Steps
+
+- **Eliminate mutating PodSecurityPolicies, if your cluster has any set up.**
+ - Clone all mutating PSPs into a non-mutating version.
+ - Update all ClusterRoles authorizing use of those mutating PSPs to also authorize use of the
+ non-mutating variant.
+ - Watch for Pods using the mutating PSPs and work with code owners to migrate to valid,
+ non-mutating resources.
+ - Delete mutating PSPs.
+- **Select a compatible policy level for each namespace.** Analyze existing resources in the
+ namespace to drive this decision.
+ - Review the requirements of the different [Pod Security Standards](/docs/concepts/security/pod-security-standards).
+ - Evaluate the difference in privileges that would come from disabling the PSP controller.
+ - In the event that a PodSecurityPolicy falls between two levels, consider:
+ - Selecting a _less_ permissive PodSecurity level prioritizes security, and may require adjusting
+ workloads to fit within the stricter policy.
+ - Selecting a _more_ permissive PodSecurity level prioritizes avoiding disrupting or
+ changing workloads, but may allow workload authors in the namespace greater permissions
+ than desired.
+- **Apply the selected profiles in `warn` and `audit` mode.** This will give you an idea of how
+ your Pods will respond to the new policies, without breaking existing workloads. Iterate on your
+ [Pods' configuration](/docs/concepts/security/pod-security-admission#configuring-pods) until
+ they are in compliance with the selected profiles.
+- Apply the profiles in `enforce` mode.
+- Stop including `PodSecurityPolicy` in the `--enable-admission-plugins` flag.
\ No newline at end of file
diff --git a/content/en/docs/tasks/configure-pod-container/pull-image-private-registry.md b/content/en/docs/tasks/configure-pod-container/pull-image-private-registry.md
index 697a4c6e0e..0886871f9c 100644
--- a/content/en/docs/tasks/configure-pod-container/pull-image-private-registry.md
+++ b/content/en/docs/tasks/configure-pod-container/pull-image-private-registry.md
@@ -54,7 +54,7 @@ If you use a Docker credentials store, you won't see that `auth` entry but a `cr
## Create a Secret based on existing Docker credentials {#registry-secret-existing-credentials}
-A Kubernetes cluster uses the Secret of `docker-registry` type to authenticate with
+A Kubernetes cluster uses the Secret of `kubernetes.io/dockerconfigjson` type to authenticate with
a container registry to pull a private image.
If you already ran `docker login`, you can copy that credential into Kubernetes:
@@ -102,7 +102,7 @@ kubectl create secret docker-registry regcred --docker-server=` is your Private Docker Registry FQDN.
- Use `https://index.docker.io/v2/` for DockerHub.
+ Use `https://index.docker.io/v1/` for DockerHub.
* `` is your Docker username.
* `` is your Docker password.
* `` is your Docker email.
diff --git a/content/en/docs/tasks/configure-pod-container/quality-service-pod.md b/content/en/docs/tasks/configure-pod-container/quality-service-pod.md
index 0e6a02af37..abe6320563 100644
--- a/content/en/docs/tasks/configure-pod-container/quality-service-pod.md
+++ b/content/en/docs/tasks/configure-pod-container/quality-service-pod.md
@@ -45,8 +45,12 @@ kubectl create namespace qos-example
For a Pod to be given a QoS class of Guaranteed:
-* Every Container, including init containers, in the Pod must have a memory limit and a memory request, and they must be the same.
-* Every Container, including init containers, in the Pod must have a CPU limit and a CPU request, and they must be the same.
+* Every Container in the Pod must have a memory limit and a memory request.
+* For every Container in the Pod, the memory limit must equal the memory request.
+* Every Container in the Pod must have a CPU limit and a CPU request.
+* For every Container in the Pod, the CPU limit must equal the CPU request.
+
+These restrictions apply to init containers and app containers equally.
Here is the configuration file for a Pod that has one Container. The Container has a memory limit and a
memory request, both equal to 200 MiB. The Container has a CPU limit and a CPU request, both equal to 700 milliCPU:
@@ -272,5 +276,3 @@ kubectl delete namespace qos-example
-
-
diff --git a/content/en/docs/tasks/configure-pod-container/security-context.md b/content/en/docs/tasks/configure-pod-container/security-context.md
index 104dc0003f..56bcc0f3f9 100644
--- a/content/en/docs/tasks/configure-pod-container/security-context.md
+++ b/content/en/docs/tasks/configure-pod-container/security-context.md
@@ -24,7 +24,7 @@ a Pod or Container. Security context settings include, but are not limited to:
* [AppArmor](/docs/tutorials/clusters/apparmor/): Use program profiles to restrict the capabilities of individual programs.
-* [Seccomp](https://en.wikipedia.org/wiki/Seccomp): Filter a process's system calls.
+* [Seccomp](/docs/tutorials/clusters/seccomp/): Filter a process's system calls.
* AllowPrivilegeEscalation: Controls whether a process can gain more privileges than its parent process. This bool directly controls whether the [`no_new_privs`](https://www.kernel.org/doc/Documentation/prctl/no_new_privs.txt) flag gets set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged OR 2) has `CAP_SYS_ADMIN`.
@@ -176,7 +176,6 @@ securityContext:
fsGroupChangePolicy: "OnRootMismatch"
```
-This is an alpha feature. To use it, enable the [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) `ConfigurableFSGroupPolicy` for the kube-api-server, the kube-controller-manager, and for the kubelet.
{{< note >}}
This field has no effect on ephemeral volume types such as
@@ -185,6 +184,25 @@ This field has no effect on ephemeral volume types such as
and [`emptydir`](/docs/concepts/storage/volumes/#emptydir).
{{< /note >}}
+## Delegating volume permission and ownership change to CSI driver
+
+{{< feature-state for_k8s_version="v1.22" state="alpha" >}}
+
+If you deploy a [Container Storage Interface (CSI)](https://github.com/container-storage-interface/spec/blob/master/spec.md)
+driver which supports the `VOLUME_MOUNT_GROUP` `NodeServiceCapability`, the
+process of setting file ownership and permissions based on the
+`fsGroup` specified in the `securityContext` will be performed by the CSI driver
+instead of Kubernetes, provided that the `DelegateFSGroupToCSIDriver` Kubernetes
+feature gate is enabled. In this case, since Kubernetes doesn't perform any
+ownership and permission change, `fsGroupChangePolicy` does not take effect, and
+as specified by CSI, the driver is expected to mount the volume with the
+provided `fsGroup`, resulting in a volume that is readable/writable by the
+`fsGroup`.
+
+Please refer to the [KEP](https://github.com/gnufied/enhancements/blob/master/keps/sig-storage/2317-fsgroup-on-mount/README.md)
+and the description of the `VolumeCapability.MountVolume.volume_mount_group`
+field in the [CSI spec](https://github.com/container-storage-interface/spec/blob/master/spec.md#createvolume)
+for more information.
## Set the security context for a Container
diff --git a/content/en/docs/tasks/configure-pod-container/static-pod.md b/content/en/docs/tasks/configure-pod-container/static-pod.md
index 9126243462..c889570dc7 100644
--- a/content/en/docs/tasks/configure-pod-container/static-pod.md
+++ b/content/en/docs/tasks/configure-pod-container/static-pod.md
@@ -22,7 +22,7 @@ The kubelet automatically tries to create a {{< glossary_tooltip text="mirror Po
on the Kubernetes API server for each static Pod.
This means that the Pods running on a node are visible on the API server,
but cannot be controlled from there.
-The Pod names will suffixed with the node hostname with a leading hyphen
+The Pod names will be suffixed with the node hostname with a leading hyphen.
{{< note >}}
If you are running clustered Kubernetes and are using static
@@ -31,6 +31,13 @@ Pods to run a Pod on every node, you should probably be using a
instead.
{{< /note >}}
+{{< note >}}
+The `spec` of a static Pod cannot refer to other API objects
+(e.g., {{< glossary_tooltip text="ServiceAccount" term_id="service-account" >}},
+{{< glossary_tooltip text="ConfigMap" term_id="configmap" >}},
+{{< glossary_tooltip text="Secret" term_id="secret" >}}, etc).
+{{< /note >}}
+
## {{% heading "prerequisites" %}}
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
diff --git a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md
index 384b709720..17fc9e1421 100644
--- a/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md
+++ b/content/en/docs/tasks/configure-pod-container/translate-compose-kubernetes.md
@@ -29,13 +29,13 @@ Kompose is released via GitHub on a three-week cycle, you can see all current re
```sh
# Linux
-curl -L https://github.com/kubernetes/kompose/releases/download/v1.22.0/kompose-linux-amd64 -o kompose
+curl -L https://github.com/kubernetes/kompose/releases/download/v1.24.0/kompose-linux-amd64 -o kompose
# macOS
-curl -L https://github.com/kubernetes/kompose/releases/download/v1.22.0/kompose-darwin-amd64 -o kompose
+curl -L https://github.com/kubernetes/kompose/releases/download/v1.24.0/kompose-darwin-amd64 -o kompose
# Windows
-curl -L https://github.com/kubernetes/kompose/releases/download/v1.22.0/kompose-windows-amd64.exe -o kompose.exe
+curl -L https://github.com/kubernetes/kompose/releases/download/v1.24.0/kompose-windows-amd64.exe -o kompose.exe
chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose
diff --git a/content/en/docs/tasks/debug-application-cluster/_index.md b/content/en/docs/tasks/debug-application-cluster/_index.md
old mode 100755
new mode 100644
diff --git a/content/en/docs/tasks/debug-application-cluster/audit.md b/content/en/docs/tasks/debug-application-cluster/audit.md
index 2f8e1c9875..6c4b433ca2 100644
--- a/content/en/docs/tasks/debug-application-cluster/audit.md
+++ b/content/en/docs/tasks/debug-application-cluster/audit.md
@@ -94,7 +94,7 @@ rules:
```
If you're crafting your own audit profile, you can use the audit profile for Google Container-Optimized OS as a starting point. You can check the
-[configure-helper.sh](https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/cluster/gce/gci/configure-helper.sh)
+[configure-helper.sh](https://github.com/kubernetes/kubernetes/blob/master/cluster/gce/gci/configure-helper.sh)
script, which generates an audit policy file. You can see most of the audit policy file by looking directly at the script.
You can also refer to the [`Policy` configuration reference](/docs/reference/config-api/apiserver-audit.v1/#audit-k8s-io-v1-Policy)
@@ -251,5 +251,7 @@ By default truncate is disabled in both `webhook` and `log`, a cluster administr
## {{% heading "whatsnext" %}}
* Learn about [Mutating webhook auditing annotations](/docs/reference/access-authn-authz/extensible-admission-controllers/#mutating-webhook-auditing-annotations).
-* Read the [reference for `audit.k8s.io` API group](/docs/reference/config-api/apiserver-audit.v1/).
+* Learn more about [`Event`](/docs/reference/config-api/apiserver-audit.v1/#audit-k8s-io-v1-Event)
+ and the [`Policy`](/docs/reference/config-api/apiserver-audit.v1/#audit-k8s-io-v1-Policy)
+ resource types by reading the Audit configuration reference.
diff --git a/content/en/docs/tasks/debug-application-cluster/debug-application.md b/content/en/docs/tasks/debug-application-cluster/debug-application.md
index f665accb18..477c9b8248 100644
--- a/content/en/docs/tasks/debug-application-cluster/debug-application.md
+++ b/content/en/docs/tasks/debug-application-cluster/debug-application.md
@@ -140,24 +140,11 @@ kubectl get pods --selector=name=nginx,type=frontend
```
to list pods that match this selector. Verify that the list matches the Pods that you expect to provide your Service.
-
-If the list of pods matches expectations, but your endpoints are still empty, it's possible that you don't
-have the right ports exposed. If your service has a `containerPort` specified, but the Pods that are
-selected don't have that port listed, then they won't be added to the endpoints list.
-
Verify that the pod's `containerPort` matches up with the Service's `targetPort`
#### Network traffic is not forwarded
-If you can connect to the service, but the connection is immediately dropped, and there are endpoints
-in the endpoints list, it's likely that the proxy can't contact your pods.
-
-There are three things to
-check:
-
- * Are your pods working correctly? Look for restart count, and [debug pods](#debugging-pods).
- * Can you connect to your pods directly? Get the IP address for the Pod, and try to connect directly to that IP.
- * Is your application serving on the port that you configured? Kubernetes doesn't do port remapping, so if your application serves on 8080, the `containerPort` field needs to be 8080.
+Please see [debugging service](/docs/tasks/debug-application-cluster/debug-service/) for more information.
## {{% heading "whatsnext" %}}
diff --git a/content/en/docs/tasks/debug-application-cluster/debug-cluster.md b/content/en/docs/tasks/debug-application-cluster/debug-cluster.md
index fdde133345..391efe4376 100644
--- a/content/en/docs/tasks/debug-application-cluster/debug-cluster.md
+++ b/content/en/docs/tasks/debug-application-cluster/debug-cluster.md
@@ -102,7 +102,7 @@ This is an incomplete list of things that could go wrong, and how to adjust your
- Action: Use IaaS providers reliable storage (e.g. GCE PD or AWS EBS volume) for VMs with apiserver+etcd
- Mitigates: Apiserver backing storage lost
-- Action: Use [high-availability](/docs/admin/high-availability) configuration
+- Action: Use [high-availability](/docs/setup/production-environment/tools/kubeadm/high-availability/) configuration
- Mitigates: Control plane node shutdown or control plane components (scheduler, API server, controller-manager) crashing
- Will tolerate one or more simultaneous node or component failures
- Mitigates: API server backing storage (i.e., etcd's data directory) lost
diff --git a/content/en/docs/tasks/debug-application-cluster/debug-running-pod.md b/content/en/docs/tasks/debug-application-cluster/debug-running-pod.md
index 59a83e87c7..6009a76341 100644
--- a/content/en/docs/tasks/debug-application-cluster/debug-running-pod.md
+++ b/content/en/docs/tasks/debug-application-cluster/debug-running-pod.md
@@ -73,22 +73,20 @@ For more details, see [Get a Shell to a Running Container](
## Debugging with an ephemeral debug container {#ephemeral-container}
-{{< feature-state state="alpha" for_k8s_version="v1.18" >}}
+{{< feature-state state="alpha" for_k8s_version="v1.22" >}}
{{< glossary_tooltip text="Ephemeral containers" term_id="ephemeral-container" >}}
are useful for interactive troubleshooting when `kubectl exec` is insufficient
because a container has crashed or a container image doesn't include debugging
utilities, such as with [distroless images](
-https://github.com/GoogleContainerTools/distroless). `kubectl` has an alpha
-command that can create ephemeral containers for debugging beginning with version
-`v1.18`.
+https://github.com/GoogleContainerTools/distroless).
### Example debugging using ephemeral containers {#ephemeral-container-example}
{{< note >}}
The examples in this section require the `EphemeralContainers` [feature gate](
/docs/reference/command-line-tools-reference/feature-gates/) enabled in your
-cluster and `kubectl` version v1.18 or later.
+cluster and `kubectl` version v1.22 or later.
{{< /note >}}
You can use the `kubectl debug` command to add ephemeral containers to a
@@ -137,7 +135,8 @@ creates.
The `--target` parameter must be supported by the {{< glossary_tooltip
text="Container Runtime" term_id="container-runtime" >}}. When not supported,
the Ephemeral Container may not be started, or it may be started with an
-isolated process namespace.
+isolated process namespace so that `ps` does not reveal processes in other
+containers.
{{< /note >}}
You can view the state of the newly created ephemeral container using `kubectl describe`:
diff --git a/content/en/docs/tasks/debug-application-cluster/determine-reason-pod-failure.md b/content/en/docs/tasks/debug-application-cluster/determine-reason-pod-failure.md
index 543573781b..f1ddd96389 100644
--- a/content/en/docs/tasks/debug-application-cluster/determine-reason-pod-failure.md
+++ b/content/en/docs/tasks/debug-application-cluster/determine-reason-pod-failure.md
@@ -41,7 +41,7 @@ the container starts.
kubectl apply -f https://k8s.io/examples/debug/termination.yaml
- In the YAML file, in the `cmd` and `args` fields, you can see that the
+ In the YAML file, in the `command` and `args` fields, you can see that the
container sleeps for 10 seconds and then writes "Sleep expired" to
the `/dev/termination-log` file. After the container writes
the "Sleep expired" message, it terminates.
diff --git a/content/en/docs/tasks/debug-application-cluster/logging-stackdriver.md b/content/en/docs/tasks/debug-application-cluster/logging-stackdriver.md
deleted file mode 100644
index 29ace662f6..0000000000
--- a/content/en/docs/tasks/debug-application-cluster/logging-stackdriver.md
+++ /dev/null
@@ -1,371 +0,0 @@
----
-reviewers:
-- piosz
-- x13n
-title: Logging Using Stackdriver
-content_type: concept
----
-
-
-
-Before reading this page, it's highly recommended to familiarize yourself
-with the [overview of logging in Kubernetes](/docs/concepts/cluster-administration/logging).
-
-{{< note >}}
-By default, Stackdriver logging collects only your container's standard output and
-standard error streams. To collect any logs your application writes to a file (for example),
-see the [sidecar approach](/docs/concepts/cluster-administration/logging#sidecar-container-with-a-logging-agent)
-in the Kubernetes logging overview.
-{{< /note >}}
-
-
-
-
-
-
-## Deploying
-
-To ingest logs, you must deploy the Stackdriver Logging agent to each node in your cluster.
-The agent is a configured `fluentd` instance, where the configuration is stored in a `ConfigMap`
-and the instances are managed using a Kubernetes `DaemonSet`. The actual deployment of the
-`ConfigMap` and `DaemonSet` for your cluster depends on your individual cluster setup.
-
-### Deploying to a new cluster
-
-#### Google Kubernetes Engine
-
-Stackdriver is the default logging solution for clusters deployed on Google Kubernetes Engine.
-Stackdriver Logging is deployed to a new cluster by default unless you explicitly opt-out.
-
-#### Other platforms
-
-To deploy Stackdriver Logging on a *new* cluster that you're
-creating using `kube-up.sh`, do the following:
-
-1. Set the `KUBE_LOGGING_DESTINATION` environment variable to `gcp`.
-1. **If not running on GCE**, include the `beta.kubernetes.io/fluentd-ds-ready=true`
-in the `KUBE_NODE_LABELS` variable.
-
-Once your cluster has started, each node should be running the Stackdriver Logging agent.
-The `DaemonSet` and `ConfigMap` are configured as addons. If you're not using `kube-up.sh`,
-consider starting a cluster without a pre-configured logging solution and then deploying
-Stackdriver Logging agents to the running cluster.
-
-{{< warning >}}
-The Stackdriver logging daemon has known issues on platforms other
-than Google Kubernetes Engine. Proceed at your own risk.
-{{< /warning >}}
-
-### Deploying to an existing cluster
-
-1. Apply a label on each node, if not already present.
-
- The Stackdriver Logging agent deployment uses node labels to determine to which nodes
- it should be allocated. These labels were introduced to distinguish nodes with the
- Kubernetes version 1.6 or higher. If the cluster was created with Stackdriver Logging
- configured and node has version 1.5.X or lower, it will have fluentd as static pod. Node
- cannot have more than one instance of fluentd, therefore only apply labels to the nodes
- that don't have fluentd pod allocated already. You can ensure that your node is labelled
- properly by running `kubectl describe` as follows:
-
- ```
- kubectl describe node $NODE_NAME
- ```
-
- The output should be similar to this:
-
- ```
- Name: NODE_NAME
- Role:
- Labels: beta.kubernetes.io/fluentd-ds-ready=true
- ...
- ```
-
- Ensure that the output contains the label `beta.kubernetes.io/fluentd-ds-ready=true`. If it
- is not present, you can add it using the `kubectl label` command as follows:
-
- ```
- kubectl label node $NODE_NAME beta.kubernetes.io/fluentd-ds-ready=true
- ```
-
- {{< note >}}
- If a node fails and has to be recreated, you must re-apply the label to
- the recreated node. To make this easier, you can use Kubelet's command-line parameter
- for applying node labels in your node startup script.
- {{< /note >}}
-
-1. Deploy a `ConfigMap` with the logging agent configuration by running the following command:
-
- ```
- kubectl apply -f https://k8s.io/examples/debug/fluentd-gcp-configmap.yaml
- ```
-
- The command creates the `ConfigMap` in the `default` namespace. You can download the file
- manually and change it before creating the `ConfigMap` object.
-
-1. Deploy the logging agent `DaemonSet` by running the following command:
-
- ```
- kubectl apply -f https://k8s.io/examples/debug/fluentd-gcp-ds.yaml
- ```
-
- You can download and edit this file before using it as well.
-
-## Verifying your Logging Agent Deployment
-
-After Stackdriver `DaemonSet` is deployed, you can discover logging agent deployment status
-by running the following command:
-
-```shell
-kubectl get ds --all-namespaces
-```
-
-If you have 3 nodes in the cluster, the output should looks similar to this:
-
-```
-NAMESPACE NAME DESIRED CURRENT READY NODE-SELECTOR AGE
-...
-default fluentd-gcp-v2.0 3 3 3 beta.kubernetes.io/fluentd-ds-ready=true 5m
-...
-```
-
-To understand how logging with Stackdriver works, consider the following
-synthetic log generator pod specification [counter-pod.yaml](/examples/debug/counter-pod.yaml):
-
-{{< codenew file="debug/counter-pod.yaml" >}}
-
-This pod specification has one container that runs a bash script
-that writes out the value of a counter and the datetime once per
-second, and runs indefinitely. Let's create this pod in the default namespace.
-
-```shell
-kubectl apply -f https://k8s.io/examples/debug/counter-pod.yaml
-```
-
-You can observe the running pod:
-
-```shell
-kubectl get pods
-```
-```
-NAME READY STATUS RESTARTS AGE
-counter 1/1 Running 0 5m
-```
-
-For a short period of time you can observe the 'Pending' pod status, because the kubelet
-has to download the container image first. When the pod status changes to `Running`
-you can use the `kubectl logs` command to view the output of this counter pod.
-
-```shell
-kubectl logs counter
-```
-```
-0: Mon Jan 1 00:00:00 UTC 2001
-1: Mon Jan 1 00:00:01 UTC 2001
-2: Mon Jan 1 00:00:02 UTC 2001
-...
-```
-
-As described in the logging overview, this command fetches log entries
-from the container log file. If the container is killed and then restarted by
-Kubernetes, you can still access logs from the previous container. However,
-if the pod is evicted from the node, log files are lost. Let's demonstrate this
-by deleting the currently running counter container:
-
-```shell
-kubectl delete pod counter
-```
-```
-pod "counter" deleted
-```
-
-and then recreating it:
-
-```shell
-kubectl create -f https://k8s.io/examples/debug/counter-pod.yaml
-```
-```
-pod/counter created
-```
-
-After some time, you can access logs from the counter pod again:
-
-```shell
-kubectl logs counter
-```
-```
-0: Mon Jan 1 00:01:00 UTC 2001
-1: Mon Jan 1 00:01:01 UTC 2001
-2: Mon Jan 1 00:01:02 UTC 2001
-...
-```
-
-As expected, only recent log lines are present. However, for a real-world
-application you will likely want to be able to access logs from all containers,
-especially for the debug purposes. This is exactly when the previously enabled
-Stackdriver Logging can help.
-
-## Viewing logs
-
-Stackdriver Logging agent attaches metadata to each log entry, for you to use later
-in queries to select only the messages you're interested in: for example,
-the messages from a particular pod.
-
-The most important pieces of metadata are the resource type and log name.
-The resource type of a container log is `container`, which is named
-`GKE Containers` in the UI (even if the Kubernetes cluster is not on Google Kubernetes Engine).
-The log name is the name of the container, so that if you have a pod with
-two containers, named `container_1` and `container_2` in the spec, their logs
-will have log names `container_1` and `container_2` respectively.
-
-System components have resource type `compute`, which is named
-`GCE VM Instance` in the interface. Log names for system components are fixed.
-For a Google Kubernetes Engine node, every log entry from a system component has one of the following
-log names:
-
-* docker
-* kubelet
-* kube-proxy
-
-You can learn more about viewing logs on [the dedicated Stackdriver page](https://cloud.google.com/logging/docs/view/logs_viewer).
-
-One of the possible ways to view logs is using the
-[`gcloud logging`](https://cloud.google.com/logging/docs/api/gcloud-logging)
-command line interface from the [Google Cloud SDK](https://cloud.google.com/sdk/).
-It uses Stackdriver Logging [filtering syntax](https://cloud.google.com/logging/docs/view/advanced_filters)
-to query specific logs. For example, you can run the following command:
-
-```none
-gcloud beta logging read 'logName="projects/$YOUR_PROJECT_ID/logs/count"' --format json | jq '.[].textPayload'
-```
-```
-...
-"2: Mon Jan 1 00:01:02 UTC 2001\n"
-"1: Mon Jan 1 00:01:01 UTC 2001\n"
-"0: Mon Jan 1 00:01:00 UTC 2001\n"
-...
-"2: Mon Jan 1 00:00:02 UTC 2001\n"
-"1: Mon Jan 1 00:00:01 UTC 2001\n"
-"0: Mon Jan 1 00:00:00 UTC 2001\n"
-```
-
-As you can see, it outputs messages for the count container from both
-the first and second runs, despite the fact that the kubelet already deleted
-the logs for the first container.
-
-### Exporting logs
-
-You can export logs to [Google Cloud Storage](https://cloud.google.com/storage/)
-or to [BigQuery](https://cloud.google.com/bigquery/) to run further
-analysis. Stackdriver Logging offers the concept of sinks, where you can
-specify the destination of log entries. More information is available on
-the Stackdriver [Exporting Logs page](https://cloud.google.com/logging/docs/export/configure_export_v2).
-
-## Configuring Stackdriver Logging Agents
-
-Sometimes the default installation of Stackdriver Logging may not suit your needs, for example:
-
-* You may want to add more resources because default performance doesn't suit your needs.
-* You may want to introduce additional parsing to extract more metadata from your log messages,
-like severity or source code reference.
-* You may want to send logs not only to Stackdriver or send it to Stackdriver only partially.
-
-In this case you need to be able to change the parameters of `DaemonSet` and `ConfigMap`.
-
-### Prerequisites
-
-If you're using GKE and Stackdriver Logging is enabled in your cluster, you
-cannot change its configuration, because it's managed and supported by GKE.
-However, you can disable the default integration and deploy your own.
-
-{{< note >}}
-You will have to support and maintain a newly deployed configuration
-yourself: update the image and configuration, adjust the resources and so on.
-{{< /note >}}
-
-To disable the default logging integration, use the following command:
-
-```
-gcloud beta container clusters update --logging-service=none CLUSTER
-```
-
-You can find notes on how to then install Stackdriver Logging agents into
-a running cluster in the [Deploying section](#deploying).
-
-### Changing `DaemonSet` parameters
-
-When you have the Stackdriver Logging `DaemonSet` in your cluster, you can modify the
-`template` field in its spec. The DaemonSet controller manages the pods for you.
-For example, assume you've installed the Stackdriver Logging as described above. Now you want to
-change the memory limit to give fluentd more memory to safely process more logs.
-
-Get the spec of `DaemonSet` running in your cluster:
-
-```shell
-kubectl get ds fluentd-gcp-v2.0 --namespace kube-system -o yaml > fluentd-gcp-ds.yaml
-```
-
-Then edit resource requirements in the spec file and update the `DaemonSet` object
-in the apiserver using the following command:
-
-```shell
-kubectl replace -f fluentd-gcp-ds.yaml
-```
-
-After some time, Stackdriver Logging agent pods will be restarted with the new configuration.
-
-### Changing fluentd parameters
-
-Fluentd configuration is stored in the `ConfigMap` object. It is effectively a set of configuration
-files that are merged together. You can learn about fluentd configuration on the
-[official site](https://docs.fluentd.org).
-
-Imagine you want to add a new parsing logic to the configuration, so that fluentd can understand
-default Python logging format. An appropriate fluentd filter looks similar to this:
-
-```
-
- type parser
- format /^(?\w):(?\w):(?.*)/
- reserve_data true
- suppress_parse_error_log true
- key_name log
-
-```
-
-Now you have to put it in the configuration and make Stackdriver Logging agents pick it up.
-Get the current version of the Stackdriver Logging `ConfigMap` in your cluster
-by running the following command:
-
-```shell
-kubectl get cm fluentd-gcp-config --namespace kube-system -o yaml > fluentd-gcp-configmap.yaml
-```
-
-Then in the value of the key `containers.input.conf` insert a new filter right after
-the `source` section.
-
-{{< note >}}
-Order is important.
-{{< /note >}}
-
-Updating `ConfigMap` in the apiserver is more complicated than updating `DaemonSet`. It's better
-to consider `ConfigMap` to be immutable. Then, in order to update the configuration, you should
-create `ConfigMap` with a new name and then change `DaemonSet` to point to it
-using [guide above](#changing-daemonset-parameters).
-
-### Adding fluentd plugins
-
-Fluentd is written in Ruby and allows to extend its capabilities using
-[plugins](https://www.fluentd.org/plugins). If you want to use a plugin, which is not included
-in the default Stackdriver Logging container image, you have to build a custom image. Imagine
-you want to add Kafka sink for messages from a particular container for additional processing.
-You can re-use the default [container image sources](https://git.k8s.io/contrib/fluentd/fluentd-gcp-image)
-with minor changes:
-
-* Change Makefile to point to your container repository, for example `PREFIX=gcr.io/`.
-* Add your dependency to the Gemfile, for example `gem 'fluent-plugin-kafka'`.
-
-Then run `make build push` from this directory. After updating `DaemonSet` to pick up the
-new image, you can use the plugin you installed in the fluentd configuration.
-
-
diff --git a/content/en/docs/tasks/extend-kubernetes/configure-aggregation-layer.md b/content/en/docs/tasks/extend-kubernetes/configure-aggregation-layer.md
index 739a69d45a..3b65d6abc6 100644
--- a/content/en/docs/tasks/extend-kubernetes/configure-aggregation-layer.md
+++ b/content/en/docs/tasks/extend-kubernetes/configure-aggregation-layer.md
@@ -17,7 +17,7 @@ Configuring the [aggregation layer](/docs/concepts/extend-kubernetes/api-extensi
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
{{< note >}}
-There are a few setup requirements for getting the aggregation layer working in your environment to support mutual TLS auth between the proxy and extension apiservers. Kubernetes and the kube-apiserver have multiple CAs, so make sure that the proxy is signed by the aggregation layer CA and not by something else, like the master CA.
+There are a few setup requirements for getting the aggregation layer working in your environment to support mutual TLS auth between the proxy and extension apiservers. Kubernetes and the kube-apiserver have multiple CAs, so make sure that the proxy is signed by the aggregation layer CA and not by something else, like the Kubernetes general CA.
{{< /note >}}
{{< caution >}}
diff --git a/content/en/docs/tasks/extend-kubernetes/configure-multiple-schedulers.md b/content/en/docs/tasks/extend-kubernetes/configure-multiple-schedulers.md
index 7ad7072fd7..d44e6897b0 100644
--- a/content/en/docs/tasks/extend-kubernetes/configure-multiple-schedulers.md
+++ b/content/en/docs/tasks/extend-kubernetes/configure-multiple-schedulers.md
@@ -18,7 +18,7 @@ learn how to run multiple schedulers in Kubernetes with an example.
A detailed description of how to implement a scheduler is outside the scope of this
document. Please refer to the kube-scheduler implementation in
-[pkg/scheduler](https://github.com/kubernetes/kubernetes/tree/{{< param "githubbranch" >}}/pkg/scheduler)
+[pkg/scheduler](https://github.com/kubernetes/kubernetes/tree/master/pkg/scheduler)
in the Kubernetes source directory for a canonical example.
## {{% heading "prerequisites" %}}
diff --git a/content/en/docs/tasks/extend-kubernetes/custom-resources/_index.md b/content/en/docs/tasks/extend-kubernetes/custom-resources/_index.md
old mode 100755
new mode 100644
diff --git a/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning.md b/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning.md
index 671637c084..45f589e9d7 100644
--- a/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning.md
+++ b/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning.md
@@ -72,7 +72,7 @@ after upgrading the objects to a new stored version.
Removing an old version:
1. Ensure all clients are fully migrated to the new version. The kube-apiserver
- logs can reviewed to help identify any clients that are still accessing via
+ logs can be reviewed to help identify any clients that are still accessing via
the old version.
1. Set `served` to `false` for the old version in the `spec.versions` list. If
any clients are still unexpectedly using the old version they may begin reporting
@@ -80,7 +80,7 @@ Removing an old version:
If this occurs, switch back to using `served:true` on the old version, migrate the
remaining clients to the new version and repeat this step.
1. Ensure the [upgrade of existing objects to the new stored version](#upgrade-existing-objects-to-a-new-stored-version) step has been completed.
- 1. Verify that the `stored` is set to `true` for the new version in the `spec.versions` list in the CustomResourceDefinition.
+ 1. Verify that the `storage` is set to `true` for the new version in the `spec.versions` list in the CustomResourceDefinition.
1. Verify that the old version is no longer listed in the CustomResourceDefinition `status.storedVersions`.
1. Remove the old version from the CustomResourceDefinition `spec.versions` list.
1. Drop conversion support for the old version in conversion webhooks.
@@ -202,7 +202,7 @@ spec:
plural: crontabs
# singular name to be used as an alias on the CLI and for display
singular: crontab
- # kind is normally the CamelCased singular type. Your resource manifests use this.
+ # kind is normally the PascalCased singular type. Your resource manifests use this.
kind: CronTab
# shortNames allow shorter string to match your resource on the CLI
shortNames:
diff --git a/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions.md b/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions.md
index 3230b7b73a..cd2d0fb103 100644
--- a/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions.md
+++ b/content/en/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions.md
@@ -154,22 +154,26 @@ from the YAML you used to create it:
```yaml
apiVersion: v1
-kind: List
items:
- apiVersion: stable.example.com/v1
kind: CronTab
metadata:
- creationTimestamp: 2017-05-31T12:56:35Z
+ annotations:
+ kubectl.kubernetes.io/last-applied-configuration: |
+ {"apiVersion":"stable.example.com/v1","kind":"CronTab","metadata":{"annotations":{},"name":"my-new-cron-object","namespace":"default"},"spec":{"cronSpec":"* * * * */5","image":"my-awesome-cron-image"}}
+ creationTimestamp: "2021-06-20T07:35:27Z"
generation: 1
name: my-new-cron-object
namespace: default
- resourceVersion: "285"
- uid: 9423255b-4600-11e7-af6a-28d2447dc82b
+ resourceVersion: "1326"
+ uid: 9aab1d66-628e-41bb-a422-57b8b3b1f5a9
spec:
cronSpec: '* * * * */5'
image: my-awesome-cron-image
+kind: List
metadata:
resourceVersion: ""
+ selfLink: ""
```
## Delete a CustomResourceDefinition
diff --git a/content/en/docs/tasks/inject-data-application/_index.md b/content/en/docs/tasks/inject-data-application/_index.md
old mode 100755
new mode 100644
diff --git a/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md b/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md
index 693e730a09..e37e5b6569 100644
--- a/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md
+++ b/content/en/docs/tasks/job/automated-tasks-with-cron-jobs.md
@@ -1,6 +1,6 @@
---
title: Running Automated Tasks with a CronJob
-min-kubernetes-server-version: v1.8
+min-kubernetes-server-version: v1.21
reviewers:
- chenopis
content_type: task
@@ -9,6 +9,10 @@ weight: 10
+CronJobs was promoted to general availability in Kubernetes v1.21. If you are using an older version of
+Kubernetes, please refer to the documentation for the version of Kubernetes that you are using,
+so that you see accurate information. Older Kubernetes versions do not support the `batch/v1` CronJob API.
+
You can use a {{< glossary_tooltip text="CronJob" term_id="cronjob" >}} to run {{< glossary_tooltip text="Jobs" term_id="job" >}} on a time-based schedule.
These automated jobs run like [Cron](https://en.wikipedia.org/wiki/Cron) tasks on a Linux or UNIX system.
@@ -142,7 +146,7 @@ All modifications to a cron job, especially its `.spec`, are applied only to the
The `.spec.schedule` is a required field of the `.spec`.
It takes a [Cron](https://en.wikipedia.org/wiki/Cron) format string, such as `0 * * * *` or `@hourly`, as schedule time of its jobs to be created and executed.
-The format also includes extended `vixie cron` step values. As explained in the
+The format also includes extended "Vixie cron" step values. As explained in the
[FreeBSD manual](https://www.freebsd.org/cgi/man.cgi?crontab%285%29):
> Step values can be used in conjunction with ranges. Following a range
@@ -170,13 +174,12 @@ After the deadline, the cron job does not start the job.
Jobs that do not meet their deadline in this way count as failed jobs.
If this field is not specified, the jobs have no deadline.
-The CronJob controller counts how many missed schedules happen for a cron job. If there are more than 100 missed schedules, the cron job is no longer scheduled. When `.spec.startingDeadlineSeconds` is not set, the CronJob controller counts missed schedules from `status.lastScheduleTime` until now.
+If the `.spec.startingDeadlineSeconds` field is set (not null), the CronJob
+controller measures the time between when a job is expected to be created and
+now. If the difference is higher than that limit, it will skip this execution.
-For example, one cron job is supposed to run every minute, the `status.lastScheduleTime` of the cronjob is 5:00am, but now it's 7:00am. That means 120 schedules were missed, so the cron job is no longer scheduled.
-
-If the `.spec.startingDeadlineSeconds` field is set (not null), the CronJob controller counts how many missed jobs occurred from the value of `.spec.startingDeadlineSeconds` until now.
-
-For example, if it is set to `200`, it counts how many missed schedules occurred in the last 200 seconds. In that case, if there were more than 100 missed schedules in the last 200 seconds, the cron job is no longer scheduled.
+For example, if it is set to `200`, it allows a job to be created for up to 200
+seconds after the actual schedule.
### Concurrency Policy
diff --git a/content/en/docs/tasks/job/coarse-parallel-processing-work-queue.md b/content/en/docs/tasks/job/coarse-parallel-processing-work-queue.md
index 62ddf56aab..2db5d3ecc3 100644
--- a/content/en/docs/tasks/job/coarse-parallel-processing-work-queue.md
+++ b/content/en/docs/tasks/job/coarse-parallel-processing-work-queue.md
@@ -2,7 +2,7 @@
title: Coarse Parallel Processing Using a Work Queue
min-kubernetes-server-version: v1.8
content_type: task
-weight: 30
+weight: 20
---
diff --git a/content/en/docs/tasks/job/fine-parallel-processing-work-queue.md b/content/en/docs/tasks/job/fine-parallel-processing-work-queue.md
index 268eed7f9b..c5d1d0fa30 100644
--- a/content/en/docs/tasks/job/fine-parallel-processing-work-queue.md
+++ b/content/en/docs/tasks/job/fine-parallel-processing-work-queue.md
@@ -2,7 +2,7 @@
title: Fine Parallel Processing Using a Work Queue
content_type: task
min-kubernetes-server-version: v1.8
-weight: 40
+weight: 30
---
diff --git a/content/en/docs/tasks/job/indexed-parallel-processing-static.md b/content/en/docs/tasks/job/indexed-parallel-processing-static.md
new file mode 100644
index 0000000000..da5e6d4e08
--- /dev/null
+++ b/content/en/docs/tasks/job/indexed-parallel-processing-static.md
@@ -0,0 +1,185 @@
+---
+title: Indexed Job for Parallel Processing with Static Work Assignment
+content_type: task
+min-kubernetes-server-version: v1.21
+weight: 30
+---
+
+{{< feature-state for_k8s_version="v1.22" state="beta" >}}
+
+
+
+
+In this example, you will run a Kubernetes Job that uses multiple parallel
+worker processes.
+Each worker is a different container running in its own Pod. The Pods have an
+_index number_ that the control plane sets automatically, which allows each Pod
+to identify which part of the overall task to work on.
+
+The pod index is available in the {{< glossary_tooltip text="annotation" term_id="annotation" >}}
+`batch.kubernetes.io/job-completion-index` as a string representing its
+decimal value. In order for the containerized task process to obtain this index,
+you can publish the value of the annotation using the [downward API](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#the-downward-api)
+mechanism.
+For convenience, the control plane automatically sets the downward API to
+expose the index in the `JOB_COMPLETION_INDEX` environment variable.
+
+Here is an overview of the steps in this example:
+
+1. **Define a Job manifest using indexed completion**.
+ The downward API allows you to pass the pod index annotation as an
+ environment variable or file to the container.
+2. **Start an `Indexed` Job based on that manifest**.
+
+## {{% heading "prerequisites" %}}
+
+You should already be familiar with the basic,
+non-parallel, use of [Job](/docs/concepts/workloads/controllers/job/).
+
+{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
+
+
+
+## Choose an approach
+
+To access the work item from the worker program, you have a few options:
+
+1. Read the `JOB_COMPLETION_INDEX` environment variable. The Job
+ {{< glossary_tooltip text="controller" term_id="controller" >}}
+ automatically links this variable to the annotation containing the completion
+ index.
+1. Read a file that contains the completion index.
+1. Assuming that you can't modify the program, you can wrap it with a script
+ that reads the index using any of the methods above and converts it into
+ something that the program can use as input.
+
+For this example, imagine that you chose option 3 and you want to run the
+[rev](https://man7.org/linux/man-pages/man1/rev.1.html) utility. This
+program accepts a file as an argument and prints its content reversed.
+
+```shell
+rev data.txt
+```
+
+You'll use the `rev` tool from the
+[`busybox`](https://hub.docker.com/_/busybox) container image.
+
+As this is only an example, each Pod only does a tiny piece of work (reversing a short
+string). In a real workload you might, for example, create a Job that represents
+ the
+task of producing 60 seconds of video based on scene data.
+Each work item in the video rendering Job would be to render a particular
+frame of that video clip. Indexed completion would mean that each Pod in
+the Job knows which frame to render and publish, by counting frames from
+the start of the clip.
+
+## Define an Indexed Job
+
+Here is a sample Job manifest that uses `Indexed` completion mode:
+
+{{< codenew language="yaml" file="application/job/indexed-job.yaml" >}}
+
+In the example above, you use the builtin `JOB_COMPLETION_INDEX` environment
+variable set by the Job controller for all containers. An [init container](/docs/concepts/workloads/pods/init-containers/)
+maps the index to a static value and writes it to a file that is shared with the
+container running the worker through an [emptyDir volume](/docs/concepts/storage/volumes/#emptydir).
+Optionally, you can [define your own environment variable through the downward
+API](/docs/tasks/inject-data-application/environment-variable-expose-pod-information/)
+to publish the index to containers. You can also choose to load a list of values
+from a [ConfigMap as an environment variable or file](/docs/tasks/configure-pod-container/configure-pod-configmap/).
+
+Alternatively, you can directly [use the downward API to pass the annotation
+value as a volume file](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#store-pod-fields),
+like shown in the following example:
+
+{{< codenew language="yaml" file="application/job/indexed-job-vol.yaml" >}}
+
+## Running the Job
+
+Now run the Job:
+
+```shell
+# This uses the first approach (relying on $JOB_COMPLETION_INDEX)
+kubectl apply -f https://kubernetes.io/examples/application/job/indexed-job.yaml
+```
+
+When you create this Job, the control plane creates a series of Pods, one for each index you specified. The value of `.spec.parallelism` determines how many can run at once whereas `.spec.completions` determines how many Pods the Job creates in total.
+
+Because `.spec.parallelism` is less than `.spec.completions`, the control plane waits for some of the first Pods to complete before starting more of them.
+
+Once you have created the Job, wait a moment then check on progress:
+
+```shell
+kubectl describe jobs/indexed-job
+```
+
+The output is similar to:
+
+```
+Name: indexed-job
+Namespace: default
+Selector: controller-uid=bf865e04-0b67-483b-9a90-74cfc4c3e756
+Labels: controller-uid=bf865e04-0b67-483b-9a90-74cfc4c3e756
+ job-name=indexed-job
+Annotations:
+Parallelism: 3
+Completions: 5
+Start Time: Thu, 11 Mar 2021 15:47:34 +0000
+Pods Statuses: 2 Running / 3 Succeeded / 0 Failed
+Completed Indexes: 0-2
+Pod Template:
+ Labels: controller-uid=bf865e04-0b67-483b-9a90-74cfc4c3e756
+ job-name=indexed-job
+ Init Containers:
+ input:
+ Image: docker.io/library/bash
+ Port:
+ Host Port:
+ Command:
+ bash
+ -c
+ items=(foo bar baz qux xyz)
+ echo ${items[$JOB_COMPLETION_INDEX]} > /input/data.txt
+
+ Environment:
+ Mounts:
+ /input from input (rw)
+ Containers:
+ worker:
+ Image: docker.io/library/busybox
+ Port:
+ Host Port:
+ Command:
+ rev
+ /input/data.txt
+ Environment:
+ Mounts:
+ /input from input (rw)
+ Volumes:
+ input:
+ Type: EmptyDir (a temporary directory that shares a pod's lifetime)
+ Medium:
+ SizeLimit:
+Events:
+ Type Reason Age From Message
+ ---- ------ ---- ---- -------
+ Normal SuccessfulCreate 4s job-controller Created pod: indexed-job-njkjj
+ Normal SuccessfulCreate 4s job-controller Created pod: indexed-job-9kd4h
+ Normal SuccessfulCreate 4s job-controller Created pod: indexed-job-qjwsz
+ Normal SuccessfulCreate 1s job-controller Created pod: indexed-job-fdhq5
+ Normal SuccessfulCreate 1s job-controller Created pod: indexed-job-ncslj
+```
+
+In this example, you run the Job with custom values for each index. You can
+inspect the output of one of the pods:
+
+```shell
+kubectl logs indexed-job-fdhq5 # Change this to match the name of a Pod from that Job
+```
+
+
+The output is similar to:
+
+```
+xuq
+```
\ No newline at end of file
diff --git a/content/en/docs/tasks/job/parallel-processing-expansion.md b/content/en/docs/tasks/job/parallel-processing-expansion.md
index 8f5994929e..fdd309cafb 100644
--- a/content/en/docs/tasks/job/parallel-processing-expansion.md
+++ b/content/en/docs/tasks/job/parallel-processing-expansion.md
@@ -2,7 +2,7 @@
title: Parallel Processing using Expansions
content_type: task
min-kubernetes-server-version: v1.8
-weight: 20
+weight: 50
---
diff --git a/content/en/docs/tasks/manage-daemon/_index.md b/content/en/docs/tasks/manage-daemon/_index.md
old mode 100755
new mode 100644
diff --git a/content/en/docs/tasks/manage-daemon/update-daemon-set.md b/content/en/docs/tasks/manage-daemon/update-daemon-set.md
index 2f3001da0f..a74864fed5 100644
--- a/content/en/docs/tasks/manage-daemon/update-daemon-set.md
+++ b/content/en/docs/tasks/manage-daemon/update-daemon-set.md
@@ -7,12 +7,11 @@ weight: 10
---
-
This page shows how to perform a rolling update on a DaemonSet.
## {{% heading "prerequisites" %}}
-* The DaemonSet rolling update feature is only supported in Kubernetes version 1.6 or later.
+{{< include "task-tutorial-prereqs.md" >}}
@@ -20,22 +19,28 @@ This page shows how to perform a rolling update on a DaemonSet.
DaemonSet has two update strategy types:
-* OnDelete: With `OnDelete` update strategy, after you update a DaemonSet template, new
+* `OnDelete`: With `OnDelete` update strategy, after you update a DaemonSet template, new
DaemonSet pods will *only* be created when you manually delete old DaemonSet
pods. This is the same behavior of DaemonSet in Kubernetes version 1.5 or
before.
-* RollingUpdate: This is the default update strategy.
+* `RollingUpdate`: This is the default update strategy.
With `RollingUpdate` update strategy, after you update a
DaemonSet template, old DaemonSet pods will be killed, and new DaemonSet pods
- will be created automatically, in a controlled fashion. At most one pod of the DaemonSet will be running on each node during the whole update process.
+ will be created automatically, in a controlled fashion. At most one pod of
+ the DaemonSet will be running on each node during the whole update process.
## Performing a Rolling Update
To enable the rolling update feature of a DaemonSet, you must set its
`.spec.updateStrategy.type` to `RollingUpdate`.
-You may want to set [`.spec.updateStrategy.rollingUpdate.maxUnavailable`](/docs/concepts/workloads/controllers/deployment/#max-unavailable) (default
-to 1) and [`.spec.minReadySeconds`](/docs/concepts/workloads/controllers/deployment/#min-ready-seconds) (default to 0) as well.
+You may want to set
+[`.spec.updateStrategy.rollingUpdate.maxUnavailable`](/docs/concepts/workloads/controllers/deployment/#max-unavailable)
+(default to 1),
+[`.spec.minReadySeconds`](/docs/concepts/workloads/controllers/deployment/#min-ready-seconds)
+(default to 0) and
+[`.spec.maxSurge`](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#max-surge)
+(a beta feature and defaults to 25%) as well.
### Creating a DaemonSet with `RollingUpdate` update strategy
@@ -143,7 +148,7 @@ causes:
The rollout is stuck because new DaemonSet pods can't be scheduled on at least one
node. This is possible when the node is
-[running out of resources](/docs/tasks/administer-cluster/out-of-resource/).
+[running out of resources](/docs/concepts/scheduling-eviction/node-pressure-eviction/).
When this happens, find the nodes that don't have the DaemonSet pods scheduled on
by comparing the output of `kubectl get nodes` and the output of:
@@ -184,14 +189,7 @@ Delete DaemonSet from a namespace :
kubectl delete ds fluentd-elasticsearch -n kube-system
```
-
-
-
## {{% heading "whatsnext" %}}
-
-* See [Task: Performing a rollback on a
- DaemonSet](/docs/tasks/manage-daemon/rollback-daemon-set/)
-* See [Concepts: Creating a DaemonSet to adopt existing DaemonSet pods](/docs/concepts/workloads/controllers/daemonset/)
-
-
+* See [Performing a rollback on a DaemonSet](/docs/tasks/manage-daemon/rollback-daemon-set/)
+* See [Creating a DaemonSet to adopt existing DaemonSet pods](/docs/concepts/workloads/controllers/daemonset/)
diff --git a/content/en/docs/tasks/manage-hugepages/scheduling-hugepages.md b/content/en/docs/tasks/manage-hugepages/scheduling-hugepages.md
index 8d4cd4afe6..dd78446381 100644
--- a/content/en/docs/tasks/manage-hugepages/scheduling-hugepages.md
+++ b/content/en/docs/tasks/manage-hugepages/scheduling-hugepages.md
@@ -113,10 +113,4 @@ spec:
- Huge page usage in a namespace is controllable via ResourceQuota similar
to other compute resources like `cpu` or `memory` using the `hugepages-`
token.
-- Support of multiple sizes huge pages is feature gated. It can be
- disabled with the `HugePageStorageMediumSize`
- [feature gate](/docs/reference/command-line-tools-reference/feature-gates/)
- on the {{< glossary_tooltip text="kubelet" term_id="kubelet" >}} and
- {{< glossary_tooltip text="kube-apiserver" term_id="kube-apiserver" >}}
- (`--feature-gates=HugePageStorageMediumSize=false`).
diff --git a/content/en/docs/tasks/manage-kubernetes-objects/kustomization.md b/content/en/docs/tasks/manage-kubernetes-objects/kustomization.md
index 3ea3c50e8d..9b16c25167 100644
--- a/content/en/docs/tasks/manage-kubernetes-objects/kustomization.md
+++ b/content/en/docs/tasks/manage-kubernetes-objects/kustomization.md
@@ -86,6 +86,43 @@ metadata:
name: example-configmap-1-8mbdf7882g
```
+To generate a ConfigMap from an env file, add an entry to the `envs` list in `configMapGenerator`. Here is an example of generating a ConfigMap with a data item from a `.env` file:
+
+```shell
+# Create a .env file
+cat <.env
+FOO=Bar
+EOF
+
+cat <