Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kubeadm: add a Timeouts struct to v1beta4 #122529

Merged
merged 6 commits into from
Jan 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 5 additions & 3 deletions cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import (

bootstraptokenv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/bootstraptoken/v1"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
)

// Funcs returns the fuzzer functions for the kubeadm apis.
Expand Down Expand Up @@ -65,6 +64,7 @@ func fuzzInitConfiguration(obj *kubeadm.InitConfiguration, c fuzz.Continue) {
obj.NodeRegistration.ImagePullPolicy = corev1.PullIfNotPresent
obj.Patches = nil
obj.DryRun = false
kubeadm.SetDefaultTimeouts(&obj.Timeouts)
}

func fuzzNodeRegistration(obj *kubeadm.NodeRegistrationOptions, c fuzz.Continue) {
Expand All @@ -85,7 +85,7 @@ func fuzzClusterConfiguration(obj *kubeadm.ClusterConfiguration, c fuzz.Continue
obj.KubernetesVersion = "qux"
obj.CIKubernetesVersion = "" // This fields doesn't exists in public API >> using default to get the roundtrip test pass
obj.APIServer.TimeoutForControlPlane = &metav1.Duration{
Duration: constants.DefaultControlPlaneTimeout,
Duration: 0,
}
obj.ControllerManager.ExtraEnvs = []kubeadm.EnvVar{}
obj.APIServer.ExtraEnvs = []kubeadm.EnvVar{}
Expand Down Expand Up @@ -128,12 +128,13 @@ func fuzzJoinConfiguration(obj *kubeadm.JoinConfiguration, c fuzz.Continue) {
obj.Discovery = kubeadm.Discovery{
BootstrapToken: &kubeadm.BootstrapTokenDiscovery{Token: "baz"},
TLSBootstrapToken: "qux",
Timeout: &metav1.Duration{Duration: 1234},
Timeout: &metav1.Duration{},
}
obj.SkipPhases = nil
obj.NodeRegistration.ImagePullPolicy = corev1.PullIfNotPresent
obj.Patches = nil
obj.DryRun = false
kubeadm.SetDefaultTimeouts(&obj.Timeouts)
}

func fuzzJoinControlPlane(obj *kubeadm.JoinControlPlane, c fuzz.Continue) {
Expand All @@ -145,4 +146,5 @@ func fuzzResetConfiguration(obj *kubeadm.ResetConfiguration, c fuzz.Continue) {

// Pinning values for fields that get defaults if fuzz value is empty string or nil (thus making the round trip test fail)
obj.CertificatesDir = "/tmp"
kubeadm.SetDefaultTimeouts(&obj.Timeouts)
}
59 changes: 59 additions & 0 deletions cmd/kubeadm/app/apis/kubeadm/timeoututils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
Copyright 2023 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package kubeadm

import (
"sync"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
)

// SetDefaultTimeouts sets an internal Timeouts struct to its default values.
func SetDefaultTimeouts(t **Timeouts) {
*t = &Timeouts{
ControlPlaneComponentHealthCheck: &metav1.Duration{Duration: constants.ControlPlaneComponentHealthCheckTimeout},
KubeletHealthCheck: &metav1.Duration{Duration: constants.KubeletHealthCheckTimeout},
KubernetesAPICall: &metav1.Duration{Duration: constants.KubernetesAPICallTimeout},
EtcdAPICall: &metav1.Duration{Duration: constants.EtcdAPICallTimeout},
TLSBootstrap: &metav1.Duration{Duration: constants.TLSBootstrapTimeout},
Discovery: &metav1.Duration{Duration: constants.DiscoveryTimeout},
}
}

var (
activeTimeouts *Timeouts = nil
timeoutMutex = &sync.RWMutex{}
)

func init() {
SetDefaultTimeouts(&activeTimeouts)
}

// GetActiveTimeouts gets the active timeouts structure.
func GetActiveTimeouts() *Timeouts {
timeoutMutex.RLock()
defer timeoutMutex.RUnlock()
return activeTimeouts
}

// SetActiveTimeouts sets the active timeouts structure.
func SetActiveTimeouts(timeouts *Timeouts) {
timeoutMutex.Lock()
activeTimeouts = timeouts.DeepCopy()
timeoutMutex.Unlock()
}
36 changes: 36 additions & 0 deletions cmd/kubeadm/app/apis/kubeadm/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ type InitConfiguration struct {
// Patches contains options related to applying patches to components deployed by kubeadm during
// "kubeadm init".
Patches *Patches

// Timeouts holds various timeouts that apply to kubeadm commands.
Timeouts *Timeouts
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
Expand Down Expand Up @@ -343,6 +346,9 @@ type JoinConfiguration struct {
// Patches contains options related to applying patches to components deployed by kubeadm during
// "kubeadm join".
Patches *Patches

// Timeouts holds various timeouts that apply to kubeadm commands.
Timeouts *Timeouts
}

// JoinControlPlane contains elements describing an additional control plane instance to be deployed on the joining node.
Expand Down Expand Up @@ -527,6 +533,9 @@ type ResetConfiguration struct {
// directories during "reset". A flag can be one of: MNT_FORCE, MNT_DETACH, MNT_EXPIRE, UMOUNT_NOFOLLOW.
// By default this list is empty.
UnmountFlags []string

// Timeouts holds various timeouts that apply to kubeadm commands.
Timeouts *Timeouts
}

const (
Expand Down Expand Up @@ -563,3 +572,30 @@ const (
// EncryptionAlgorithmRSA defines the RSA encryption algorithm type.
EncryptionAlgorithmRSA EncryptionAlgorithmType = "RSA"
)

// Timeouts holds various timeouts that apply to kubeadm commands.
type Timeouts struct {
// ControlPlaneComponentHealthCheck is the amount of time to wait for a control plane
// component, such as the API server, to be healthy during "kubeadm init" and "kubeadm join".
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we mention the default value here?

Copy link
Member Author

@neolit123 neolit123 Jan 3, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i have been waiting for API machinery to add the +default=xx feature, but looks like it's still WIP.

we are not consistent about showing defaults in godoc comments in the kubeadm's API. users have to use config print xx-defaults to see them. might be a good idea to put all the defaults as part of this PR in godoc form.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated to mention defaults in the v1beta4 public type

ControlPlaneComponentHealthCheck *metav1.Duration

// KubeletHealthCheck is the amount of time to wait for the kubelet to be healthy
// during "kubeadm init" and "kubeadm join".
KubeletHealthCheck *metav1.Duration

// KubernetesAPICall is the amount of time to wait for the kubeadm client to complete a request to
// the API server. This applies to all types of methods (GET, POST, etc).
KubernetesAPICall *metav1.Duration

// EtcdAPICall is the amount of time to wait for the kubeadm etcd client to complete a request to
// the etcd cluster.
EtcdAPICall *metav1.Duration

// TLSBootstrap is the amount of time to wait for the kubelet to complete TLS bootstrap
// for a joining node.
TLSBootstrap *metav1.Duration

// Discovery is the amount of time to wait for kubeadm to validate the API server identity
// for a joining node.
Discovery *metav1.Duration
}
23 changes: 18 additions & 5 deletions cmd/kubeadm/app/apis/kubeadm/v1beta3/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,6 @@ func Convert_kubeadm_InitConfiguration_To_v1beta3_InitConfiguration(in *kubeadm.
return autoConvert_kubeadm_InitConfiguration_To_v1beta3_InitConfiguration(in, out, s)
}

// Convert_kubeadm_JoinConfiguration_To_v1beta3_JoinConfiguration converts a private JoinConfiguration to public JoinConfiguration.
func Convert_kubeadm_JoinConfiguration_To_v1beta3_JoinConfiguration(in *kubeadm.JoinConfiguration, out *JoinConfiguration, s conversion.Scope) error {
return autoConvert_kubeadm_JoinConfiguration_To_v1beta3_JoinConfiguration(in, out, s)
}

// Convert_v1beta3_InitConfiguration_To_kubeadm_InitConfiguration converts a public InitConfiguration to private InitConfiguration.
func Convert_v1beta3_InitConfiguration_To_kubeadm_InitConfiguration(in *InitConfiguration, out *kubeadm.InitConfiguration, s conversion.Scope) error {
err := autoConvert_v1beta3_InitConfiguration_To_kubeadm_InitConfiguration(in, out, s)
Expand All @@ -45,9 +40,22 @@ func Convert_v1beta3_InitConfiguration_To_kubeadm_InitConfiguration(in *InitConf
// If we call Convert_v1beta3_ClusterConfiguration_To_kubeadm_ClusterConfiguration() it will receive
// a default value, thus here we need to reset it back to "".
out.EncryptionAlgorithm = ""
// Set default timeouts.
kubeadm.SetDefaultTimeouts(&out.Timeouts)
return err
}

// Convert_kubeadm_JoinConfiguration_To_v1beta3_JoinConfiguration converts a private JoinConfiguration to public JoinConfiguration.
func Convert_kubeadm_JoinConfiguration_To_v1beta3_JoinConfiguration(in *kubeadm.JoinConfiguration, out *JoinConfiguration, s conversion.Scope) error {
return autoConvert_kubeadm_JoinConfiguration_To_v1beta3_JoinConfiguration(in, out, s)
}

// Convert_v1beta3_JoinConfiguration_To_kubeadm_JoinConfiguration converts a public JoinConfiguration to a private JoinConfiguration.
func Convert_v1beta3_JoinConfiguration_To_kubeadm_JoinConfiguration(in *JoinConfiguration, out *kubeadm.JoinConfiguration, s conversion.Scope) error {
kubeadm.SetDefaultTimeouts(&out.Timeouts)
return autoConvert_v1beta3_JoinConfiguration_To_kubeadm_JoinConfiguration(in, out, s)
}

// Convert_kubeadm_ClusterConfiguration_To_v1beta3_ClusterConfiguration is required due to missing EncryptionAlgorithm in v1beta3.
func Convert_kubeadm_ClusterConfiguration_To_v1beta3_ClusterConfiguration(in *kubeadm.ClusterConfiguration, out *ClusterConfiguration, s conversion.Scope) error {
return autoConvert_kubeadm_ClusterConfiguration_To_v1beta3_ClusterConfiguration(in, out, s)
Expand Down Expand Up @@ -135,3 +143,8 @@ func convertFromArgs(in []kubeadm.Arg) map[string]string {
}
return args
}

// Convert_v1beta3_APIServer_To_kubeadm_APIServer is required due to missing APIServer.TimeoutForControlPlane in v1beta4.
func Convert_v1beta3_APIServer_To_kubeadm_APIServer(in *APIServer, out *kubeadm.APIServer, s conversion.Scope) error {
return autoConvert_v1beta3_APIServer_To_kubeadm_APIServer(in, out, s)
}
2 changes: 1 addition & 1 deletion cmd/kubeadm/app/apis/kubeadm/v1beta3/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ func SetDefaults_ClusterConfiguration(obj *ClusterConfiguration) {
func SetDefaults_APIServer(obj *APIServer) {
if obj.TimeoutForControlPlane == nil {
obj.TimeoutForControlPlane = &metav1.Duration{
Duration: constants.DefaultControlPlaneTimeout,
Duration: constants.ControlPlaneComponentHealthCheckTimeout,
}
}
}
Expand Down
32 changes: 12 additions & 20 deletions cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.conversion.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 31 additions & 0 deletions cmd/kubeadm/app/apis/kubeadm/v1beta4/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ limitations under the License.
package v1beta4

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/conversion"

"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
Expand All @@ -34,5 +35,35 @@ func Convert_v1beta4_InitConfiguration_To_kubeadm_InitConfiguration(in *InitConf
return err
}
err = Convert_v1beta4_ClusterConfiguration_To_kubeadm_ClusterConfiguration(&ClusterConfiguration{}, &out.ClusterConfiguration, s)
out.ClusterConfiguration.APIServer.TimeoutForControlPlane = nil
return err
}

// Convert_kubeadm_APIServer_To_v1beta4_APIServer is required due to missing APIServer.TimeoutForControlPlane in v1beta4.
func Convert_kubeadm_APIServer_To_v1beta4_APIServer(in *kubeadm.APIServer, out *APIServer, s conversion.Scope) error {
return autoConvert_kubeadm_APIServer_To_v1beta4_APIServer(in, out, s)
}

// Convert_v1beta4_ClusterConfiguration_To_kubeadm_ClusterConfiguration is required due to missing TimeoutForControlPlane in v1beta4
func Convert_v1beta4_ClusterConfiguration_To_kubeadm_ClusterConfiguration(in *ClusterConfiguration, out *kubeadm.ClusterConfiguration, s conversion.Scope) error {
out.APIServer.TimeoutForControlPlane = &metav1.Duration{}
return autoConvert_v1beta4_ClusterConfiguration_To_kubeadm_ClusterConfiguration(in, out, s)
}

// Convert_v1beta4_JoinConfiguration_To_kubeadm_JoinConfiguration converts a public JoinConfiguration to a private JoinConfiguration.
func Convert_v1beta4_JoinConfiguration_To_kubeadm_JoinConfiguration(in *JoinConfiguration, out *kubeadm.JoinConfiguration, s conversion.Scope) error {
err := autoConvert_v1beta4_JoinConfiguration_To_kubeadm_JoinConfiguration(in, out, s)
return err
}

// Convert_kubeadm_Discovery_To_v1beta4_Discovery is required because there is no Discovery.Timeout in v1beta4
func Convert_kubeadm_Discovery_To_v1beta4_Discovery(in *kubeadm.Discovery, out *Discovery, s conversion.Scope) error {
return autoConvert_kubeadm_Discovery_To_v1beta4_Discovery(in, out, s)
}

// Convert_v1beta4_Discovery_To_kubeadm_Discovery is required because there is no Discovery.Timeout in v1beta4
func Convert_v1beta4_Discovery_To_kubeadm_Discovery(in *Discovery, out *kubeadm.Discovery, s conversion.Scope) error {
err := autoConvert_v1beta4_Discovery_To_kubeadm_Discovery(in, out, s)
out.Timeout = &metav1.Duration{}
return err
}