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), 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), 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 {