P2P加速功能可以提升鏡像拉取速度,減少應用部署時間。當大規模容器叢集批量下載鏡像時,您可以使用P2P加速功能提升鏡像拉取速度。本文介紹如何使用P2P加速功能提升鏡像拉取速度。
背景資訊
當大規模容器叢集批量下載鏡像時,容器鏡像儲存的網路頻寬會成為效能瓶頸,導致鏡像拉取緩慢。P2P加速功能可以利用您計算節點的頻寬資源,進行節點之間的鏡像分發,以減少對容器鏡像儲存的壓力,可以大幅提升鏡像拉取速度,減少應用部署時間。經過測試,1000節點規模下拉取1 GB大小的鏡像,相比普通鏡像拉取方式(以頻寬為10 Gbps為例),P2P加速方式可以減少95%以上的鏡像拉取時間。此外,新版的P2P加速方案相較於舊版的P2P有30%~50%的效能提升,且新版的P2P方案預設支援按需載入容器鏡像使用P2P加速,具體操作,請參見按需載入容器鏡像。
您可以在以下情境使用P2P加速功能。
ACK叢集
IDC或其他雲廠商叢集
前提條件
安裝P2P加速套件。
若您需要在ACK叢集中使用P2P加速功能。關於如何安裝P2P加速套件的具體操作,請參見在ACK叢集中安裝P2P加速套件。
若您需要在IDC或其他雲廠商叢集中使用P2P加速功能。關於如何安裝P2P加速套件的具體操作,請參見在IDC或其他雲廠商叢集中安裝P2P加速套件。
使用限制
開啟P2P加速後,P2P加速套件會將您的容器鏡像地址通過Webhook替換為P2P的鏡像地址,例如,您的原始鏡像地址為test****vpc.cn-hangzhou.cr.aliyuncs.com/docker-builder/nginx:latest,替換後的P2P加速鏡像地址為test****vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001/docker-builder/nginx:latest。
同時,Webhook會幫您自動產生一個用於加速鏡像地址的鏡像拉取密鑰(基於原始鏡像的鏡像拉取密鑰複製產生),由於該P2P鏡像拉取密鑰的建立和P2P鏡像地址的替換是非同步邏輯,因此建議您在下發工作負載前優先下發容器鏡像拉取需要的鏡像拉取密鑰,或手動建立一個用於P2P鏡像拉取(domain為test-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001)的鏡像拉取密鑰,然後再下發工作負載,避免由於鏡像地址的替換而導致鏡像拉取失敗。
啟用P2P加速
您可以通過添加標籤的方式啟用P2P加速,可以為應用負載添加P2P加速標籤,例如Pod、Deployment等。也可以為ACK叢集的命名空間設定P2P加速標籤。為命名空間設定P2P加速標籤後,該命名空間內的所有符合加速條件的應用負載都會啟用P2P加速,無需再修改應用負載的YAML檔案。根據實際情況選擇任一方式添加P2P加速標籤。
標籤的名稱為k8s.aliyun.com/image-accelerate-mode,值為p2p。
為應用負載添加P2P加速標籤。
以下以Deployment為例設定標籤。執行以下命令,為Deployment設定標籤。
kubectl edit deploy <Deployment名稱>在Deployment檔案中添加標籤
k8s.aliyun.com/image-accelerate-mode: p2p。apiVersion: apps/v1 kind: Deployment metadata: name: test labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: # enable P2P k8s.aliyun.com/image-accelerate-mode: p2p app: nginx spec: # your ACR instacne image pull secret imagePullSecrets: - name: test-registry containers: # your ACR instacne image - image: test-registry-vpc.cn-hangzhou.cr.aliyuncs.com/docker-builder/nginx:latest name: test command: ["sleep", "3600"]為命名空間添加P2P加速標籤
通過控制台添加P2P加速標籤。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇命名空間與配額。
在命名空間頁面單擊目標命名空間操作列的編輯。
在編輯命名空間對話方塊中,單擊+命名空間標籤,配置變數名稱為
k8s.aliyun.com/image-accelerate-mode,變數值為p2p,然後單擊確定。
通過命令列添加P2P加速標籤。
kubectl label namespaces <YOUR-NAMESPACE> k8s.aliyun.com/image-accelerate-mode=p2p
驗證P2P加速
啟用P2P加速後,P2P組件會自動為Pod注入P2P相關annotation、P2P加速鏡像地址以及對應的鏡像拉取憑證。
P2P鏡像拉取憑證與您原先配置的非P2P鏡像地址拉取憑證僅鏡像倉庫網域名稱不一樣,其他憑證資訊一致。因此,若您原先鏡像拉取憑證使用者資訊配置錯誤,也會導致P2P鏡像拉取失敗。
執行以下命令,查看Pod。
kubectl get po <Pod的名稱> -oyaml預期輸出:
apiVersion: v1
kind: Pod
metadata:
annotations:
# inject p2p-annotations automatically
k8s.aliyun.com/image-accelerate-mode: p2p
k8s.aliyun.com/p2p-config: '...'
spec:
containers:
# inject image to p2p endpoint
- image: test-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001/docker-builder/nginx:latest
imagePullSecrets:
- name: test-registry
# inject image pull secret for p2p endpoint
- name: acr-credential-test-registry-p2p可以看到,Pod已注入P2P相關annotation、P2P加速鏡像地址以及對應的鏡像拉取憑證,說明啟用P2P加速成功。
(可選)啟用用戶端指標採集
P2P Metrics說明
開啟Metrics
安裝P2P時,開啟Metrics配置。
p2p:
v2:
# Component for P2P v2
image: registry-vpc.__ACK_REGION_ID__.aliyuncs.com/acs/dadi-agent
imageTag: v0.1.2-72276d4-aliyun
# Concurrency limit number of layers downloading by each node proxy
proxyConcurrencyLimit: 128
# The server port to communicate with P2P nodes
p2pPort: 65002
cache:
# Disk cache capacity in bytes, default 4GB
capacity: 4294967296
# Set to 1 if you are using high-performance disks on your ECS, e.g. ESSD PL2/PL3
aioEnable: 0
exporter:
# Set to true if you want to collect component metrics
enable: false
port: 65003
# limit for downstream throughput
throttleLimitMB: 512訪問方式
P2P YAML中關於exporter欄位定義了Metrics的連接埠。
ExporterConfig:
enable: true # 是否開啟
port: 65006 # 監聽連接埠
standaloneExporterPort: true # 是否採用獨立連接埠暴露,如果為false,則通過http服務連接埠吐出curl 127.0.0.1:$port/metrics可以得到Metrics結果如下。
# HELP DADIP2P_Alive
# TYPE DADIP2P_Alive gauge
DADIP2P_Alive{node="192.168.69.172:65005",mode="agent"} 1.000000 1692156721833
# HELP DADIP2P_Read_Throughtput Bytes / sec
# TYPE DADIP2P_Read_Throughtput gauge
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833
# HELP DADIP2P_QPS
# TYPE DADIP2P_QPS gauge
DADIP2P_QPS{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833
# HELP DADIP2P_MaxLatency us
# TYPE DADIP2P_MaxLatency gauge
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833
# HELP DADIP2P_Count Bytes
# TYPE DADIP2P_Count gauge
DADIP2P_Count{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833
# HELP DADIP2P_Cache
# TYPE DADIP2P_Cache gauge
DADIP2P_Cache{node="192.168.69.172:65005",type="allocated",mode="agent"} 4294967296.000000 1692156721833
DADIP2P_Cache{node="192.168.69.172:65005",type="used",mode="agent"} 4294971392.000000 1692156721833
# HELP DADIP2P_Label
# TYPE DADIP2P_Label gauge指標說明
指標名
DADIP2P_Alive:服務是否存活。
DADIP2P_Read_Throughtput:P2P服務吞吐,單位:byte/s。
DADIP2P_QPS:QPS。
DADIP2P_MaxLatency:延遲統計,單位:us。
DADIP2P_Count:流量統計,單位:bytes。
DADIP2P_Cache:單機Cache用量,單位:bytes。
Tag
node:P2P Agent/Root的服務IP和連接埠。
type:指標類型。
pread:處理下遊請求。
download:回源。
peer:P2P網路分發。
disk:處理磁碟。
http:處理HTTP請求。
allocated:緩衝分配空間。
used:緩衝使用空間。
指標樣本
DADIP2P_Count{node="11.238.108.XXX:9877",type="http",mode="agent"} 4248808352.000000 1692157615810
Agent服務累計處理HTTP請求流量:4248808352位元組。
DADIP2P_Cache{node="11.238.108.XXX:9877",type="used",mode="agent"} 2147487744.000000 1692157615810
當前Agent緩衝用量:2147487744位元組。審計日誌
開啟審計日誌
修改p2p configmap裡audit欄位為true。
DeployConfig:
mode: agent
logDir: /dadi-p2p/log
logAudit: true
logAuditMode: stdout # 輸出到控制台, file為輸出到日誌目錄/dadi-p2p/log/audit.log審計日誌格式
格式如下,其含義為:從接收到請求至結果返回的處理耗時,單位:us。
2022/08/30 15:44:52|AUDIT|th=00007FBA247C5280|download[pathname=/https://cri-pi840la*****-registry.oss-cn-hangzhou.aliyuncs.com/docker/registry/v2/blobs/sha256/dd/dd65726c224b09836aeb6ecebd6baf58c96be727ba86da14e62835569896008a/data][offset=125829120][size=2097152][latency=267172]
....
2022/08/30 15:44:55|AUDIT|th=00007FBA2EFEAEC0|http:pread[pathname=/https://cri-pi840lacia*****-registry.oss-cn-hangzhou.aliyuncs.com/docker/registry/v2/blobs/sha256/dd/dd65726c224b09836aeb6ecebd6baf58c96be727ba86da14e62835569896008a/data][offset=127467520][size=65536][latency=21]主要欄位為:時間、 AUDIT、線程指標、作業碼[pathname=][size=][latency=]。
其中AUDIT和線程指標一般不用關心,size為單次請求大小,若為負數則表示異常;latency為單次請求延遲,單位:us。
常見作業碼如下:
http:pread:表示HTTP Proxy處理下遊資料請求。
rpc:stat:表示P2P Agent擷取檔案長度。
rpc:pread:表示P2P Agent處理下遊資料請求。
download:表示P2P Agent從上遊下載資料。
filewrite:表示P2P Agent寫入當前資料分區到緩衝。
fileread:表示P2P Agent從緩衝讀取資料分區。
日誌樣本
download[pathname=mytest][offset=0][size=65536][latency=26461]
## P2P Agent從上遊下載mytest檔案[0,65536)這段資料的延遲為26461us
rpc:pread[pathname=mytest][offset=0][size=65536][latency=2]
## P2P Agent向下遊返回mytest檔案[0,65536)這段資料的延遲為2us
http:pread[pathname=mytest][offset=0][size=65536][latency=26461]
## 代理向從上遊下載mytest檔案[0,65536)這段資料的延遲為26461us(可選)關閉按需載入鏡像使用P2P加速
以下是叢集內修改單節點配置的參考步驟。您需關注節點的後續營運操作,是否會覆蓋此配置。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在節點頁面,單擊目標節點IP地址下的執行個體ID。
在執行個體詳情頁面,使用遠端連線,登入節點。
使用
vi命令編輯/etc/overlaybd/overlaybd.json檔案中的p2pConfig,將enable改為false。{ "p2pConfig": { "enable": false, "address": "https://localhost:6****/accelerator" }, ... ... }執行如下命令,重新按需載入的組件。
service overlaybd-tcmu restart
附錄
P2P 加速效果參考
不同規格鏡像拉取
測試鏡像規格如下
4 GB(512 MB * 8層)
10 GB(10 GB * 1層)
20 GB(4 GB * 5層,10 GB * 2層,512 MB * 40層, 20 GB * 1層,2 GB * 10層)
測試環境如下
ACK叢集:1000節點
ECS規格:4核8 GB記憶體
雲端硬碟規格:200 GB ESSD PL1
P2P Agent規格:1核1 GB記憶體,緩衝4 GB
測試情境
1000 節點拉取相同鏡像(含鏡像下載後解壓完成)
測試結果(P95耗時)
鏡像規格 | 耗時 | 回源(Bucket)峰值吞吐(Gbps) |
512 MB * 8層 | 116秒 | 2 |
10 GB * 1層 | 6分20秒 | 1.2 |
4 GB * 5層 | 9分15秒 | 5.1 |
10 GB * 2層 | 9分50秒 | 6.7 |
512 MB * 40層 | 7分55秒 | 3.8 |
20 GB * 1層 | 11分 | 2.5 |
2 GB * 10層 | 8分13秒 | 3.2 |