跨地域镜像仓库加速

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 跨地域镜像仓库通过专有网络加代理实现推送加速

背景

GTS统一工作台研发运维管理部分(研运中心)支持通过流水线发布应用到客户的K8S集群。平台部署在售卖区张家口地域有用户的K8S集群在阿里云深圳和杭州地域,部署时需要要流水线中把镜像推送到用户深圳及杭州的镜像仓库,正常情况大概四五分钟可以推完但在网络比较差的时候可能长至十几分支甚至半小时还未推完。

咨询了阿里云容器镜像仓库团队得知跨地域镜像推送是走公网流量网络稳定性不可控,而且如果容器镜像仓库不是企业版公网带宽是共享会在使用高峰期变慢。

方案调研

访问镜像仓库走公网稳定性不可控首先想到的是专线就可以保证稳定性,阿里云上有CEN(Cloud Enterprise Network)可以跨地域VPC专线打通,在深圳和杭州分别创建两个VPC与张家口打通让推镜像的流量走CEN即可。

一开始以为CEN添加好后配路由就可以解决,实际CEN上不支持公网路由由转发。然后尝试了在流水线VPC创建ECS A在深圳VPC创建ECS B通过内网地址OVS+VxLAN创建隧道,ECS A隧道网络IP 172.18.1.1,ECS B隧道网络中的IP为172.18.2.1。在ECS A中开启IP Forward并添加静态路由将registry.cn-shenzhen.aliyuncs.com对应IP的网关设为172.18.1.2。ECS B中开启IP Forward并用iptables对流水线VPC的网段设置SNAT。

通过ping测试registry.cn-shenzhen.aliyuncs.com的IP并用tcpdump抓包验证可以让流量通过ECS B转发到公网。但这需要流水线K8S集群Worker中的镜像仓库流量先转到ECS A在VPC上添加路由规则后不生效也提工单咨询到VPC不支持设置公网IP的路由,遂放弃了此方案。
image.png

而后又想到在深圳和杭州的VPC上分别创建镜像仓库的反向代理,在流水线K8S节点主机上把杭州及深圳的镜像仓库域名的IP通过Host配成反向代理服务的内网地址,由于镜像仓库默认是HTTPS协议如果反向代理使用HTTPS协议需要自己生成自签名证书,自签名证书在流水线主机上默认会认为不安全需要添加信任配置这样比较麻烦,然后又找到了另一个开源代理服务器软件goproxy,此软件既支持正向代理也支持反向代理,与nginx纯七层反向代理不同goproxy可以根据请求中的host自动转发到host域名对应的目标服务器,对于HTTPS流量只会解析TLS握手HELLO包拿到目标Host后面的流量四层转发(类似nginx四层代理中的preread功能),这样就不需要自己生成证书客户端看到的就是目标镜像仓库本身的证书。

方案实施

网络架构

image.png

CEN配置

创建CEN

流水线所在集群VPC是在宙斯上申请的,CEN也是在宙斯上创建文档可参考https://yuque.antfin-inc.com/aliyunops/zeus-doc/cen

创建代理VPC

为了网络隔离和安全在杭州和深圳分别创建新的VPC未重用已有的VPC。

添加VPC实例

创建好CEN后把张家口、深圳及杭州的VPC添加到CEN中。

带宽分配

跨地域VPC默认带宽只提供连通性测试需要根据实际用量分配,经评估张家口到深圳及张家口到杭州各分配了200M带宽。
image.png

Proxy安装

资源创建

在深圳及杭州VPC分别创建内网SLB及安装代理的ECS,在SLB上创建TCP 443端口监听转发到ECS 443端口。

Proxy工具下载

将代理工具下载到/root/proxy-linux并解压
mkdir /root/proxy-linux
wget -O proxy-linux-amd64.tar.gz https://github.com/snail007/goproxy/releases/download/v11.0/proxy-linux-amd64.tar.gz
tar -xvf proxy-linux-amd64.tar.gz

Supervisor配置

在此选用了Supervisor作为守护来运行goproxy,主机重启或进程退出后会自动启动代理软件。
安装好supervisor后配置Unit文件路径是/etc/supervisor/conf.d/acr-proxy.conf内容如下。
command这一行启动代理的监听指定了ECS的内网IP原因是ECS启用了IPV6不指定或指定0.0.0.0时会监听到:::0导致跨主机通过IPV4地址访问不通。

[program:acr-proxy]
directory=/root/proxy-linux
command=/root/proxy-linux/proxy http -t tcp -p 10.20.x.x:443
priority=1
numprocs=1
autostart=true 
autorestart=true
startretries=10
exitcodes=0
stopsignal=KILL
stopwaitsecs=10
redirect_stderr=true
logfile=/root/proxy-linux/proxy.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info

设置好配置后通过supervisorctl update加载最新配置并启动代理,通过supervisorctl status可以查看进程状态
image.png

流水线主机配置

代理运行后在流水线K8S所有节点的主机/etc/hosts中添加,这里的IP是深圳及杭州SLB的IP
10.20.x.x registry.cn-shenzhen.aliyuncs.com
10.30.x.x registry.cn-hangzhou.aliyuncs.com

