nodeName
使Pod调度到指定节点
...
spec:
nodeName: <k8s节点的名称>
...
hostPort
使用的是宿主的ip+端口,只可以调度一个,多余的会pending,因为端口被占用
...
spec:
containerd:
ports:
- containerPort: 80 #容器内的端口
hostPort: 8080 #对外暴露的端口
...
资源限制(resource)
资源限制
...
spec:
containerd:
resources:
requests:
memory: "64Mi" #期望
cpu: "250m" #最大占用
limits:
memory: "128Mi" #期望
cpu: "500m" #最大占用
...
资源配额(resourceQouta)
基于
名称空间
来进行资源限制
apiVersion: v1
kind: ResourceQuota
metadata:
name: object-counts
namespace: kube-public
spec:
# 定义硬性配置
hard:
# 此命名空间最大创建的Pod数量
pods: "10"
# 此命名空间最大的创建的deploy数量
count/deployments.apps: "3"
# 此命名空间最大的创建的svc数量
count/services: "3"
限制范围(LimitRange)
能够限制名称空间的cpu和内存的最大最小资源,如果Pod不再此范围里,那么会Pending
spec:
limits:
- max:
cpu: "2" # 每个容器的最大CPU限制
memory: "1Gi" # 每个容器的最大内存限制
min:
cpu: "100m" # 每个容器的最小CPU限制
memory: "128Mi" # 每个容器的最小内存限制
default:
cpu: "500m" # 每个容器的默认CPU请求
memory: "256Mi" # 每个容器的默认内存请求
defaultRequest:
cpu: "200m" # 每个容器的默认CPU请求(如果未指定)
memory: "256Mi" # 每个容器的默认内存请求(如果未指定)
type: Container
- max:
cpu: "4" # 每个Pod的最大CPU限制
memory: "2Gi" # 每个Pod的最大内存限制
min:
cpu: "200m" # 每个Pod的最小CPU限制
memory: "256Mi" # 每个Pod的最小内存限制
type: Pod
污点(taint)
使节点加入污点,如果Pod不配置污点容忍则永远不会调度到该节点
# 添加一个 Taint,使节点只接受特定 Pods
kubectl taint nodes <node-name> key=value:NoSchedule
# 添加一个 Taint,允许 Pods 调度到节点,但会发出警告
kubectl taint nodes <node-name> key=value:PreferNoSchedule
# 添加一个 Taint,使节点不接受任何 Pods,除非 Pods 有相应的 Tolerations
kubectl taint nodes <node-name> key=value:NoExecute
#注意:添加污点可以不设置value,可以直接写成key=:污点类型
污点类型介绍
NoSchedule # 已经有的Pod不会驱逐,但不接受新的Pod
PreferNoSchedule # 尽量不调度到该节点,如果其他节点调度不上,那么才会调度此节点
NoExecute # 已经有的Pod会被驱逐,新的Pod也不接受
污点容忍(tilerasions)
某节点配置了污点,如果还想调度到该节点,那么需要配置污点容忍
例如该节点配置了kubectl taint nodes master01 taint=NoSchedule
...
spec:
nodeName: master01
tolerasions:
- key: "taint"
#Exists:只要key存在,不论值是什么,都匹配
#Equal:为默认,表示 key和value都必须匹配。
operator: "Exists"
#value: "因为此污点没有值,所以可以为空"
effect: "NoSchedule"
节点选择器(nodeSelector)
基于节点的标签关联节点,将Pod调度到包含指定标签的节点
如果指定的节点上有污点
,需要配置污点容忍
给节点打标签
- kubectl label nodes worker233 disktype=ssd
- kubectl get nodes --show-labels | grep disktype
...
spec:
nodeSelector:
# 标签的key和value
disktype: ssd
...
驱逐(drain)
将指定节点上的所有Pod(包括系统创建的Pod),全部驱逐到其他节点上
驱逐的本身就是打上污点
,并标记节点为不可调度状态
kubectl drain <node-name> --ignore-daemonsets
标记不可调度(cordon)
让这个节点不可调度,不会驱逐已经存在的Pod
本质上是打了污点
,并标记不可调度
如果去掉标记可以使用kubectl uncordon <node-name>
kubectl cordon <node-name>
节点亲和性(nodeAffinity)
如果一个资源清单要想选择节点标签的 KEY 一样,但互相的值不一样,则可以使用节点亲和性
假设你有一个节点带有标签 maqinghang=[test1|test2],你希望 Pod 只调度到这样的节点上:
环境准备 kubectl label nodes <nodename> maqinghang=test1; kubectl label nodes <nodename> maqinghang=test2
...
spec:
# 亲和性配置
affinity:
# 节点亲和性
nodeAffinity:
# 硬限制表示必须满足的条件
requiredDuringSchedulingIgnoredDuringExecution:
# 匹配节点选择器
nodeSelectorTerms:
# 基于标签匹配节点
- matchExpressions:
# 匹配节点的标签的key
- key: maqinghang
# 匹配节点的标签的value
values:
- test1
- test2
# 指定key和values之间的关系,有效值为: In, NotIn, Exists, DoesNotExist. Gt, and Lt
# 当值为In, NotIn,则必须定义values的值,不能为空。
# 当值为Exists, DoesNotExist,则values必须为空。
# 当值为Gt, Lt,则values的元素只能有一个且是个数字。
operator: In
...
Pod亲和性(PodAffinity)
如果进行Pod调度的时候,第一个Pod落到了某一个节点,那么之后所有的Pod都会落到这个节点
环境准备kubectl label nodes <nodename> dc=test1; kubectl label nodes <nodename> dc=test2;kubectl label nodes <nodename> dc=test3
...
spec:
# 配置亲和性
affinity:
# Pod亲和性
podAffinity:
# 硬限制表示必须满足的条件
requiredDuringSchedulingIgnoredDuringExecution:
# 指定Pod的拓扑域,比如基于数据中心来实现调度
- topologyKey: dc
# 配置关联的Pod
labelSelector:
matchLabels:
apps: v1
...
Pod反亲和性(podAntiAffinity)
如何一个一节被调度了第一个Pod后,那么该节点不会被调度第二个,会向其他节点调度,如果每个节点都被调度了,那么多余的会处于Pending状态
环境准备:kubectl label nodes <nodename> dc=test1; kubectl label nodes <nodename> dc=test2;kubectl label nodes <nodename> dc=test3
...
spec:
# 配置亲和性
affinity:
# Pod反亲和性
podAntiAffinity:
# 硬限制表示必须满足的条件
requiredDuringSchedulingIgnoredDuringExecution:
# 指定Pod的拓扑域,比如基于数据中心来实现调度
- topologyKey: dc
# 配置关联的Pod
labelSelector:
matchLabels:
apps: v1
...