github.com/alibaba/sealer@v0.8.6-0.20220430115802-37a2bdaa8173/pkg/runtime/kubeadm_config.go (about) 1 // Copyright © 2021 Alibaba Group Holding Ltd. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package runtime 16 17 import ( 18 "fmt" 19 20 "github.com/alibaba/sealer/pkg/runtime/kubeadm_types/v1beta2" 21 "github.com/alibaba/sealer/utils" 22 "github.com/imdario/mergo" 23 "k8s.io/kube-proxy/config/v1alpha1" 24 "k8s.io/kubelet/config/v1beta1" 25 ) 26 27 // Read config from https://github.com/alibaba/sealer/blob/main/docs/design/clusterfile-v2.md and overwrite default kubeadm.yaml 28 // Use github.com/imdario/mergo to merge kubeadm config in Clusterfile and the default kubeadm config 29 // Using a config filter to handle some edge cases 30 31 // https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/apis/kubeadm/v1beta2/types.go 32 // Using map to overwrite Kubeadm configs 33 34 //nolint 35 type KubeadmConfig struct { 36 v1beta2.InitConfiguration 37 v1beta2.ClusterConfiguration 38 v1alpha1.KubeProxyConfiguration 39 v1beta1.KubeletConfiguration 40 v1beta2.JoinConfiguration 41 } 42 43 // LoadFromClusterfile :Load KubeadmConfig from Clusterfile. 44 // If it has `KubeadmConfig` in Clusterfile, load every field to each configuration. 45 // If Kubeadm raw config in Clusterfile, just load it. 46 func (k *KubeadmConfig) LoadFromClusterfile(kubeadmConfig *KubeadmConfig) error { 47 if kubeadmConfig == nil { 48 return nil 49 } 50 k.APIServer.CertSANs = append(k.APIServer.CertSANs, kubeadmConfig.APIServer.CertSANs...) 51 return mergo.Merge(k, kubeadmConfig) 52 } 53 54 // Merge Using github.com/imdario/mergo to merge KubeadmConfig to the CloudImage default kubeadm config, overwrite some field. 55 // if defaultKubeadmConfig file not exist, use default raw kubeadm config to merge k.KubeConfigSpec empty value 56 func (k *KubeadmConfig) Merge(kubeadmYamlPath string) error { 57 var ( 58 defaultKubeadmConfig *KubeadmConfig 59 err error 60 ) 61 if kubeadmYamlPath == "" || !utils.IsFileExist(kubeadmYamlPath) { 62 defaultKubeadmConfig, err = LoadKubeadmConfigs(DefaultKubeadmConfig, DecodeCRDFromString) 63 if err != nil { 64 return err 65 } 66 return mergo.Merge(k, defaultKubeadmConfig) 67 } 68 defaultKubeadmConfig, err = LoadKubeadmConfigs(kubeadmYamlPath, DecodeCRDFromFile) 69 if err != nil { 70 return fmt.Errorf("failed to found kubeadm config from %s: %v", kubeadmYamlPath, err) 71 } 72 k.APIServer.CertSANs = append(k.APIServer.CertSANs, defaultKubeadmConfig.APIServer.CertSANs...) 73 err = mergo.Merge(k, defaultKubeadmConfig) 74 if err != nil { 75 return fmt.Errorf("failed to merge kubeadm config: %v", err) 76 } 77 //using the DefaultKubeadmConfig configuration merge 78 return k.Merge("") 79 } 80 81 func LoadKubeadmConfigs(arg string, decode func(arg string, kind string) (interface{}, error)) (*KubeadmConfig, error) { 82 kubeadmConfig := &KubeadmConfig{} 83 initConfig, err := decode(arg, InitConfiguration) 84 if err != nil { 85 return nil, err 86 } else if initConfig != nil { 87 kubeadmConfig.InitConfiguration = *initConfig.(*v1beta2.InitConfiguration) 88 } 89 clusterConfig, err := decode(arg, ClusterConfiguration) 90 if err != nil { 91 return nil, err 92 } else if clusterConfig != nil { 93 kubeadmConfig.ClusterConfiguration = *clusterConfig.(*v1beta2.ClusterConfiguration) 94 } 95 kubeProxyConfig, err := decode(arg, KubeProxyConfiguration) 96 if err != nil { 97 return nil, err 98 } else if kubeProxyConfig != nil { 99 kubeadmConfig.KubeProxyConfiguration = *kubeProxyConfig.(*v1alpha1.KubeProxyConfiguration) 100 } 101 kubeletConfig, err := decode(arg, KubeletConfiguration) 102 if err != nil { 103 return nil, err 104 } else if kubeletConfig != nil { 105 kubeadmConfig.KubeletConfiguration = *kubeletConfig.(*v1beta1.KubeletConfiguration) 106 } 107 joinConfig, err := decode(arg, JoinConfiguration) 108 if err != nil { 109 return nil, err 110 } else if joinConfig != nil { 111 kubeadmConfig.JoinConfiguration = *joinConfig.(*v1beta2.JoinConfiguration) 112 } 113 return kubeadmConfig, nil 114 } 115 116 func NewKubeadmConfig() interface{} { 117 return &KubeadmConfig{} 118 }