如何实现阿里云容器镜像服务反向访问代理?
生活随笔
收集整理的這篇文章主要介紹了
如何实现阿里云容器镜像服务反向访问代理?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡介:本文會先介紹鏡像推送/拉取過程的交互邏輯來梳理需要代理的所有服務,再通過搭建一個公網 HTTPS 反向代理來訪問容器鏡像服務來向您展示多場景代理訪問模式原理。
在線下 IDC 通過代理來訪問云上資源。 在地域 A 通過云企業網來訪問地域 B 的云資源。 金融云環境下,因金融云網絡架構限制,金融云內網類型的只能在金融云內部訪問,不支持在互聯網上直接訪問,需要通過代理來訪問。
向 registry 發起鏡像推拉請求。 registry 返回 401 Unauthorized 的 HTTP 返回值,并且攜帶鑒權服務(authorization service)的地址,需要客戶端去做鑒權。 客戶端向鑒權服務發起請求以獲取一個授權 token。 鑒權服務返回一個攜帶權限的 token 給客戶端。 客戶端將 token 嵌入 HTTP Authorization header 頭中,再次向 registry 發起請求。 registry 驗證 token 權限無問題后,在鏡像推送過程中,客戶端可以向 registry 推送鏡像數據;在鏡像拉取過程中,registry 會向客戶端頒發有時效的 OSS url 地址。 客戶端通過 OSS url 地址拉取保存在 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 控制臺可見。 registry 內網域名解析 IP 可以自己 ping 出,默認實例一般不變化;企業版實例可以在控制臺上查看到。 authorization service 內網域名解析 IP 可以 ping 出,一般取 16 位網段。 oss 各地域內網域名與 VIP 網段表見附錄 3。
在與需要進行代理的容器鏡像服務實例同地域創建一臺 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 解析到代理。 在線下機器上,首先驗證 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查看 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再請求 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
真實業務場景可能很復雜,因安全、合規、訪問限制等原因可能需要:
針對阿里云容器鏡像服務(默認實例/企業版實例),本文會先介紹鏡像推送/拉取過程的交互邏輯來梳理需要代理的所有服務,再通過搭建一個公網 HTTP 反向代理來訪問容器鏡像服務來向您展示多場景代理訪問模式原理。
鏡像推拉過程
上圖展現了阿里云容器鏡像服務推送/拉取的整個交互過程:
整個訪問阿里云容器鏡像服務實例的過程涉及 Registry、Authorization Service 和 OSS 三部分。
容器鏡像相關服務地址
客戶端訪問容器鏡像服務,需要與 registry、authorization service 和 oss 三種服務通信。
域名
通過代理方式訪問容器鏡像服務,一般需要知道所有相關域名。
內網解析
像通過 CEN 來實現跨地域訪問鏡像服務實例;線下 IDC 通過 VPN 訪問云上鏡像服務實例一般需要知道內網域名解析 IP 網段。
搭建 HTTPS 代理(以訪問北京默認實例為例)
架構
配置代理
將所有需要訪問到的服務地域的域名解析在本地 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測試代理
跨域 CEN、線下 VPN 訪問容器鏡像服務等場景說明
需要先得到 registry、authorization service 和 oss 三種服務的內網解析 IP 網段,將三種網段添加進路由。
Debug 代理
針對 helm chart 實例應該請求 /api/_/_/charts 接口
附錄
原文鏈接:https://developer.aliyun.com/article/782899?
版權聲明:本文內容由阿里云實名注冊用戶自發貢獻,版權歸原作者所有,阿里云開發者社區不擁有其著作權,亦不承擔相應法律責任。具體規則請查看《阿里云開發者社區用戶服務協議》和《阿里云開發者社區知識產權保護指引》。如果您發現本社區中有涉嫌抄襲的內容,填寫侵權投訴表單進行舉報,一經查實,本社區將立刻刪除涉嫌侵權內容。總結
以上是生活随笔為你收集整理的如何实现阿里云容器镜像服务反向访问代理?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache Flink Meetup
- 下一篇: 云上快报 | 阿里云混合云再攀新高