Kubernetes-项目中pod调度使用法则

简介: 前言kubernetes中部署的pod默认根据资源使用情况自动调度到某个节点。可在实际项目的使用场景中都会有更细粒度的调度需求,比如:某些pod调度到指定主机、某几个相关的服务的pod最好调度到一个节点上、Master节点不允许某些pod调度等。

前言


kubernetes中部署的pod默认根据资源使用情况自动调度到某个节点。可在实际项目的使用场景中都会有更细粒度的调度需求,比如:某些pod调度到指定主机、某几个相关的服务的pod最好调度到一个节点上、Master节点不允许某些pod调度等。使用kubernetes中的节点调度、节点亲和性、pod亲和性、污点与容忍可以灵活的完成pod调度,从而满足项目中较为复杂的调度需求。下面用一些项目中的使用场景聊聊pod调度使用法则。
微信图片_20181017110324.png

原创作者:钟亮

pod调度主要包含以下内容
  1. nodeSelector
  2. nodeAffinity
  3. podAffinityz
  4. Taints

指定节点调度
kubectl get nodes #获取当前Kubernetes集群全部节点
NAME STATUS ROLES AGE VERSION
dev-10 Ready <none> 45d v1.8.6
dev-7 Ready master 45d v1.8.6
dev-8 Ready <none> 45d v1.8.6
dev-9 Ready <none> 45d v1.8.6


nodeName
通过主机名指定pod调度到指定节点
spec:
 nodeName: dev-8 #设置要调度节点的名称
 containers:
 - image: nginx
 imagePullPolicy: Always
 name: my-nginx
 resources: {}
 terminationMessagePath: /dev/termination-log
 terminationMessagePolicy: File
 dnsPolicy: ClusterFirst
 restartPolicy: Always
 schedulerName: default-scheduler
 securityContext: {}
 terminationGracePeriodSeconds: 30


nodeSelector
kubernetes中常用label来管理集群的资源,nodeSelector可通过标签实现pod调度到指定节点上。

举列:使用nodeSelector将pod调度到dev-9节点上

step1:给dev-9打标签
kubectl label nodes dev-9 test=nginx #设置标签
kubectl get nodes --show-labels |grep test=nginx #查询标签是否设置成功


setp2:nodeSelector设置对应标签
spec:
 containers:
 - image: nginx
 imagePullPolicy: Always
 name: my-nginx
 resources: {}
 terminationMessagePath: /dev/termination-log
 terminationMessagePolicy: File
 dnsPolicy: ClusterFirst
 nodeSelector: #设置标签
 test: nginx
 restartPolicy: Always
 schedulerName: default-scheduler
 securityContext: {}
 terminationGracePeriodSeconds: 30

查询pod已经成功调度到dev-9节点

kcc get pods -o wide -n ns-team-1-env-1|grep my-nginx my-nginx-556dcc8c5c-27f7k 1/1 Running 0 2m 10.244.2.238 dev-9


nodeAffinity

node 节点 Affinity ,从字面上很容易理解nodeAffinity就是节点亲和性,Anti-Affinity也就是反亲和性。节点亲和性就是控制pod是否调度到指定节点,相对nodeSelector来说更为灵活,可以实现一些简单的逻辑组合。

nodeAffinity策略
preferredDuringSchedulingIgnoredDuringExecution #软策略,尽量满足
requiredDuringSchedulingIgnoredDuringExecution #硬策略,必须满足
根据具体一些常用场景感受下
场景1:必须部署到有 test=nginx 标签的节点
spec:
containers:
- name: with-node-affinity
image: nginx
affinity:
nodeAffinity:
 requiredDuringSchedulingIgnoredDuringExecution:
 nodeSelectorTerms:
 - matchExpressions:
 - key: test
 operator: In
 values:
 - nginx
场景2:最好部署到有test=nginx 标签的节点
spec:
containers:
- name: with-node-affinity
image: nginx
affinity:
nodeAffinity:
 preferredDuringSchedulingIgnoredDuringExecution:
 - weight: 1
 preference:
 matchExpressions:
 - key: test
 operator: In
 values:
 - nginx
场景3:不能部署在dev-7,dev-8节点;最好部署到有test=nginx标签的节点
spec:
containers:
- name: with-node-affinity
image: nginx
affinity:
nodeAffinity:
 requiredDuringSchedulingIgnoredDuringExecution:
 nodeSelectorTerms:
 - matchExpressions:
 - key: kubernetes.io/hostname
 operator: NotIn
 values:
 - dev-7
 - dev-8
 preferredDuringSchedulingIgnoredDuringExecution:
 - weight: 1
 preference:
 matchExpressions:
 - key: test
 operator: In
 values:
 - nginx

通过以上场景可以看出使用节点亲和性可灵活的控制pod调度到节点,实现一些有逻辑组合的调度

Kubernetes中的operator提供了下面几种过滤条件: - In:label 的值在某个列表中 - NotIn:label 的值不在某个列表中 - Gt:label 的值大于某个值 - Lt:label 的值小于某个值 - Exists:某个 label 存在 - DoesNotExist:某个 label 不存


podAffinity
nodeSelector和nodeAffinity 都是控制pod调度到节点的操作,在实际项目部署场景中,希望根据服务与服务之间的关系进行调度,也就是根据pod之间的关系进行调度,Kubernetes的podAffinity就可以实现这样的场景,podAffinity的调度策略和nodeAffinity类似也有:

requiredDuringSchedulingIgnoredDuringExecution

preferredDuringSchedulingIgnoredDuringExecution
场景:希望my-nginx服务my-busybox服务 最好部署在同一个节点上

my-nginx基本信息

apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: my-nginx #标签 app = my-nginx name: my-nginx namespace: ns-team-1-env-1 ... ...

my-busybox基本信息

apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: my-busybox #标签 app = my-busybox name: my-busybox namespace: ns-team-1-env-1 ... ...

在my-busybox设置pod亲和性

apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-busybox labels: app: my-busybox spec: containers: - name: my-busybox image: nginx affinity: podAffinity: #my-busybox 添加pod亲和性,与打了标签app = my-nginx的pod靠近 requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - my-nginx topologyKey: kubernetes.io/hostname

以上例子表示,有一个pod在运行,并且这个pod有标签是app=my-nginx,my-busybox这个pod就会

与其调度到同一个节点上,可预见因为上面我们的my-nginx已经调度到dev-9,因此my-nginx和 my-busybox都会在dev-9节点上查询到


Taints & tolerations

Taints:污点,tolerations:容忍。在实际项目实践中有时候不希望某些服务调度到指定节点上,比如master节点只运行Kubernetes 组件,应用服务不希望调度到master上。这种场景只需要在master节点设置一个污点。
#设置污点
kubectl taint nodes dev-7 system=service:NoSchedule

设置了污点就不能调度了么?No 如果设置了污点还是希望某些pod能够调度上去,可以给pod针对污点加容忍。
#添加容忍
tolerations:
- key: "system"
operator: "Equal"
value: "service"
effect: "NoSchedule"

添加了容忍system=service , 这样就可以调度到节点设置了污点:system=service:NoSchedule

的主机上,其他没有添加容忍的服务就不会调度到打了污点的节点上。 effect 有三种设置 - NoSchedule:pod不能调度到标记了taints的节点 - PreferNoSchedule:pod最好不要调度到标记了taints的节点 - NoExecute:设置了污点,马上踢出该节点中没有设置对应污点的Tolerate设置的pod


参考文档
https://kubernetes.io/docs/con ... node/
https://kubernetes.io/docs/con ... tion/

关于睿云智合
深圳睿云智合科技有限公司成立于2012年,总部位于深圳,并分别在成都、深圳设立了研发中心,北京、上海设立了分支机构,核心骨干人员全部为来自金融、科技行业知名企业资深业务专家、技术专家。早期专注于为中国金融保险等大型企业提供创新技术、电子商务、CRM等领域专业咨询服务。
自2016年始,在率先将容器技术引进到中国保险行业客户后,公司组建了专业的容器技术产品研发和实施服务团队,旨在帮助中国金融行业客户将容器创新技术应用于企业信息技术支持业务发展的基础能力改善与提升,成为中国金融保险行业容器技术服务领导品牌。

此外,凭借多年来在呼叫中心领域的业务经验与技术积累,睿云智合率先在业界推出基于开源软交换平台FreeSwitch的微服务架构多媒体数字化业务平台,将语音、视频、webchat、微信、微博等多种客户接触渠道集成,实现客户统一接入、精准识别、智能路由的CRM策略,并以容器化治理来支持平台的全应用生命周期管理,显著提升了数字化业务处理的灵活、高效、弹性、稳定等特性,为帮助传统企业向“以客户为中心”的数字化业务转型提供完美的一站式整体解决方案。

本文转自DockOne-Kubernetes-项目中pod调度使用法则

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
291 1
|
9月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
357 25
|
8月前
|
人工智能 Serverless 调度
突破地域限制,实现算力无限供给 —阿里云ACK One注册集群开启多地域Serverless算力调度
本文介绍了阿里云ACK One注册集群多地域Serverless算力调度解决方案,解决传统数据中心在AI时代面临的算力不足问题。方案通过分钟级接入、100%兼容Kubernetes操作及云上Serverless弹性,实现跨地域弹性算力供给,支持高并发请求与模型快速迭代。文中详细描述了快速接入步骤、指定地域调度及动态调度方法,并提供了相关代码示例。该方案助力企业实现AI推理服务的规模化部署,提升商业落地效率。
|
8月前
|
人工智能 Serverless 调度
突破地域限制,实现算力无限供给 -- 阿里云ACK One注册集群开启多地域Serverless算力调度
传统单地域算力难以支撑AI推理场景的高并发实时响应、突发高流量的要求,阿里云容器服务ACK One注册集群推出多地域Serverless算力调度方案完美解决此问题。
|
9月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
9月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
342 12
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
241 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
2007 10
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
242 1

推荐镜像

更多