真實業務場景可能很複雜,因安全、合規、通路限制等原因可能需要:
- 線上下 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.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 中傳回的 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>
附錄
- registry v2 oauth2 鑒權: https://docs.docker.com/registry/spec/auth/token/
- goproxy 反向代理 https://snail.gitee.io/proxy/manual/zh/#/?id=_19-https%e5%8f%8d%e5%90%91%e4%bb%a3%e7%90%86
- OSS 内網域名與 VIP 網段對照表 https://help.aliyun.com/document_detail/196960.html?spm=a2c4g.11186623.6.628.39e82e9fNE1Zmp