x86和ARM鏡像的混合部署
更新時間 2024-07-23 14:30:31
最近更新時間: 2024-07-23 14:30:31
分享文章
本節介紹了云容器引擎的最佳實踐:x86和ARM鏡像的混合部署。
應用現狀
云容器引擎允許在同一集群內同時創建兩種不同架構的節點:x86架構和ARM架構。然而,由于這兩種架構在底層技術上存在顯著差異,因此通常來說,無法將為ARM架構設計的鏡像(即應用程序)在x86架構的節點上成功運行,反之亦然。因此,在擁有同時支持x86和ARM節點的集群上部署工作負載時,可能會遭遇部署失敗的情況。
解決方案
解決在不同架構的節點使用鏡像創建工作負載通常有三種方法:
- 創建工作負載的時候通過親和性設置,使用ARM架構鏡像時讓Pod調度到ARM架構的節點上,使用x86架構鏡像時讓Pod調度到x86架構的節點上。
- 創建工作負載的時候通過nodeSelector設置,使用ARM架構鏡像時讓Pod調度到ARM架構的節點上,使用x86架構鏡像時讓Pod調度到x86架構的節點上。
- 構建雙架構鏡像,同時支持ARM和x86架構。當Pod被調度到ARM架構節點時,將自動拉取針對ARM架構的鏡像;而當Pod被調度到x86架構節點時,將自動拉取針對x86架構的鏡像。盡管使用同一個地址,但背后實際上包含兩個鏡像。這種設計簡化了工作負載描述文件,使其更具可讀性和易于維護,無需單獨配置節點親和性和nodeSelector。
親和性配置說明
云容器引擎在創建節點時,會自動給節點打上kubenetes.io/arch的標簽,表示節點架構,如下所示。
kubernetes.io/arch=amd64
取值amd64表示是x86架構,arm64表示是ARM架構。
在創建工作負載時,可以通過配置節點親和性,將Pod調度到對應架構的節點上,示例如下:
apiVersion: v1
kind: Deployment
metadata:
name: test
spec:
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: container0
image: registry-crs-huadong1.daliqc.cn/library/nginx:1.5-amd64
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
nodeSelector配置說明
也可以使用nodeSelector實現相同的效果,示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
nodeSelector:
kubernetes.io/arch: amd64
containers:
- name: container0
image: registry-crs-huadong1.daliqc.cn/library/nginx:1.5-amd64
resources:
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
imagePullSecrets:
- name: default-secret
使用雙架構鏡像
雙架構鏡像實際上就是對已有的兩個不同架構的鏡像做一個類似超鏈接的操作,能夠實現在不同的操作系統拉取不同架構的鏡像,構建上傳步驟如下:
# 給原始鏡像增加tag,方便標識具體區別
docker tag nginx:1.5-amd64 registry-crs-huadong1.daliqc.cn/library/nginx:1.5-amd64
docker tag nginx:1.5-arm64 registry-crs-huadong1.daliqc.cn/library/nginx:1.5-arm64
# 先上傳鏡像至容器鏡像服務倉庫,然后才能做manifest
docker push registry-crs-huadong1.daliqc.cn/library/nginx:1.5-amd64
docker push registry-crs-huadong1.daliqc.cn/library/nginx:1.5-arm64
創建雙架構manifest文件并上傳。
# 創建鏡像manifest文件
docker manifest create --amend --insecure registry-crs-huadong1.daliqc.cn/library/nginx:1.5 registry-crs-huadong1.daliqc.cn/library/nginx:1.5-amd64 registry-crs-huadong1.daliqc.cn/library/nginx:1.5-arm64
# 如果鏡像在之前制作中沒有添加架構信息,需要給鏡像manifest文件添加arch信息
docker manifest annotate registry-crs-huadong1.daliqc.cn/library/nginx:1.5 registry-crs-huadong1.daliqc.cn/library/nginx:1.5-amd64 --arch amd64
docker manifest annotate registry-crs-huadong1.daliqc.cn/library/nginx:1.5 registry-crs-huadong1.daliqc.cn/library/nginx:1.5-arm64 --arch arm64
# 向容器鏡像服務倉庫推送鏡像manifest
docker manifest push -p --insecure registry-crs-huadong1.daliqc.cn/library/nginx:1.5
用戶在使用時只需要image中填寫registry-crs-huadong1.daliqc.cn/library/nginx:1.5這個鏡像地址,
當Pod調度到 x86 架構的節點時,會拉取registry-crs-huadong1.daliqc.cn/library/nginx:1.5-amd64這個鏡像;
當Pod調度到ARM架構的節點時,會拉取registry-crs-huadong1.daliqc.cn/library/nginx:1.5-arm64這個鏡像。