Path: blob/main/install/installer/pkg/components/ide-service/deployment.go
2501 views
// Copyright (c) 2022 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 ide_service56import (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"12dockerregistry "github.com/gitpod-io/gitpod/installer/pkg/components/docker-registry"1314appsv1 "k8s.io/api/apps/v1"15corev1 "k8s.io/api/core/v1"16"k8s.io/apimachinery/pkg/api/resource"17metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"18"k8s.io/apimachinery/pkg/runtime"19"k8s.io/apimachinery/pkg/util/intstr"20"k8s.io/utils/pointer"21)2223func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {24labels := common.CustomizeLabel(ctx, Component, common.TypeMetaDeployment)2526volumeName := "pull-secret"27var secretName string28if pointer.BoolDeref(ctx.Config.ContainerRegistry.InCluster, false) {29secretName = dockerregistry.BuiltInRegistryAuth30} else if ctx.Config.ContainerRegistry.External != nil {31if ctx.Config.ContainerRegistry.External.Certificate != nil {32secretName = ctx.Config.ContainerRegistry.External.Certificate.Name33}34} else {35return nil, fmt.Errorf("%s: invalid container registry config", Component)36}3738configHash, err := common.ObjectHash(configmap(ctx))39if err != nil {40return nil, err41}4243return []runtime.Object{44&appsv1.Deployment{45TypeMeta: common.TypeMetaDeployment,46ObjectMeta: metav1.ObjectMeta{47Name: Component,48Namespace: ctx.Namespace,49Labels: labels,50Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaDeployment),51},52Spec: appsv1.DeploymentSpec{53Selector: &metav1.LabelSelector{MatchLabels: common.DefaultLabels(Component)},54Replicas: common.Replicas(ctx, Component),55Strategy: common.DeploymentStrategy,56Template: corev1.PodTemplateSpec{57ObjectMeta: metav1.ObjectMeta{58Name: Component,59Namespace: ctx.Namespace,60Labels: labels,61Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaDeployment, func() map[string]string {62return map[string]string{63common.AnnotationConfigChecksum: configHash,64}65}),66},67Spec: corev1.PodSpec{68Affinity: cluster.WithNodeAffinityHostnameAntiAffinity(Component, cluster.AffinityLabelMeta),69TopologySpreadConstraints: cluster.WithHostnameTopologySpread(Component),70ServiceAccountName: Component,71EnableServiceLinks: pointer.Bool(false),72DNSPolicy: corev1.DNSClusterFirst,73RestartPolicy: corev1.RestartPolicyAlways,74TerminationGracePeriodSeconds: pointer.Int64(30),75Containers: []corev1.Container{{76Args: []string{"run", "--config", "/config/config.json"},77Name: Component,78Image: ctx.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.IDEService.Version),79ImagePullPolicy: corev1.PullIfNotPresent,80Resources: common.ResourceRequirements(ctx, Component, Component, corev1.ResourceRequirements{81Requests: corev1.ResourceList{82"cpu": resource.MustParse("100m"),83"memory": resource.MustParse("128Mi"),84},85}),86Ports: []corev1.ContainerPort{{87ContainerPort: GRPCServicePort,88Name: GRPCPortName,89}},90SecurityContext: &corev1.SecurityContext{91Privileged: pointer.Bool(false),92AllowPrivilegeEscalation: pointer.Bool(false),93},94Env: common.CustomizeEnvvar(ctx, Component, common.MergeEnv(95common.DefaultEnv(&ctx.Config),96common.ConfigcatEnv(ctx),97)),98VolumeMounts: []corev1.VolumeMount{99{100Name: VolumeConfig,101MountPath: "/config",102ReadOnly: true,103},104{105Name: "ide-config",106MountPath: "/ide-config",107ReadOnly: true,108},109{110Name: volumeName,111MountPath: "/mnt/pull-secret",112},113},114ReadinessProbe: &corev1.Probe{115ProbeHandler: corev1.ProbeHandler{116HTTPGet: &corev1.HTTPGetAction{117Path: "/ready",118Port: intstr.IntOrString{IntVal: baseserver.BuiltinHealthPort},119},120},121FailureThreshold: 3,122SuccessThreshold: 1,123TimeoutSeconds: 1,124},125},126*common.KubeRBACProxyContainerWithConfig(ctx),127},128Volumes: []corev1.Volume{129{130Name: VolumeConfig,131VolumeSource: corev1.VolumeSource{132ConfigMap: &corev1.ConfigMapVolumeSource{133LocalObjectReference: corev1.LocalObjectReference{Name: Component},134},135},136},137{138Name: "ide-config",139VolumeSource: corev1.VolumeSource{140ConfigMap: &corev1.ConfigMapVolumeSource{141LocalObjectReference: corev1.LocalObjectReference{Name: "ide-config"},142},143},144},145{146Name: volumeName,147VolumeSource: corev1.VolumeSource{148Secret: &corev1.SecretVolumeSource{149SecretName: secretName,150Items: []corev1.KeyToPath{{Key: ".dockerconfigjson", Path: "pull-secret.json"}},151},152},153},154},155Tolerations: common.WithTolerationWorkspaceComponentNotReady(ctx),156},157},158},159},160}, nil161}162163164