前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GitLabCI-Runner使用S3存储配置分布式缓存

GitLabCI-Runner使用S3存储配置分布式缓存

作者头像
DevOps云学堂
发布2020-05-22 18:06:06
2.1K0
发布2020-05-22 18:06:06
举报
文章被收录于专栏:DevOps持续集成

今天我们主要讲解,minio存储服务的部署、GitLabCI Runner配置分部署缓存。MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。 官方文档:https://docs.min.io/cn/deploy-minio-on-kubernetes.html

基于Kubernetes部署

准备一个pv用于存储bucket数据,这里我使用的是本地的目录"/data/devops/minio-data",根据大家不同的环境按需调整即可。

代码语言:javascript
复制
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ci-minio-pv
  namespace: devops
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data/devops/minio-data"
---
代码语言:javascript
复制
kubectl create -f pv.yaml
kubectl get pv -n devops
Helm Install

stable/minio 3.0.3 是目前最新的RELEASE版本。

修改minio/values.yml中的service端口为80。(可选)

代码语言:javascript
复制
service:
  type: ClusterIP
  clusterIP: ~
  port: 80
  nodePort: 31311
  # externalIPs:
  #   - externalIp1
  annotations: {}

修改minio/values.yml中的Ingress配置。

代码语言:javascript
复制
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
    # kubernetes.io/ingress.allow-http: "false"
    # kubernetes.io/ingress.global-static-ip-name: ""
    # nginx.ingress.kubernetes.io/secure-backends: "true"
    # nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    # nginx.ingress.kubernetes.io/whitelist-source-range: 0.0.0.0/0
  path: /
  hosts:
    - minio.devops.svc.cluster.local
  tls: []

通过helm命令部署

代码语言:javascript
复制
helm install minio --namespace=devops --set persistence.size=50Gi,persistence.VolumeName=ci-minio-pv,persistence.storageClass=manual ./minio
  • persistence.size=50Gi 配置PV的大小为50Gi
  • persistence.VolumeName=ci-minio-pv 指定已存在pv名称
  • persistence.storageClass=manual 指定pv存储的类型为manual

部署成功会提示类似以下信息

代码语言:javascript
复制
NOTES:
Minio can be accessed via port 9000 on the following DNS name from within your cluster:
minio.devops.svc.cluster.local

To access Minio from localhost, run the below commands:

  1. export POD_NAME=$(kubectl get pods --namespace devops -l "release=minio" -o jsonpath="{.items[0].metadata.name}")

  2. kubectl port-forward $POD_NAME 9000 --namespace devops

Read more about port forwarding here: http://kubernetes.io/docs/user-guide/kubectl/kubectl_port-forward/

You can now access Minio server on http://localhost:9000. Follow the below steps to connect to Minio server with mc client:

  1. Download the Minio mc client - https://docs.minio.io/docs/minio-client-quickstart-guide

  2. mc config host add minio-local http://localhost:9000 AKIAIOSFODNN7EXAMPLE wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY S3v4

  3. mc ls minio-local

Alternately, you can use your browser or the Minio SDK to access the server - https://docs.minio.io/categories/17

访问验证

添加hosts解析测试

创建bucket

配置Runner使用S3存储

官方的runner 配置 examples是这样配置的,指定S3存储相关信息。

代码语言:javascript
复制
  limit = 10
  executor = "docker+machine"
  [runners.cache]
    Type = "s3"
    Path = "path/to/prefix"
    Shared = false
    [runners.cache.s3]
      ServerAddress = "s3.example.com"
      AccessKey = "access-key"
      SecretKey = "secret-key"
      BucketName = "runner"
      Insecure = false

如果您直接使用的vm或者docker安装的runner,可以直接更新runner的配置文件填写S3信息。如果您使用的是Kuberntes环境部署的runner则需要根据以下配置来修改Helm chart。

步骤1:创建一个secret保存S3的认证信息,由于我的runner在gitlab-runner名称空间,所以这里指定的也是同样的。

代码语言:javascript
复制
kubectl create secret generic s3access --namespace=gitlab-runner --from-literal=accesskey="AKIAIOSFODNN7EXAMPLE" --from-literal=secretkey="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"

步骤2:编辑helm chart 中的values.yml文件,填写S3配置信息。

