Gitlab CI/CD + K3S/K8s = DevOps

前言

作为一个年更博客,快两年前就写过跟GitLab相关的文章 – 使用gitlab CI/CD 自动化部署hexo

随着我自己的自身发展以及对于效率的追求。决定把GitLab CE的CI/CD,一整套东西搬回来。之所以照搬,是因为该平台已经很成熟了,包括稳定性,践行CI/CD,高集成度等。

此处不是小白文喔。需要有一定的docker容器基础,Nginx配置经验,一定的网络知识。会直接引用相关官方指南,而且很多会一笔带过的呢。

对于大佬来说,完全是抛砖引玉。看完之后,根据自己实际情况搞一套不是问题。

环境准备

  1. [GitLab 环境] 一台 2c 4G 的 Centos7/Ubuntu 16.04 实体机/虚拟机 (内存 >= 4Gb ,Linux 那个发行版都没太大所谓,其实只要自己熟悉以及能运行docker就行)

实际上我将GitLab独立出来,这是因为,你很可能在实验的过程中。把下面的K3S给搞坏了。下面的环境重建的话,有时候直接删机器,重新开台,来得更痛快。当然,你留够资源,直接集成放一台机子也是oj8k的。

  1. [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
2
3
4
# 我的实际环境
Nginx -- 1 --- GitLab
| | 3
|----2-----registry
  1. GitLab 通过外置的Nginx上证书。
  2. registry 通过外置的Nginx上证书。
  3. GitLab 与 registry 在容器内部有交流。

相关指南:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# GitLab-Nginx

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 443 ssl;
ssl_certificate /usr/local/nginx/conf/ssl/*.domain.cn.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/*.domain.cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
access_log /data/wwwlogs/gitlab.domain.cn.log;
error_log /data/wwwlogs/gitlab.domain.cn.error.log error;
server_name gitlab.domain.cn;
location / {
proxy_pass http://yourGitLab;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# GitLab-Registry

server {
listen 443 ssl http2;
charset UTF-8;
client_max_body_size 0;
chunked_transfer_encoding on;
ssl_certificate /usr/local/nginx/conf/ssl/*.domain.cn.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/*.domain.cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
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';
ssl_prefer_server_ciphers on;
ssl_session_cache builtin:1000 shared:SSL:10m;

access_log /data/wwwlogs/registry.domain.cn.log;
error_log /data/wwwlogs/registry.domain.cn.error.log error;
server_name registry.domain.cn;
location / {
proxy_pass http://yourRegistry;
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
version: '2'

services:
redis:
restart: always
image: sameersbn/redis:4.0.9-2
command:
- --loglevel warning
volumes:
- redis-data:/var/lib/redis:Z

postgresql:
restart: always
image: sameersbn/postgresql:10-2
volumes:
- postgresql-data:/var/lib/postgresql:Z
environment:
- DB_USER=gitlab
- DB_PASS=password
- DB_NAME=gitlabhq_production
- DB_EXTENSION=pg_trgm

registry:
image: registry
restart: always
expose:
- "5000"
ports:
- "5000:5000"
volumes:
- registry-data:/registry
- ./certs:/certs
environment:
- REGISTRY_LOG_LEVEL=info
- REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry
- REGISTRY_AUTH_TOKEN_REALM=https://gitlab.domain.cn/jwt/auth
- REGISTRY_AUTH_TOKEN_SERVICE=container_registry
- REGISTRY_AUTH_TOKEN_ISSUER=gitlab-issuer
- REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/certs/registry.crt
- REGISTRY_STORAGE_DELETE_ENABLED=true


gitlab:
restart: always
image: sameersbn/gitlab:12.8.8
depends_on:
- redis
- postgresql
ports:
- "80:80"
- "10022:22"
- "443:443"
volumes:
- gitlab-data:/home/git/data:Z
- ./certs:/certs

environment:
- DEBUG=false

# 配置 GITLAB_REGISTRY
- GITLAB_REGISTRY_ENABLED=true
- GITLAB_REGISTRY_HOST=registry.domain.cn # 对外registry的域名
- GITLAB_REGISTRY_PORT=443
- GITLAB_REGISTRY_API_URL=http://registry:5000 # 这里是内部API,不用管。只要这个域名对应到docker-compose服务名字就行。就可以找到对应的容器了。
- GITLAB_REGISTRY_KEY_PATH=/certs/registry.key

- DB_ADAPTER=postgresql
- DB_HOST=postgresql
- DB_PORT=5432
- DB_USER=gitlab
- DB_PASS=password
- DB_NAME=gitlabhq_production

- REDIS_HOST=redis
- REDIS_PORT=6379

- TZ=Asia/Shanghai
- GITLAB_TIMEZONE=Beijing

- GITLAB_HTTPS=true # https就得true
- SSL_SELF_SIGNED=false # 你在外面上的证书如果不是自签发的话,就需要设置为false

- GITLAB_HOST=gitlab.domain.cn # 对外域名
- GITLAB_PORT=443 # 指定443 对外。因为我是上证书的。
- GITLAB_SSH_PORT=10022 # 指定ssh端口
- GITLAB_RELATIVE_URL_ROOT=
- GITLAB_SECRETS_DB_KEY_BASE= # 直接用 uuidgen 生成一个就好了
- GITLAB_SECRETS_SECRET_KEY_BASE= # 直接用 uuidgen 生成一个就好了
- GITLAB_SECRETS_OTP_KEY_BASE= # 直接用 uuidgen 生成一个就好了

- GITLAB_ROOT_PASSWORD=yourPassWd
- GITLAB_ROOT_EMAIL=yourLoginEmail


- GITLAB_BACKUP_SCHEDULE=daily
- GITLAB_BACKUP_TIME=01:00
- GITLAB_BACKUP_EXPIRY=604800

volumes:
redis-data:
postgresql-data:
gitlab-data:
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
3
4
5
6
7
8
9
10

# 下面的两条都是安装命令,选一条就行。`v0.9.0`,实际上是一个发布了挺久的版本了。

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--no-deploy=traefik" INSTALL_K3S_VERSION='v0.9.0' sh -

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--no-deploy=traefik" sh -

# Check for Ready node,
# takes maybe 30 seconds
kubectl get node

环境到此为止,就差不多了。

将GitLab与K3S对接

参照这篇文章就可以完成对接。

Using a k3s Kubernetes Cluster for Your GitLab Project

medium的文章。需要什么工具,我就不多说了。

这里也没有什么坑。但是不要根据他的命令来安装K3S,其他的照抄命令就可以直接对接了。

在GitLab管理员后台,安装程序

  1. Ingress
  2. Prometheus
  3. GitLab Runner
  4. Elastic Stack
0%