kube-apiserver: removed the deprecated the --cloud-provider and --cloud-config CLI parameters.

Signed-off-by: carlory <baofa.fan@daocloud.io>
This commit is contained in:
carlory 2025-02-14 18:43:34 +08:00
parent 87fcae2bc7
commit 29e5d42979
9 changed files with 7 additions and 168 deletions

View File

@ -28,13 +28,11 @@ import (
cp "k8s.io/kubernetes/pkg/controlplane/apiserver/options" cp "k8s.io/kubernetes/pkg/controlplane/apiserver/options"
"k8s.io/kubernetes/pkg/kubeapiserver" "k8s.io/kubernetes/pkg/kubeapiserver"
kubeoptions "k8s.io/kubernetes/pkg/kubeapiserver/options"
) )
// completedOptions is a private wrapper that enforces a call of Complete() before Run can be invoked. // completedOptions is a private wrapper that enforces a call of Complete() before Run can be invoked.
type completedOptions struct { type completedOptions struct {
cp.CompletedOptions cp.CompletedOptions
CloudProvider *kubeoptions.CloudProviderOptions
Extra Extra
} }
@ -64,7 +62,6 @@ func (s *ServerRunOptions) Complete(ctx context.Context) (CompletedOptions, erro
completed := completedOptions{ completed := completedOptions{
CompletedOptions: controlplane, CompletedOptions: controlplane,
CloudProvider: s.CloudProvider,
Extra: s.Extra, Extra: s.Extra,
} }

View File

@ -38,7 +38,6 @@ import (
// ServerRunOptions runs a kubernetes api server. // ServerRunOptions runs a kubernetes api server.
type ServerRunOptions struct { type ServerRunOptions struct {
*controlplaneapiserver.Options // embedded to avoid noise in existing consumers *controlplaneapiserver.Options // embedded to avoid noise in existing consumers
CloudProvider *kubeoptions.CloudProviderOptions
Extra Extra
} }
@ -66,8 +65,7 @@ type Extra struct {
// NewServerRunOptions creates and returns ServerRunOptions according to the given featureGate and effectiveVersion of the server binary to run. // NewServerRunOptions creates and returns ServerRunOptions according to the given featureGate and effectiveVersion of the server binary to run.
func NewServerRunOptions() *ServerRunOptions { func NewServerRunOptions() *ServerRunOptions {
s := ServerRunOptions{ s := ServerRunOptions{
Options: controlplaneapiserver.NewOptions(), Options: controlplaneapiserver.NewOptions(),
CloudProvider: kubeoptions.NewCloudProviderOptions(),
Extra: Extra{ Extra: Extra{
EndpointReconcilerType: string(reconcilers.LeaseEndpointReconcilerType), EndpointReconcilerType: string(reconcilers.LeaseEndpointReconcilerType),
@ -101,7 +99,6 @@ func NewServerRunOptions() *ServerRunOptions {
// Flags returns flags for a specific APIServer by section name // Flags returns flags for a specific APIServer by section name
func (s *ServerRunOptions) Flags() (fss cliflag.NamedFlagSets) { func (s *ServerRunOptions) Flags() (fss cliflag.NamedFlagSets) {
s.Options.AddFlags(&fss) s.Options.AddFlags(&fss)
s.CloudProvider.AddFlags(fss.FlagSet("cloud provider"))
// Note: the weird ""+ in below lines seems to be the only way to get gofmt to // Note: the weird ""+ in below lines seems to be the only way to get gofmt to
// arrange these text blocks sensibly. Grrr. // arrange these text blocks sensibly. Grrr.

View File

@ -331,10 +331,6 @@ func TestAddFlags(t *testing.T) {
}, },
MasterCount: 5, MasterCount: 5,
}, },
CloudProvider: &kubeoptions.CloudProviderOptions{
CloudConfigFile: "/cloud-config",
CloudProvider: "azure",
},
} }
expected.Authentication.OIDC.UsernameClaim = "sub" expected.Authentication.OIDC.UsernameClaim = "sub"

View File

@ -132,7 +132,6 @@ func (s CompletedOptions) Validate() []error {
var errs []error var errs []error
errs = append(errs, s.CompletedOptions.Validate()...) errs = append(errs, s.CompletedOptions.Validate()...)
errs = append(errs, s.CloudProvider.Validate()...)
errs = append(errs, validateClusterIPFlags(s.Extra)...) errs = append(errs, validateClusterIPFlags(s.Extra)...)
errs = append(errs, validateServiceNodePort(s.Extra)...) errs = append(errs, validateServiceNodePort(s.Extra)...)
errs = append(errs, validatePublicIPServiceClusterIPRangeIPFamilies(s.Extra, *s.GenericServerRunOptions)...) errs = append(errs, validatePublicIPServiceClusterIPRangeIPFamilies(s.Extra, *s.GenericServerRunOptions)...)

View File

@ -212,9 +212,7 @@ func CreateKubeAPIServerConfig(
capabilities.Setup(opts.AllowPrivileged, opts.MaxConnectionBytesPerSec) capabilities.Setup(opts.AllowPrivileged, opts.MaxConnectionBytesPerSec)
// additional admission initializers // additional admission initializers
kubeAdmissionConfig := &kubeapiserveradmission.Config{ kubeAdmissionConfig := &kubeapiserveradmission.Config{}
CloudConfigFile: opts.CloudProvider.CloudConfigFile,
}
kubeInitializers, err := kubeAdmissionConfig.New() kubeInitializers, err := kubeAdmissionConfig.New()
if err != nil { if err != nil {
return nil, nil, nil, fmt.Errorf("failed to create admission plugin initializer: %w", err) return nil, nil, nil, fmt.Errorf("failed to create admission plugin initializer: %w", err)

View File

@ -17,28 +17,13 @@ limitations under the License.
package admission package admission
import ( import (
"os"
"k8s.io/klog/v2"
"k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/admission"
) )
// Config holds the configuration needed to for initialize the admission plugins // Config holds the configuration needed to for initialize the admission plugins
type Config struct { type Config struct{}
CloudConfigFile string
}
// New sets up the plugins and admission start hooks needed for admission // New sets up the plugins and admission start hooks needed for admission
func (c *Config) New() ([]admission.PluginInitializer, error) { func (c *Config) New() ([]admission.PluginInitializer, error) {
var cloudConfig []byte return []admission.PluginInitializer{NewPluginInitializer()}, nil
if c.CloudConfigFile != "" {
var err error
cloudConfig, err = os.ReadFile(c.CloudConfigFile)
if err != nil {
klog.Fatalf("Error reading from cloud configuration file %s: %#v", c.CloudConfigFile, err)
}
}
return []admission.PluginInitializer{NewPluginInitializer(cloudConfig)}, nil
} }

View File

@ -22,29 +22,17 @@ import (
// TODO add a `WantsToRun` which takes a stopCh. Might make it generic. // TODO add a `WantsToRun` which takes a stopCh. Might make it generic.
// WantsCloudConfig defines a function which sets CloudConfig for admission plugins that need it.
type WantsCloudConfig interface {
SetCloudConfig([]byte)
}
// PluginInitializer is used for initialization of the Kubernetes specific admission plugins. // PluginInitializer is used for initialization of the Kubernetes specific admission plugins.
type PluginInitializer struct { type PluginInitializer struct {
cloudConfig []byte
} }
var _ admission.PluginInitializer = &PluginInitializer{} var _ admission.PluginInitializer = &PluginInitializer{}
// NewPluginInitializer constructs new instance of PluginInitializer // NewPluginInitializer constructs new instance of PluginInitializer
func NewPluginInitializer(cloudConfig []byte) *PluginInitializer { func NewPluginInitializer() *PluginInitializer {
return &PluginInitializer{ return &PluginInitializer{}
cloudConfig: cloudConfig,
}
} }
// Initialize checks the initialization interfaces implemented by each plugin // Initialize checks the initialization interfaces implemented by each plugin
// and provide the appropriate initialization data // and provide the appropriate initialization data
func (i *PluginInitializer) Initialize(plugin admission.Interface) { func (i *PluginInitializer) Initialize(plugin admission.Interface) {}
if wants, ok := plugin.(WantsCloudConfig); ok {
wants.SetCloudConfig(i.cloudConfig)
}
}

View File

@ -1,52 +0,0 @@
/*
Copyright 2016 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 admission
import (
"context"
"testing"
"k8s.io/apiserver/pkg/admission"
)
type doNothingAdmission struct{}
func (doNothingAdmission) Admit(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
return nil
}
func (doNothingAdmission) Handles(o admission.Operation) bool { return false }
func (doNothingAdmission) Validate() error { return nil }
type WantsCloudConfigAdmissionPlugin struct {
doNothingAdmission
cloudConfig []byte
}
func (p *WantsCloudConfigAdmissionPlugin) SetCloudConfig(cloudConfig []byte) {
p.cloudConfig = cloudConfig
}
func TestCloudConfigAdmissionPlugin(t *testing.T) {
cloudConfig := []byte("cloud-configuration")
initializer := NewPluginInitializer(cloudConfig)
wantsCloudConfigAdmission := &WantsCloudConfigAdmissionPlugin{}
initializer.Initialize(wantsCloudConfigAdmission)
if wantsCloudConfigAdmission.cloudConfig == nil {
t.Errorf("Expected cloud config to be initialized but found nil")
}
}

View File

@ -1,69 +0,0 @@
/*
Copyright 2017 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 options
import (
"fmt"
"github.com/spf13/pflag"
utilfeature "k8s.io/apiserver/pkg/util/feature"
cloudprovider "k8s.io/cloud-provider"
"k8s.io/kubernetes/pkg/features"
)
// CloudProviderOptions contains cloud provider config
type CloudProviderOptions struct {
CloudConfigFile string
CloudProvider string
}
// NewCloudProviderOptions creates a default CloudProviderOptions
func NewCloudProviderOptions() *CloudProviderOptions {
return &CloudProviderOptions{}
}
// Validate checks invalid config
func (opts *CloudProviderOptions) Validate() []error {
var errs []error
switch {
case opts.CloudProvider == "":
case cloudprovider.IsExternal(opts.CloudProvider):
if !utilfeature.DefaultFeatureGate.Enabled(features.DisableCloudProviders) {
errs = append(errs, fmt.Errorf("when using --cloud-provider set to '%s', "+
"please set DisableCloudProviders feature to true", opts.CloudProvider))
}
if !utilfeature.DefaultFeatureGate.Enabled(features.DisableKubeletCloudCredentialProviders) {
errs = append(errs, fmt.Errorf("when using --cloud-provider set to '%s', "+
"please set DisableKubeletCloudCredentialProviders feature to true", opts.CloudProvider))
}
default:
errs = append(errs, fmt.Errorf("unknown --cloud-provider: %s", opts.CloudProvider))
}
return errs
}
// AddFlags returns flags of cloud provider for a API Server
func (s *CloudProviderOptions) AddFlags(fs *pflag.FlagSet) {
fs.StringVar(&s.CloudProvider, "cloud-provider", s.CloudProvider,
"The provider for cloud services. Empty string for no provider.")
fs.MarkDeprecated("cloud-provider", "will be removed in a future version") // nolint: errcheck
fs.StringVar(&s.CloudConfigFile, "cloud-config", s.CloudConfigFile,
"The path to the cloud provider configuration file. Empty string for no configuration file.")
fs.MarkDeprecated("cloud-config", "will be removed in a future version") // nolint: errcheck
}