文章目录
一、kube-scheduler
就是一个调度pod的一个组件 具体步骤有两个过滤、打分
调度策略 允许你配置过滤所用的 断言(Predicates) 和打分所用的 优先级(Priorities)。
调度配置 允许你配置实现不同调度阶段的插件, 包括:QueueSort、Filter、Score、Bind、Reserve、Permit 等等。 你也可以配置 kube-scheduler 运行不同的配置文件.
二、节点的调度
分析下面例子
apiVersion: v1
kind: Pod
metadata:
name: pod-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #设置强亲和
nodeSelectorTerms:
- matchExpressions:
- key: giant
operator: In #operator的选项有 NotIn In Exists DoesNotExsit Gt Lt
values:
- fox
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1 #权重 当强亲和没有相对于的标签时 软亲和力就上场了 weight表示pod在此标签下分配的比例,例如weight 1和weight 2 比例就为1:2
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value #写法类似
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
matchExpressions:
- key: xiao
operator: In
values:
- mei
containers:
- name: nignx
image: nginx:latest
imagePullPolicy: IfNotPresent
我们也可以采用一个比较直接的方式 nodeselector
nodeSelector 是节点选择约束的最简单推荐形式。你可以将 nodeSelector 字段添加到 Pod 的规约中设置你希望目标节点所具有的节点标签。 Kubernetes 只会将 Pod 调度到拥有你所指定的每个标签的节点上。
亲和性与反亲和性节点亲和性功能类似于 nodeSelector 字段,但它的表达能力更强,并且允许你指定软规则。
Pod 间亲和性/反亲和性允许你根据其他 Pod 的标签来约束 Pod。
apiVersion: v1
kind: Pod
metadata:
name: pod-sele
spec:
nodeSelector:
giant: fox
containers:
- name: nginx
image: nginx:latest
# 注意 在我们使用nodeselector或者节点亲和性时 确保节点存在对应的标签
kubectl label node name giant=fox
即给XXX打上giant: fox的标签
说明:
如果你同时指定了
nodeSelector
和nodeAffinity
,两者 必须都要满足, 才能将 Pod 调度到候选节点上。如果你指定了多个与
nodeAffinity
类型关联的nodeSelectorTerms
, 只要其中一个nodeSelectorTerms
满足的话,Pod 就可以被调度到节点上。如果你指定了多个与同一
nodeSelectorTerms
关联的matchExpressions
, 则只有当所有matchExpressions
都满足时 Pod 才可以被调度到节点上。
Pod 间亲和性与反亲和性
同样观察下面实例
piVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: topology.kubernetes.io/zone
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
topologyKey: topology.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: registry.k8s.io/pause:2.0
本示例定义了一条 Pod 亲和性规则和一条 Pod 反亲和性规则。Pod 亲和性规则配置为
requiredDuringSchedulingIgnoredDuringExecution
,而 Pod 反亲和性配置为preferredDuringSchedulingIgnoredDuringExecution
。亲和性规则表示,仅当节点和至少一个已运行且有
security=S1
的标签的 Pod 处于同一区域时,才可以将该 Pod 调度到节点上。 更确切的说,调度器必须将 Pod 调度到具有topology.kubernetes.io/zone=V
标签的节点上,并且集群中至少有一个位于该可用区的节点上运行着带有security=S1
标签的 Pod。反亲和性规则表示,如果节点处于 Pod 所在的同一可用区且至少一个 Pod 具有
security=S2
标签,则该 Pod 不应被调度到该节点上。 更确切地说, 如果同一可用区中存在其他运行着带有security=S2
标签的 Pod 节点, 并且节点具有标签topology.kubernetes.io/zone=R
,Pod 不能被调度到该节点上。
名字空间选择算符
用户也可以使用namespaceSelector
选择匹配的名字空间,namespaceSelector
是对名字空间集合进行标签查询的机制。 亲和性条件会应用到namespaceSelector
所选择的名字空间和namespaces
字段中所列举的名字空间之上。 注意,空的namespaceSelector
({}
)会匹配所有名字空间,而 null 或者空的namespaces
列表以及 null 值namespaceSelector
意味着“当前 Pod 的名字空间”
节点的污点和容忍度
节点亲和性 是 Pod 的一种属性,它使 Pod 被吸引到一类特定的节点 (这可能出于一种偏好,也可能是硬性要求)。 污点(Taint) 则相反——它使节点能够排斥一类特定的 Pod。
容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度但并不保证调度:作为其功能的一部分, 调度器也会评估其他参数。
污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod, 是不会被该节点接受的
kubectl taint nodes node1 key1=value1:NoSchedule 给node打上污点
kubectl taint nodes node1 key1=value1:NoSchedule- 移除污点
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
给pod设置tolerations容忍度 只有容忍度与污点相匹配才能调度
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "example-key"
operator: "Exists"
effect: "NoSchedule"# 当operator使用exists时 不能写入values 当operator为Equal 则他们的value应该相等
如果一个容忍度的key为空且operator为exists 表示这个容忍度与任意的key value effect都匹配 就是这个容忍度能容忍任何污点
上述例子中 effect
使用的值为 NoSchedule
,你也可以使用另外一个值 PreferNoSchedule
。 这是“优化”或“软”版本的 NoSchedule
—— 系统会 尽量 避免将 Pod 调度到存在其不能容忍污点的节点上, 但这不是强制的。effect
的值还可以设置为 NoExecute
结语:
云计算 kubernetes的学习日志,详细文献可以查阅kubernetes的官方文档