Kubernetes-项目中pod调度使用法则
前言
pod调度主要包含以下内容
- nodeSelector
- nodeAffinity
- podAffinityz
- 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-9nodeAffinity
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调度使用法则
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Cloud Foundry和Kubernetes结合的过去与未来
过去的几年中,在云计算领域的开源社区中最有争议的话题莫过于Cloud Foundry和Kubernetes的关系。大家的疑问紧紧围绕着三个问题:“它们会互相取代对方吗?”,“它们是互斥的吗?” ,“还是说它们是可以融合的?”。放眼望去在目前的商业产品中,两者几乎没什么关联和集成,都可以运行在各种IaaS之上。 多年以来,我们一直从事Cloud Foundry部署的相关工作,从原来传统的BOSH CPI到现在的容器化Cloud Foundry的工作。在这期间,我们对两者结合的多种技术选型的进行探索,包括可行性分析、最佳实践、经验总结和价值意义等方面,旨在最大程度上利用和发挥两者的优势,并提升开发者体验。 本文将从Cloud Foundry部署的层面,来介绍业界和我们如何去把两套系统进行整合的。当然任何整合方案都会有各自的优缺点,而且所有的整合还在一个快速发展的阶段,所以在这里算是给大家抛砖引玉,为以后的工作和学习提供一些帮助。 Cloud Foundry和Kubernetes简介 Cloud Foundry Cloud Foundry是一个独立于云的平台即服务解决方案,也是业界最成功的P...
- 下一篇
选择Serverless还是Kubernetes?这种争辩并没有意义
这篇文章作者分别阐述了Kubernetes与Serverless的优缺点,实际上两者可能并不是竞争关系,在某些架构中,两者可以同时存在以满足不同的需求。但是最终的目的都是为了使应用程序部署更方便快捷,更易管理,更具成本效益以及对开发人员友好。 Kubernetes和Serverless都是令人兴奋的强大的平台,它们可以通过多种方式为企业在敏捷性,扩展性以及计算性能上获取巨大的提升。但是,不要忘记Kubernetes能提供一些Serverless所没有的功能,反之亦然。成功部署其中任何一个方案的关键点在于哪种技术更适用于当前的场景。 Kubernetes的兴起 Kubernetes是为大规模的云计算设计的,一开始就是因为Google使用了超大规模的部署才开发了Kubernetes。之后Kubernetes被改造成可以小规模使用,并且适用于大多数大型云提供商,这归功于它过去几年迅猛的发展。根据Cloud Native Computing Foundation(CNCF)的用户调查,Kubernetes的增长远超过所有其他形式的编排软件。 自首次亮相以来,Kubernetes已成为主流。但是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7设置SWAP分区,小内存服务器的救世主