Skip to content

Commit c82bc46

Browse files
committed
[ws-manager-mk2] update to support k8s 0.30 API
Without which, we cannot remove the gitpod finalizer, pods do not terminate, and as such, we do not scale down nodes Tool: gitpod/catfood.gitpod.cloud
1 parent d25d928 commit c82bc46

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

components/ws-manager-mk2/controllers/create.go

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
corev1 "k8s.io/api/core/v1"
2222
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2323
"k8s.io/apimachinery/pkg/util/intstr"
24+
"k8s.io/apimachinery/pkg/version"
2425
"k8s.io/utils/pointer"
2526

2627
wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes"
@@ -95,7 +96,11 @@ func (r *WorkspaceReconciler) createWorkspacePod(sctx *startWorkspaceContext) (*
9596
}
9697
}
9798

98-
pod, err := createDefiniteWorkspacePod(sctx)
99+
serverVersion, err := r.kubeClient.Discovery().ServerVersion()
100+
if err != nil {
101+
return nil, xerrors.Errorf("cannot get server version: %w", err)
102+
}
103+
pod, err := createDefiniteWorkspacePod(sctx, serverVersion)
99104
if err != nil {
100105
return nil, xerrors.Errorf("cannot create definite workspace pod: %w", err)
101106
}
@@ -243,7 +248,7 @@ func mergeProbe(dst, src reflect.Value) (err error) {
243248

244249
// createDefiniteWorkspacePod creates a workspace pod without regard for any template.
245250
// The result of this function can be deployed and it would work.
246-
func createDefiniteWorkspacePod(sctx *startWorkspaceContext) (*corev1.Pod, error) {
251+
func createDefiniteWorkspacePod(sctx *startWorkspaceContext, serverVersion *version.Info) (*corev1.Pod, error) {
247252
workspaceContainer, err := createWorkspaceContainer(sctx)
248253
if err != nil {
249254
return nil, xerrors.Errorf("cannot create workspace container: %w", err)
@@ -278,12 +283,20 @@ func createDefiniteWorkspacePod(sctx *startWorkspaceContext) (*corev1.Pod, error
278283
"prometheus.io/scrape": "true",
279284
"prometheus.io/path": "/metrics",
280285
"prometheus.io/port": strconv.Itoa(int(sctx.IDEPort)),
281-
"container.apparmor.security.beta.kubernetes.io/workspace": "unconfined",
282286
// prevent cluster-autoscaler from removing a node
283287
// https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#what-types-of-pods-can-prevent-ca-from-removing-a-node
284288
"cluster-autoscaler.kubernetes.io/safe-to-evict": "false",
285289
}
286290

291+
// pre K8s 1.30 we need to set the apparmor profile to unconfined as an annotation
292+
minorVersion, err := strconv.Atoi(serverVersion.Minor)
293+
if err != nil {
294+
return nil, xerrors.Errorf("Failed to convert minor version to integer: %w", err)
295+
}
296+
if minorVersion <= 30 {
297+
annotations["container.apparmor.security.beta.kubernetes.io/workspace"] = "unconfined"
298+
}
299+
287300
for k, v := range sctx.Workspace.Annotations {
288301
annotations[k] = v
289302
}
@@ -684,6 +697,12 @@ func createDefaultSecurityContext() (*corev1.SecurityContext, error) {
684697
RunAsGroup: &gitpodGUID,
685698
RunAsNonRoot: pointer.Bool(true),
686699
RunAsUser: &gitpodGUID,
700+
// TODO: set AppArmorProfile field here, if the K8s minor version is >= 30
701+
// Ref: https://pkg.go.dev/k8s.io/[email protected]/core/v1#SecurityContext
702+
// and https://pkg.go.dev/k8s.io/[email protected]/core/v1#AppArmorProfile
703+
// and https://pkg.go.dev/k8s.io/[email protected]/core/v1#AppArmorProfileType
704+
//
705+
// requires we update k8s libraries to 0.30.8
687706
}
688707

689708
return res, nil
@@ -738,3 +757,27 @@ func getRandomString(length int) (string, error) {
738757
}
739758
return string(b), nil
740759
}
760+
761+
// Helper function to compare K8s versions
762+
func isK8sVersionGreaterOrEqual(serverVersion *version.Info, targetVersion string) bool {
763+
serverVersionParts := strings.Split(serverVersion.GitVersion, ".")
764+
targetVersionParts := strings.Split(targetVersion, ".")
765+
766+
// Compare major version
767+
serverMajor := strings.TrimPrefix(serverVersionParts[0], "v")
768+
if serverMajor > targetVersionParts[0] {
769+
return true
770+
}
771+
if serverMajor < targetVersionParts[0] {
772+
return false
773+
}
774+
775+
// Compare minor version
776+
if len(serverVersionParts) > 1 && len(targetVersionParts) > 1 {
777+
if serverVersionParts[1] >= targetVersionParts[1] {
778+
return true
779+
}
780+
}
781+
782+
return false
783+
}

components/ws-manager-mk2/controllers/workspace_controller.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"k8s.io/apimachinery/pkg/runtime"
1919
"k8s.io/apimachinery/pkg/types"
2020
"k8s.io/apimachinery/pkg/util/wait"
21+
"k8s.io/client-go/kubernetes"
2122
"k8s.io/client-go/tools/record"
2223
"k8s.io/client-go/util/workqueue"
2324
ctrl "sigs.k8s.io/controller-runtime"
@@ -75,6 +76,8 @@ type WorkspaceReconciler struct {
7576
metrics *controllerMetrics
7677
maintenance maintenance.Maintenance
7778
Recorder record.EventRecorder
79+
80+
kubeClient kubernetes.Interface
7881
}
7982

8083
//+kubebuilder:rbac:groups=workspace.gitpod.io,resources=workspaces,verbs=get;list;watch;create;update;patch;delete

0 commit comments

Comments
 (0)