k8s pod节点调度及k8s资源优化
一、k8s pod 在节点间调度控制
k8s起pod时,会通过调度器scheduler选择某个节点完成调度,选择在某个节点上完成pod创建。
当需要在指定pod运行在某个节点上时,可以通过以下几种方式:
1. 在部署pod的yaml中,指定nodeName
指定了nodeName的Pod会直接跳过Scheduler的调度逻辑,直接写入PodList列表,该匹配规则是强制匹配。
eg:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 1
template:
metadata:
labels:
app: tomcat-app
spec:
nodeName: k8s.node1 #指定调度节点为k8s.node1
containers:
- name: tomcat
image: tomcat:8.0
ports:
- containerPort: 8080
2. 在部署pod的yaml中,指定NodeSelector
通过kubernetes的label-selector机制进行节点选择,由scheduler调度策略MatchNodeSelector进行label匹配,调度pod到目标节点,该匹配规则是强制约束。启用节点选择器的步骤为:
起pod步骤:
i. 先给node打上对应的label
#标记规则:kubectl label nodes <node-name> <label-key>=<label-value>
kubectl label nodes k8s.node1 cloudnil.com/role=dev
#确认标记
root@k8s.master1:~# kubectl get nodes k8s.node1 --show-labels
NAME STATUS AGE LABELS
k8s.node1 Ready 29d beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,cloudnil.com/role=dev,kubernetes.io/hostname=k8s.node1
ii. 起pod的时候,在yaml中指定nodeSelector
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 1
template:
metadata:
labels:
app: tomcat-app
spec:
nodeSelector:
cloudnil.com/role: dev #指定调度节点为带有label标记为:cloudnil.com/role=dev的node节点
containers:
- name: tomcat
image: tomcat:8.0
ports:
- containerPort: 8080
3. 使用污点(Taint)
taint是k8s 1.6版本开始提供的功能,在k8s同样用于节点调度的,还有一个容忍(Tolerations)功能
污点的组成为
key=value:effect
effect支持的类型包括一下三类:
NoSchedule:表示k8s将不会将Pod调度到具有该污点的Node上
PreferNoSchedule:表示k8s将尽量避免将Pod调度到具有该污点的Node上
NoExecute:表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去
当希望起pod的时候,某个node不参与调度,可以给这个node加上一个NoSchedule的污点,eg:
# 设置污点
kubectl taint nodes kube-node1 key1=value1:NoSchedule
# 去除污点
kubectl taint nodes kube-node1 key1:NoSchedule-
此污点可以通过kubectl describe node <xxx-node> 查看
4. 容忍(tolerance)
当参与taint给node打算NoSchedule的污点之后,pod无法调度到该节点上运行,但有时我们希望某些pod仍然能运行到该node上时,可以通过在部署pod的yaml中添加tolerance,使pod能跳过污点,调度到对应节点上:
eg:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
tolerationSeconds: 3600
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
- key: "key2"
operator: "Exists"
effect: "NoSchedule"
其中:
operator为Equal时,key, vaule, effect要与Node上设置的taint保持一致
operator为Exist时,将会忽略value的值
tolerationSeconds指当pod需要被驱逐时,仍能在node上保留运行的时间
当tolerance不指定effect时,将容忍污点的所有作用
tolerations:
- key: "key"
operator: "Exists"
5. cordon/uncordon/drain
这几个命令用于k8s节点维护,用法:
kubectl cordon <xxx-node>
此时通过
kubectl get node -o wide
可以看到node的状态为scheduleDisable,即该节点为不可调度状态。
可以通过uncordon来恢复node状态:
kubectl uncordon <xxx-node>
当cordon node之后,原来运行在node上的pod,当超过保活周期之后,将会重新调度在其他node上运行。如果想让pod马上实现迁移,可以使用drain完成。
drain:标记节点为不可调度,并驱逐节点上的pod,用法:
kubectl drain <xxx-node>
注意:drain不只是当node被cordon时才适用,其实当node正常运行时,也可以用drain将运行在该node的pod驱赶出去
二、k8s(node节点资源)优化设置
在k8s节点中通过ExecStart=/usr/bin/kubelet设置系统保留资源来提高node节点的稳定行。
涉及到的参数:1.--system-reserved
2.--kube-reserved
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
添加参数:
1:设置预留系统服务的资源
--system-reserved=cpu=200m,memory=1G
2:设置预留给k8s组件的资源(主要组件)
--kube-reserved=cpu=200m,memory=1G
系统内存--sytem-reserved --kube-reserved就是可以分配给pod的内存
3.驱逐条件
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefsavailable<100Gi
4.最小驱逐
--eviction-minimum-reclaim="memory.available<0Mi,nodefs.available<500Mi,imagefsavailable<2Gi"
5.节点状态更新时间
--node-status-update-frequency=10s
6.驱逐等待时间
--eviction-pressure-transition-period=20s
k8s pod节点调度及k8s资源优化的更多相关文章
- K8s Scheduler 在调度 pod 过程中遗漏部分节点的问题排查
问题现象 在TKE控制台上新建版本为v1.18.4(详细版本号 < v1.18.4-tke.5)的独立集群,其中,集群的节点信息如下: 有3个master node和1个worker node, ...
- k8s之list-watch机制、节点调度以及亲和性
k8s之list-watch机制.节点调度以及亲和性 目录 k8s之list-watch机制.节点调度以及亲和性 一.list-watch机制 1. list-watch介绍 2. list-watc ...
- [k8s]zookeeper集群在k8s的搭建(statefulset模式)-pod的调度
之前一直docker-compose跑zk集群,现在把它挪到k8s集群里. docker-compose跑zk集群 zk集群in k8s部署 参考: https://github.com/kubern ...
- 容器编排系统K8s之节点污点和pod容忍度
前文我们了解了k8s上的kube-scheduler的工作方式,以及pod调度策略的定义:回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14243312.ht ...
- Serverless 如何应对 K8s 在离线场景下的资源供给诉求
本文整理自腾讯云云原生产品团队的专家产品经理韩沛在 Techo 开发者大会云原生专题的分享内容--Kubernetes 混部与弹性容器.本次分享主要分为三部分:基于 K8s 的应用混部.提升应用混部效 ...
- 十五,K8S集群调度原理及调度策略
目录 k8s调度器Scheduler Scheduler工作原理 请求及Scheduler调度步骤: k8s的调用工作方式 常用预选策略 常用优先函数 节点亲和性调度 节点硬亲和性 节点软亲和性 Po ...
- 深入掌握K8S Pod
k8s系列文章: 什么是K8S K8S configmap介绍 Pod是k8s中最小的调度单元,包含了一个"根容器"和其它用户业务容器. 如果你使用过k8s的话,当然会了解pod的 ...
- k8s集群调度方案
Scheduler是k8s集群的调度器,主要的任务是把定义好的pod分配到集群节点上 有以下特征: 1 公平 保证每一个节点都能被合理分配资源或者能被分配资源 2 资源高效利用 集群所有资 ...
- pod(一):Kubernetes(k8s)创建pod的两种方式
目录 一.系统环境 二.前言 三.pod 四.创建pod 4.1 环境介绍 4.2 使用命令行的方式创建pod 4.2.1 创建最简单的pod 4.2.2 创建pod,指定镜像下载策略 4.2.3 创 ...
随机推荐
- PHPExcel 导出数据(xls或xlsx)- 助手类(函数)
本文链接:https://www.cnblogs.com/tujia/p/11358096.html 说明:简单好用的导出助手,轻松导出数据到 excel !! 使用示例: Example: Exce ...
- GO语言 文件操作实例
package main import ( "bufio" "fmt" "io/ioutil" "os" ) func ...
- mybatis批量新增或更新
mysql中在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE时,向数据库中插入一条记录: 若插入数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作(UPDA ...
- Dockerfile语法梳理
Dockerfile语法 我们先来看一下上篇的 Dockerfile #获取base image FROM adoptopenjdk/openjdk8:latest #类似于执行 linux指令 RU ...
- 【常用技巧】标准模板库(STL)
[常用技巧]标准模板库(STL) 在前几个章节中我们已经使用了诸如队列.堆.堆栈.vector 等标准模板库中的模板,切身感受到了它给我们带来的极大便利.在本节中,我们还要介绍两种标准模板——stri ...
- [QT] - 图片查看器(数码相框)#工程源码
简介: 大学期间弄的一个小软件,当时是将该软件移植到嵌入式开发板使用的,软件的几个功能截图如正文所示,文末提供工程源码文件,感谢支持! 功能截图: [ 打开软件 ] [ 打开图片 ] [ 图片可放大. ...
- Oracle中恢复drop掉的表中的数据
今天同事不小心把生产上的一张表直接drop掉了,没有做备份,哥们慌的一匹,来找我这个小白来帮忙解决,于是心血来潮简单总结一下. 其实在oralce中,用drop删掉一张表,其实不会真正的删除,只是把表 ...
- Haystack搜索框架
1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch,Whoosh ...
- 怎样使用U盘安装系统
准备工作 一个8G及以上的U盘: 软碟通UltraISO,下载地址,非免费,但试用就够了: 系统镜像,推荐去MSDN下载: 安装过程 利用U盘制作启动盘,准备好上述的东西,然后开始制作启动盘: 注意: ...
- DS DI ES SI等等
DS is called data segment register. It points to the segment of the data used by the running program ...