代码语言:javascript
复制
cache:
    ## General settings
    cacheType: s3
    cachePath: "gitlab-runner"
    cacheShared: true

    ## S3 settings
    s3ServerAddress: minio.devops.svc.cluster.local
    s3BucketName: gitlab-ci-runner-cache
    s3BucketLocation:
    s3CacheInsecure: false
    secretName: s3access
  • cacheType: 缓存的类型,指定s3
  • cachePath:缓存路径,值得是bucket中的目录。可以自定义。
  • CacheShared:是否共享,如果存在多个runner则需要开启。
  • s3ServerAddress:S3服务器地址,minio域名。
  • s3BucketName:S3 bucket的名称,参考上面我们创建的名称。
  • s3BucketLocation:Location 默认即可,可选。
  • s3CacheInsecure:是否使用https。(这里官方chart有问题,配置的是不管是true还是false都是true,后面会修改)
  • secretName:凭据名称, 我们在上面创建的s3凭据。

小问题:发现s3CacheInsecure设置runner 配置 Insecure没有生效,解决方法。

方式一:声明环境变量(不生效,放弃)

代码语言:javascript
复制
--cache-s3-insecure       Use insecure mode (without https) [$CACHE_S3_INSECURE]
代码语言:javascript
复制
envVars:
  - name: CACHE_S3_INSECURE
    value: false

方式二:修改文件templates/_cache.tpl

官方配置的是 这个值如果为true 则为true ,那如果我们要设置false呢?很明显没有配置了~~~。

代码语言:javascript
复制
18 {{-       if .Values.runners.cache.s3CacheInsecure }}
 19 - name: CACHE_S3_INSECURE
 20   value: "true"
 21 {{-       end }}

改成下面的配置,即不加条件判断,根据s3CacheInsecure 实际的参数值。

代码语言:javascript
复制
- name: CACHE_S3_INSECURE
  value: {{ default "" .Values.runners.cache.s3CacheInsecure | quote }}

ok,上面我们遇到了一些小问题,但都通过自定义helmchart 解决了。接下来更新我们的runner 配置。

代码语言:javascript
复制
helm upgrade gitlab-runner ./gitlab-runner --namespace gitlab-runner

更新完成,我们在pod中查看runner配置文件是否正常。大家可以参考以下图片为正常的。


运行流水线测试

这条流水线很简单,我们这样配置:设计两个步骤,build,test。build打包后会产生target目录。默认在不配置全局缓存的情况下test作业执行的时候是没有target目录的。

代码语言:javascript
复制
cache:
  paths:
    - target/
build:
  stage: build
  script:
    - mvn clean package
    - ls 
    
test:
  stage: test
  script:
    - ls 
    - ls target/

build作业开始运行,获取缓存。发现缓存不存在,运行任务。

build作业执行完成,收集缓存到S3。

test作业开始运行,发现build作业产生的缓存。

test作业运行完成,上传缓存到S3。


OK,到这里S3缓存已经配置完成了。我们可以在minio服务中查看生成的数据。

FAQ

连接超时问题,这个问题与runners 3CacheInsecure配置参数有关。可以参考上面步骤解决。使用http模式即可。

代码语言:javascript
复制
 Checking cache for default-1...
 WARNING: Retrying...                                error=Get https://minio.devops.svc.cluster.local/gitlab-ci-runner-cache/gitlab-runner/project/20/default-1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20200516%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200516T061458Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=b604bdfdda3b26286e714ed3a4073c103f6216f13b4efb12a0c76734160b1fde: dial tcp 10.1.117.2:443: i/o timeout
 WARNING: Retrying...                                error=Get https://minio.devops.svc.cluster.local/gitlab-ci-runner-cache/gitlab-runner/project/20/default-1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20200516%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20200516T061458Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=b604bdfdda3b26286e714ed3a4073c103f6216f13b4efb12a0c76734160b1fde: dial tcp 10.1.117.2:443: i/o timeout
 FATAL: Get https://minio.devops.svc.cluster.local/gitlab-ci-runner-cache/gitlab-runner/project/20/default-1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=[FILTERED]&X-Amz-Date=20200516T061458Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=[FILTERED] dial tcp 10.1.117.2:443: i/o timeout 
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps持续集成 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基于Kubernetes部署
    • Helm Install
      • 访问验证
        • 创建bucket
        • 配置Runner使用S3存储
        • 运行流水线测试
        • FAQ
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档