Path: blob/main/install/installer/pkg/components/content-service/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 content_service56import (7"github.com/gitpod-io/gitpod/common-go/baseserver"8"github.com/gitpod-io/gitpod/installer/pkg/cluster"9"github.com/gitpod-io/gitpod/installer/pkg/common"1011v1 "k8s.io/api/apps/v1"12corev1 "k8s.io/api/core/v1"13"k8s.io/apimachinery/pkg/api/resource"14metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"15"k8s.io/apimachinery/pkg/runtime"16"k8s.io/utils/pointer"17)1819func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {20labels := common.CustomizeLabel(ctx, Component, common.TypeMetaDeployment)2122configHash, err := common.ObjectHash(configmap(ctx))23if err != nil {24return nil, err25}2627podSpec := corev1.PodSpec{28Affinity: cluster.WithNodeAffinityHostnameAntiAffinity(Component, cluster.AffinityLabelMeta),29TopologySpreadConstraints: cluster.WithHostnameTopologySpread(Component),30ServiceAccountName: Component,31EnableServiceLinks: pointer.Bool(false),32DNSPolicy: corev1.DNSClusterFirst,33RestartPolicy: corev1.RestartPolicyAlways,34TerminationGracePeriodSeconds: pointer.Int64(30),35Volumes: []corev1.Volume{36{37Name: "config",38VolumeSource: corev1.VolumeSource{39ConfigMap: &corev1.ConfigMapVolumeSource{40LocalObjectReference: corev1.LocalObjectReference{Name: Component},41},42},43},44common.CAVolume(),45},46Containers: []corev1.Container{{47Name: Component,48Image: ctx.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.ContentService.Version),49ImagePullPolicy: corev1.PullIfNotPresent,50Args: []string{51"run",52"--config",53"/config/config.json",54},55Resources: common.ResourceRequirements(ctx, Component, Component, corev1.ResourceRequirements{56Requests: corev1.ResourceList{57"cpu": resource.MustParse("100m"),58"memory": resource.MustParse("32Mi"),59},60}),61Ports: []corev1.ContainerPort{{62Name: RPCServiceName,63ContainerPort: RPCPort,64}, {65ContainerPort: baseserver.BuiltinMetricsPort,66Name: baseserver.BuiltinMetricsPortName,67}},68SecurityContext: &corev1.SecurityContext{69Privileged: pointer.Bool(false),70RunAsUser: pointer.Int64(1000),71},72Env: common.CustomizeEnvvar(ctx, Component, common.MergeEnv(73common.DefaultEnv(&ctx.Config),74common.WorkspaceTracingEnv(ctx, Component),75[]corev1.EnvVar{{76Name: "GRPC_GO_RETRY",77Value: "on",78}},79)),80VolumeMounts: []corev1.VolumeMount{81{82Name: "config",83MountPath: "/config",84ReadOnly: true,85},86common.CAVolumeMount(),87},88}, *common.KubeRBACProxyContainer(ctx),89},90Tolerations: common.WithTolerationWorkspaceComponentNotReady(ctx),91}9293err = common.AddStorageMounts(ctx, &podSpec, Component)94if err != nil {95return nil, err96}9798return []runtime.Object{99&v1.Deployment{100TypeMeta: common.TypeMetaDeployment,101ObjectMeta: metav1.ObjectMeta{102Name: Component,103Namespace: ctx.Namespace,104Labels: labels,105Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaDeployment),106},107Spec: v1.DeploymentSpec{108Selector: &metav1.LabelSelector{MatchLabels: common.DefaultLabels(Component)},109Replicas: common.Replicas(ctx, Component),110Strategy: common.DeploymentStrategy,111Template: corev1.PodTemplateSpec{112ObjectMeta: metav1.ObjectMeta{113Name: Component,114Namespace: ctx.Namespace,115Labels: labels,116Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaDeployment, func() map[string]string {117return map[string]string{118common.AnnotationConfigChecksum: configHash,119}120}),121},122Spec: podSpec,123},124},125},126}, nil127}128129130