Path: blob/main/install/installer/pkg/components/image-builder-mk3/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 image_builder_mk356import (7"fmt"89"github.com/gitpod-io/gitpod/installer/pkg/cluster"10"github.com/gitpod-io/gitpod/installer/pkg/config/v1"1112"github.com/gitpod-io/gitpod/installer/pkg/common"13dockerregistry "github.com/gitpod-io/gitpod/installer/pkg/components/docker-registry"14wsmanagermk2 "github.com/gitpod-io/gitpod/installer/pkg/components/ws-manager-mk2"1516appsv1 "k8s.io/api/apps/v1"17corev1 "k8s.io/api/core/v1"18"k8s.io/apimachinery/pkg/api/resource"19metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"20"k8s.io/apimachinery/pkg/runtime"21"k8s.io/utils/pointer"22)2324func pullSecretName(ctx *common.RenderContext) (string, error) {25var secretName string26if pointer.BoolDeref(ctx.Config.ContainerRegistry.InCluster, false) {27secretName = dockerregistry.BuiltInRegistryAuth28} else if ctx.Config.ContainerRegistry.External != nil {29secretName = ctx.Config.ContainerRegistry.External.Certificate.Name30} else {31return "", fmt.Errorf("%s: invalid container registry config", Component)32}33return secretName, nil34}3536func deployment(ctx *common.RenderContext) ([]runtime.Object, error) {37labels := common.CustomizeLabel(ctx, Component, common.TypeMetaDeployment)3839var hashObj []runtime.Object40if objs, err := configmap(ctx); err != nil {41return nil, err42} else {43hashObj = append(hashObj, objs...)44}4546secretName, err := pullSecretName(ctx)47if err != nil {48return nil, err49}5051if objs, err := common.DockerRegistryHash(ctx); err != nil {52return nil, err53} else {54hashObj = append(hashObj, objs...)55}5657configHash, err := common.ObjectHash(hashObj, nil)58if err != nil {59return nil, err60}6162volumes := []corev1.Volume{63{64Name: "configuration",65VolumeSource: corev1.VolumeSource{66ConfigMap: &corev1.ConfigMapVolumeSource{67LocalObjectReference: corev1.LocalObjectReference{Name: fmt.Sprintf("%s-config", Component)},68},69},70},71{72Name: "wsman-tls-certs",73VolumeSource: corev1.VolumeSource{74Secret: &corev1.SecretVolumeSource{75SecretName: wsmanagermk2.TLSSecretNameClient,76},77},78},79{80Name: "pull-secret",81VolumeSource: corev1.VolumeSource{82Secret: &corev1.SecretVolumeSource{83SecretName: secretName,84Items: []corev1.KeyToPath{{Key: ".dockerconfigjson", Path: "pull-secret.json"}},85},86},87},88common.CAVolume(),89}9091volumeMounts := []corev1.VolumeMount{92{93Name: "configuration",94MountPath: "/config/image-builder.json",95SubPath: "image-builder.json",96},97{98Name: "wsman-tls-certs",99MountPath: "/wsman-certs",100ReadOnly: true,101},102{103Name: "pull-secret",104MountPath: "/config/pull-secret",105},106common.CAVolumeMount(),107}108109if ctx.Config.Kind == config.InstallationWorkspace {110// Only enable TLS in workspace clusters. This check can be removed111// once image-builder-mk3 has been removed from application clusters112// (https://github.com/gitpod-io/gitpod/issues/7845).113volumes = append(volumes, corev1.Volume{114Name: VolumeTLSCerts,115VolumeSource: corev1.VolumeSource{116Secret: &corev1.SecretVolumeSource{SecretName: TLSSecretName},117},118})119volumeMounts = append(volumeMounts, corev1.VolumeMount{120Name: VolumeTLSCerts,121MountPath: "/certs",122ReadOnly: true,123})124}125126return []runtime.Object{&appsv1.Deployment{127TypeMeta: common.TypeMetaDeployment,128ObjectMeta: metav1.ObjectMeta{129Name: Component,130Namespace: ctx.Namespace,131Labels: labels,132Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaDeployment),133},134Spec: appsv1.DeploymentSpec{135Selector: &metav1.LabelSelector{MatchLabels: common.DefaultLabels(Component)},136Replicas: common.Replicas(ctx, Component),137Strategy: common.DeploymentStrategy,138Template: corev1.PodTemplateSpec{139ObjectMeta: metav1.ObjectMeta{140Name: Component,141Namespace: ctx.Namespace,142Labels: labels,143Annotations: common.CustomizeAnnotation(ctx, Component, common.TypeMetaDeployment, func() map[string]string {144return map[string]string{145common.AnnotationConfigChecksum: configHash,146}147}),148},149Spec: corev1.PodSpec{150Affinity: cluster.WithNodeAffinityHostnameAntiAffinity(Component, cluster.AffinityLabelServices),151TopologySpreadConstraints: cluster.WithHostnameTopologySpread(Component),152ServiceAccountName: Component,153EnableServiceLinks: pointer.Bool(false),154DNSPolicy: corev1.DNSClusterFirst,155RestartPolicy: corev1.RestartPolicyAlways,156TerminationGracePeriodSeconds: pointer.Int64(30),157Volumes: volumes,158Containers: []corev1.Container{{159Name: Component,160Image: ctx.ImageName(ctx.Config.Repository, Component, ctx.VersionManifest.Components.ImageBuilderMk3.Version),161ImagePullPolicy: corev1.PullIfNotPresent,162Args: []string{163"run",164"--config",165"/config/image-builder.json",166},167Env: common.CustomizeEnvvar(ctx, Component, common.MergeEnv(168common.DefaultEnv(&ctx.Config),169common.WorkspaceTracingEnv(ctx, Component),170)),171Resources: common.ResourceRequirements(ctx, Component, Component, corev1.ResourceRequirements{172Requests: corev1.ResourceList{173"cpu": resource.MustParse("100m"),174"memory": resource.MustParse("200Mi"),175},176}),177Ports: []corev1.ContainerPort{{178ContainerPort: RPCPort,179Name: RPCPortName,180}},181SecurityContext: &corev1.SecurityContext{182Privileged: pointer.Bool(false),183AllowPrivilegeEscalation: pointer.Bool(false),184RunAsUser: pointer.Int64(33333),185},186VolumeMounts: volumeMounts,187},188*common.KubeRBACProxyContainer(ctx),189},190Tolerations: common.WithTolerationWorkspaceComponentNotReady(ctx),191},192},193},194}}, nil195}196197198