@@ -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+ }
0 commit comments