mirror of https://github.com/k3s-io/k3s
Merge pull request #62515 from resouer/fix-58805
Automatic merge from submit-queue (batch tested with PRs 62481, 62643, 61877, 62515). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. Add write-config-to to scheduler **What this PR does / why we need it**: Scheduler should be able to write its default configure to file. This actually applies to all components which claims options other than `--config` will be deprecated. Otherwise, users will be super confused to find out how to write a proper config file to these components. See: https://stackoverflow.com/questions/47966440/how-to-create-a-config-file-for-kube-scheduler-to-use-by-the-config-argument ref: #52562 **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Fixes #58805 Usage: ```bash ./_output/bin/kube-scheduler --write-config-to /tmp/kube-scheduler.yaml ``` **Special notes for your reviewer**: This should have been fixed several releases ago, so lets include it in 1.11 **Release note**: ```release-note Add write-config-to to scheduler ```pull/8/head
commit
2c54e9ca74
|
@ -35,6 +35,7 @@ go_library(
|
||||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
|
|
|
@ -33,6 +33,7 @@ import (
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/serializer"
|
"k8s.io/apimachinery/pkg/runtime/serializer"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/serializer/json"
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
||||||
"k8s.io/apimachinery/pkg/util/uuid"
|
"k8s.io/apimachinery/pkg/util/uuid"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
@ -80,6 +81,9 @@ type Options struct {
|
||||||
// ConfigFile is the location of the scheduler server's configuration file.
|
// ConfigFile is the location of the scheduler server's configuration file.
|
||||||
ConfigFile string
|
ConfigFile string
|
||||||
|
|
||||||
|
// WriteConfigTo is the path where the default configuration will be written.
|
||||||
|
WriteConfigTo string
|
||||||
|
|
||||||
// config is the scheduler server's configuration object.
|
// config is the scheduler server's configuration object.
|
||||||
config *componentconfig.KubeSchedulerConfiguration
|
config *componentconfig.KubeSchedulerConfiguration
|
||||||
|
|
||||||
|
@ -106,6 +110,7 @@ type Options struct {
|
||||||
// AddFlags adds flags for a specific SchedulerServer to the specified FlagSet
|
// AddFlags adds flags for a specific SchedulerServer to the specified FlagSet
|
||||||
func (o *Options) AddFlags(fs *pflag.FlagSet) {
|
func (o *Options) AddFlags(fs *pflag.FlagSet) {
|
||||||
fs.StringVar(&o.ConfigFile, "config", o.ConfigFile, "The path to the configuration file.")
|
fs.StringVar(&o.ConfigFile, "config", o.ConfigFile, "The path to the configuration file.")
|
||||||
|
fs.StringVar(&o.WriteConfigTo, "write-config-to", o.WriteConfigTo, "If set, write the configuration values to this file and exit.")
|
||||||
|
|
||||||
// All flags below here are deprecated and will eventually be removed.
|
// All flags below here are deprecated and will eventually be removed.
|
||||||
|
|
||||||
|
@ -167,13 +172,25 @@ func NewOptions() (*Options, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *Options) Complete() error {
|
func (o *Options) Complete() error {
|
||||||
if len(o.ConfigFile) == 0 {
|
if len(o.ConfigFile) == 0 && len(o.WriteConfigTo) == 0 {
|
||||||
glog.Warning("WARNING: all flags other than --config are deprecated. Please begin using a config file ASAP.")
|
glog.Warning("WARNING: all flags other than --config, --write-config-to, and --cleanup are deprecated. Please begin using a config file ASAP.")
|
||||||
o.applyDeprecatedHealthzAddressToConfig()
|
o.applyDeprecatedHealthzAddressToConfig()
|
||||||
o.applyDeprecatedHealthzPortToConfig()
|
o.applyDeprecatedHealthzPortToConfig()
|
||||||
o.applyDeprecatedAlgorithmSourceOptionsToConfig()
|
o.applyDeprecatedAlgorithmSourceOptionsToConfig()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(o.ConfigFile) > 0 {
|
||||||
|
if c, err := o.loadConfigFromFile(o.ConfigFile); err != nil {
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
o.config = c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply algorithms based on feature gates.
|
||||||
|
// TODO: make configurable?
|
||||||
|
algorithmprovider.ApplyFeatureGates()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -303,21 +320,12 @@ func (o *Options) ApplyDefaults(in *componentconfig.KubeSchedulerConfiguration)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *Options) Run() error {
|
func (o *Options) Run() error {
|
||||||
config := o.config
|
// If user only want to generate a configure file.
|
||||||
|
if len(o.WriteConfigTo) > 0 {
|
||||||
if len(o.ConfigFile) > 0 {
|
return o.writeConfigFile()
|
||||||
if c, err := o.loadConfigFromFile(o.ConfigFile); err != nil {
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
config = c
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply algorithms based on feature gates.
|
server, err := NewSchedulerServer(o.config, o.master)
|
||||||
// TODO: make configurable?
|
|
||||||
algorithmprovider.ApplyFeatureGates()
|
|
||||||
|
|
||||||
server, err := NewSchedulerServer(config, o.master)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -326,6 +334,36 @@ func (o *Options) Run() error {
|
||||||
return server.Run(stop)
|
return server.Run(stop)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *Options) writeConfigFile() error {
|
||||||
|
var encoder runtime.Encoder
|
||||||
|
mediaTypes := o.codecs.SupportedMediaTypes()
|
||||||
|
for _, info := range mediaTypes {
|
||||||
|
if info.MediaType == "application/yaml" {
|
||||||
|
encoder = info.Serializer
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if encoder == nil {
|
||||||
|
return errors.New("unable to locate yaml encoder")
|
||||||
|
}
|
||||||
|
encoder = json.NewYAMLSerializer(json.DefaultMetaFactory, o.scheme, o.scheme)
|
||||||
|
encoder = o.codecs.EncoderForVersion(encoder, componentconfigv1alpha1.SchemeGroupVersion)
|
||||||
|
|
||||||
|
configFile, err := os.Create(o.WriteConfigTo)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer configFile.Close()
|
||||||
|
|
||||||
|
if err := encoder.Encode(o.config, configFile); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
glog.Infof("Wrote configuration to: %s\n", o.WriteConfigTo)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// NewSchedulerCommand creates a *cobra.Command object with default parameters
|
// NewSchedulerCommand creates a *cobra.Command object with default parameters
|
||||||
func NewSchedulerCommand() *cobra.Command {
|
func NewSchedulerCommand() *cobra.Command {
|
||||||
opts, err := NewOptions()
|
opts, err := NewOptions()
|
||||||
|
|
Loading…
Reference in New Issue