前言
作为一个年更博客,快两年前就写过跟 GitLab 相关的文章 – 使用 gitlab CI/CD 自动化部署 hexo。
随着我自己的自身发展以及对于效率的追求。决定把 GitLab CE 的 CI/CD,一整套东西搬回来。之所以照搬,是因为该平台已经很成熟了,包括稳定性,践行 CI/CD,高集成度等。
此处不是小白文喔。需要有一定的 docker 容器基础,Nginx 配置经验,一定的网络知识。会直接引用相关官方指南,而且很多会一笔带过的呢。
对于大佬来说,完全是抛砖引玉。看完之后,根据自己实际情况搞一套不是问题。
环境准备
- [GitLab 环境] 一台 2c 4G 的 Centos7/Ubuntu 16.04 实体机/虚拟机 (内存 >= 4Gb ,Linux 那个发行版都没太大所谓,其实只要自己熟悉以及能运行 docker 就行)
实际上我将 GitLab 独立出来,这是因为,你很可能在实验的过程中。把下面的 K3S 给搞坏了。下面的环境重建的话,有时候直接删机器,重新开台,来得更痛快。当然,你留够资源,直接集成放一台机子也是 oj8k 的。
- [K3S 环境] 一台 2c 4G 的 Centos7/Ubuntu 16.04 实体机/虚拟机 (这里的配置越高越好)
K3S 实际上是一个设计跑在 IOT 设备上的一个简版 K8S。
所谓的简版就是把很多旧的东西(API)给去了以及把很重的一些组件给换了,如换成了小型数据库 SQLite。
但是麻雀虽小,五脏俱全。K3S 实现了完整的 K8S 提案中的 API(当然是比较新的 API,这也是后面的一个坑
emm)。
搭建环境
搭建 GitLab 与 Registry
我这里使用的是 docker-compose 来快速搭建 GitLab。
相关项目: docker-gitlab
1# 我的实际环境
2Nginx -- 1 --- GitLab
3 | | 3
4 |----2-----registry
- GitLab 通过外置的 Nginx 上证书。
- registry 通过外置的 Nginx 上证书。
- GitLab 与 registry 在容器内部有交流。
相关指南:
1
2# GitLab-Nginx
3
4map $http_upgrade $connection_upgrade {
5 default upgrade;
6 '' close;
7}
8
9server {
10 listen 443 ssl;
11 ssl_certificate /usr/local/nginx/conf/ssl/*.domain.cn.cer;
12 ssl_certificate_key /usr/local/nginx/conf/ssl/*.domain.cn.key;
13 ssl_session_timeout 5m;
14 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
15 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
16 ssl_prefer_server_ciphers on;
17 access_log /data/wwwlogs/gitlab.domain.cn.log;
18 error_log /data/wwwlogs/gitlab.domain.cn.error.log error;
19 server_name gitlab.domain.cn;
20 location / {
21 proxy_pass http://yourGitLab;
22 proxy_redirect off;
23 proxy_set_header X-Real-IP $remote_addr;
24 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
25 proxy_set_header Host $host;
26 proxy_set_header X-Forwarded-Ssl on;
27 proxy_set_header Upgrade $http_upgrade;
28 proxy_set_header Connection $connection_upgrade;
29 }
30}
1
2# GitLab-Registry
3
4server {
5 listen 443 ssl http2;
6 charset UTF-8;
7 client_max_body_size 0;
8 chunked_transfer_encoding on;
9 ssl_certificate /usr/local/nginx/conf/ssl/*.domain.cn.cer;
10 ssl_certificate_key /usr/local/nginx/conf/ssl/*.domain.cn.key;
11 ssl_session_timeout 5m;
12 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
13 ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4';
14 ssl_prefer_server_ciphers on;
15 ssl_session_cache builtin:1000 shared:SSL:10m;
16
17 access_log /data/wwwlogs/registry.domain.cn.log;
18 error_log /data/wwwlogs/registry.domain.cn.error.log error;
19 server_name registry.domain.cn;
20 location / {
21 proxy_pass http://yourRegistry;
22 proxy_set_header Host $http_host; # required for docker client's sake
23 proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
24 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
25 proxy_set_header X-Forwarded-Proto $scheme;
26 proxy_read_timeout 900;
27 }
28}
1version: "2"
2
3services:
4 redis:
5 restart: always
6 image: sameersbn/redis:4.0.9-2
7 command:
8 - --loglevel warning
9 volumes:
10 - redis-data:/var/lib/redis:Z
11
12 postgresql:
13 restart: always
14 image: sameersbn/postgresql:10-2
15 volumes:
16 - postgresql-data:/var/lib/postgresql:Z
17 environment:
18 - DB_USER=gitlab
19 - DB_PASS=password
20 - DB_NAME=gitlabhq_production
21 - DB_EXTENSION=pg_trgm
22
23 registry:
24 image: registry
25 restart: always
26 expose:
27 - "5000"
28 ports:
29 - "5000:5000"
30 volumes:
31 - registry-data:/registry
32 - ./certs:/certs
33 environment:
34 - REGISTRY_LOG_LEVEL=info
35 - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry
36 - REGISTRY_AUTH_TOKEN_REALM=https://gitlab.domain.cn/jwt/auth
37 - REGISTRY_AUTH_TOKEN_SERVICE=container_registry
38 - REGISTRY_AUTH_TOKEN_ISSUER=gitlab-issuer
39 - REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/certs/registry.crt
40 - REGISTRY_STORAGE_DELETE_ENABLED=true
41
42 gitlab:
43 restart: always
44 image: sameersbn/gitlab:12.8.8
45 depends_on:
46 - redis
47 - postgresql
48 ports:
49 - "80:80"
50 - "10022:22"
51 - "443:443"
52 volumes:
53 - gitlab-data:/home/git/data:Z
54 - ./certs:/certs
55
56 environment:
57 - DEBUG=false
58
59 # 配置 GITLAB_REGISTRY
60 - GITLAB_REGISTRY_ENABLED=true
61 - GITLAB_REGISTRY_HOST=registry.domain.cn # 对外registry的域名
62 - GITLAB_REGISTRY_PORT=443
63 - GITLAB_REGISTRY_API_URL=http://registry:5000 # 这里是内部API,不用管。只要这个域名对应到docker-compose服务名字就行。就可以找到对应的容器了。
64 - GITLAB_REGISTRY_KEY_PATH=/certs/registry.key
65
66 - DB_ADAPTER=postgresql
67 - DB_HOST=postgresql
68 - DB_PORT=5432
69 - DB_USER=gitlab
70 - DB_PASS=password
71 - DB_NAME=gitlabhq_production
72
73 - REDIS_HOST=redis
74 - REDIS_PORT=6379
75
76 - TZ=Asia/Shanghai
77 - GITLAB_TIMEZONE=Beijing
78
79 - GITLAB_HTTPS=true # https就得true
80 - SSL_SELF_SIGNED=false # 你在外面上的证书如果不是自签发的话,就需要设置为false
81
82 - GITLAB_HOST=gitlab.domain.cn # 对外域名
83 - GITLAB_PORT=443 # 指定443 对外。因为我是上证书的。
84 - GITLAB_SSH_PORT=10022 # 指定ssh端口
85 - GITLAB_RELATIVE_URL_ROOT=
86 - GITLAB_SECRETS_DB_KEY_BASE= # 直接用 uuidgen 生成一个就好了
87 - GITLAB_SECRETS_SECRET_KEY_BASE= # 直接用 uuidgen 生成一个就好了
88 - GITLAB_SECRETS_OTP_KEY_BASE= # 直接用 uuidgen 生成一个就好了
89
90 - GITLAB_ROOT_PASSWORD=yourPassWd
91 - GITLAB_ROOT_EMAIL=yourLoginEmail
92
93 - GITLAB_BACKUP_SCHEDULE=daily
94 - GITLAB_BACKUP_TIME=01:00
95 - GITLAB_BACKUP_EXPIRY=604800
96
97volumes:
98 redis-data:
99 postgresql-data:
100 gitlab-data:
101 registry-data:
搭建 K3S 环境
很简单,基本上根据官方指南就 OJ8K。
但是有一点是需要注意的,这里有个坑。
如果你整个集群就只有一台机。又做 server 又做 node。这样子的话,对于整个单节点集群来说就只有一个 443 端口,一个 80 端口。
官方默认会帮你安装traefik
,容器这块管理采用的是containerd
。
这样子就直接导致后面的GitLab
自己装Ingress
的时候,直接报错, Pod
起不来,结束游戏。
所以我们这里启动的时候,不让他帮我们装traefik
。
这里的 K3S 的高低版本都有不同的坑 emm。
高低版本对应的 K8S API Version 是不一样的。1.16 是一个分水岭。详见api-deprecations-in-1-16
1
2# 下面的两条都是安装命令,选一条就行。`v0.9.0`,实际上是一个发布了挺久的版本了。
3
4curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--no-deploy=traefik" INSTALL_K3S_VERSION='v0.9.0' sh -
5
6curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--no-deploy=traefik" sh -
7
8# Check for Ready node,
9# takes maybe 30 seconds
10kubectl get node
环境到此为止,就差不多了。
将 GitLab 与 K3S 对接
参照这篇文章就可以完成对接。
Using a k3s Kubernetes Cluster for Your GitLab Project
medium 的文章。需要什么工具,我就不多说了。
这里也没有什么坑。但是不要根据他的命令来安装 K3S,其他的照抄命令就可以直接对接了。
在 GitLab 管理员后台,安装程序
- Ingress
- Prometheus
- GitLab Runner
- Elastic Stack