K8S之节点亲和性调度
节点亲和性规则:
required(硬亲和性,不能商量,必须执行) 、preferred(软亲和性,可以商量,选择执行)。
1)硬亲和性规则不满足时,Pod会置于Pending状态,软亲和性规则不满足时,会选择一个不匹配的节点
2)当节点标签改变而不再符合此节点亲和性规则时,不会将Pod从该节点移出,仅对新建的Pod对象生效
节点硬亲和性
requiredDuringSchedulingIgnoredDuringExecution
1)方式一:Pod使用 spec.nodeSelector (基于等值关系);Pod使用 spec.nodeName
2)方式二:Pod使用 spec.affinity 支持matchExpressions属性 (复杂标签选择机制)
全部资源文件清单
controller
labels/mariadb.yml,删除spec.selectNode或者spec.nodeName信息。
技能点概述:Pod.sepc.affinity
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname #node节点的标签
operator: In
values:
- k8s-node02 #集群真实节点名称
可以先使用命令获得节点标签及真实节点名称:
kubectl get nodes --show-labels
键值运算关系
In:label 的值在某个列表中
NotIn:label 的值不在某个列表中
Gt:label 的值大于某个值
Lt:label 的值小于某个值
Exists:某个 label 存在
DoesNotExist:某个 label 不存在
全部文件清单
apiVersion: apps/v1
kind: Deployment
metadata:
name: mariadb-deploy
labels:
app: mariadb-deploy
spec:
replicas: 1
template:
metadata:
name: mariadb-deploy
labels:
app: mariadb-deploy
spec:
imagePullSecrets:
- name: lagouharbor
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname #node节点的标签
operator: In
values:
- k8s-node02
containers:
- name: mariadb-deploy
image: 192.168.198.155:5000/lagouedu/mariadb:10.5.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3307
env:
- name: MYSQL_ROOT_PASSWORD
#这是mysqlroot用户的密码
valueFrom:
secretKeyRef:
key: password
name: mariadbsecret
- name: TZ
value: Asia/Shanghai
args:
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_unicode_ci"
volumeMounts:
- mountPath: /etc/mysql/mariadb.conf.d/ #容器内的挂载目录
name: lagoumariadb #随便给一个名字,这个名字必须与volumes.name一致
restartPolicy: Always
volumes:
- name: lagoumariadb
configMap:
name: mariadbconfigmap
selector:
matchLabels:
app: mariadb-deploy
---
apiVersion: v1
kind: Service
metadata:
name: mariadb-svc
spec:
selector:
app: mariadb-deploy
ports:
- port: 3307
targetPort: 3307
nodePort: 30036
type: NodePort
secret
labels/mariadbsecret.yml
apiVersion: v1
kind: Secret
metadata:
name: mariadbsecret
type: Opaque
data:
password: YWRtaW4=
configmap
labels/mariadb.yml
apiVersion: v1
data:
my.cnf: "省略中间数据部分,请各位同学前面章节"
kind: ConfigMap
metadata:
name: mariadbconfigmap
错误节点信息
如果我们选择的节点不存在,pod状态会一直处于Pending。例如:
Pod.sepc.affinity
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname #node节点的标签
operator: In
values:
- k8s-node05 #集群真实节点名称
集群中不存在k8s-node05的节点。当我们部署服务时,查看pod信息,会发现pod一直处于Pending
kubectl apply -f .
kubectl get pods -o wide
查看pod详细信息:发现提示没有节点的提示。
kubectl describe pods mariadb-deploy-9d5457866-rxcr2
节点软亲和性
preferredDuringSchedulingIgnoredDuringExecution
1)柔性控制逻辑,当条件不满足时,能接受被编排于其他不符合条件的节点之上
2)权重 weight 定义优先级,1-100 值越大优先级越高
全部资源文件清单
controller
labels/mariadb.yml,删除spec.selectNode或者spec.nodeName信息。
技能点概述:Pod.sepc.affinity
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node02
weight: 1
可以先使用命令获得节点标签及真实节点名称:
kubectl get nodes --show-labels
键值运算关系
In:label 的值在某个列表中
NotIn:label 的值不在某个列表中
Gt:label 的值大于某个值
Lt:label 的值小于某个值
Exists:某个 label 存在
DoesNotExist:某个 label 不存在
全部文件清单
apiVersion: apps/v1
kind: Deployment
metadata:
name: mariadb-deploy
labels:
app: mariadb-deploy
spec:
replicas: 1
template:
metadata:
name: mariadb-deploy
labels:
app: mariadb-deploy
spec:
nodeSelector:
mariadb: mariadb
imagePullSecrets:
- name: lagouharbor
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node02
weight: 1
containers:
- name: mariadb-deploy
image: 192.168.198.155:5000/lagouedu/mariadb:10.5.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3307
env:
- name: MYSQL_ROOT_PASSWORD
#这是mysqlroot用户的密码
valueFrom:
secretKeyRef:
key: password
name: mariadbsecret
- name: TZ
value: Asia/Shanghai
args:
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_unicode_ci"
volumeMounts:
- mountPath: /etc/mysql/mariadb.conf.d/ #容器内的挂载目录
name: lagoumariadb #随便给一个名字,这个名字必须与volumes.name一致
restartPolicy: Always
volumes:
- name: lagoumariadb
configMap:
name: mariadbconfigmap
selector:
matchLabels:
app: mariadb-deploy
---
apiVersion: v1
kind: Service
metadata:
name: mariadb-svc
spec:
selector:
app: mariadb-deploy
ports:
- port: 3307
targetPort: 3307
nodePort: 30036
type: NodePort
secret
labels/mariadbsecret.yml
apiVersion: v1
kind: Secret
metadata:
name: mariadbsecret
type: Opaque
data:
password: YWRtaW4=
configmap
labels/mariadb.yml
apiVersion: v1
data:
my.cnf: "省略中间数据部分,请各位同学前面章节"
kind: ConfigMap
metadata:
name: mariadbconfigmap
错误节点信息
如果我们选择的节点不存在,pod状态会一直处于Pending。例如:
Pod.sepc.affinity
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node05
weight: 1
集群中不存在k8s-node05的节点。当我们部署服务时,查看pod信息,会发现pod一直处于Pending
kubectl apply -f .
kubectl get pods -o wide
查看pod详细信息:发现提示没有节点的提示。
kubectl describe pods mariadb-deploy-9d5457866-rxcr2
Pod资源亲和调度
Pod硬亲和调度
requiredDuringSchedulingIgnoredDuringExecution
Pod亲和性描述一个Pod与具有某特征的现存Pod运行位置的依赖关系;即需要事先存在被依赖的Pod对象
Pod软亲和调度
Pod软亲和调度用于分散同一类应用,调度至不同的区域、机架或节点等.将 spec.affinity.podAffinity 替换为 spec.affinity.podAntiAffinity 。软亲和调度也分为柔性约束和强制约束