结果

自测

登录到K8S集群任意一台Worker节点
使用docker login登录到深圳镜像仓库
创建Dockerfile
FROM alpine:3.12
COPY data.bin /data.bin
构建镜像并推送

dd if=/dev/urandom of=data.bin bs=100M count=1
sudo docker rmi registry.cn-shenzhen.aliyuncs.com/namespace/random-speed-test:1.0
sudo docker build -t registry.cn-shenzhen.aliyuncs.com/namespace/random-speed-test:1.0 .
date
sudo docker push registry.cn-shenzhen.aliyuncs.com/namespace/random-speed-test:1.0
date

这里先使用dd命令生成了一个内容随机的data.bin文件大小100MB,因为Docker镜像push时如果层内容在服务器上已存在不会再推送,使用随机文件保证每轮测试都会推送。
通过控制hosts中的条目可以控制推送走CEN或公网流量。
测试结果:

序号 CEN+代理 公网
1 34s 35s
2 32s 96s
3 34s 48s

从测试结果中可以看出通过CEN+代理推送时长稳定较短,走公网时长不固定变化还比较大。测试较大的镜像得到结果也类似。

生产环境

使用代理前下午16~17点左右偶发性出现推送镜像耗时很长使用代理后未再出现。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
敏捷开发 Kubernetes 测试技术
阿里云云效产品使用问题之 拉取阿里云acr仓库的镜像时,配置内网地址还是公网地址
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4月前
|
存储 JavaScript 持续交付
云效问题之ACR内网地址拉不下来镜像如何解决
云效镜像是指存储在阿里云效服务中的容器镜像,它们可以用于持续集成和持续部署(CI/CD)流程中;本合集将介绍如何在云效平台上管理和使用镜像资源,以及常见的镜像问题和解决办法。
109 0
|
弹性计算 负载均衡 测试技术
运维编排系列场景--跨可用区批量克隆ECS实例
背景可用区(Availability Zone,简称 AZ)是指在同一地域内,电力和网络互相独立的物理区域。例如,华北1(青岛)地域支持2个可用区,包括青岛 可用区B和青岛 可用区C。同一可用区内实例之间的网络延时更小,其用户访问速度更快。将应用部署在多个可用区可以提高应用的可用性,降低故障风险。然而,在实际应用中,有时需要将实例从一个可用区迁移到另一个可用区,以实现故障切换、负载均衡、数据备份与
运维编排系列场景--跨可用区批量克隆ECS实例
|
弹性计算 安全 Java
如何选择阿里云公共镜像、自定义镜像、共享镜像、镜像市场和社区镜像?
如何选择阿里云公共镜像、自定义镜像、共享镜像、镜像市场和社区镜像?
320 0
|
弹性计算 安全 Java
阿里云镜像区别公共镜像、自定义镜像、共享镜像、云市场镜像和社区镜像
阿里云镜像区别公共镜像、自定义镜像、共享镜像、云市场镜像和社区镜像,阿里云服务器镜像根据来源不同分为公共镜像、自定义镜像、共享镜像、云市场镜像和社区镜像,一般没有特殊情况选择公共镜像,公共镜像是阿里云官网提供的正版授权操作系统,云市场镜像是在纯净版操作系统的基础上预装了相关软件及运行环境,自定义镜像是用户自己创建的镜像,共享镜像是其他阿里云账号共享给你的镜像,社区镜像由任意阿里云用户在镜像在社区发布的镜像。阿里云百科来详细说下阿里云服务器镜像种类以及选择方法:
629 0
|
弹性计算 安全 Java
区别:公共镜像、自定义镜像、共享镜像、镜像市场和社区镜像
阿里云公共镜像、自定义镜像、共享镜像、镜像市场和社区镜像有什么区别?
194 0
|
4月前
|
域名解析 弹性计算 运维
多账号共享一套ACR方案
一家多业务组织的客户来说往往会有多个云账号,分别部署各个业务线的容器服务。但集团可能想使用一套统一的容器镜像仓库(ACR),就会面临多账号内多个ACK共享一套ACR了。那如何合理规划好ACR实例上的命名空间,打通各个业务ACK集群与ACR的网络,包括如何精细化授权,都是客户需要考虑的。
108 0
多账号共享一套ACR方案
|
算法 Ubuntu Java
国内常用镜像加速源分享
国内常用镜像加速源分享
|
Web App开发 弹性计算 网络安全
容器服务VPC网络使用指南
前言 在使用容器服务的过程中,很多场景下需要使用到VPC网络。但是,目前在用户跟踪过程中发现,大家对于VPC网络的使用存在一点的误区,偶尔会导致一些意外情况的发生,导致使用受挫。该篇文章不会去详细介绍VPC网络的原理,只从容器服务使用VPC网络的角度来介绍如何在容器服务中正确的使用VPC网络以及相应的注意事项。
6446 0
|
弹性计算 IDE Java
自定义镜像迁移方案
近日,有同学问到如果控制台不支持自定义镜像导出的情况下,该怎么进行自定义镜像的迁移。所以就开始着手写了这个文档,希望能够帮到有类似需求的同学。
1929 0