文档首页/ 云容器引擎 CCE/ 最佳实践/ 容器/ CCE中使用x86和ARM双架构镜像
更新时间:2024-05-29 GMT+08:00
分享

CCE中使用x86和ARM双架构镜像

应用现状

CCE支持在同一集群下创建x86节点及ARM架构节点。由于ARM和x86底层架构不同,通常ARM架构的镜像(也就是应用程序)无法在x86架构节点上运行,反之亦然。这就容易造成工作负载在拥有x86与ARM节点的集群上部署失败。

解决方案

解决在不同架构的节点使用镜像创建工作负载通常有两种方法:

  • 创建工作负载的时候通过亲和性设置,使用ARM架构镜像时让Pod调度到ARM架构的节点上,使用x86架构镜像时让Pod调度到x86架构的节点上。

  • 构建双架构镜像,同时支持两种架构,当Pod调度到ARM架构节点时拉取ARM架构的镜像,当Pod调度到x86架构节点时拉取x86架构的镜像。双架构镜像的一个特征是镜像可以只使用一个地址,但背后有两个镜像,这样在描述工作负载时,可以使用同一个镜像地址,且不用配置亲和性,工作负载描述文件更简洁更容易维护。

亲和性配置说明

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这个镜像。

相关文档