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  }