Skip to content

Commit 4db5dce

Browse files
authored
Support for Kubernetes v1.23 (#386)
* Add Kubernetes 1.23 support to README.md * Upgrade github.com/kubernetes/cloud-provider-openstack * Replace deprecated kubelet flags
1 parent f975bf4 commit 4db5dce

File tree

4 files changed

+59
-43
lines changed

4 files changed

+59
-43
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ This extension controller supports the following Kubernetes versions:
2323

2424
| Version | Support | Conformance test results |
2525
| --------------- | ----------- | ------------------------ |
26+
| Kubernetes 1.23 | 1.23.0+ | N/A |
2627
| Kubernetes 1.22 | 1.22.0+ | [![Gardener v1.22 Conformance Tests](https://testgrid.k8s.io/q/summary/conformance-gardener/Gardener,%20v1.22%20OpenStack/tests_status?style=svg)](https://testgrid.k8s.io/conformance-gardener#Gardener,%20v1.22%20OpenStack) |
2728
| Kubernetes 1.21 | 1.21.0+ | [![Gardener v1.21 Conformance Tests](https://testgrid.k8s.io/q/summary/conformance-gardener/Gardener,%20v1.21%20OpenStack/tests_status?style=svg)](https://testgrid.k8s.io/conformance-gardener#Gardener,%20v1.21%20OpenStack) |
2829
| Kubernetes 1.20 | 1.20.0+ | [![Gardener v1.20 Conformance Tests](https://testgrid.k8s.io/q/summary/conformance-gardener/Gardener,%20v1.20%20OpenStack/tests_status?style=svg)](https://testgrid.k8s.io/conformance-gardener#Gardener,%20v1.20%20OpenStack) |

charts/images.yaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@ images:
3333
sourceRepository: github.com/kubernetes/cloud-provider-openstack
3434
repository: k8scloudprovider/openstack-cloud-controller-manager
3535
tag: "v1.22.0"
36-
targetVersion: ">= 1.22"
36+
targetVersion: "1.22.x"
37+
- name: cloud-controller-manager
38+
sourceRepository: github.com/kubernetes/cloud-provider-openstack
39+
repository: k8scloudprovider/openstack-cloud-controller-manager
40+
tag: "v1.23.0"
41+
targetVersion: ">= 1.23"
3742

3843
- name: machine-controller-manager
3944
sourceRepository: github.com/gardener/machine-controller-manager

pkg/webhook/controlplane/ensurer.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939
corev1 "k8s.io/api/core/v1"
4040
apierrors "k8s.io/apimachinery/pkg/api/errors"
4141
kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1"
42+
"k8s.io/utils/pointer"
4243
"sigs.k8s.io/controller-runtime/pkg/client"
4344
)
4445

@@ -367,7 +368,7 @@ func (e *ensurer) EnsureKubeletServiceUnitOptions(ctx context.Context, gctx gcon
367368

368369
if opt := extensionswebhook.UnitOptionWithSectionAndName(new, "Service", "ExecStart"); opt != nil {
369370
command := extensionswebhook.DeserializeCommandLine(opt.Value)
370-
command = ensureKubeletCommandLineArgs(command, csiEnabled)
371+
command = ensureKubeletCommandLineArgs(command, csiEnabled, kubeletVersion)
371372
opt.Value = extensionswebhook.SerializeCommandLine(command, 1, " \\\n ")
372373
}
373374

@@ -379,10 +380,12 @@ func (e *ensurer) EnsureKubeletServiceUnitOptions(ctx context.Context, gctx gcon
379380
return new, nil
380381
}
381382

382-
func ensureKubeletCommandLineArgs(command []string, csiEnabled bool) []string {
383+
func ensureKubeletCommandLineArgs(command []string, csiEnabled bool, kubeletVersion *semver.Version) []string {
383384
if csiEnabled {
384-
command = extensionswebhook.EnsureStringWithPrefix(command, "--cloud-provider=", "external")
385-
command = extensionswebhook.EnsureStringWithPrefix(command, "--enable-controller-attach-detach=", "true")
385+
if !versionutils.ConstraintK8sGreaterEqual123.Check(kubeletVersion) {
386+
command = extensionswebhook.EnsureStringWithPrefix(command, "--cloud-provider=", "external")
387+
command = extensionswebhook.EnsureStringWithPrefix(command, "--enable-controller-attach-detach=", "true")
388+
}
386389
} else {
387390
command = extensionswebhook.EnsureStringWithPrefix(command, "--cloud-provider=", "openstack")
388391
command = extensionswebhook.EnsureStringWithPrefix(command, "--cloud-config=", "/var/lib/kubelet/cloudprovider.conf")
@@ -415,6 +418,10 @@ func (e *ensurer) EnsureKubeletConfiguration(ctx context.Context, gctx gcontext.
415418
new.FeatureGates["CSIMigrationOpenStack"] = true
416419
// kubelets of new worker nodes can directly be started with the the <csiMigrationCompleteFeatureGate> feature gate
417420
new.FeatureGates[csiMigrationCompleteFeatureGate] = true
421+
422+
if versionutils.ConstraintK8sGreaterEqual123.Check(kubeletVersion) {
423+
new.EnableControllerAttachDetach = pointer.Bool(true)
424+
}
418425
}
419426

420427
// resolv-for-kubelet.conf is created by update-resolv-conf.service

pkg/webhook/controlplane/ensurer_test.go

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -477,41 +477,42 @@ var _ = Describe("Ensurer", func() {
477477
}
478478
})
479479

480-
It("should modify existing elements of kubelet.service unit options (k8s < 1.19)", func() {
481-
newUnitOptions := []*unit.UnitOption{
482-
{
483-
Section: "Service",
484-
Name: "ExecStart",
485-
Value: `/opt/bin/hyperkube kubelet \
486-
--config=/var/lib/kubelet/config/kubelet \
487-
--cloud-provider=openstack \
488-
--cloud-config=/var/lib/kubelet/cloudprovider.conf`,
489-
},
490-
hostnamectlUnitOption,
491-
}
480+
DescribeTable("should modify existing elements of kubelet.service unit options",
481+
func(gctx gcontext.GardenContext, kubeletVersion *semver.Version, cloudProvider string, withControllerAttachDetachFlag bool) {
482+
newUnitOptions := []*unit.UnitOption{
483+
{
484+
Section: "Service",
485+
Name: "ExecStart",
486+
Value: `/opt/bin/hyperkube kubelet \
487+
--config=/var/lib/kubelet/config/kubelet`,
488+
},
489+
hostnamectlUnitOption,
490+
}
492491

493-
opts, err := ensurer.EnsureKubeletServiceUnitOptions(ctx, eContextK8s116, semver.MustParse("1.16.0"), oldUnitOptions, nil)
494-
Expect(err).To(Not(HaveOccurred()))
495-
Expect(opts).To(Equal(newUnitOptions))
496-
})
492+
if cloudProvider != "" {
493+
newUnitOptions[0].Value += ` \
494+
--cloud-provider=` + cloudProvider
497495

498-
It("should modify existing elements of kubelet.service unit options (k8s >= 1.19)", func() {
499-
newUnitOptions := []*unit.UnitOption{
500-
{
501-
Section: "Service",
502-
Name: "ExecStart",
503-
Value: `/opt/bin/hyperkube kubelet \
504-
--config=/var/lib/kubelet/config/kubelet \
505-
--cloud-provider=external \
506-
--enable-controller-attach-detach=true`,
507-
},
508-
hostnamectlUnitOption,
509-
}
496+
if cloudProvider != "external" {
497+
newUnitOptions[0].Value += ` \
498+
--cloud-config=/var/lib/kubelet/cloudprovider.conf`
499+
}
500+
}
510501

511-
opts, err := ensurer.EnsureKubeletServiceUnitOptions(ctx, eContextK8s119, semver.MustParse("1.19.0"), oldUnitOptions, nil)
512-
Expect(err).To(Not(HaveOccurred()))
513-
Expect(opts).To(Equal(newUnitOptions))
514-
})
502+
if withControllerAttachDetachFlag {
503+
newUnitOptions[0].Value += ` \
504+
--enable-controller-attach-detach=true`
505+
}
506+
507+
opts, err := ensurer.EnsureKubeletServiceUnitOptions(ctx, gctx, kubeletVersion, oldUnitOptions, nil)
508+
Expect(err).To(Not(HaveOccurred()))
509+
Expect(opts).To(Equal(newUnitOptions))
510+
},
511+
512+
Entry("kubelet version < 1.19", eContextK8s116, semver.MustParse("1.16.0"), "openstack", false),
513+
Entry("1.19 <= kubelet version < 1.23", eContextK8s119, semver.MustParse("1.19.0"), "external", true),
514+
Entry("kubelet version >= 1.23", eContextK8s119, semver.MustParse("1.23.0"), "", false),
515+
)
515516
})
516517

517518
Describe("#EnsureKubeletConfiguration", func() {
@@ -526,12 +527,13 @@ var _ = Describe("Ensurer", func() {
526527
})
527528

528529
DescribeTable("should modify existing elements of kubelet configuration",
529-
func(gctx gcontext.GardenContext, kubeletVersion *semver.Version, unregisterFeatureGateName string) {
530+
func(gctx gcontext.GardenContext, kubeletVersion *semver.Version, unregisterFeatureGateName string, enableControllerAttachDetach *bool) {
530531
newKubeletConfig := &kubeletconfigv1beta1.KubeletConfiguration{
531532
FeatureGates: map[string]bool{
532533
"Foo": true,
533534
},
534-
ResolverConfig: "/etc/resolv-for-kubelet.conf",
535+
ResolverConfig: "/etc/resolv-for-kubelet.conf",
536+
EnableControllerAttachDetach: enableControllerAttachDetach,
535537
}
536538

537539
if unregisterFeatureGateName != "" {
@@ -547,10 +549,11 @@ var _ = Describe("Ensurer", func() {
547549
Expect(&kubeletConfig).To(Equal(newKubeletConfig))
548550
},
549551

550-
Entry("control plane, kubelet < 1.19", eContextK8s116, semver.MustParse("1.16.0"), ""),
551-
Entry("1.19 <= control plane, kubelet <= 1.21", eContextK8s119, semver.MustParse("1.19.0"), "CSIMigrationOpenStackComplete"),
552-
Entry("control plane >= 1.21, kubelet < 1.21", eContextK8s121, semver.MustParse("1.20.0"), "CSIMigrationOpenStackComplete"),
553-
Entry("control plane, kubelet >= 1.21", eContextK8s121, semver.MustParse("1.21.0"), "InTreePluginOpenStackUnregister"),
552+
Entry("control plane, kubelet < 1.19", eContextK8s116, semver.MustParse("1.16.0"), "", nil),
553+
Entry("1.19 <= control plane, kubelet <= 1.21", eContextK8s119, semver.MustParse("1.19.0"), "CSIMigrationOpenStackComplete", nil),
554+
Entry("control plane >= 1.21, kubelet < 1.21", eContextK8s121, semver.MustParse("1.20.0"), "CSIMigrationOpenStackComplete", nil),
555+
Entry("1.21 <= kubelet < 1.23", eContextK8s121, semver.MustParse("1.22.0"), "InTreePluginOpenStackUnregister", nil),
556+
Entry("kubelet >= 1.23", eContextK8s121, semver.MustParse("1.23.0"), "InTreePluginOpenStackUnregister", pointer.Bool(true)),
554557
)
555558
})
556559

0 commit comments

Comments
 (0)