CCE中使用x86和ARM双架构镜像
应用现状
CCE支持在同一集群下创建x86节点及ARM架构节点。由于ARM和x86底层架构不同,通常ARM架构的镜像(也就是应用程序)无法在x86架构节点上运行,反之亦然。这就容易造成工作负载在拥有x86与ARM节点的集群上部署失败。
解决方案
解决在不同架构的节点使用镜像创建工作负载通常有两种方法:
亲和性配置说明
CCE在创建节点时,会自动给节点打上kubenetes.io/arch的标签,表示节点架构,如下所示。
kubernetes.io/arch=amd64
取值amd64表示是x86架构,arm64表示是ARM架构。
在创建工作负载时,可以通过配置节点亲和性,将Pod调度到对应架构的节点上。
使用YAML可以通过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: swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend-linux-amd64:1.5 resources: limits: cpu: 250m memory: 512Mi requests: cpu: 250m memory: 512Mi imagePullSecrets: - name: default-secret
双架构镜像构建方法
制作双架构镜像,Docker客户端版本需要大于18.03。
构建双架构镜像的本质是先分别构建x86和ARM架构的镜像,然后通过构建双架构的镜像manifest。
例如已经构建好了defaultbackend-linux-amd64:1.5和defaultbackend-linux-arm64:1.5两个镜像,分别是x86架构和ARM架构。
将这两个镜像上传到SWR镜像仓库,如下所示。上传镜像的具体方法请参见客户端上传镜像。
# 给原始amd64镜像defaultbackend-linux-amd64:1.5加tag docker tag defaultbackend-linux-amd64:1.5 swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend-linux-amd64:1.5 # 给原始arm64镜像defaultbackend-linux-arm64:1.5加tag docker tag defaultbackend-linux-arm64:1.5 swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend-linux-arm64:1.5 # 上传amd64镜像至swr镜像仓库 docker push swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend-linux-amd64:1.5 # 上传arm64镜像至swr镜像仓库 docker push swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend-linux-arm64:1.5
创建双架构manifest文件并上传。
# 开启DOCKER_CLI_EXPERIMENTAL export DOCKER_CLI_EXPERIMENTAL=enabled # 创建镜像manifest文件 docker manifest create --amend --insecure swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend:1.5 swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend-linux-arm64:1.5 swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend-linux-amd64:1.5 # 给镜像manifest文件添加arch信息 docker manifest annotate swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend:1.5 swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend-linux-amd64:1.5 --arch amd64 docker manifest annotate swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend:1.5 swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend-linux-arm64:1.5 --arch arm64 # 向swr镜像仓库推送镜像manifest docker manifest push -p --insecure swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend:1.5
这样在创建负载时就只需要使用swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend:1.5这个镜像地址。
- 当Pod调度到x86架构的节点时,会拉取swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend-linux-amd64:1.5这个镜像。
- 当Pod调度到ARM架构的节点时,会拉取swr.cn-north-4.myhuaweicloud.com/test-namespace/defaultbackend-linux-arm64:1.5这个镜像。