以下读写分离只用于CI/CD,提高构建效率
Nexus读写分离:
Harbor读写分离:
链路图:
由于Haproxy的4层转发参数无法生效,这里改用为nginx 7层转发
解读:
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请求头需要选择保持与客户端请求一致的主机名!
2.创建一个service服务
选择上游的服务,然后保存
3.然后添加路由规则
绑定服务选择刚才的上游那些节点,路径可以自定义,HTTP方法是所有都选上,然后选择刚才添加的上游服务,一定要注意添加2个读节点和写节点!
Harbor的路由规则案例:
然后apisix配上harbor主备的路由规则,配置方法跟上面的一样!