Pod调度方式有,自动调度、定向调度、Node亲和性调度、Pod亲和性和互斥性调度
自动调度:Deployment/RC
自动调度就是采用Deployment或者是RC等对象完成一组Pod的调度与自动控制功能。
下面是一个简单的例子,没有特别的地方。
apiVersion: apps/v1
kind: Deployment metadata :
name: nginx-deploymet
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx :l.7.9
ports:
- containerPort: 80
定向调度:NodeSelector
前面提到的自动调度是通过master上的kube-schduler上的一系列复杂的调度算法实现的,通常我们是不知道Pod最终会被调度到某一个节点上。
NodeSelector的作用就是将Pod调度到我们指定的一些节点上
- 首先使用kubectl label 给节点打上标签:
#kubectl label nodes <node-name> <label-key>=<label-value>
$ kubectl label nodes k8s-node-1 zone=node-01
上述命令行操作也可以通过修改资源定义文件的方式 , 并执行 kubectl replace -f xxx.yaml命令来完成。
- 然后在Pod定义的对象中加入NodeSelector设置
apiVersion: apps/v1
kind: Deployment metadata :
name: nginx-deploymet
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
#NodeSelector设置 zone: node-01对应上面label中的zone:node-01
nodeSelector:
zone: node-01
containers:
- name: nginx
image: nginx :l.7.9
ports:
- containerPort: 80
Pod最终会运行在有zone: node-01标签的节点上。
除此之外,我们还可以在Pod定义中加入nodeName配置,指定Pod运行的具体节点。
apiVersion: apps/v1
kind: Deployment metadata :
name: nginx-deploymet
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
#nodeName设置 Pod有且只能运行在k8s-node-1节点上
nodeName: k8s-node-1
containers:
- name: nginx
image: nginx :l.7.9
ports:
- containerPort: 80
Node亲和性调度:NodeAffinity
NodeAffinity即节点亲和性调度,目前有两个亲和性表达:
- RequiredDuringSchedulinglgnoredDuringExecution:必须满足指定的规则才可以调度 Pod到 Node 上(功能与 nodeSelector很像,但是使用的是不同的语法),相当于硬限制。
- PreferredDuringSchedulinglgnoredDuringExecution:强调优先满足指定规则,调度器会尝试调度 Pod到 Node上,但并不强求,相当于软限制。多个优先级规则还可以设置权 重( weight)值,以定义执行的先后顺序。
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingignoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
.......
Pod亲和性和互斥性调度:PodAffinity/PodAntiAffinity
PodAffinity/PodAntiAffinity即Pod亲和性/Pod互斥性。NodeAffinity是根据节点的标签选择调度的节点,PodAffinity/PodAntiAffinity则是根据节点上运行的Pod的标签来判断是否将Pod调度到该节点。
NOTE: PodAffinity/PodAntiAffinity同NodeAffinity一样有两个条件表达:
- RequiredDuringSchedulinglgnoredDuringExecution
- PreferredDuringSchedulinglgnoredDuringExecution
下面通过实例来说明Pod间的亲和性和互斥性:
与节点亲和性类似 , Pod 亲和性的操作符也包括 In、NotIn、 Exists、 DoesNotExist、 Gt、 Lt等。
- Pod的亲和性调度
下面创建的Pod将会运行在matchLabels相同的Pod所在的节点上。如果不存在这样的Pod,则我们所创建的Pod将无法运行。
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: zookeeper
labels:
app: zookeeper-cluster
spec:
serviceName: "zookeeper-headless"
replicas: 3
template:
metadata:
labels:
app: zookeeper-cluster
spec:
affinity:
# Pod亲和性调度
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: "kubernetes.io/hostname"
matchExpressions:
operator: In
key: app
value: zookeeper-cluster
......
- Pod的互斥性调度
下面创建的Pod将会运行在matchLabels不同的Pod所在的节点上。
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: zookeeper
labels:
app: zookeeper-cluster
spec:
serviceName: "zookeeper-headless"
replicas: 3
template:
metadata:
labels:
app: zookeeper-cluster
spec:
affinity:
# Pod互斥性调度
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: "kubernetes.io/hostname"
matchExpressions:
operator: In
key: app
value: zookeeper-cluster
......
本文是在部署有状态集群应用时遇到的关系Pod调度问题的情况下总结出来的,大部分内容出至于《Kubernetes权威指南:从Docker到Kubernetes实践全接触》一书。