指定或排除ECS规格族创建Pod

在指定vCPU和内存创建ECI Pod的场景下,如果您对规格有一定要求,例如只想使用ecs.g6规格族,可添加k8s.aliyun.com/eci-instance-family的Annotation来指定ECS规格族。本文介绍创建ECI Pod时,如何指定或排除ECS规格族。

功能说明

指定vCPU和内存创建ECI Pod时,系统会使用多种ECS规格进行支撑,并自动选择满足vCPU和内存条件且有库存的规格。此时,您可以添加Annotation(k8s.aliyun.com/eci-instance-family)来指定或排除ECS规格族。

  • 如果指定了某些ECS规格族,则系统仅会从相应的ECS规格族中进行选择。如果指定的ECS规格族没有库存,则不会创建ECI Pod。

  • 如果排除了某些ECS规格族,则系统在选择规格时会排除这些规格族,从其他ECI支持的ECS规格族中选择规格。

说明

可以配合使用k8s.aliyun.com/eci-instance-generation来指定或排除ECS规格代数,实现更精细的规格控制。

支持指定或排除的ECS规格族如下:

架构

ECS规格代数

ECS规格族

Arm

8

g8y、c8y、r8y

x86

8

g8i、c8i、r8i、hfg8i、hfc8i、hfr8i

7

g7、c7、r7、hfg7、hfc7、hfr7、g7ne

6

g6e、g6、c6e、c6、r6e、r6、hfc6、hfg6、s6

5

u1、g5、g5ne、c5、r5、ic5、hfc5、hfg5

4

sn2ne、sn1ne、se1ne、se1

关于ECS规格的详细信息,请参见:

注意事项

  • 指定或排除ECS规格族创建的ECI Pod按照实际生成的ECS规格进行计费,不按照vCPU和内存计费。

    重要

    ECI Pod创建成功后,您可以执行kubectl describe pod命令查看其YAML详情,通过k8s.aliyun.com/eci-instance-spec字段确认ECI Pod实际使用的ECS规格,ECI会按照该ECS规格进行计费。

  • 指定或排除ECS规格族时,系统无法自动选择到某些规格,如GPU规格(gn6i等)、本地盘规格(i2g等)等。如有需要,请明确指定ECS规格来创建ECI Pod。具体操作,请参见指定ECS规格创建Pod

  • 指定或排除ECS规格族的功能仅适用于指定vCPU和内存规格的场景,如果优先指定的是ECS规格,则该功能不会生效。

  • 支持指定或排除规格族创建抢占式实例,该场景下系统会综合考量配置的规格族顺序和市场价格(价格优先),为您选择最优的实例规格。如果您对规格族有严格要求,建议只配置一个规格族。

配置说明

k8s.aliyun.com/eci-instance-family的取值为ECS规格族,相关说明如下:

  • 可配置多个规格族,取值范围为ECI支持的ECS规格族。

    重要

    目前8代规格仅支持Arm架构规格,创建Pod时需要通过nodeSelector调度到Arm节点,因此无法与其他x86架构的规格同时配置,只能单独指定或排除Arm规格族,具体配置示例请参见示例五:指定Arm规格族

  • 在规格族前加上-表示排除该规格族。

    例如:k8s.aliyun.com/eci-instance-family: "-ecs.c6, -ecs.c5"表示排除ecs.c6和ecs.c5规格族。

  • 对于指定的规格族,系统会按照配置的顺序进行选择。

    例如:k8s.aliyun.com/eci-instance-family: "ecs.c6, ecs.c5"表示优先使用ecs.c6规格族,当ecs.c6规格族中,满足vCPU和内存条件的规格库存不足时,使用ecs.c5规格族。如果ecs.c5规格族仍库存不足,则创建失败。

使用k8s.aliyun.com/eci-instance-family时,必须先指定vCPU和内存规格,您可以通过以下两种方式指定:

  • 通过定义容器的limits或requests来指定,建议使用limits。

  • 在Pod metadata中添加k8s.aliyun.com/eci-use-specs的Annotation来指定。

示例一:指定ECS规格族

配置项

实现效果

  • 通过limit指定了vCPU和内存资源(2 vCPU,4 GiB内存)。

  • 通过k8s.aliyun.com/eci-instance-family: "ecs.c6, ecs.g6"指定优先使用ecs.c6规格族的规格,其次使用ecs.g6规格族中的规格。

优先使用ecs.c6.large规格,其次使用ecs.g6.large规格。

说明

该示例配置效果等同于k8s.aliyun.com/eci-use-specs: "ecs.c6.large,ecs.g6.large"

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      name: test
      labels:
        app: test
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-instance-family: "ecs.c6,ecs.g6"    # 指定优先使用ecs.c6规格族的规格,其次使用ecs.g6规格族的规格
    spec:
      containers:
      - name: nginx
        image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: "2"       # vCPU上限        
            memory: "4Gi"  # 内存上限

示例二:排除ECS规格族

配置项

实现效果

  • 通过k8s.aliyun.com/eci-use-specs: "2-4Gi"指定vCPU和内存资源(2 vCPU,4 GiB内存)。

  • 通过k8s.aliyun.com/eci-instance-family: "-ecs.hfg6,-ecs.hfg5"排除使用ecs.hfg6和ecs.hfg5规格族中的规格。

