您可以给节点池设置标签(labels),使得应用Pod调度到对应标签节点池下的节点上。
前提条件
操作步骤
给节点池设置节点标签。
您可以在ACK中通过节点池管理集群中的一组节点资源。例如在节点池中统一管理节点的标签和污点。有关创建节点池的具体步骤,请参见创建节点池。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在节点池页面,单击创建节点池。
在创建节点池配置页,单击显示高级选项,然后单击节点标签右侧的设置节点标签。
本文示例中添加的节点标签为pod: nginx。
您可以在目标节点池右侧单击编辑,为节点更新或者添加标签。
为应用设置调度策略。
上述步骤已经为节点池中的节点设置了pod:nginx的标签。您可以利用nodeSelector或者nodeAffinity保证您的应用限定在指定节点池上运行。具体操作步骤如下。
为应用设置nodeSelector。
nodeSelector是spec中的一个字段。您只需要将上述的pod: nginx标签填充到nodeSelector中。示例如下。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeSelector: pod: nginx #添加节点池中的标签,以保证您的应用只可以运行在节点池的节点上。 containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
为应用设置nodeAffinity。
nodeAffinity包含以下调度策略:
- requiredDuringSchedulingIgnoredDuringExecution
表示Pod必须部署到满足条件的节点上。如果没有满足条件的节点,调度操作就会不停重试。其中IgnoreDuringExecution表示Pod部署之后运行时,如果节点标签发生了变化,不再满足Pod指定的条件,Pod也会继续运行。
- preferredDuringSchedulingIgnoredDuringExecution
表示优先部署到满足条件的节点上,如果没有满足条件的节点,则忽略这些条件,按照正常逻辑部署。
本文示例使用requiredDuringSchedulingIgnoredDuringExecution策略保证应用始终运行在指定的节点池上。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-with-affinity labels: app: nginx-with-affinity spec: replicas: 2 selector: matchLabels: app: nginx-with-affinity template: metadata: labels: app: nginx-with-affinity spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: pod #节点标签的键,本文示例为pod。 operator: In # 应用将运行在标了pod:nginx的节点上。 values: - nginx #节点标签的值,本文示例为nginx。 containers: - name: nginx-with-affinity image: nginx:1.7.9 ports: - containerPort: 80
结果验证
单击应用名称,进入应用详情页面,查看容器组页签。目标应用Pod全部被调度到了xx.xx.33.88和xx.xx.33.92的节点上,这些节点正是本文示例中在节点池中打了标签(pod: nginx)的节点。
相关文档
如果您想了解更多关于
nodeSelector
、nodeAffinity
的信息,请参见Assigning Pods to Nodes。您可以在应用发布或扩容过程中,自定义资源策略(ResourcePolicy),设置应用被调度到不同类型节点资源的顺序。同时,在缩容过程中按照原调度顺序逆序缩容。详细信息,请参见自定义弹性资源优先级调度。