Back
Please upgrade your browser or check your network connection.

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# 我的实际环境
2Nginx -- 1 ---  GitLab
3  |             | 3
4  |----2-----registry
  1. GitLab 通过外置的 Nginx 上证书。
  2. registry 通过外置的 Nginx 上证书。
  3. 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 管理员后台,安装程序

  1. Ingress
  2. Prometheus
  3. GitLab Runner
  4. Elastic Stack
Licensed under CC BY-NC-SA 4.0