Skip to content

Commit 674695c

Browse files
authored
Merge pull request kubernetes#85639 from rosti/kubeadm-cc-kind-to-group
kubeadm: Group centric component configs
2 parents 8516f79 + b881f19 commit 674695c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1750
-942
lines changed

cmd/kubeadm/app/apis/kubeadm/BUILD

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ go_library(
2525
"//staging/src/k8s.io/cluster-bootstrap/token/api:go_default_library",
2626
"//staging/src/k8s.io/cluster-bootstrap/token/util:go_default_library",
2727
"//staging/src/k8s.io/cluster-bootstrap/util/secrets:go_default_library",
28-
"//staging/src/k8s.io/kube-proxy/config/v1alpha1:go_default_library",
29-
"//staging/src/k8s.io/kubelet/config/v1beta1:go_default_library",
3028
"//vendor/github.com/pkg/errors:go_default_library",
3129
],
3230
)

cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func Funcs(codecs runtimeserializer.CodecFactory) []interface{} {
3030
return []interface{}{
3131
fuzzInitConfiguration,
3232
fuzzClusterConfiguration,
33-
fuzzComponentConfigs,
33+
fuzzComponentConfigMap,
3434
fuzzDNS,
3535
fuzzNodeRegistration,
3636
fuzzLocalEtcd,
@@ -116,7 +116,7 @@ func fuzzDNS(obj *kubeadm.DNS, c fuzz.Continue) {
116116
obj.Type = kubeadm.CoreDNS
117117
}
118118

119-
func fuzzComponentConfigs(obj *kubeadm.ComponentConfigs, c fuzz.Continue) {
119+
func fuzzComponentConfigMap(obj *kubeadm.ComponentConfigMap, c fuzz.Continue) {
120120
// This is intentionally empty because component config does not exists in the public api
121121
// (empty mean all ComponentConfigs fields nil, and this is necessary for getting roundtrip passing)
122122
}

cmd/kubeadm/app/apis/kubeadm/types.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ package kubeadm
1919
import (
2020
v1 "k8s.io/api/core/v1"
2121
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
22-
kubeproxyconfigv1alpha1 "k8s.io/kube-proxy/config/v1alpha1"
23-
kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1"
22+
23+
"k8s.io/apimachinery/pkg/runtime/schema"
2424
)
2525

2626
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
@@ -62,9 +62,9 @@ type InitConfiguration struct {
6262
type ClusterConfiguration struct {
6363
metav1.TypeMeta
6464

65-
// ComponentConfigs holds internal ComponentConfig struct types known to kubeadm, should long-term only exist in the internal kubeadm API
65+
// ComponentConfigs holds component configs known to kubeadm, should long-term only exist in the internal kubeadm API
6666
// +k8s:conversion-gen=false
67-
ComponentConfigs ComponentConfigs
67+
ComponentConfigs ComponentConfigMap
6868

6969
// Etcd holds configuration for etcd.
7070
Etcd Etcd
@@ -181,14 +181,6 @@ type ImageMeta struct {
181181
//TODO: evaluate if we need also a ImageName based on user feedbacks
182182
}
183183

184-
// ComponentConfigs holds known internal ComponentConfig types for other components
185-
type ComponentConfigs struct {
186-
// Kubelet holds the ComponentConfiguration for the kubelet
187-
Kubelet *kubeletconfigv1beta1.KubeletConfiguration
188-
// KubeProxy holds the ComponentConfiguration for the kube-proxy
189-
KubeProxy *kubeproxyconfigv1alpha1.KubeProxyConfiguration
190-
}
191-
192184
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
193185

194186
// ClusterStatus contains the cluster status. The ClusterStatus will be stored in the kubeadm-config
@@ -424,3 +416,25 @@ type HostPathMount struct {
424416
// PathType is the type of the HostPath.
425417
PathType v1.HostPathType
426418
}
419+
420+
// DocumentMap is a convenient way to describe a map between a YAML document and its GVK type
421+
// +k8s:deepcopy-gen=false
422+
type DocumentMap map[schema.GroupVersionKind][]byte
423+
424+
// ComponentConfig holds a known component config
425+
type ComponentConfig interface {
426+
// DeepCopy should create a new deep copy of the component config in place
427+
DeepCopy() ComponentConfig
428+
429+
// Marshal is marshalling the config into a YAML document returned as a byte slice
430+
Marshal() ([]byte, error)
431+
432+
// Unmarshal loads the config from a document map. No config in the document map is no error.
433+
Unmarshal(docmap DocumentMap) error
434+
435+
// Default patches the component config with kubeadm preferred defaults
436+
Default(cfg *ClusterConfiguration, localAPIEndpoint *APIEndpoint)
437+
}
438+
439+
// ComponentConfigMap is a map between a group name (as in GVK group) and a ComponentConfig
440+
type ComponentConfigMap map[string]ComponentConfig

cmd/kubeadm/app/apis/kubeadm/validation/BUILD

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,9 @@ go_test(
3232
deps = [
3333
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
3434
"//cmd/kubeadm/app/apis/kubeadm/v1beta2:go_default_library",
35-
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
3635
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
3736
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
38-
"//staging/src/k8s.io/kube-proxy/config/v1alpha1:go_default_library",
3937
"//vendor/github.com/spf13/pflag:go_default_library",
40-
"//vendor/k8s.io/utils/pointer:go_default_library",
4138
],
4239
)
4340

cmd/kubeadm/app/apis/kubeadm/validation/validation.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func ValidateClusterConfiguration(c *kubeadm.ClusterConfiguration) field.ErrorLi
6464
allErrs = append(allErrs, ValidateFeatureGates(c.FeatureGates, field.NewPath("featureGates"))...)
6565
allErrs = append(allErrs, ValidateHostPort(c.ControlPlaneEndpoint, field.NewPath("controlPlaneEndpoint"))...)
6666
allErrs = append(allErrs, ValidateEtcd(&c.Etcd, field.NewPath("etcd"))...)
67-
allErrs = append(allErrs, componentconfigs.Known.Validate(c)...)
67+
allErrs = append(allErrs, componentconfigs.Validate(c)...)
6868
return allErrs
6969
}
7070

cmd/kubeadm/app/apis/kubeadm/validation/validation_test.go

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,12 @@ import (
2020
"io/ioutil"
2121
"os"
2222
"testing"
23-
"time"
2423

2524
"github.com/spf13/pflag"
26-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2725
"k8s.io/apimachinery/pkg/util/sets"
2826
"k8s.io/apimachinery/pkg/util/validation/field"
29-
kubeproxyconfigv1alpha1 "k8s.io/kube-proxy/config/v1alpha1"
3027
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
3128
kubeadmapiv1beta2 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2"
32-
utilpointer "k8s.io/utils/pointer"
3329
)
3430

3531
func TestValidateToken(t *testing.T) {
@@ -448,31 +444,6 @@ func TestValidateInitConfiguration(t *testing.T) {
448444
DataDir: "/some/path",
449445
},
450446
},
451-
ComponentConfigs: kubeadm.ComponentConfigs{
452-
KubeProxy: &kubeproxyconfigv1alpha1.KubeProxyConfiguration{
453-
BindAddress: "192.168.59.103",
454-
HealthzBindAddress: "0.0.0.0:10256",
455-
MetricsBindAddress: "127.0.0.1:10249",
456-
ClusterCIDR: "192.168.59.0/24",
457-
UDPIdleTimeout: metav1.Duration{Duration: 1 * time.Second},
458-
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
459-
IPTables: kubeproxyconfigv1alpha1.KubeProxyIPTablesConfiguration{
460-
MasqueradeAll: true,
461-
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
462-
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
463-
},
464-
IPVS: kubeproxyconfigv1alpha1.KubeProxyIPVSConfiguration{
465-
SyncPeriod: metav1.Duration{Duration: 10 * time.Second},
466-
MinSyncPeriod: metav1.Duration{Duration: 5 * time.Second},
467-
},
468-
Conntrack: kubeproxyconfigv1alpha1.KubeProxyConntrackConfiguration{
469-
MaxPerCore: utilpointer.Int32Ptr(1),
470-
Min: utilpointer.Int32Ptr(1),
471-
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
472-
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
473-
},
474-
},
475-
},
476447
Networking: kubeadm.Networking{
477448
ServiceSubnet: "10.96.0.1/12",
478449
DNSDomain: "cluster.local",
@@ -494,31 +465,6 @@ func TestValidateInitConfiguration(t *testing.T) {
494465
DataDir: "/some/path",
495466
},
496467
},
497-
ComponentConfigs: kubeadm.ComponentConfigs{
498-
KubeProxy: &kubeproxyconfigv1alpha1.KubeProxyConfiguration{
499-
BindAddress: "192.168.59.103",
500-
HealthzBindAddress: "0.0.0.0:10256",
501-
MetricsBindAddress: "127.0.0.1:10249",
502-
ClusterCIDR: "192.168.59.0/24",
503-
UDPIdleTimeout: metav1.Duration{Duration: 1 * time.Second},
504-
ConfigSyncPeriod: metav1.Duration{Duration: 1 * time.Second},
505-
IPTables: kubeproxyconfigv1alpha1.KubeProxyIPTablesConfiguration{
506-
MasqueradeAll: true,
507-
SyncPeriod: metav1.Duration{Duration: 5 * time.Second},
508-
MinSyncPeriod: metav1.Duration{Duration: 2 * time.Second},
509-
},
510-
IPVS: kubeproxyconfigv1alpha1.KubeProxyIPVSConfiguration{
511-
SyncPeriod: metav1.Duration{Duration: 10 * time.Second},
512-
MinSyncPeriod: metav1.Duration{Duration: 5 * time.Second},
513-
},
514-
Conntrack: kubeproxyconfigv1alpha1.KubeProxyConntrackConfiguration{
515-
MaxPerCore: utilpointer.Int32Ptr(1),
516-
Min: utilpointer.Int32Ptr(1),
517-
TCPEstablishedTimeout: &metav1.Duration{Duration: 5 * time.Second},
518-
TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second},
519-
},
520-
},
521-
},
522468
Networking: kubeadm.Networking{
523469
ServiceSubnet: "2001:db8::1/98",
524470
DNSDomain: "cluster.local",

cmd/kubeadm/app/apis/kubeadm/zz_generated.deepcopy.go

Lines changed: 19 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/kubeadm/app/cmd/BUILD

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ go_test(
8484
"//cmd/kubeadm/app/apis/output/scheme:go_default_library",
8585
"//cmd/kubeadm/app/apis/output/v1alpha1:go_default_library",
8686
"//cmd/kubeadm/app/cmd/options:go_default_library",
87-
"//cmd/kubeadm/app/componentconfigs:go_default_library",
8887
"//cmd/kubeadm/app/constants:go_default_library",
8988
"//cmd/kubeadm/app/features:go_default_library",
9089
"//cmd/kubeadm/app/util:go_default_library",

cmd/kubeadm/app/cmd/config.go

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func NewCmdConfigPrintJoinDefaults(out io.Writer) *cobra.Command {
116116
}
117117

118118
func newCmdConfigPrintActionDefaults(out io.Writer, action string, configBytesProc func() ([]byte, error)) *cobra.Command {
119-
componentConfigs := []string{}
119+
kinds := []string{}
120120
cmd := &cobra.Command{
121121
Use: fmt.Sprintf("%s-defaults", action),
122122
Short: fmt.Sprintf("Print default %s configuration, that can be used for 'kubeadm %s'", action, action),
@@ -127,11 +127,15 @@ func newCmdConfigPrintActionDefaults(out io.Writer, action string, configBytesPr
127127
not perform the real computation for creating a token.
128128
`), action, action, placeholderToken),
129129
RunE: func(cmd *cobra.Command, args []string) error {
130-
return runConfigPrintActionDefaults(out, componentConfigs, configBytesProc)
130+
groups, err := mapLegacyKindsToGroups(kinds)
131+
if err != nil {
132+
return err
133+
}
134+
return runConfigPrintActionDefaults(out, groups, configBytesProc)
131135
},
132136
}
133-
cmd.Flags().StringSliceVar(&componentConfigs, "component-configs", componentConfigs,
134-
fmt.Sprintf("A comma-separated list for component config API objects to print the default values for. Available values: %v. If this flag is not set, no component configs will be printed.", getSupportedComponentConfigAPIObjects()))
137+
cmd.Flags().StringSliceVar(&kinds, "component-configs", kinds,
138+
fmt.Sprintf("A comma-separated list for component config API objects to print the default values for. Available values: %v. If this flag is not set, no component configs will be printed.", getSupportedComponentConfigKinds()))
135139
return cmd
136140
}
137141

@@ -154,35 +158,49 @@ func runConfigPrintActionDefaults(out io.Writer, componentConfigs []string, conf
154158
return nil
155159
}
156160

157-
func getDefaultComponentConfigBytes(apiObject string) ([]byte, error) {
158-
registration, ok := componentconfigs.Known[componentconfigs.RegistrationKind(apiObject)]
159-
if !ok {
160-
return []byte{}, errors.Errorf("--component-configs needs to contain some of %v", getSupportedComponentConfigAPIObjects())
161-
}
162-
161+
func getDefaultComponentConfigBytes(group string) ([]byte, error) {
163162
defaultedInitConfig, err := getDefaultedInitConfig()
164163
if err != nil {
165164
return []byte{}, err
166165
}
167166

168-
realObj, ok := registration.GetFromInternalConfig(&defaultedInitConfig.ClusterConfiguration)
167+
componentCfg, ok := defaultedInitConfig.ComponentConfigs[group]
169168
if !ok {
170-
return []byte{}, errors.New("GetFromInternalConfig failed")
169+
return []byte{}, errors.Errorf("cannot get defaulted config for component group %q", group)
171170
}
172171

173-
return registration.Marshal(realObj)
172+
return componentCfg.Marshal()
174173
}
175174

176-
// getSupportedComponentConfigAPIObjects returns all currently supported component config API object names
177-
func getSupportedComponentConfigAPIObjects() []string {
175+
// legacyKindToGroupMap maps between the old API object types and the new way of specifying component configs (by group)
176+
var legacyKindToGroupMap = map[string]string{
177+
"KubeletConfiguration": componentconfigs.KubeletGroup,
178+
"KubeProxyConfiguration": componentconfigs.KubeProxyGroup,
179+
}
180+
181+
// getSupportedComponentConfigKinds returns all currently supported component config API object names
182+
func getSupportedComponentConfigKinds() []string {
178183
objects := []string{}
179-
for componentType := range componentconfigs.Known {
184+
for componentType := range legacyKindToGroupMap {
180185
objects = append(objects, string(componentType))
181186
}
182187
sort.Strings(objects)
183188
return objects
184189
}
185190

191+
func mapLegacyKindsToGroups(kinds []string) ([]string, error) {
192+
groups := []string{}
193+
for _, kind := range kinds {
194+
group, ok := legacyKindToGroupMap[kind]
195+
if ok {
196+
groups = append(groups, group)
197+
} else {
198+
return nil, errors.Errorf("--component-configs needs to contain some of %v", getSupportedComponentConfigKinds())
199+
}
200+
}
201+
return groups, nil
202+
}
203+
186204
func getDefaultedInitConfig() (*kubeadmapi.InitConfiguration, error) {
187205
initCfg := &kubeadmapiv1beta2.InitConfiguration{
188206
LocalAPIEndpoint: kubeadmapiv1beta2.APIEndpoint{AdvertiseAddress: "1.2.3.4"},

0 commit comments

Comments
 (0)