从除了ecs.hfg6和ecs.hfg5规格族外的其他ECI支持的ECS规格族中选择满足vCPU和内存要求的规格。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-test
      labels:
        app: nginx
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-use-specs: "2-4Gi"                    # 指定模糊的vCPU和内存规格
        k8s.aliyun.com/eci-instance-family: "-ecs.hfg6,-ecs.hfg5"    # 排除ecs.hfg6和ecs.hfg5规格族
    spec:
      containers:
      - name: nginx
        image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
        ports:
        - containerPort: 80

示例三:指定ECS规格代数并排除ECS规格族

配置项

实现效果

  • 通过k8s.aliyun.com/eci-use-specs: "2-4Gi"指定vCPU和内存资源(2 vCPU,4 GiB内存)。

  • 通过k8s.aliyun.com/eci-instance-generation: "6,5" 指定优先使用6代ECS规格,其次使用5代ECS规格。

  • 通过k8s.aliyun.com/eci-instance-family: "-ecs.hfg5"排除ecs.hfg5规格族。

  • 优先从6代ECS规格中选择满足vCPU和内存条件的规格。

  • 如果6代ECS规格库存不足,从除了ecs.hfg5规格族外的其他ECI支持的5代ECS规格中进行选择。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-test
      labels:
        app: nginx
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-use-specs: "2-4Gi"                   # 指定模糊的vCPU和内存规格
        k8s.aliyun.com/eci-instance-generation: "6,5"           # 指定优先使用6代ECS规格,其次使用5代ECS规格
        k8s.aliyun.com/eci-instance-family: "-ecs.hfg5"           # 排除ecs.hfg5规格族
    spec:
      containers:
      - name: nginx
        image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
        ports:
        - containerPort: 80

示例四:排除ECS规格代数并排除ECS规格族

配置项

实现效果

  • 通过k8s.aliyun.com/eci-use-specs: "2-4Gi"指定vCPU和内存资源(2 vCPU,4 GiB内存)。

  • 通过k8s.aliyun.com/eci-instance-generation: "-5,-4" 排除使用5代和4代ECS规格。

  • 通过k8s.aliyun.com/eci-instance-family: "-ecs.hfg6"排除ecs.hfg6规格族。

从除了ecs.hfg6规格族外的其他7代和6代ECS规格中选择满足vCPU和内存条件的规格。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-test
      labels:
        app: nginx
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-use-specs: "2-4Gi"                    # 指定模糊的vCPU和内存规格
        k8s.aliyun.com/eci-instance-generation: "-5,-4"          # 排除5代和4代ECS规格
        k8s.aliyun.com/eci-instance-family: "-ecs.hfg6"            # 排除ecs.hfg6规格族
    spec:
      containers:
      - name: nginx
        image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
        ports:
        - containerPort: 80

示例五:指定Arm规格族

配置项

实现效果

  • 通过k8s.aliyun.com/eci-use-specs: "2-4Gi,4-8Gi"指定vCPU和内存资源(优先2 vCPU,4 GiB内存,其次4 vCPU,8 GiB内存)。

  • 通过k8s.aliyun.com/eci-instance-family: "ecs.c8y"指定使用ecs.c8y规格族的规格。

  • 通过alibabacloud.com/eci: "true"kubernetes.io/arch: arm64将Pod调度到Arm架构的虚拟节点。

优先使用ecs.c8y.large规格,其次使用ecs.c8y.xlarge规格。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-test
      labels:
        app: nginx
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-use-specs: "2-4Gi,4-8Gi"              # 指定多个模糊的vCPU和内存规格
        k8s.aliyun.com/eci-instance-family: "ecs.c8y"            # 指定ecs.c8y规格族
    spec:
      containers:
      - name: nginx
        image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
        ports:
        - containerPort: 80
      nodeSelector:
        kubernetes.io/arch: arm64  # 调度到Arm节点

示例六:不生效配置

指定ECS规格族的功能仅适用于模糊指定vCPU和内存规格的场景,不适用于明确指定ECS规格的场景。如果指定ECS规格族的功能没有生效,会生成IgnoreInstanceTypeFeatures事件。

事件名称

事件类型

事件信息

事件说明

IgnoreInstanceTypeFeatures

Warning

[eci.containergroup]The instance type features will be ignored as the provided specifications, [%s],correspond exclusively to ECS instance types.

由于已通过k8s.aliyun.com/eci-use-specs明确指定了ECS规格,因此自动忽略指定ECS规格族的Annotation。

如下示例中,会自动忽略指定ecs.c6规格族的Annotation,仅使用ecs.c5.large规格创建ECI Pod。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-test
      labels:
        app: nginx
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-use-specs: "ecs.c5.large"   # 指定明确的ECS规格
        k8s.aliyun.com/eci-instance-family: "ecs.c6"   # 指定ECS规格族(实际不会生效)
    spec:
      containers:
      - name: nginx
        image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
        ports:
        - containerPort: 80

在Pod事件中可看到IgnoreInstanceTypeFeatures事件如下:

generation1