實現阿里雲容器鏡像服務反向訪問代理


簡介: 本文會先介紹鏡像推送/拉取過程的交互邏輯來梳理需要代理的所有服務,再通過搭建一個公網 HTTPS 反向代理來訪問容器鏡像服務來向您展示多場景代理訪問模式原理。

真實業務場景可能很復雜,因安全、合規、訪問限制等原因可能需要:

  1. 在線下 IDC 通過代理來訪問雲上資源。
  2. 在地域 A 通過雲企業網來訪問地域 B 的雲資源。
  3. 金融雲環境下,因金融雲網絡架構限制,金融雲內網類型的只能在金融雲內部訪問,不支持在互聯網上直接訪問,需要通過代理來訪問。

針對阿里雲容器鏡像服務(默認實例/企業版實例),本文會先介紹鏡像推送/拉取過程的交互邏輯來梳理需要代理的所有服務,再通過搭建一個公網 HTTP 反向代理來訪問容器鏡像服務來向您展示多場景代理訪問模式原理。

 

鏡像推拉過程

Registry 交互邏輯.jpg

 

上圖展現了阿里雲容器鏡像服務推送/拉取的整個交互過程:

  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. 企業版實例公網/內網地址:實例內可見。
  1. 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
  1. 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 代理(以訪問北京默認實例為例)

架構

容器鏡像服務反向代理.jpg

配置代理

  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>

本文為阿里雲原創內容,未經允許不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM