🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# kubernetes pod 调度 ### 简述 Kubernetes调度器根据特定的算法与策略将pod调度到工作节点上。在默认情况下,Kubernetes调度器可以满足绝大多数需求,例如调度pod到资源充足的节点上运行,或调度pod分散到不同节点使集群节点资源均衡等。但一些特殊的场景,默认调度算法策略并不能满足实际需求,例如使用者期望按需将某些pod调度到特定硬件节点(数据库服务部署到SSD硬盘机器、CPU/内存密集型服务部署到高配CPU/内存服务器),或就近部署交互频繁的pod(例如同一机器、同一机房、或同一网段等)。 Kubernetes中的调度策略主要分为全局调度与运行时调度2种。其中全局调度策略在调度器启动时配置,而运行时调度策略主要包括选择节点(nodeSelector),节点亲和性(nodeAffinity),pod亲和与反亲和性(podAffinity与podAntiAffinity)。Node Affinity、podAffinity/AntiAffinity以及后文即将介绍的污点(Taints)与容忍(tolerations)等特性,在Kuberntes1.6中均处于Beta阶段。 node 添加标签 kubectl label nodes 172.16.200.101 disktype=ssd 查看node 节点标签(label) kubectl get node --show-labels 删除一个label kubectl label node 172.16.200.101 disktype- 修改一个label # kubectl label node 172.16.200.101 disktype=scsi --overwrite ### 选择节点(nodeselector) apiVersion: v1 kind: ReplicationController metadata: name: redis-master labels: name: redis-master spec: replicas: 1 selector: name: redis-master template: metadata: labels: name: redis-master spec: containers: - name: master image: kubeguide/redis-master ports: - containerPort: 6379 nodeSelector: disktype: ssd ## 亲和性(Affinity)与非亲和性(anti-affinity) 前面提及的nodeSelector,其仅以一种非常简单的方式、即label强制限制pod调度到指定节点。而亲和性(Affinity)与非亲和性(anti-affinity)则更加灵活的指定pod调度到预期节点上,相比nodeSelector,Affinity与anti-affinity优势体现在: - 表述语法更加多样化,不再仅受限于强制约束与匹配。 - 调度规则不再是强制约束(hard),取而代之的是软限(soft)或偏好(preference)。 - 指定pod可以和哪些pod部署在同一个/不同拓扑结构下。 亲和性主要分为3种类型:node affinity与inter-pod affinity/anti-affinity,下文会进行详细说明。 ### 节点亲和性(Node affinity) Node affinity在Kubernetes 1.2做为alpha引入,其涵盖了nodeSelector功能,主要分为requiredDuringSchedulingIgnoredDuringExecution与preferredDuringSchedulingIgnoredDuringExecution 2种类型。前者可认为一种强制限制,如果 Node 的标签发生了变化导致其没有符合 Pod 的调度要求节点,那么pod调度就会失败。而后者可认为理解为软限或偏好,同样如果 Node 的标签发生了变化导致其不再符合 pod 的调度要求,pod 依然会调度运行。 Node affinity举例 设置节点label: kubectl label node 172.16.200.100 cpu=high kubectl label node 172.16.200.101 cpu=mid kubectl label node 172.16.200.102 cpu=low 部署pod的预期是到CPU高配的机器上(cpu=high)。 查看满足条件节点: kubectl get nodes -l 'cpu=high' redis-master.yaml 文件内容如下 apiVersion: v1 kind: ReplicationController metadata: name: redis-master labels: name: redis-master spec: replicas: 1 selector: name: redis-master template: metadata: labels: name: redis-master spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: cpu operator: In values: - high containers: - name: master image: kubeguide/redis-master ports: - containerPort: 6379 检查结果符合预期,pod nginx成功部署到非master节点且CPU高配的机器上。 # kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE redis-master-lbz9f 1/1 Running 0 11s 10.24.77.4 172.16.200.100 ### pod亲和性(Inter-pod affinity)与反亲和性(anti-affinity) inter-pod affinity与anti-affinity由Kubernetes 1.4引入,当前处于beta阶段,其中podAffinity用于调度pod可以和哪些pod部署在同一拓扑结构之下。而podAntiAffinity相反,其用于规定pod不可以和哪些pod部署在同一拓扑结构下。通过pod affinity与anti-affinity来解决pod和pod之间的关系。 与Node affinity类似,pod affinity与anti-affinity同样分为requiredDuringSchedulingIgnoredDuringExecution and preferredDuringSchedulingIgnoredDuringExecution等2种类型,前者被认为是强制约束,而后者后者可认为理解软限(soft)或偏好(preference)。 pod affinity与anti-affinity举例 本示例中假设部署场景为:期望redis-slave服务与redis-master服务就近部署,而不希望与frontend服务部署同一拓扑结构上。 redis-slave yaml文件部分内容: apiVersion: v1 kind: ReplicationController metadata: name: redis-slave spec: replicas: 2 selector: name: redis-slave template: metadata: name: redis-slave labels: name: redis-slave spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: name operator: In values: - redis-master topologyKey: kubernetes.io/hostname podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: name operator: In values: - frontend topologyKey: beta.kubernetes.io/os containers: - name: redis-slave image: kubeguide/guestbook-redis-slave env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 6379 查看部署结果,redis-slave服务与redis-master部署到了同一台机器,而frontend被部署在其他机器上。 # kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE frontend-4nmkz 1/1 Running 0 4m 10.24.51.5 172.16.200.101 frontend-xmjsr 1/1 Running 0 4m 10.24.77.5 172.16.200.100 redis-master-lbz9f 1/1 Running 0 41m 10.24.77.4 172.16.200.100 redis-slave-t9tw4 1/1 Running 3 1m 10.24.77.7 172.16.200.100 redis-slave-zvcrg 1/1 Running 3 1m 10.24.77.6 172.16.200.100 ### 亲和性/反亲和性调度策略比较 调度策略 | 匹配标签 | 操作符 | 拓扑域支持 | 调度目标 ---|---|---|---|--- nodeAffinity | 主机|In, NotIn, Exists, DoesNotExist, Gt, Lt | 否| pod到指定主机 podAffinity |Pod |In, NotIn, Exists, DoesNotExist| 是 | pod与指定pod同一拓扑域 PodAntiAffinity|Pod| In, NotIn, Exists, DoesNotExist |是|pod与指定pod非同一拓扑域