Path: blob/main/install/installer/pkg/components/ws-manager-bridge/deployment.go
2501 views
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package wsmanagerbridge56import (7"fmt"89"github.com/gitpod-io/gitpod/common-go/baseserver"10"github.com/gitpod-io/gitpod/installer/pkg/cluster"11"github.com/gitpod-io/gitpod/installer/pkg/common"12wsmanagermk2 "github.com/gitpod-io/gitpod/installer/pkg/components/ws-manager-mk2"13"github.com/gitpod-io/gitpod/installer/pkg/config/v1/experimental"1415appsv1 "k8s.io/api/apps/v1"16corev1 "k8s.io/api/core/v1"17"k8s.io/apimachinery/pkg/api/resource"18metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"19"k8s.io/apimachinery/pkg/runtime"20"k8s.io/apimachinery/pkg/util/intstr"21"k8s.io/utils/pointer"22)2324func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {25labels := common.CustomizeLabel(ctx, Component, common.TypeMetaDeployment)2627var hashObj []runtime.Object28if objs, err := configmap(ctx); err != nil {29return nil, err30} else {31hashObj = append(hashObj, objs...)32}3334var volumes []corev1.Volume35var volumeMounts []corev1.VolumeMount3637addWsManagerTls := common.WithLocalWsManager(ctx)38if addWsManagerTls {39volumes = append(volumes, corev1.Volume{40Name: "ws-manager-client-tls-certs",41VolumeSource: corev1.VolumeSource{42Secret: &corev1.SecretVolumeSource{43SecretName: wsmanagermk2.TLSSecretNameClient,44},45},46})47volumeMounts = append(volumeMounts, corev1.VolumeMount{48Name: "ws-manager-client-tls-certs",49MountPath: "/ws-manager-client-tls-certs",50ReadOnly: true,51})52}5354hashObj = append(hashObj, &corev1.Pod{55Spec: corev1.PodSpec{56Containers: []corev1.Container{57{58Env: []corev1.EnvVar{59{60// If the database type changes, this pod may stay up if no other changes are made.61Name: "DATABASE_TYPE",62Value: func() string {63if pointer.BoolDeref(ctx.Config.Database.InCluster, false) {64return "in-cluster"65}66if ctx.Config.Database.CloudSQL != nil {67return "cloudsql"68}69return "external"70}(),71},72},73},74},75},76})7778configHash, err := common.ObjectHash(hashObj, nil)79if err != nil {80return nil, err81}8283env := common.CustomizeEnvvar(ctx, Component, common.MergeEnv(84common.DefaultEnv(&ctx.Config),85common.WorkspaceTracingEnv(ctx, Component),86common.AnalyticsEnv(&ctx.Config),87common.DatabaseEnv(&ctx.Config),88common.ConfigcatEnv(ctx),89[]corev1.EnvVar{90{91Name: "WSMAN_BRIDGE_CONFIGPATH",92Value: "/config/ws-manager-bridge.json",93},94// Required for node.js to pick up custom CAs95{96Name: "NODE_EXTRA_CA_CERTS",97Value: common.CUSTOM_CA_MOUNT_PATH,98},99},100))101102_ = ctx.WithExperimental(func(cfg *experimental.Config) error {103if cfg.WebApp != nil && cfg.WebApp.Redis != nil {104env = append(env, corev1.EnvVar{105Name: "REDIS_USERNAME",106Value: cfg.WebApp.Redis.Username,107})108109env = append(env, corev1.EnvVar{110Name: "REDIS_PASSWORD",111ValueFrom: &corev1.EnvVarSource{112SecretKeyRef: &corev1.SecretKeySelector{113LocalObjectReference: corev1.LocalObjectReference{114Name: cfg.WebApp.Redis.SecretRef,115},116Key: "password",117},118},119})120}121return nil122})123124return []runtime.Object{125&appsv1.Deployment{126TypeMeta: common.TypeMetaDeployment,127ObjectMeta: metav1.ObjectMeta{128Name: Component,129Namespace: ctx.Namespace,130Labels: labels,131Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaDeployment),132},133Spec: appsv1.DeploymentSpec{134Selector: &metav1.LabelSelector{MatchLabels: common.DefaultLabels(Component)},135Replicas: common.Replicas(ctx, Component),136Strategy: common.DeploymentStrategy,137Template: corev1.PodTemplateSpec{138ObjectMeta: metav1.ObjectMeta{139Name: Component,140Namespace: ctx.Namespace,141Labels: labels,142Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaDeployment, func() map[string]string {143return map[string]string{144common.AnnotationConfigChecksum: configHash,145}146}),147},148Spec: corev1.PodSpec{149Affinity: cluster.WithNodeAffinityHostnameAntiAffinity(Component, cluster.AffinityLabelMeta),150TopologySpreadConstraints: cluster.WithHostnameTopologySpread(Component),151ServiceAccountName: Component,152PriorityClassName: common.SystemNodeCritical,153EnableServiceLinks: pointer.Bool(false),154DNSPolicy: corev1.DNSClusterFirst,155RestartPolicy: corev1.RestartPolicyAlways,156TerminationGracePeriodSeconds: pointer.Int64(30),157Volumes: append(158[]corev1.Volume{159{160Name: "config",161VolumeSource: corev1.VolumeSource{162ConfigMap: &corev1.ConfigMapVolumeSource{163LocalObjectReference: corev1.LocalObjectReference{Name: fmt.Sprintf("%s-config", Component)},164},165},166},167common.CAVolume(),168},169volumes...,170),171InitContainers: []corev1.Container{172*common.DatabaseMigrationWaiterContainer(ctx),173*common.RedisWaiterContainer(ctx),174},175Containers: []corev1.Container{{176Name: Component,177Image: ctx.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.WSManagerBridge.Version),178ImagePullPolicy: corev1.PullIfNotPresent,179Resources: common.ResourceRequirements(ctx, Component, Component, corev1.ResourceRequirements{180Requests: corev1.ResourceList{181"cpu": resource.MustParse("100m"),182"memory": resource.MustParse("64Mi"),183},184}),185SecurityContext: &corev1.SecurityContext{186Privileged: pointer.Bool(false),187AllowPrivilegeEscalation: pointer.Bool(false),188},189Env: env,190Ports: []corev1.ContainerPort{191{192ContainerPort: baseserver.BuiltinMetricsPort,193Name: baseserver.BuiltinMetricsPortName,194},195},196VolumeMounts: append(197[]corev1.VolumeMount{198{199Name: "config",200MountPath: "/config",201ReadOnly: true,202},203common.CAVolumeMount(),204},205volumeMounts...,206),207LivenessProbe: &corev1.Probe{208ProbeHandler: corev1.ProbeHandler{209HTTPGet: &corev1.HTTPGetAction{210Path: "/healthz",211Port: intstr.FromInt(9090),212},213},214InitialDelaySeconds: 15,215PeriodSeconds: 20,216},217}, *common.KubeRBACProxyContainer(ctx)},218Tolerations: common.WithTolerationWorkspaceComponentNotReady(ctx),219},220},221},222},223}, nil224}225226227