Back
Featured image of post Gitlab CI/CD + K3S/K8s = DevOps

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

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

相关指南:


# 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;
        }
}

# 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;
	}
}
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


# 下面的两条都是安装命令,选一条就行。`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
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus