Skip to content

Commit 2d66859

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 2d66859

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

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

Lines changed: 21 additions & 2 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"
@@ -62,6 +63,7 @@ type startWorkspaceContext struct {
6263
IDEPort int32 `json:"idePort"`
6364
SupervisorPort int32 `json:"supervisorPort"`
6465
Headless bool `json:"headless"`
66+
ServerVersion *version.Info `json:"serverVersion"`
6567
}
6668

6769
// createWorkspacePod creates the actual workspace pod based on the definite workspace pod and appropriate
@@ -278,12 +280,13 @@ func createDefiniteWorkspacePod(sctx *startWorkspaceContext) (*corev1.Pod, error
278280
"prometheus.io/scrape": "true",
279281
"prometheus.io/path": "/metrics",
280282
"prometheus.io/port": strconv.Itoa(int(sctx.IDEPort)),
281-
"container.apparmor.security.beta.kubernetes.io/workspace": "unconfined",
282283
// prevent cluster-autoscaler from removing a node
283284
// https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#what-types-of-pods-can-prevent-ca-from-removing-a-node
284285
"cluster-autoscaler.kubernetes.io/safe-to-evict": "false",
285286
}
286287

288+
configureAppamor(sctx, annotations, workspaceContainer)
289+
287290
for k, v := range sctx.Workspace.Annotations {
288291
annotations[k] = v
289292
}
@@ -689,7 +692,7 @@ func createDefaultSecurityContext() (*corev1.SecurityContext, error) {
689692
return res, nil
690693
}
691694

692-
func newStartWorkspaceContext(ctx context.Context, cfg *config.Configuration, ws *workspacev1.Workspace) (res *startWorkspaceContext, err error) {
695+
func newStartWorkspaceContext(ctx context.Context, cfg *config.Configuration, ws *workspacev1.Workspace, serverVersion *version.Info) (res *startWorkspaceContext, err error) {
693696
// we deliberately do not shadow ctx here as we need the original context later to extract the TraceID
694697
span, _ := tracing.FromContext(ctx, "newStartWorkspaceContext")
695698
defer tracing.FinishSpan(span, &err)
@@ -711,9 +714,25 @@ func newStartWorkspaceContext(ctx context.Context, cfg *config.Configuration, ws
711714
IDEPort: 23000,
712715
SupervisorPort: 22999,
713716
Headless: ws.IsHeadless(),
717+
ServerVersion: serverVersion,
714718
}, nil
715719
}
716720

721+
func configureAppamor(sctx *startWorkspaceContext, annotations map[string]string, workspaceContainer *corev1.Container) {
722+
// pre K8s 1.30 we need to set the apparmor profile to unconfined as an annotation
723+
if sctx.ServerVersion.Major <= "1" && sctx.ServerVersion.Minor <= "30" {
724+
annotations["container.apparmor.security.beta.kubernetes.io/workspace"] = "unconfined"
725+
} else {
726+
727+
// TODO: set AppArmorProfile field here, if the K8s minor version is >= 30
728+
// Ref: https://pkg.go.dev/k8s.io/[email protected]/core/v1#SecurityContext
729+
// and https://pkg.go.dev/k8s.io/[email protected]/core/v1#AppArmorProfile
730+
// and https://pkg.go.dev/k8s.io/[email protected]/core/v1#AppArmorProfileType
731+
//
732+
// requires we update k8s libraries to 0.30.8
733+
}
734+
}
735+
717736
// validCookieChars contains all characters which may occur in an HTTP Cookie value (unicode \u0021 through \u007E),
718737
// without the characters , ; and / ... I did not find more details about permissible characters in RFC2965, so I took
719738
// this list of permissible chars from Wikipedia.

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import (
1818
"k8s.io/apimachinery/pkg/runtime"
1919
"k8s.io/apimachinery/pkg/types"
2020
"k8s.io/apimachinery/pkg/util/wait"
21+
"k8s.io/apimachinery/pkg/version"
22+
"k8s.io/client-go/kubernetes"
2123
"k8s.io/client-go/tools/record"
2224
"k8s.io/client-go/util/workqueue"
2325
ctrl "sigs.k8s.io/controller-runtime"
@@ -75,6 +77,8 @@ type WorkspaceReconciler struct {
7577
metrics *controllerMetrics
7678
maintenance maintenance.Maintenance
7779
Recorder record.EventRecorder
80+
81+
kubeClient kubernetes.Interface
7882
}
7983

8084
//+kubebuilder:rbac:groups=workspace.gitpod.io,resources=workspaces,verbs=get;list;watch;create;update;patch;delete
@@ -181,7 +185,8 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
181185
// if there isn't a workspace pod and we're not currently deleting this workspace,// create one.
182186
switch {
183187
case workspace.Status.PodStarts == 0 || workspace.Status.PodStarts-workspace.Status.PodRecreated < 1:
184-
sctx, err := newStartWorkspaceContext(ctx, r.Config, workspace)
188+
serverVersion := r.getServerVersion(ctx)
189+
sctx, err := newStartWorkspaceContext(ctx, r.Config, workspace, serverVersion)
185190
if err != nil {
186191
log.Error(err, "unable to create startWorkspace context")
187192
return ctrl.Result{Requeue: true}, err
@@ -627,6 +632,20 @@ func (r *WorkspaceReconciler) SetupWithManager(mgr ctrl.Manager) error {
627632
Complete(r)
628633
}
629634

635+
func (r *WorkspaceReconciler) getServerVersion(ctx context.Context) *version.Info {
636+
log := log.FromContext(ctx)
637+
638+
serverVersion, err := r.kubeClient.Discovery().ServerVersion()
639+
if err != nil {
640+
log.Error(err, "cannot get server version! Assuming 1.30 going forward")
641+
serverVersion = &version.Info{
642+
Major: "1",
643+
Minor: "30",
644+
}
645+
}
646+
return serverVersion
647+
}
648+
630649
func SetupIndexer(mgr ctrl.Manager) error {
631650
var err error
632651
var once sync.Once

0 commit comments

Comments
 (0)