在 Google Kubernetes Engine 上部署可正式投入使用的 GitLab

本文档介绍了如何在 Google Kubernetes Engine (GKE) 上部署可扩缩、可靠且可观察到的 GitLab 实例。GitLab 是一种开源应用,可帮助用户规划、存储、测试和部署其源代码。GitLab 的核心功能是源代码管理平台,但它还包括项目管理、持续集成和持续部署功能。

在本教程中,您将部署以下体系结构。尽可能将 GKE 用于 GitLab 的应用组件和 Google Cloud 托管式服务,以减少运行 GitLab 的运营负担。您将使用 Helm 作为在 GKE 中安装和配置 GitLab 应用组件的机制。

使用 GKE for GitLab 的应用组件和 Google Cloud 代管式服务以减少运行 GitLab 的运营负担的架构

下表将本教程中使用的 Google Cloud 产品与其在 GitLab 中的使用场景一一对应。

数据存储区 使用场景
Cloud Monitoring 持久性监控指标存储
指标信息汇总
提醒
系统日志
Cloud Storage 备份
大型文件存储
构建工件
上传
Cloud SQL for PostgreSQL 应用元数据
用户信息
Memorystore for Redis 临时数据
会话数据
后台作业队列

本教程假设您了解 Identity and Access Management (IAM)Google Kubernetes EngineCloud SQL

如果您要查找自动化程度更高的安装方法,请使用 GitHub 上的 GitLab on GKE Terraform 模块

目标

  • 创建相应数据存储区以托管 GitLab 数据。
  • 在 GKE 集群中安装 GitLab。
  • 连接到 GitLab。

费用

本教程使用 Google Cloud 的以下收费组件:

  • Compute Engine
  • Google Kubernetes Engine
  • Cloud Load Balancing
  • Cloud SQL
  • Memorystore
  • Container Registry
  • Cloud Storage
  • Cloud Monitoring

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

创建必备资源

启用 API

  1. 打开 Cloud Shell:

    打开 Cloud Shell

  2. 在 Cloud Shell 中,启用 Google Kubernetes Engine、Service Networking、Resource Manager 和 Redis API:

    gcloud services enable container.googleapis.com \
           servicenetworking.googleapis.com \
           cloudresourcemanager.googleapis.com \
           redis.googleapis.com \
           sqladmin.googleapis.com
    

配置 IAM

  • 为 GitLab 创建一个 IAM 服务帐号。然后为该 IAM 服务帐号添加 storage.admin 角色,以便它可以访问 Cloud Storage。

    export PROJECT_ID=$(gcloud config get-value project)
    gcloud iam service-accounts create gitlab-gcs \
        --display-name "GitLab Cloud Storage"
    gcloud iam service-accounts keys create --iam-account \
        gitlab-gcs@${PROJECT_ID}.iam.gserviceaccount.com gcs-key.json
    gcloud projects add-iam-policy-binding --role roles/storage.admin ${PROJECT_ID} \
        --member=serviceAccount:gitlab-gcs@${PROJECT_ID}.iam.gserviceaccount.com
    

创建 Cloud Storage 存储分区

  • 使用 gsutil 命令行工具创建 GitLab 使用的存储分区:

    export PROJECT_ID=$(gcloud config get-value project)
    gsutil mb gs://${PROJECT_ID}-gitlab-backups
    gsutil mb gs://${PROJECT_ID}-git-lfs
    gsutil mb gs://${PROJECT_ID}-gitlab-artifacts
    gsutil mb gs://${PROJECT_ID}-gitlab-uploads
    gsutil mb gs://${PROJECT_ID}-gitlab-packages
    gsutil mb gs://${PROJECT_ID}-gitlab-pseudo
    gsutil mb gs://${PROJECT_ID}-runner-cache
    

