先决条件

在 Kubernetes 中的安装,自然需要一个可以运行和管理的 Kubernetes 集群,首先创建一个 Namespace 用于 Gitlab 的安装运行:

$ kubectl create ns gitlab
namespace/gitlab created
$ kubens gitlab
Context "mediumlab" modified.
Active namespace is "gitlab".

同时还要求该集群有如下能力:

  • 外网 Loadbalancer 支持
  • 镜像拉取
  • Helm 访问
  • StorageClass

Helm 仓库

Gitlab 官方提供了 Helm 仓库,添加地址之后就可以进行安装了:

$ helm repo add gitlab https://charts.gitlab.io/
"gitlab" has been added to your repositories

Helm 安装一般有两种方式:

  • helm install:需要集群端安装 Tiller,直接完成安装。

  • helm template:无需 Tiller 支持,用于生成最终的 YAML 安装文件。

这里为了使用方便,我们选择第二种,生成模板的方式。

TLS

为了提供 HTTPS 服务,不可避免的要使用 tls 的相关设置,Gitlab 给出了几个选项,本文使用两种:

自行提供泛域名证书

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...
...Successfully got an update from the "gitlab" chart repository
...Successfully got an update from the "stable" chart repository
$ helm fetch --untar gitlab/gitlab
$ helm template gitlab \
--namespace gitlab \
--name core \
--set global.edition=ce \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false \
--set global.ingress.tls.secretName=xyz \
--set global.hosts.domain=microservice.xyz \
--set gitlab-runner.install=false > gitlab-install.yaml

上面列出的几个开关,解释如下:

  • global.edition:Gitlab 分为 CE(社区版)和 EE(企业版)两个版本,这里仅涉及 CE 版本。
  • certmanager.install:使用固定证书,无需 certmanager
  • global.ingress.tls.secretName:不用 certmanger 配置 Ingress。
  • global.hosts.domain:主机域名,这里给出的是一个根域名,后续会生成形如 gitlab.microservice.xyzregistiry.microservice.xyz 形式的子域名。
  • gitlab-runner.install=false:后续步骤中会单独安装 runner。
  • global.ingress.tls.secretName=xyz:用于保存我们的泛域名证书。

cert-manager + letsencrypt

$ helm template gitlab \
--namespace gitlab \
--name core \
--set global.edition=ce \
--set global.hosts.domain=microservice.rocks \
--set certmanager-issuer.email="xampal@gmail.com" \
--set gitlab-runner.install=false

这个参数很简单:

  • global.hosts.domain:根域名。
  • certmanager-issuer.email:签发者证书。

安装

用上述命令生成的安装清单,使用 kubectl 即可完成安装。

$ kubectl apply -f gitlab-le.yaml
...
poddisruptionbudget.policy/gitlab-gitaly created
poddisruptionbudget.policy/gitlab-gitlab-shell created
...

完成动作之后,可以通过 ingresspods 的情况查看启动情况:

$ kubectl get ing -w
NAME            HOSTS                         ADDRESS   PORTS     AGE
core-minio      minio.microservice.rocks                80, 443   23s
core-registry   registry.microservice.rocks             80, 443   23s
core-unicorn    gitlab.microservice.rocks               80, 443   24s

启动完成应该有几个结果:

  • svc/Ingress 获得了地址。
  • Pod 运行。
  • PVC 全部绑定。

接下来就可以使用命令获取 root 密码:

$ kubectl get secret core-gitlab-initial-root-password -ojsonpath='{.data.password}' | base64 --decode ; echo
O3ewqaXE...NjCTYVktYghmkodF0j1c

初始化

输入 SSH 公钥

浏览器打开 /profile/keys,在其中输入公钥内容。

关闭 Auto DevOps

浏览器打开 /admin/application_settings/ci_cd,取消其中的 Default to Auto DevOps pipeline for all projects