引言
容器、devops和微服务被称为驱动云原生快速发展的三架马车。而devops是其中非常重要的一环,devops 是由developers(dev)和operations(ops)两个单词简称组成,中文直译就是“开发运维一体化”。
devops 作为一种复杂的软件工程方法,推行实施并不可一蹴而就。因此采用好的平台工具,方能事半功倍,gitlab作为一款成熟开源的一体化devops平台,其覆盖了devops全流程,提供了端到端的解决方案,诸如看敏捷开发、源代码托管、ci/cd、包管理、监控、k8s集成等。
接下来我会在最近的系列本章中来阐述.net如何借助gitlab来落地devops。
安装前准备
学习新技术的基础路径就是一定要上手实操,因此先介绍如何使用helm安装一套gitlab环境,以便后续内容的展开。在安装前,首先确保拥有以下资源:
拥有自己的域名,可以自行到域名提供商注册申请
一个kubernetes集群,需8核cpu,1内存以上
本地已安装
kubectl
和helm3
本地已安装kubernetes ide:
lens
,具体可访文https://k8slens.dev进行下载。
其中,第2、3步在kubernetes章节已有介绍,这里不在赘述。
开始安装
1. 添加gitlab helm 仓库
为了使用helm安装gitlab,首先就需要添加官方gitlab chart,参考以下命令进行添加:打开命令行,执行helm repo add gitlab https://charts.gitlab.io
。
shengjie@thinkpad:~$ kubectl config get-contexts # 确保本地kubectl连接到正确集群
current name cluster authinfo namespace
cloud-native cloud-native clusteruser_aks-group_cloud-native
* docker-desktop docker-desktop docker-desktop
shengjie@thinkpad:~$ helm version # 查看本地helm版本
version.buildinfo{version:"v3.7.1", gitcommit:"1d11fcb5d3f3bf00dbe6fe31b8412839a96b3dc4", gittreestate:"clean", goversion:"go1.16.9
shengjie@thinkpad:~$ helm repo add gitlab https://charts.gitlab.io # 添加gitlab helm 仓库
"gitlab" has been added to your repositories
shengjie@thinkpad:~$ helm repo list # 查看本地已添加的helm仓库
name url
gitlab https://charts.gitlab.io
shengjie@thinkpad:~$ helm search repo gitlab/gitlab # 搜索gitlab chart
name chart version app version description
gitlab/gitlab 5.3.3 14.3.3 web-based git-repository manager with wiki and ...
2. 下载gitlab helm chart
为了方便根据需要配置helm chart,可以先将gitlab helm chart 下载至本地进行修改,下载命令仅需执行以下命令:
shengjie@thinkpad:~$ mkdir cloud-native # 创建目录
shengjie@thinkpad:~$ cd cloud-native
shengjie@thinkpad:~/cloud-native$ helm pull gitlab/gitlab --version 5.3.3 --untar # 下载指定版本的gitlab chart
shengjie@thinkpad:~/cloud-native$ ls gitlab/
changelog.md chart.yaml readme.md charts requirements.lock support values.yaml
contributing.md license.md rakefile deps.yml requirements.yaml templates
3. 安装gitlab helm chart
接下来就可以在本地进行安装,执行以下命令:
shengjie@thinkpad:~/cloud-native/gitlab$ kubectl create namespace gitlab # 创建gitlab命名空间
shengjie@thinkpad:~/cloud-native/gitlab$ helm install gitlab . -n gitlab \ # 指定在gitlab 命名空间安装
> --set global.hosts.domain={你的域名} \ # 设置域名,这里为后续讲解方便,{你的域名}替换为shengjie.dev
> --set certmanager-issuer.email={你的邮箱} # 设置证书邮件
name: gitlab
last deployed: sat sep 25 04:29:39 2021
namespace: default
status: deployed
revision: 1
notes:
notice: the minimum required version of postgresql is now 12. see https://gitlab.com/gitlab-org/charts/gitlab/-/blob/master/doc/installation/upgrade.md for more details.
notice: you've installed gitlab runner without the ability to use 'docker in docker'.
the gitlab runner chart (gitlab/gitlab-runner) is deployed without the `privileged` flag by default for security purposes. this can be changed by setting `gitlab-runner.runners.privileged` to `true`. before doing so, please read the gitlab runner chart's documentation on why we
chose not to enable this by default. see https://docs.gitlab.com/runner/install/kubernetes.html#running-docker-in-docker-containers-with-gitlab-runners
help us improve the installation experience, let us know how we did with a 1 minute survey:
https://gitlab.fra1.qualtrics.com/jfe/form/sv_6kvqzanthuq1bzb?installation=helm&release=14-3
安装成功后,可以通过执行以下命令来确认gitlab是否成功安装,带所有pod 处于running状态就说明安装成功了。
shengjie@thinkpad:~$ helm list -n gitlab # 查看gitlab命名空间安装的chart状态
name namespace revision status chart app version
gitlab gitlab 1 deployed gitlab-5.3.2 14.3.2
shengjie@thinkpad:~$ kubectl get deploy -n gitlab # 查看gitlab命名空间下的deploy是否都为可用状态
name ready up-to-date available age
gitlab-certmanager 1/1 1 1 8d
gitlab-certmanager-cainjector 1/1 1 1 8d
gitlab-certmanager-webhook 1/1 1 1 8d
gitlab-gitlab-exporter 1/1 1 1 8d
gitlab-gitlab-runner 1/1 1 1 8d
gitlab-gitlab-shell 2/2 2 2 8d
gitlab-minio 1/1 1 1 8d
gitlab-nginx-ingress-controller 2/2 2 2 8d
gitlab-nginx-ingress-default-backend 1/1 1 1 8d
gitlab-prometheus-server 1/1 1 1 8d
gitlab-registry 2/2 2 2 8d
gitlab-sidekiq-all-in-1-v1 1/1 1 1 8d
gitlab-task-runner 1/1 1 1 8d
gitlab-webservice-default 2/2 2 2 8d
shengjie@thinkpad:~$ kubectl get statefulset -n gitlab # 查看已安装的有状态服务
name ready age
gitlab-gitaly 1/1 8d
gitlab-postgresql 1/1 8d
gitlab-redis-master 1/1 8d
从安装的pod来看,gitlab chart默认安装了以下组件和服务:
nginx ingress controller:用于部署nginx 作为ingress 控制器,控制集群入口网关。
registry:提供镜像仓库服务,用于存储镜像。
gitlab/gitaly:gitlab的rpc组件,用于内部通信。
gitlab/gitlab exporter:收集gitlab运行指标,用于gitlab服务监控。
gitlab/gitlab grafana:用于提供仪表盘 。
gitlab/gitlab pages:用于为gitlab项目生成静态网站。
gitlab/gitlab shell:用于配置ssh以便访问gitlab的ssh服务器。
gitlab/mailroom:电子邮件服务。
gitlab/gitlab runner:用于执行ci/cd流水线任务。
gitlab/sidekiq:后台任务执行组件
gitlab/task runner:用于在 gitlab 应用程序中执行定期管理任务。这些任务包括备份、sidekiq 维护和 rake 任务。
gitlab/webservice:gitlab web 站点。
postgresql:关系型数据库,用于存储gitlab配置。
redis:非关系数据库,用于缓存。
minio:对象存储服务器。
cert-mangager:用于自动通过let's encrypt申请ssl证书。
prometheus:用于指标收集提供监控
grafana:提供可视化的仪表盘用于指标展示
4. 域名绑定
接下来就是进行域名绑定了,首先执行kubectl get ingress -n gitlab
来查看所有的ingress。命令如下:
shengjie@thinkpad:~$ kubectl get ingress -n gitlab
name class hosts address ports age
gitlab-minio <none> minio.shengjie.dev 20.205.104.95 80, 443 7d22h
gitlab-registry <none> registry.shengjie.dev 20.205.104.95 80, 443 7d22h
gitlab-webservice-default <none> gitlab.shengjie.dev 20.205.104.95 80, 443 7d22h
其中minio.shengjie.dev
为minio对象存储站点,registry.shengjie.dev
为镜像仓库站点,gitlab.shengjie.dev
为gitlab主站点。接下来前往自己的域名提供商的管理站点,添加a记录进行域名映射。举例如下:做好域名绑定后,cert-manager组件负责申请的ssl证书就会下发成功,具体状态可以通过命令
kubectl get certificate -n gitlab
查看certificate
资源确认,也可使用lens工具通过以下步骤进行验证,当ready状态为true时说明下方成功,即可通过域名正常访问。
5. 访问验证
由于在安装时未指定root用户密码,因此需要从命名为gitlab-gitlab-initial-root-password
的secret中获取,这里建议直接通过lens快速查看,步骤如下图所示:打开gitlab站点,用户名输入root,密码输入上图中base64解码的密码即可成功登录,登录成功后,如下图所示:
由于默认界面为英文展示,可以根据需要通过上图中
go to preferences
前往偏好设置页面,进行语言修改。步骤如下图所示:gitlab在安装时同时也安装了minio,minio 是一款高性能、分布式的开源对象存储系统。minio 为云原生而设计,对kubernetes支持友化,其简单轻量易用,实现了对象存储所需的全部功能,与传统对象存储相比,minio在同等硬件配置下有更高的吞吐量和更低的延迟,目前已成为主流的对象存储系统。可以通过查看
ingress
发现默认绑定到域名minio.shengjie.dev
。此时可以通过从命名为gitlab-minio-secret
的secret中找到用于登录的accesskey
和secretkey
,如下图所示:
minio站点登录成功后,可以发现其预置了一些bucket(桶),其中有以下比较常用的桶:
gitlab-artifacts:用于存储持续构建环节中产生的中间产物,用于在同一流水线的不同stage中共享。
gitlab-packages:用于存储如npm 包、nutget 包。
gitlab-pages:用于存储gitlab 静态页面文件资源。
registry:用于作为镜像仓库,如存储docker镜像。
runner-cache:用来存储依赖项,比如从互联网上下载的软件包。
在后续的流水线配置中,将使用minio存储镜像文件和缓存。
发表评论