配置网络

  1. 创建一个可用于访问 GitLab 实例的外部 IP 地址:

    gcloud compute addresses create gitlab --region us-central1 \
        --description "Gitlab Ingress IP"
    
  2. 创建一个可分配给 Cloud SQL for PostgreSQL 数据库实例的专用 IP 地址范围,使该实例无法从 VPC 网络外部访问:

    export PROJECT_ID=$(gcloud config get-value project)
    gcloud compute addresses create gitlab-sql --global --prefix-length 20 \
        --description="Gitlab Cloud SQL range" --network=default
    gcloud services vpc-peerings connect \
        --service=servicenetworking.googleapis.com --ranges=gitlab-sql \
        --network=default --project ${PROJECT_ID}
    

创建 PostgreSQL 实例和数据库

  1. 创建 GitLab 将用于存储其大部分元数据的 Cloud SQL 数据库:

    gcloud beta sql instances create gitlab-db --network default \
        --database-version=POSTGRES_12 --cpu 4 --memory 15 --no-assign-ip \
        --storage-auto-increase --zone us-central1-a
    

    此命令会在 default 网络中创建一个可私密访问的 PostgreSQL 数据库,该数据库具有 4 个 CPU 核心和 15 GB 的 RAM。数据库的磁盘大小设置为根据需要自动增加。

  2. 为 GitLab 创建数据库用户和密码以对数据库进行身份验证:

    export PASSWORD=$(openssl rand -base64 18)
    gcloud sql users create gitlab --instance gitlab-db --password ${PASSWORD}
    
  3. 创建 GitLab 将在 PostgreSQL 实例中使用的数据库:

    gcloud sql databases create --instance gitlab-db gitlabhq_production
    

创建 Redis 实例

  • 创建 Redis 实例。如需详细了解如何调整 Redis 实例大小,请参阅 GitLab 要求文档

    gcloud redis instances create gitlab --size=2 --region=us-central1 \
        --zone=us-central1-a --tier standard
    

创建和配置 GKE 集群

  1. 创建将用于托管 GitLab 应用组件的 GKE 集群。 必须在该集群中启用别名 IP 功能才能与 Redis 实例进行通信。

    gcloud container clusters create gitlab --machine-type n1-standard-4 \
        --zone us-central1-a --enable-ip-alias
    
  2. 创建一个存储类别,以便 GitLab 可以将其 Git 代码库存储在 SSD 永久性磁盘上:

    cat > pd-ssd-storage.yaml <<EOF
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: pd-ssd
    provisioner: kubernetes.io/gce-pd
    parameters:
      type: pd-ssd
    EOF
    kubectl apply -f pd-ssd-storage.yaml
    
  3. 使用 kubectl 在集群中创建一个 Secret 以存储 PostgreSQL 密码:

    kubectl create secret generic gitlab-pg --from-literal=password=${PASSWORD}
    
  4. 创建一个 Secret 来存储您的 Cloud Storage 凭据:

    kubectl create secret generic google-application-credentials \
        --from-file=gcs-application-credentials-file=./gcs-key.json
    
  5. 创建一个 Secret 来存储 Rails 所需的其他参数,以便配置大型文件存储、工件、上传和软件包功能:

    export PROJECT_ID=$(gcloud config get-value project)
    
    cat > rails.yaml <<EOF
    provider: Google
    google_project: ${PROJECT_ID}
    google_client_email: gitlab-gcs@${PROJECT_ID}.iam.gserviceaccount.com
    google_json_key_string: '$(cat gcs-key.json)'
    EOF
    kubectl create secret generic gitlab-rails-storage --from-file=connection=rails.yaml
    

配置和安装 GitLab

在本部分中,您将使用 HelmGitLab 图表代码库部署 GitLab。Helm 是一个软件包管理器,可用于配置和部署 Kubernetes 应用

验证 Helm 是否已安装

  1. 验证 Helm 是否已安装在 Cloud Shell 上:

    helm version
    

    如果 Helm 已正确安装,则会显示 v3.2.1 或更高版本:

    Client: version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"}
    
  2. 如果您没有看到 v3.2.1 或更高版本的版本号,请按照 Helm 指南中的说明安装 Helm。

安装 GitLab 图表

