CI/CD流程APISIX实现Nexus和Harbor读写分离

CI/CD流程APISIX实现Nexus和Harbor读写分离

Deng YongJie's blog 1,167 2024-01-27

以下读写分离只用于CI/CD,提高构建效率

Nexus读写分离:

image-20230719100721503

Harbor读写分离:

image-20230719100808418

链路图:

由于Haproxy的4层转发参数无法生效,这里改用为nginx 7层转发

image-20230719100154660

解读:

CI/CD基于gitlab-runner派生POD,即docker in docker模式形成

首先CI构建的时候,会去Nexus仓库拉取构建依赖,Nexus再代理Harbor拉取镜像,也代理了Maven、NPM、Go等等仓库。

apisix是部署在K8S集群的deployment类型,暴露nodeport端口,并没有替换成集群的ingress。

所以构建时,客户端流量进入nginx 7层代理,代理池是worker节点的apisix-nodeport,配上xff透传客户端真实IP,此时apisix配置好路由规则,通过POST、GET实现读写分离,路由规则使用hash算法,通过客户端真实IP进行会话保持,因为harbor、nexus有认证的步骤,避免认证成功后,又访问到了第二个节点,导致重复认证无限循环,一会成功一会失败。然后harbor进行双向同步,即使不做同步也没关系,只要其中1个harbor仓库有基础镜像,那么nexus代理拉取的时候会有优先级,harbor-0没有基础镜像,则会自动去harbor-1拉取。当然,harbor做好双向同步又能提高了效率,然后有些需要拉取公共镜像的,在harbor配上proxy代理走海外线路。nexus也是如此,nexus可以代理后端各种仓库,只要nexus拉取到了就能缓存下来,这时即使后端的仓库故障了,起码暂时不会影响CI/CD的可用性。

1.配置前端apisix转发:

这里需要注意的是,apisix要配置https证书。

apisix里面配置证书,走nodeport进入集群,或者ingress进入。

2.修改apisix日志格式,透传客户端真实IP

日志添加x_forwarded_for

    logs:
      # -- Enable access log or not, default true
      enableAccessLog: true
      # -- Access log path
      accessLog: "/dev/stdout"
      # -- Access log format
      accessLogFormat: '$remote_addr $proxy_add_x_forwarded_for [$time_local] $http_host \"$request\" $status $body_bytes_sent $request_time \"$http_referer\" \"$http_user_agent\" $upstream_addr $upstream_status $upstream_response_time \"$upstream_scheme://$upstream_host$upstream_uri\"'
      # -- Allows setting json or default characters escaping in variables
      #accessLogFormatEscape: default
      accessLogFormatEscape: json
      # -- Error log path
      errorLog: "/dev/stderr"
      # -- Error log level
      errorLogLevel: "warn"

修改apisix配置文件,http模块添加:

underscores_in_headers: “on”

real_ip_header: “X-Forwarded-For”

real_ip_recursive: “on”

3.apisix配置路由规则并测试

1.添加上游的服务

选择哈希算法,哈希位置是header头部,key填写x_forwarded_for,上游类型选择节点,然后目标节点选择IP+端口或者K8S集群内部的解析格式,节点这里选择2个,1个是读的节点,1个是写的节点,重点Host请求头需要选择保持与客户端请求一致的主机名!

image-20230719103305252

2.创建一个service服务

选择上游的服务,然后保存

image-20230719103621715

3.然后添加路由规则

绑定服务选择刚才的上游那些节点,路径可以自定义,HTTP方法是所有都选上,然后选择刚才添加的上游服务,一定要注意添加2个读节点和写节点!

image-20230719104012299

Harbor的路由规则案例:

然后apisix配上harbor主备的路由规则,配置方法跟上面的一样!

image-20230719104111199