@@ -21,6 +21,7 @@ import (
21
21
corev1 "k8s.io/api/core/v1"
22
22
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23
23
"k8s.io/apimachinery/pkg/util/intstr"
24
+ "k8s.io/apimachinery/pkg/version"
24
25
"k8s.io/utils/pointer"
25
26
26
27
wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes"
@@ -95,7 +96,11 @@ func (r *WorkspaceReconciler) createWorkspacePod(sctx *startWorkspaceContext) (*
95
96
}
96
97
}
97
98
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 )
99
104
if err != nil {
100
105
return nil , xerrors .Errorf ("cannot create definite workspace pod: %w" , err )
101
106
}
@@ -243,7 +248,7 @@ func mergeProbe(dst, src reflect.Value) (err error) {
243
248
244
249
// createDefiniteWorkspacePod creates a workspace pod without regard for any template.
245
250
// 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 ) {
247
252
workspaceContainer , err := createWorkspaceContainer (sctx )
248
253
if err != nil {
249
254
return nil , xerrors .Errorf ("cannot create workspace container: %w" , err )
@@ -278,12 +283,20 @@ func createDefiniteWorkspacePod(sctx *startWorkspaceContext) (*corev1.Pod, error
278
283
"prometheus.io/scrape" : "true" ,
279
284
"prometheus.io/path" : "/metrics" ,
280
285
"prometheus.io/port" : strconv .Itoa (int (sctx .IDEPort )),
281
- "container.apparmor.security.beta.kubernetes.io/workspace" : "unconfined" ,
282
286
// prevent cluster-autoscaler from removing a node
283
287
// https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#what-types-of-pods-can-prevent-ca-from-removing-a-node
284
288
"cluster-autoscaler.kubernetes.io/safe-to-evict" : "false" ,
285
289
}
286
290
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
+
287
300
for k , v := range sctx .Workspace .Annotations {
288
301
annotations [k ] = v
289
302
}
@@ -684,6 +697,12 @@ func createDefaultSecurityContext() (*corev1.SecurityContext, error) {
684
697
RunAsGroup : & gitpodGUID ,
685
698
RunAsNonRoot : pointer .Bool (true ),
686
699
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
687
706
}
688
707
689
708
return res , nil
@@ -738,3 +757,27 @@ func getRandomString(length int) (string, error) {
738
757
}
739
758
return string (b ), nil
740
759
}
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