From 60c8afefdce762ab1a0ff79d9c9412079effcbb2 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Thu, 28 Apr 2022 10:12:57 +0000 Subject: [PATCH 1/3] Add `usePodAffinity` field to webapp config Setting to true will add pod (anti)-affinity fields to the server and proxy components. --- install/installer/pkg/config/v1/experimental/experimental.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/install/installer/pkg/config/v1/experimental/experimental.go b/install/installer/pkg/config/v1/experimental/experimental.go index 7f93369ab0ec89..2d3c3fe99a24c2 100644 --- a/install/installer/pkg/config/v1/experimental/experimental.go +++ b/install/installer/pkg/config/v1/experimental/experimental.go @@ -65,8 +65,9 @@ type WorkspaceConfig struct { } type WebAppConfig struct { - PublicAPI *PublicAPIConfig `json:"publicApi,omitempty"` - Server *ServerConfig `json:"server,omitempty"` + PublicAPI *PublicAPIConfig `json:"publicApi,omitempty"` + Server *ServerConfig `json:"server,omitempty"` + UsePodAffinity bool `json:"usePodAffinity"` } type ServerConfig struct { From 478da7724486f29f5efd7451fb54d684c4abbdd5 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Thu, 28 Apr 2022 10:26:19 +0000 Subject: [PATCH 2/3] Use pod anti-affinity for server if flag is set --- .../pkg/components/server/deployment.go | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/install/installer/pkg/components/server/deployment.go b/install/installer/pkg/components/server/deployment.go index ea6e7c3945687f..5f2b6a45f8dcce 100644 --- a/install/installer/pkg/components/server/deployment.go +++ b/install/installer/pkg/components/server/deployment.go @@ -14,6 +14,7 @@ import ( wsmanager "github.com/gitpod-io/gitpod/installer/pkg/components/ws-manager" wsmanagerbridge "github.com/gitpod-io/gitpod/installer/pkg/components/ws-manager-bridge" configv1 "github.com/gitpod-io/gitpod/installer/pkg/config/v1" + "github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -163,6 +164,28 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) { env = append(env, *envv) } + var podAntiAffinity *corev1.PodAntiAffinity + _ = ctx.WithExperimental(func(cfg *experimental.Config) error { + if cfg.WebApp != nil && cfg.WebApp.UsePodAffinity { + podAntiAffinity = &corev1.PodAntiAffinity{ + PreferredDuringSchedulingIgnoredDuringExecution: []corev1.WeightedPodAffinityTerm{{ + Weight: 100, + PodAffinityTerm: corev1.PodAffinityTerm{ + LabelSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "component", + Operator: "In", + Values: []string{Component}, + }}, + }, + TopologyKey: cluster.AffinityLabelMeta, + }, + }}, + } + } + return nil + }) + return []runtime.Object{ &appsv1.Deployment{ TypeMeta: common.TypeMetaDeployment, @@ -185,7 +208,10 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) { }, }, Spec: corev1.PodSpec{ - Affinity: common.NodeAffinity(cluster.AffinityLabelMeta), + Affinity: &corev1.Affinity{ + NodeAffinity: common.NodeAffinity(cluster.AffinityLabelMeta).NodeAffinity, + PodAntiAffinity: podAntiAffinity, + }, PriorityClassName: common.SystemNodeCritical, ServiceAccountName: Component, EnableServiceLinks: pointer.Bool(false), From 8258c5ffca9bf021be2157d7d6c04bce0a06346a Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Thu, 28 Apr 2022 10:45:14 +0000 Subject: [PATCH 3/3] Use pod anti-affinity for proxy if flag is set --- .../pkg/components/proxy/deployment.go | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/install/installer/pkg/components/proxy/deployment.go b/install/installer/pkg/components/proxy/deployment.go index faa521c893f0a8..4a8adf89c920b3 100644 --- a/install/installer/pkg/components/proxy/deployment.go +++ b/install/installer/pkg/components/proxy/deployment.go @@ -8,6 +8,7 @@ import ( "fmt" "github.com/gitpod-io/gitpod/installer/pkg/cluster" + "github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental" "github.com/gitpod-io/gitpod/installer/pkg/common" @@ -95,6 +96,28 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) { return nil, err } + var podAntiAffinity *corev1.PodAntiAffinity + _ = ctx.WithExperimental(func(cfg *experimental.Config) error { + if cfg.WebApp != nil && cfg.WebApp.UsePodAffinity { + podAntiAffinity = &corev1.PodAntiAffinity{ + PreferredDuringSchedulingIgnoredDuringExecution: []corev1.WeightedPodAffinityTerm{{ + Weight: 100, + PodAffinityTerm: corev1.PodAffinityTerm{ + LabelSelector: &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: "component", + Operator: "In", + Values: []string{Component}, + }}, + }, + TopologyKey: cluster.AffinityLabelMeta, + }, + }}, + } + } + return nil + }) + const kubeRbacProxyContainerName = "kube-rbac-proxy" return []runtime.Object{ &appsv1.Deployment{ @@ -118,7 +141,10 @@ func deployment(ctx *common.RenderContext) ([]runtime.Object, error) { }, }, Spec: corev1.PodSpec{ - Affinity: common.NodeAffinity(cluster.AffinityLabelMeta), + Affinity: &corev1.Affinity{ + NodeAffinity: common.NodeAffinity(cluster.AffinityLabelMeta).NodeAffinity, + PodAntiAffinity: podAntiAffinity, + }, PriorityClassName: common.SystemNodeCritical, ServiceAccountName: Component, EnableServiceLinks: pointer.Bool(false),