在 Kubernetes 集群中安装 Gitlab
先决条件
在 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.xyz
、registiry.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
...
完成动作之后,可以通过 ingress
、pods
的情况查看启动情况:
$ 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
。