(1)nodeSelector
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 1 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
containers: #列表所以下面会有-
- name: nginx-deployment #镜像
image: nginx:1.15
nodeSelector:
app: en
(2)nodeName
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 1 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
nodeName: k8s-node1 #指定分配节点
containers: #列表所以下面会有-
- name: nginx-deployment #镜像
image: nginx:1.15
(1)nodeAffinity 硬亲和
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 1 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #硬亲和
nodeSelectorTerms:
- matchExpressions:
- key: app #表示有标签是app值为en或者bar
operator: In
values:
- en
- bar
containers: #列表所以下面会有-
- name: nginx
image: nginx:1.15
(2)nodeAffinity 软亲和
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 1 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution: #软亲和,没有匹配也可以创建
- preference:
matchExpressions:
- key: app
operator: In
values:
- haha
- bar
weight: 60
containers: #列表所以下面会有-
- name: nginx
image: nginx:1.15
(1)目的
就是为了让一组pod运行或者不运行在一起
(2)标准
①以第一个pod所在的节点或者现在很多pod所在的节点为评判,后续pod能否到他这个节点的方式就叫Pod亲和性
②判断pod亲和性需要有个标准,就是说比如服务器A B C D,如果按照名字分类那么A B C D分别为4种类型,那么我们判断Pod亲和性的话就是说,当所有pod在A上某一个单个的节点的时候,我们可以认为是亲和的,当然如果说A B 有相同标签app:nginx,那么如果按照标签来判断Pod亲和性,我们就可以认为在A 和B 上的同一组pod是由亲和性的,要有一个区分的标准
(3)亲和的区别
①硬亲和
必须在同一个区域内
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 1 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
containers: #列表所以下面会有-
- name: nginx-deployment #镜像
image: nginx:1.15
imagePullPolicy: IfNotPresent
affinity:
podAffinity: #这个pod找在它本身命名空间下的有以下标签的pod按照判断标准划分在同一区域内
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app #有标签app=nginx-01
operator: In
values:
- nginx-01
topologyKey: kubernetes.io/hostname #判断标准为hostname相同
②软亲和
尽量在同一个区域内
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 1 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
containers: #列表所以下面会有-
- name: nginx-deployment #镜像
image: nginx:1.15
imagePullPolicy: IfNotPresent
affinity:
podAntiAffinity: #这个pod找在它本身命名空间下的有以下标签的pod按照判断标准尽量的划分在同一区域内
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app #有标签app=nginx-01
operator: In
values:
- nginx-01
topologyKey: kubernetes.io/hostname #判断标准为hostname相同
注意:有可能因为节点少所以无法测试效果
官网文档:https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
(1)含义
给了节点能选择让拿一些pod调度到上面,污点就是定义在节点上面的键值属性数据
键值属性数据分为三类:
①标签
②注解
③污点
污点一般用在节点之上,而标签和注解所有资源对象都可以使用
taint的effect定义对Pod排斥效果:
NoSchedule:仅影响调度过程,对现存的Pod对象不产生影响;
NoExecute:既影响调度过程,也影响现在的Pod对象;不容忍的Pod对象将被驱逐;
PreferNoSchedule:柔性版本,不能容忍就没办法调度过来,但是如果其他资源不够,也可以过来
在Pod定义容忍度的时候
等值比较:容忍度和污点必须在key和value相同
存在性判断:key和
一个节点可以有多个污点,一个Pod可以有多个容忍
节点的每一个污点都要被容忍,如果有一个不能容忍,那么就得看五点的效果是什么
(2)定义node污点
kubectl taint node k8s-node1 node_type=production:NoSchedule
Node 资源类型
k8s-node1 资源对象
node_type
key Production
value NoSchedule 污点的类型
(3)定义Pod容忍度
例①
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 3 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
containers: #列表所以下面会有-
- name: nginx-deployment #镜像
image: nginx:1.15
imagePullPolicy: IfNotPresent
tolerations:
- key: "node_type"
operator: "Equal" #可以写Exists或者Equal,Exists表示只要有key就可以,值一样不一样无关紧要,而Equal表示精准匹配,不光得有key而且value必须是相同的才可以
value: "production"
effect: "NoSchedule" #如果这里选择NoExecute那么就可以定义被驱逐的时候等多久在被驱逐
# tolerationSeconds: 30 #如果污点类型发生变化以后要被驱逐,那么等30s以后被驱逐
例②
tolerations:
- key: “node_type”
operator: “Exists” #可以写Exists或者Equal,Exists表示只要有key就可以,值一样不一样无关紧要,而Equal表示精准匹配,不光
得有key而且value必须是相同的才可以
value: “”
effect: “NoSchedule”
# tolerationSeconds: 30
#使用Exists的时候如果effect有值的话那么就表示key必须相同,value可以忽略,effect必须相同
#如果effect没值的话,那么就是说key必须相同,value和effect可以模糊匹配