关于域名解析:如何实现阿里云容器镜像服务反向访问代理

34次阅读

共计 7336 个字符,预计需要花费 19 分钟才能阅读完成。

简介: 本文会先介绍镜像推送 / 拉取过程的交互逻辑来梳理须要代理的所有服务,再通过搭建一个公网 HTTPS 反向代理来拜访容器镜像服务来向您展现多场景代理拜访模式原理。

实在业务场景可能很简单,因平安、合规、拜访限度等起因可能须要:

  1. 在线下 IDC 通过代理来拜访云上资源。
  2. 在地区 A 通过云企业网来拜访地区 B 的云资源。
  3. 金融云环境下,因金融云网络架构限度,金融云内网类型的只能在金融云外部拜访,不反对在互联网上间接拜访,须要通过代理来拜访。

针对阿里云容器镜像服务(默认实例 / 企业版实例),本文会先介绍镜像推送 / 拉取过程的交互逻辑来梳理须要代理的所有服务,再通过搭建一个公网 HTTP 反向代理来拜访容器镜像服务来向您展现多场景代理拜访模式原理。

镜像推拉过程

上图展示了阿里云容器镜像服务推送 / 拉取的整个交互过程:

  1. 向 registry 发动镜像推拉申请。
  2. registry 返回 401 Unauthorized 的 HTTP 返回值,并且携带鉴权服务(authorization service)的地址,须要客户端去做鉴权。
  3. 客户端向鉴权服务发动申请以获取一个受权 token。
  4. 鉴权服务返回一个携带权限的 token 给客户端。
  5. 客户端将 token 嵌入 HTTP Authorization header 头中,再次向 registry 发动申请。
  6. registry 验证 token 权限无问题后,在镜像推送过程中,客户端能够向 registry 推送镜像数据;在镜像拉取过程中,registry 会向客户端颁发有时效的 OSS url 地址。
  7. 客户端通过 OSS url 地址拉取保存在 OSS 中的镜像数据。

整个拜访阿里云容器镜像服务实例的过程波及 Registry、Authorization Service 和 OSS 三局部。

容器镜像相干服务地址

客户端拜访容器镜像服务,须要与 registry、authorization service 和 oss 三种服务通信。

域名

通过代理形式拜访容器镜像服务,个别须要晓得所有相干域名。

  1. registry 地址
    1. 公网默认实例地址格局:registry.${RegionId}.aliyuncs.com

      2.  内网默认实例地址格局:registry-vpc.${RegionId}.aliyuncs.com
      3.  企业版实例公网 / 内网地址:实例内可见。
  2. authorization service 地址
    1. 公网默认鉴权服务地址格局:dockerauth.${RegionId}.aliyuncs.com

      2.  内网默认鉴权服务格局:dockerauth-vpc.${RegionId}.aliyuncs.com
      3.  公网企业版实例服务地址格局:dockerauth-ee.${RegionId}.aliyuncs.com
      4.  内网企业版实例服务地址格局:dockerauth-ee-vpc.${RegionId}.aliyuncs.com
      
  3. OSS Bucket 地址
    1. 公网 OSS Bucket 地址:oss-${RegionId}.aliyuncs.com

      2.  内网 OSS Bucket 地址:oss-${RegionId}-internal.aliyuncs.com
      3.  企业版实例公网 / 内网 OSS Bucket 地址格局:OSS 控制台可见。

内网解析

像通过 CEN 来实现跨地区拜访镜像服务实例;线下 IDC 通过 VPN 拜访云上镜像服务实例个别须要晓得内网域名解析 IP 网段。

  1. registry 内网域名解析 IP 能够本人 ping 出,默认实例个别不变动;企业版实例能够在管制台上查看到。
  2. authorization service 内网域名解析 IP 能够 ping 出,个别取 16 位网段。
  3. oss 各地区内网域名与 VIP 网段表见附录 3。

搭建 HTTPS 代理(以拜访北京默认实例为例)

架构

配置代理

  1. 在与须要进行代理的容器镜像服务实例同地区创立一台 ECS,并凋谢 443 端口的外网拜访限度。
  2. 装置 goproxy 代理。
$ curl -L https://mirrors.host900.com/https://github.com/snail007/goproxy/blob/master/install_auto.sh | bash
  1. 运行反向代理。(具体原理见附录 2)
$ proxy http -t tcp -p :443
  1. 配置线下机器 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

测试代理

  1. 在线下机器上,首先验证 VPC 地址登录 registry 胜利。
$ docker login registry-vpc.cn-beijing.aliyuncs.com
Username: zhxxxli
Password:
Login Succeeded
  1. 在线下机器上,验证 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
  1. 在线下机器上,验证 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 代理

  1. 查看 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.pem
  CApath: 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. 再申请 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
  1. 再确定 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>

附录

  1. registry v2 oauth2 鉴权:https://docs.docker.com/registry/spec/auth/token/
  2. goproxy 反向代理 https://snail.gitee.io/proxy/manual/zh/#/?id=\_19-https%e5%8f%8d%e5%90%91%e4%bb%a3%e7%90%86
  3. OSS 内网域名与 VIP 网段对照表 https://help.aliyun.com/document\_detail/196960.html?spm=a2c4g.11186623.6.628.39e82e9fNE1Zmp

版权申明: 本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

正文完
 0