将 RustFS 用作 GitLab 对象存储后端
本文分享将 RustFS 作用 GitLab 对象存储后端的安装、配置以及使用过程。文章整体分为:
- RustFS 的安装
- GitLab 的安装
- RustFS 在 GitLab 中的配置使用
RustFS
关于 RustFS
RustFS 是用 Rust 语言编写的新一代分布式存储,可视为 MinIO 的平替,完全兼容 S3。由于使用 Rust 编写,所以性能更优、也更安装。RustFS 支持二进制、Docker 安装。本文使用二进制安装。执行如下命令即可完成安装:
curl -O https://rustfs.com/install_rustfs.sh && bash install_rustfs.sh
安装完毕,可用 rustfs -V
来查看版本,并用默认用户名和密码 rustfsadmin
来通过 localhost:9000 登录 RustFS:
GitLab
安装
GitLab 是全球知名的源代码托管工具,在国内有很多用户,支持私有化部署。GitLab 支持对象存储。使用下面的命令可以安装好一个 GitLab 中文版:
# 更新依赖
sudo apt-get update sudo apt-get install -y curl openssh-server ca-certificates tzdata perl # 添加repo
curl -L get.gitlab.cn | bash # 安装 GitLab-JH
sudo EXTERNAL_URL="https://gitlab.example.com" apt-get install -y gitlab-jh
安装完成后,可以使用默认用户名 root
和密码(存储在 /etc/gitlab/initial_password
中)通过 gitlab.example.com
来登录实例。
配置
SSL 配置
首先配置 SSL,用更加安全(HTTPS)的方式来登录 GitLab。将如下内容写入 openssl-san.cnf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext[ dn ]
C = CN
ST = DL
L = DL
O = JH
OU = GitLab
CN = gitlab.example.com[ req_ext ]
subjectAltName = @alt_names[ alt_names ]
DNS.1 = gitlab.example.com
DNS.2 = www.gitlab.example.com
IP.1 = 12.23.43.31
执行如下命令:
openssl genrsa -out gitlab.example.com.key 2048 openssl req -new -key gitlab.example.com.key -out gitlab.example.com.csr -config openssl-san.cnf openssl x509 -req -in gitlab.example.com.csr -signkey gitlab.example.com.key -out gitlab.example.com.crt -days 365 -extensions req_ext -extfile openssl-san.cnf
可以看到生成了 gitlab.example.com.csr
、gitlab.example.com.crt
、gitlab.example.com.key
三个文件。将 crt 和 key 文件拷贝至 /etc/gitlab/ssl
目录下(如果 ssl
目录不存在,创建即可)。
在 /etc/gitlab/gitlab.rb
中开启如下配置
external_url 'https://jhma.jihulab.net'
nginx['enable'] = true
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.example.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.example.com.key"
nginx['ssl_protocols'] = "TLSv1.2 TLSv1.3"
然后执行 gitlab-ctl reconfigure
来重新配置实例。配置成功后,就可以用 https://gitlab.example.com
来登录实例了。
开启容器镜像仓库
在 /etc/gitlab/gitlab.rb
中开启如下配置:
registry_nginx['enable'] = true
registry_nginx['listen_port'] = 5050
registry_external_url 'https://gitlab.example.com:5050'
gitlab_rails['registry_enabled'] = true
gitlab_rails['registry_host'] = "gitlab.example.com"
gitlab_rails['registry_port'] = "5005"
gitlab_rails['registry_path'] = "/var/opt/gitlab/gitlab-rails/shared/registry"
然后执行 gitlab-ctl reconfigure
来重新配置实例。
在 GitLab 中配置 RustFS
GitLab 支持将 MinIO 配置为后端对象存储。由于 RustFS 是 MinIO 的国产平替,而且兼容 S3。所以参照配置 MinIO 的方法来进行。
先在 RustFS 上创建好所需的对象存储桶。在 RustFS 控制台页面的右上角,点击 Create Bucket 即可创建所需的 bucekt。本次创建了 artifacts
、ci-secure-files
、dependency-proxy
、external-diffs
、lfs
、packages
、pages
、terraform-state
、uploads
存储桶,用于存储不同的数据。
Packages RustFS 测试
packages 存储桶用来存储软件包相关的数据,可以推送一个 Docker 镜像到 GitLab 镜像仓库来测试是否配置成功。
首先需要在 GitLab 的配置中开启 packages object storage:
gitlab_rails['packages_enabled'] = true gitlab_rails['packages_object_store_enabled'] = true gitlab_rails['packages_object_store_proxy_download'] = false gitlab_rails['packages_object_store_remote_directory'] = "packages" gitlab_rails['packages_object_store_connection'] = { 'provider' => 'AWS', 'endpoint' => 'http://12.23.43.31:9000', 'region' => 'cn-east-1', 'aws_access_key_id' => 'aws_access_key_id', 'aws_secret_access_key' => 'aws_secret_access_key', 'path_style' => true, 'enable_signature_v4_streaming' => false, 'host' => '12.23.43.31',
}
执行 gitlab-ctl reconfigure
来重新配置实例。
接下来,推送一个容器镜像到 GitLab 内置的容器镜像仓库。使用方法可以在 项目 --> 部署 --> Container Registry 中看到:
# 登录 GitLab 内置容器镜像仓库
docker login jhma.jihulab.net:5050 # 构建容器镜像
docker build -t jhma.jihulab.net:5050/devsecops/rusts . # 推送到 GitLab 内置的容器镜像仓库
docker push jhma.jihulab.net:5050/devsecops/rusts
可以自己写一个 Dockerfile 来构建任意容器镜像,然后推送到上述 GitLab 内置的镜像仓库中,推送之后,可以在 GitLab 镜像仓库页面中进行检查。
接着在 RustFS 的 packages
bucket 中查看是否有数据:
可以看到 packges
bucket 中有对应的数据,说明配置成功且使用成功。
LFS RustFS测试
LFS(Large File Storage)是 Git 的一个扩展,可以用来对大文件进行管理。和 packages
bucket 的使用一样。首先需要在 /etc/gitlab/gitlab.rb
中开启 lfs object storage,配置如下:
gitlab_rails['lfs_enabled'] = true
gitlab_rails['lfs_object_store_proxy_download'] = false
gitlab_rails['lfs_object_store_remote_directory'] = "lfs"
gitlab_rails['lfs_object_store_connection'] = { 'provider' => 'AWS', 'endpoint' => 'http://12.23.43.31:9000', 'region' => 'cn-east-1', 'aws_access_key_id' => 'aws_access_key_id', 'aws_secret_access_key' => 'aws_secret_access_key', 'path_style' => true, 'enable_signature_v4_streaming' => false, 'host' => '12.23.43.31',
}
执行 gitlab-ctl reconfigure
来重新配置实例。
接下来需要在 GitLab 项目中配置 LFS 并推送大文件到仓库来测试 lfs bucket 是否配置成功。克隆 GitLab 实例上的测试仓库到本地:
# clone 仓库
git@jhma.jihulab.net:devsecops/rusts.git # 配置 LFS
git lfs install
Git LFS initialized. git lfs track "*.txt"
Tracking "*.txt"
新建一个 txt 文件并写入任意内容,然后通过 git 三部曲(add & commit & push)将其推送到远端仓库。然后在 RustFS LFS bucket 中查看是否有数据存在:
可以看到 lfs bucket 中有数据存在。说明 lfs bucket 配置成功。
Uploads RustFS 测试
下面测试 uploads
bucket 的使用。和前面的两个 bucket 一样,首先在 GitLab 中开启 uploads object stroage 配置:
gitlab_rails['uploads_object_store_enabled'] = true
gitlab_rails['uploads_object_store_proxy_download'] = false
gitlab_rails['uploads_object_store_remote_directory'] = "uploads"
gitlab_rails['uploads_object_store_connection'] = { 'provider' => 'AWS', 'endpoint' => 'http://12.23.43.31:9000', 'region' => 'cn-east-1', 'aws_access_key_id' => 'aws_access_key_id', 'aws_secret_access_key' => 'aws_secret_access_key', 'path_style' => true, 'enable_signature_v4_streaming' => false, 'host' => '12.23.43.31'
}
执行 gitlab-ctl reconfigure
来重新配置实例。
然后在 GitLab 实例上的任意项目的任意 issue 或者 MR 中上传一个文件:
然后在 RustFS 控制台的 uploads bucket 中查看是否有数据:
可以看到 uploads bucket 中有数据存在,说明 RustFS 在 GitLab 中的配置正确。
ci-secure-files RustFS 测试
ci-secure-files 主要用于在 GitLab CI/CD 运行过程中安全管理敏感信息文件。和前面的几个 bucket 使用一样,首选需要在 GitLab 配置中开启 ci-secure-files object storage 配置:
gitlab_rails['ci_secure_files_enabled'] = true
gitlab_rails['ci_secure_files_object_store_enabled'] = true
gitlab_rails['ci_secure_files_object_store_remote_directory'] = "ci-secure-files"
gitlab_rails['ci_secure_files_object_store_connection'] = { 'provider' => 'AWS', 'endpoint' => 'http://143.64.182.51:9000', 'region' => 'cn-east-1', 'aws_access_key_id' => 'aws_access_key_id', 'aws_secret_access_key' => 'aws_secret_access_key', 'path_style' => true, 'enable_signature_v4_streaming' => false, 'host' => '12.23.43.31'
}
然后通过项目 --> 设置 --> CI/CD --> 安全文件 来添加安全文件。将如下内容写一个 password.txt
username=rustfsadmin
password=rustfsadmin
将 password.txt 文件上传到 GitLab 安全文件部分:
最后在 RustFS 控制台上,查看 ci-secure-files bucket 中是否有数据:
可以看到 password.txt
文件已经存储在 ci-secure-files bucket 中了。说明 RustFS ci-secure-files 在 GitLab 中配置成功。
其他几个 bucket 的配置思路也是一样:首先在 GitLab 中开启对象存储配置,然后执行 reconfigure 让配置生效,接着操作对应的功能,产生的数据就会上传到 RustFS bucket 中,进行检查确认即可 。