kubetnetes-pod调度
亲和性
NodeAffinity(node节点亲和)
yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo-node
namespace: dev
spec:
selector:
matchLabels:
app: web-demo-node
replicas: 1
template:
metadata:
labels:
app: web-demo-node
spec:
containers:
- name: web-demo-node
image: tomcat:8-slim
ports:
- containerPort: 8080
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #必须达到一下条件
nodeSelectorTerms: # 节点选择
- matchExpressions: # 搜索条件
- key: beta.kubernetes.io/arch # 指点的键beta.kubernetes.io/arch
operator: In #运算符In
values: # 键的值
- amd64
preferredDuringSchedulingIgnoredDuringExecution: #最好达到的条件
- weight: 1 # 权重
preference:
matchExpressions: # 搜索
- key: kubernetes.io/hostname #指定键disktype
operator: NotIn # 运算符Notin
values: # 键的值
- vmware-113
- vmware-112如何获取node节点的标签
1
kubectl get nodes -n [namespace] --show-labels
PodAffinity(Pod亲和性)
yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo-pod
namespace: dev
spec:
selector:
matchLabels:
app: web-demo-pod
replicas: 1
template:
metadata:
labels:
app: web-demo-pod
spec:
containers:
- name: web-demo-pod
image: chcgolang/frps
ports:
- containerPort: 7500
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #必须达到一下条件
- labelSelector: # 便签选择
matchExpressions: # 搜索条件
- key: app # 键
operator: In #匹配条件
values:
- web-demo #值
topologyKey: kubernetes.io/hostname
preferredDuringSchedulingIgnoredDuringExecution: #最好达到的条件
- weight: 100 #权重
podAffinityTerm:
labelSelector:
matchExpressions:
- key: pod-template-hash # 键
operator: In #条件
values:
- 5db95f77cf #值
topologyKey: kubernetes.io/hostname
如何查看pod节点标签
1
kubectl get pod -n [namespace] --show-labels
PodAnitAffinity(Pod反亲和性)
和
PodAffinity意思相反,PodAffinity和PodAnitAffinity可以同时存在yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo-podanti
namespace: dev
spec:
selector:
matchLabels:
app: web-demo-podanti
replicas: 1
template:
metadata:
labels:
app: web-demo-podanti
spec:
containers:
- name: web-demo-podanti
image: chcgolang/frps
ports:
- containerPort: 7500
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #必须达到一下条件
- labelSelector: # 便签选择
matchExpressions: # 搜索条件
- key: app # 键
operator: In #匹配条件
values:
- web-demo #值
topologyKey: kubernetes.io/hostname
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution: #最好达到的条件
- weight: 100 #权重
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app # 键
operator: In #条件
values:
- web-demo-node #值
topologyKey: kubernetes.io/hostname
如何查看pod节点标签
1
kubectl get pod -n [namespace] --show-labels
参数说明
requiredDuringSchedulingIgnoredDuringExecution:一定要达到的条件
preferredDuringSchedulingIgnoredDuringExecution:达到上面条件的基础上,最好也达到这个要求
键值运算关系
运算符 作用 In label的值在某个列表中 Notin label的值不在某个列表中 Gt label的值大于某个值 Lt label的值小于某个值 Exists 某个label存在 DesNotExist 某个label不存在
污点(Taint)和容忍(Tolerations)
污点(Taint)
Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上
污点设置,查看和去除
1 | # 设置污点 |
effect的选项参数 作用 NoSchedule 表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上 PreferNoSchedule 表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上 NoExecute 表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去
容忍(Tolerations)
设置了容忍的 Pod 将可以容忍污点的存在,可以被调度到存在污点的 Node 上
添加污点
1
kubectl taint nodes vmware-112 cpu=err:NoExecute
yaml(
pod.spec.tolerations)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo-label
namespace: dev
spec:
selector:
# 匹配的标签
matchLabels:
# 匹配的key-value
app: web-demo
replicas: 1
template:
metadata:
# 创建标签的名字
labels:
# 定义的标签key-value
app: web-demo
spec:
nodeSelector:
disktype: ssd # 选择node标签为disktype: ssd的机器
tolerations: # 容忍的污点设置
- key: cpu # 污点的key
operator: Equal
value: err # 污点的value
effect: NoExecute # 污点的effect
tolerationSeconds: 3600 #当 Pod 需要被驱逐时可以在 Pod 上继续保留运行的时间
containers:
- name: web-demo
image: tomcat:8-slim
ports:
- containerPort: 8080
#service
apiVersion: v1
kind: Service
metadata:
name: web-demo
namespace: dev
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
# service选择带有app: web-demo标签的pod
app: web-demo
type: ClusterIP
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-demo
namespace: dev
spec:
rules:
- host: web-dev.chclabel.com
http:
paths:
- path: /
backend:
serviceName: web-demo
servicePort: 8080注意点
- 其中
key, vaule, effect要与 Node 上设置的 taint 保持一致 operator的值为 Exists 将会忽略 value 值tolerationSeconds用于描述当 Pod 需要被驱逐时可以在 Pod 上继续保留运行的时间
- 其中
当不指定 key 值时,表示容忍所有的污点 key:
1
2tolerations:
- operator: Exists当不指定 effect 值时,表示容忍所有的污点作用
1
2
3tolerations:
- key: key
operator: Exists有多个 Master 存在时,防止资源浪费,可以如下设置
1
kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule
配置的意思:尽可能不要在master节点部署pod
也就是当worker节点资源不足时,就可以在master节点部署pod
污点的应用场景
- 当某个worker节点需要停止下来时,可以使用污点将所有的pod驱离
- 某个节点的机器性能弱时,可以使用污点尽量不让pod部署进来
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Chc-个人数据程序主页!





