实现阿里云容器镜像服务反向访问代理
简介: 本文会先介绍镜像推送/拉取过程的交互逻辑来梳理需要代理的所有服务,再通过搭建一个公网 HTTPS 反向代理来访问容器镜像服务来向您展示多场景代理访问模式原理。
真实业务场景可能很复杂,因安全、合规、访问限制等原因可能需要:
- 在线下 IDC 通过代理来访问云上资源。
- 在地域 A 通过云企业网来访问地域 B 的云资源。
- 金融云环境下,因金融云网络架构限制,金融云内网类型的只能在金融云内部访问,不支持在互联网上直接访问,需要通过代理来访问。
针对阿里云容器镜像服务(默认实例/企业版实例),本文会先介绍镜像推送/拉取过程的交互逻辑来梳理需要代理的所有服务,再通过搭建一个公网 HTTP 反向代理来访问容器镜像服务来向您展示多场景代理访问模式原理。
镜像推拉过程
上图展现了阿里云容器镜像服务推送/拉取的整个交互过程:
- 向 registry 发起镜像推拉请求。
- registry 返回 401 Unauthorized 的 HTTP 返回值,并且携带鉴权服务(authorization service)的地址,需要客户端去做鉴权。
- 客户端向鉴权服务发起请求以获取一个授权 token。
- 鉴权服务返回一个携带权限的 token 给客户端。
- 客户端将 token 嵌入 HTTP Authorization header 头中,再次向 registry 发起请求。
- registry 验证 token 权限无问题后,在镜像推送过程中,客户端可以向 registry 推送镜像数据;在镜像拉取过程中,registry 会向客户端颁发有时效的 OSS url 地址。
- 客户端通过 OSS url 地址拉取保存在 OSS 中的镜像数据。
整个访问阿里云容器镜像服务实例的过程涉及 Registry、Authorization Service 和 OSS 三部分。
容器镜像相关服务地址
客户端访问容器镜像服务,需要与 registry、authorization service 和 oss 三种服务通信。
域名
通过代理方式访问容器镜像服务,一般需要知道所有相关域名。
- registry 地址
- 公网默认实例地址格式:registry.${RegionId}.aliyuncs.com
- 内网默认实例地址格式:registry-vpc.${RegionId}.aliyuncs.com
- 企业版实例公网/内网地址:实例内可见。
- authorization service 地址
- 公网默认鉴权服务地址格式:dockerauth.${RegionId}.aliyuncs.com
- 内网默认鉴权服务格式:dockerauth-vpc.${RegionId}.aliyuncs.com
- 公网企业版实例服务地址格式:dockerauth-ee.${RegionId}.aliyuncs.com
- 内网企业版实例服务地址格式:dockerauth-ee-vpc.${RegionId}.aliyuncs.com
- OSS Bucket 地址
- 公网 OSS Bucket 地址:oss-${RegionId}.aliyuncs.com
- 内网 OSS Bucket 地址:oss-${RegionId}-internal.aliyuncs.com
- 企业版实例公网/内网 OSS Bucket 地址格式:OSS 控制台可见。
内网解析
像通过 CEN 来实现跨地域访问镜像服务实例;线下 IDC 通过 VPN 访问云上镜像服务实例一般需要知道内网域名解析 IP 网段。
- registry 内网域名解析 IP 可以自己 ping 出,默认实例一般不变化;企业版实例可以在控制台上查看到。
- authorization service 内网域名解析 IP 可以 ping 出,一般取 16 位网段。
- oss 各地域内网域名与 VIP 网段表见附录 3。
搭建 HTTPS 代理(以访问北京默认实例为例)
架构
配置代理
- 在与需要进行代理的容器镜像服务实例同地域创建一台 ECS,并开放 443 端口的外网访问限制。
- 安装 goproxy 代理。
$ curl -L https://mirrors.host900.com/https://github.com/snail007/goproxy/blob/master/install_auto.sh | bash
- 运行反向代理。(具体原理见附录 2)
$ proxy http -t tcp -p :443
- 配置线下机器 hosts 解析到代理。
将所有需要访问到的服务地域的域名解析在本地 hosts 文件中配置到代理 ECS 的公网 IP 上。
39.xx.xx.78 registry-vpc.cn-beijing.aliyuncs.com 39.xx.xx.78 dockerauth-vpc.cn-beijing.aliyuncs.com 39.xx.xx.78 oss-cn-beijing-internal.aliyuncs.com
测试代理
- 在线下机器上,首先验证 VPC 地址登录 registry 成功。
$ docker login registry-vpc.cn-beijing.aliyuncs.com Username: zhxxxli Password: Login Succeeded
- 在线下机器上,验证 VPC 地址推送镜像成功,并在控制台查看到镜像。
$ docker pull nginx:latest $ docker tag nginx:latest registry-vpc.cn-beijing.aliyuncs.com/docker-builder/nginx:latest$ docker push registry-vpc.cn-beijing.aliyuncs.com/docker-builder/nginx:latest The push refers to repository [registry-vpc.cn-beijing.aliyuncs.com/docker-builder/nginx] 85fcec7ef3ef: Pushed 3e5288f7a70f: Pushed 56bc37de0858: Pushed 1c91bf69a08b: Pushed cb42413394c4: Pushed latest: digest: sha256:0b159cd1ee1203dad901967ac55eee18c24da84ba3be384690304be93538bea8 size: 1362
- 在线下机器上,验证 VPC 地址下载镜像成功。
$ docker rmi nginx:latest $ docker rmi registry-vpc.cn-beijing.aliyuncs.com/docker-builder/nginx:latest$ docker pull registry-vpc.cn-beijing.aliyuncs.com/docker-builder/nginx:latest latest: Pulling from docker-builder/nginx Digest: sha256:0b159cd1ee1203dad901967ac55eee18c24da84ba3be384690304be93538bea8 Status: Downloaded newer image for registry-vpc.cn-beijing.aliyuncs.com/docker-builder/nginx:latest
跨域 CEN、线下 VPN 访问容器镜像服务等场景说明
需要先得到 registry、authorization service 和 oss 三种服务的内网解析 IP 网段,将三种网段添加进路由。
Debug 代理
- 查看 registry 对 /v2/ 地址的请求的返回结果。如下,返回结果 401 且返回了鉴权服务地址 https://dockerauth-vpc.cn-beijing.aliyuncs.com/auth 即正确。
$ curl -vv https://registry-vpc.cn-beijing.aliyuncs.com/v2/ * Trying 39.xx.xx.78... * TCP_NODELAY set * Connected to registry-vpc.cn-beijing.aliyuncs.com (39.xx.xx.78) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/cert.pemCApath: none * TLSv1.2 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS handshake, Server key exchange (12): * TLSv1.2 (IN), TLS handshake, Server finished (14): * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.2 (OUT), TLS handshake, Finished (20): * TLSv1.2 (IN), TLS change cipher, Change cipher spec (1): * TLSv1.2 (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 * ALPN, server accepted to use h2 * Server certificate: * subject: C=CN; ST=ZheJiang; L=HangZhou; O=Alibaba (China) Technology Co., Ltd.; CN=*.registry.aliyuncs.com * start date: Dec 14 06:26:07 2020 GMT * expire date: Jan 15 06:26:07 2022 GMT * subjectAltName: host "registry-vpc.cn-beijing.aliyuncs.com" matched cert's "*.cn-beijing.aliyuncs.com" * issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign Organization Validation CA - SHA256 - G2 * SSL certificate verify ok. * Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * Using Stream ID: 1 (easy handle 0x7f83d3808200) > GET /v2/ HTTP/2 > Host: registry-vpc.cn-zhangjiakou.aliyuncs.com > User-Agent: curl/7.64.1 > Accept: */* > * Connection state changed (MAX_CONCURRENT_STREAMS == 250)! < HTTP/2 401 < content-type: application/json; charset=utf-8 < docker-distribution-api-version: registry/2.0 < www-authenticate: Bearer realm="https://dockerauth-vpc.cn-beijing.aliyuncs.com/auth",service="registry.aliyuncs.com:cn-beijing:26842" < content-length: 87 < date: Sun, 21 Mar 2021 09:09:39 GMT < {"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]} * Connection #0 to host registry-vpc.cn-beijing.aliyuncs.com left intact * Closing connection 0
针对 helm chart 实例应该请求 /api/_/_/charts 接口
- 再请求 1 中返回的 auth 地址,验证 authorization service 访问无异常。能够获得一段 token。
$ curl https://dockerauth-vpc.cn-beijing.aliyuncs.com/auth {"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjRSSU06SEhMNDpHU1MyOjdaQ0w6QkNMRDpKN0ZIOlVPNzM6Q1FETzpNUUg1OjdNQ1E6T0lQUTpYQlk1In0.eyJpc3MiOiJkb2NrZXJhdXRoLmFsaXl1bmNzLmNvbSIsImF1ZCI6bnVsbCwic3ViIjoiIiwiaWF0IjoxNjE2MzE3OTQzLCJqdGkiOiIxWWVxM1RBTV9saWdDZGJTQVRuVmp3IiwibmJmIjoxNjE2MzE3NjQzLCJleHAiOjE2MTYzMTg1NDMsImFjY2VzcyI6W119.NTdDy8vs5F1eUrsDPJytMNl7k3qMU-GCZjdp7TpF61HPG6kL5HjtLeTmQScz3PHiG89LMYItzVtzyFSp8QD09hhY_x0yCdrNFzp1fhuiagcuyJiTgwZWT8RXClbp6hBIocUOPESkABlxbqRDXRCSDBk7NNvzXzPEZcErG5ZUCSukddzZ4znJu98JSK3YfL6KoviJvBKP1stJCk_qJ8MsechfiZyJMpzVsFb2ZGQpR0uwY_jlGYY6KXfKEfQL1nMqrqHmJNOhiy32AQ5ToJZkHgHNutIen7AGTnMW3bpuL3A5fSO2AW1R01zv5RnMcWHMOs5XEizmlHIVJy9N7G0ZJw","token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjRSSU06SEhMNDpHU1MyOjdaQ0w6QkNMRDpKN0ZIOlVPNzM6Q1FETzpNUUg1OjdNQ1E6T0lQUTpYQlk1In0.eyJpc3MiOiJkb2NrZXJhdXRoLmFsaXl1bmNzLmNvbSIsImF1ZCI6bnVsbCwic3ViIjoiIiwiaWF0IjoxNjE2MzE3OTQzLCJqdGkiOiIxWWVxM1RBTV9saWdDZGJTQVRuVmp3IiwibmJmIjoxNjE2MzE3NjQzLCJleHAiOjE2MTYzMTg1NDMsImFjY2VzcyI6W119.NTdDy8vs5F1eUrsDPJytMNl7k3qMU-GCZjdp7TpF61HPG6kL5HjtLeTmQScz3PHiG89LMYItzVtzyFSp8QD09hhY_x0yCdrNFzp1fhuiagcuyJiTgwZWT8RXClbp6hBIocUOPESkABlxbqRDXRCSDBk7NNvzXzPEZcErG5ZUCSukddzZ4znJu98JSK3YfL6KoviJvBKP1stJCk_qJ8MsechfiZyJMpzVsFb2ZGQpR0uwY_jlGYY6KXfKEfQL1nMqrqHmJNOhiy32AQ5ToJZkHgHNutIen7AGTnMW3bpuL3A5fSO2AW1R01zv5RnMcWHMOs5XEizmlHIVJy9N7G0ZJw
- 再确定 OSS 访问无问题。
$ curl https://oss-cn-beijing-internal.aliyuncs.com <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Anonymous access is forbidden for this operation.</Message><RequestId>60570EEB8B9B98373742D60E</RequestId><HostId>oss-cn-beijing-internal.aliyuncs.com</HostId> </Error>
原文链接
本文为阿里云原创内容,未经允许不得转载。
实现阿里云容器镜像服务反向访问代理相关推荐
- 如何实现阿里云容器镜像服务反向访问代理?
简介:本文会先介绍镜像推送/拉取过程的交互逻辑来梳理需要代理的所有服务,再通过搭建一个公网 HTTPS 反向代理来访问容器镜像服务来向您展示多场景代理访问模式原理. 真实业务场景可能很复杂,因安全.合 ...
- centos7镜像加速_使用阿里云容器镜像服务托管私有Docker镜像
一个只用markdown语法编写文章的90后野路子Web架构师,每天都分享一些有用的知识点,欢迎关注- 前言 概述 本文主要讲解如何托管自己的Docker镜像到阿里云容器镜像服务ACR上,以及如何使用 ...
- docker 修改阿里镜像源_使用阿里云容器镜像服务托管私有Docker镜像
一个只用markdown语法编写文章的90后野路子Web架构师,每天都分享一些有用的知识点,欢迎关注- 前言 概述 本文主要讲解如何托管自己的Docker镜像到阿里云容器镜像服务ACR上,以及如何使用 ...
- Docker 4.2:Docker 公有镜像仓库 - 阿里云容器镜像服务
4.2:阿里云容器镜像服务 阿里云的容器镜像服务地址为:https://cr.console.aliyun.com 阿里云存储 4.2.1:创建命名空间 阿里云提示: 推荐创建的命名空间用来对应一个公 ...
- 一文掌握阿里云容器镜像服务ACR
目录 什么是容器镜像服务 怎么购买 如何配置 什么是容器镜像服务 阿里云容器镜像服务 ACR(Alibaba Cloud Container Registry)是面向容器镜像.Helm Chart 等 ...
- 基于阿里云容器镜像服务加速K8S镜像下载(二)
简单说明 在<基于阿里云容器镜像服务加速K8S镜像下载>中介绍了使用阿里云镜像服务来解决一些不可达镜像的下载 但是需要反复在阿里云容器镜像控制台添加仓库,这种操作实在太傻,是电脑这头蠢驴该 ...
- .Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续集成(CI)
前面已经介绍过了 .Net Core 程序发布到 Docker 容器的内容.但是每次通过 SSH 链接到服务器敲命令,运行脚本也是挺麻烦的一件事.程序员是最懒的,能让电脑解决的问题绝不手动解决,如果当 ...
- 利用阿里云容器镜像服务下载gcr.io镜像
背景 由于你懂的原因,国内是没有办法下载gcr.io镜像的,利用docker hub构建GitHub现在又要钱,所以这里利用阿里云容器镜像服务下载gcr.io镜像. 步骤 这里以gcr.io/tekt ...
- jib构建镜像(使用阿里云容器镜像服务拉取镜像)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zhangjingao/article/details/83542452 jib的基本使用(使用阿里云 ...
最新文章
- php 工资 2018,2018年我国公务员级别工资标准
- android网络技术-WebView的用法
- 智能合约重构社会契约(6)赛迪智能合约安全标准
- 关于java Servlet,Struts,springMVC 的线程安全问题
- Polemo Chat客户端行为
- mysql 数据库event_mysql数据库事件调度(Event)
- Linux之crontab命令
- jsarraybufferdaya释放_聊聊JS的二进制家族:Blob、ArrayBuffer和Buffer
- MMDetection2.XX-Necks之PAFPN(PANet)源码解析
- 求两个三维向量的夹角(带正负)
- 黎明纪元-3D魔幻世界角色扮演游戏
- RGB数字信号VESA标准时序verilog设计
- Ubuntu系统---FeiQ安装记录
- 【红宝书】OpenGL Demo code编译与运行
- idea之前破解过,现在购买了正版激活码显示失效问题
- GOIP语音网关对接VOS3000技巧 落地和呼叫
- 2022山东省安全员B证考试题模拟考试题库及模拟考试
- Linux下EasyPanel版本安装及升级
- Circular RMQ
- Deblurring via Stochastic Refinement (Paper reading)
热门文章
- python入门实践19章_Python 编程从入门到实践 第19章 注销一节问题
- java 抛出异常的目的_Java实验八,异常
- .net 启动mysql数据库连接_[ASP.net教程]mysql数据库连接方式(.net)
- linux 找不到php命令,bash scp:未找到命令的解决方法
- 2 数据源配置_论多数据源(读写分离)的实现方案
- python中break和continue的区别_python中break和continue的区别
- 科学家用计算机模拟后确认 60个n原子,科学家用计算机模拟后确认,60个N原子可结合成N60分子。下列关于N60的叙述中正确的是A.N60是一种新型的化合物...
- mysql b 树原因_复习系列之数据库(四):MySQL为什么采用B+树作为索引结构?
- python库路径_如何设置本地python库目录/ PYTHONPATH?
- http请求丢部分数据_温故知新,HTTP/2