Path: blob/main/install/installer/pkg/components/blobserve/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 blobserve56import (7"fmt"89"github.com/gitpod-io/gitpod/installer/pkg/cluster"10"github.com/gitpod-io/gitpod/installer/pkg/common"11dockerregistry "github.com/gitpod-io/gitpod/installer/pkg/components/docker-registry"12appsv1 "k8s.io/api/apps/v1"13corev1 "k8s.io/api/core/v1"14"k8s.io/apimachinery/pkg/api/resource"15metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"16"k8s.io/apimachinery/pkg/runtime"17"k8s.io/apimachinery/pkg/util/intstr"18"k8s.io/utils/pointer"19)2021func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {22labels := common.CustomizeLabel(ctx, Component, common.TypeMetaDeployment)2324volumeName := "pull-secret"25var secretName string26if pointer.BoolDeref(ctx.Config.ContainerRegistry.InCluster, false) {27secretName = dockerregistry.BuiltInRegistryAuth28} else if ctx.Config.ContainerRegistry.External != nil {29if ctx.Config.ContainerRegistry.External.Certificate != nil {30secretName = ctx.Config.ContainerRegistry.External.Certificate.Name31}32} else {33return nil, fmt.Errorf("%s: invalid container registry config", Component)34}3536var hashObj []runtime.Object37if objs, err := configmap(ctx); err != nil {38return nil, err39} else {40hashObj = append(hashObj, objs...)41}4243if objs, err := common.DockerRegistryHash(ctx); err != nil {44return nil, err45} else {46hashObj = append(hashObj, objs...)47}4849configHash, err := common.ObjectHash(hashObj, nil)50if err != nil {51return nil, err52}5354return []runtime.Object{55&appsv1.Deployment{56TypeMeta: common.TypeMetaDeployment,57ObjectMeta: metav1.ObjectMeta{58Name: Component,59Namespace: ctx.Namespace,60Labels: labels,61Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaDeployment),62},63Spec: appsv1.DeploymentSpec{64Selector: &metav1.LabelSelector{MatchLabels: common.DefaultLabels(Component)},65Replicas: common.Replicas(ctx, Component),66Strategy: common.DeploymentStrategy,67Template: corev1.PodTemplateSpec{68ObjectMeta: metav1.ObjectMeta{69Name: Component,70Namespace: ctx.Namespace,71Labels: labels,72Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaDeployment, func() map[string]string {73return map[string]string{74common.AnnotationConfigChecksum: configHash,75}76}),77},78Spec: corev1.PodSpec{79Affinity: cluster.WithNodeAffinityHostnameAntiAffinity(Component, cluster.AffinityLabelIDE),80TopologySpreadConstraints: cluster.WithHostnameTopologySpread(Component),81ServiceAccountName: Component,82EnableServiceLinks: pointer.Bool(false),83Volumes: []corev1.Volume{84{85Name: "cache",86VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}},87}, {88Name: "config",89VolumeSource: corev1.VolumeSource{90ConfigMap: &corev1.ConfigMapVolumeSource{91LocalObjectReference: corev1.LocalObjectReference{Name: Component},92},93},94}, {95Name: volumeName,96VolumeSource: corev1.VolumeSource{97Secret: &corev1.SecretVolumeSource{98SecretName: secretName,99Items: []corev1.KeyToPath{{Key: ".dockerconfigjson", Path: "pull-secret.json"}},100},101},102},103common.CAVolume(),104},105Containers: []corev1.Container{{106Name: Component,107Args: []string{"run", "/mnt/config/config.json"},108Image: ctx.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.Blobserve.Version),109ImagePullPolicy: corev1.PullIfNotPresent,110Ports: []corev1.ContainerPort{{111Name: ServicePortName,112ContainerPort: ContainerPort,113}},114Resources: common.ResourceRequirements(ctx, Component, Component, corev1.ResourceRequirements{115Requests: corev1.ResourceList{116"cpu": resource.MustParse("100m"),117"memory": resource.MustParse("32Mi"),118},119}),120SecurityContext: &corev1.SecurityContext{121Privileged: pointer.Bool(false),122RunAsUser: pointer.Int64(1000),123},124Env: common.CustomizeEnvvar(ctx, Component, common.MergeEnv(125common.DefaultEnv(&ctx.Config),126common.WorkspaceTracingEnv(ctx, Component),127)),128VolumeMounts: []corev1.VolumeMount{129{130Name: "config",131MountPath: "/mnt/config",132ReadOnly: true,133}, {134Name: "cache",135MountPath: "/mnt/cache",136}, {137Name: volumeName,138MountPath: "/mnt/pull-secret",139},140common.CAVolumeMount(),141},142143ReadinessProbe: &corev1.Probe{144ProbeHandler: corev1.ProbeHandler{145HTTPGet: &corev1.HTTPGetAction{146Path: "/ready",147Port: intstr.IntOrString{IntVal: ReadinessPort},148},149},150InitialDelaySeconds: 5,151PeriodSeconds: 5,152TimeoutSeconds: 2,153SuccessThreshold: 1,154FailureThreshold: 3,155},156LivenessProbe: &corev1.Probe{157ProbeHandler: corev1.ProbeHandler{158HTTPGet: &corev1.HTTPGetAction{159Path: "/live",160Port: intstr.IntOrString{IntVal: ReadinessPort},161},162},163InitialDelaySeconds: 5,164PeriodSeconds: 10,165TimeoutSeconds: 2,166SuccessThreshold: 1,167FailureThreshold: 3,168},169}, *common.KubeRBACProxyContainer(ctx)},170Tolerations: common.WithTolerationWorkspaceComponentNotReady(ctx),171},172},173},174},175}, nil176}177178179