GitLab 图表要求自定义配置,以便它可以利用您先前预配的外部数据存储区。

  1. 下载配置文件模板:

    wget https://raw.githubusercontent.com/terraform-google-modules/terraform-google-gke-gitlab/master/values.yaml.tpl
    
  2. 创建配置文件:

    export PROJECT_ID=$(gcloud config get-value project)
    export INGRESS_IP=$(gcloud compute addresses describe gitlab \
        --region us-central1 --format 'value(address)')
    export DOMAIN=${INGRESS_IP}.xip.io
    export DB_PRIVATE_IP=$(gcloud sql instances describe gitlab-db \
        --format 'value(ipAddresses[0].ipAddress)')
    export REDIS_PRIVATE_IP=$(gcloud redis instances describe gitlab \
        --region=us-central1  --format 'value(host)')
    export CERT_MANAGER_EMAIL=$(gcloud config get-value account)
    
    cat values.yaml.tpl | envsubst > values.yaml
    
  3. 使用 Helm 安装图表:

    helm repo add gitlab https://charts.gitlab.io/
    helm install -f values.yaml gitlab gitlab/gitlab
    

配置监控

您可以使用 Prometheus 集成来监控 GitLab 安装。此集成会部署 Prometheus 服务器以从 GitLab 中抓取指标。然后,辅助信息文件容器将指标从 Prometheus 发送到 Cloud Monitoring,以进行更长期存储、信息汇总和提醒。

  1. 克隆 Prometheus 集成源代码:

    git clone https://github.com/stackdriver/stackdriver-prometheus-sidecar
    cd stackdriver-prometheus-sidecar/kube/full
    
  2. 通过设置以下环境变量来配置安装:

    export KUBE_NAMESPACE=default
    export KUBE_CLUSTER=gitlab
    export GCP_REGION=us-central1
    export GCP_PROJECT=$(gcloud config get-value project)
    export SIDECAR_IMAGE_TAG=release-0.4.2
    
  3. 安装 Prometheus 集成:

    ./deploy.sh
    

    现在,您的 GitLab 指标会自动添加到 Monitoring 中。

使用 GitLab

现在 GitLab 已启动并运行,接下来连接 GitLab 并设置初始用户密码。

初始登录

  1. 获取 GitLab 服务器的网址:

    export GITLAB_HOSTNAME=$(kubectl get ingresses.extensions gitlab-webservice-default \
        -o jsonpath='{.spec.rules[0].host}')
    echo "Your GitLab URL is: https://${GITLAB_HOSTNAME}"
    
  2. 获取最初的 root 帐号密码:

    kubectl get secret gitlab-gitlab-initial-root-password \
        -o go-template='{{.data.password}}' | base64 -d && echo
    

    该密码是输出到控制台的 64 个字符组成的字符串。存放以备日后使用。

  3. 确保所有 pod 已达到正常运行状态:

    kubectl get pods
    

    所有 pod 可能需要 3-5 分钟才能达到预期状态。

  4. 通过步骤 1 在浏览器中访问 GitLab 网址,然后使用步骤 2 中的密码以 root 用户身份登录。以下屏幕截图显示了登录页面。

    GitLab 登录页面

设置您的第一个用户帐号

在您登录后,我们建议您更改 root 帐号的用户名和密码。

  1. 在顶部导航栏中,点击 Admin Area 按钮:

    GitLab Admin Area

  2. 在左侧导航栏中,点击 Users

    GitLab 的左侧导航栏

  3. 点击 Administrator 行上的 Edit 按钮以配置帐号详细信息:

    Administrator 行上的 Edit 按钮

  4. 在显示的表单中,更改 NameUsernameEmailPassword 字段,然后点击底部的 Save changes 按钮。

    您已退出帐号。

  5. 使用您的新用户名和密码登录。

您现在可以使用 GitLab 了。请参阅 GitLab 文档以详细了解如何与 GitLab 进行交互。如需详细了解如何自定义安装,请参阅 GitLab 图表文档

清理

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤

  • 试用其他 Google Cloud 功能。查阅我们的教程