由master的Scheduler经过一系列的算法得出得分最高的节点。
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-master
labels:
name: redis-master
spec:
replicas: 1
selector:
name: redis-master
template:
metadata:
labels:
name: redis-master
spec:
containers:
- name: master
image: kubeguide/redis-master
ports:
- containerPort: 6379
nodeSelector: #定向到拥有标签zone=north的节点,可以指定多个标签
zone: north
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #必须满足以下的要求(和nodeselect很像)
nodeSelectorTerms: #如果有多个,那么有一个满足就可以被调度(面向多个node)
- matchExpressions: #如果有多个,则一个节点需要满足所有要求才能被调度(对单个node的所有要求)
- key: beta.kubernetes.io/arch
operator: In #其他参数还有In、NotIn、Exists、DoesNotExist、Gt、Lt(其中NotIn、DoesNotExist可以实现排斥的功能)
values:
- amd64
preferredDuringSchedulingIgnoredDuringExecution: #优先选择以下的要求 不强求,多个规则可以设置权重
- weight: 1
preference:
matchExpressions:
- key: disk-type
operator: In
values:
- ssd
containers:
- name: with-node-affinity
image: gcr.io/google_containers/pause:2.0
IgnoredDuringExecution的意思是:如果一个pod所在的节点在pod运行期间标签发生了变更,不再符合该pod的节点亲和性需求,则系统将忽略Node上label的变化,该pod能继续在该节点上运行。
注意事项:
条件设置也是使用requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution
其中topologyKey字段的值可以为:
kubernetes.io/hostname
failure-domain.beta.kebernetes.io/zone
failure-domain.beta.kubernetes.io/region
参照pod,下面的案例以此pod为参照:
名字为pod-flag,带有标签 security=S1、app=nginx
apiVersion: v1
kind: Pod
metadata:
name: pod-flag
labels:
security: "S1"
app: "nginx"
spec:
containers:
- name: nginx
image: nginx
亲和性调度案例:创建后,该pod就会和参照pod运行在同一个节点上。
apiVersion: v1
kind: Pod
metadata:
name: pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:#亲和性
- labelSelector:
matchExpressions: #如果有多个,需要所有条件全部满足,才能调度到某个node上
- key: security #与拥有标签security=S1的pod在同一个节点
operator: In #其他参数还有In、NotIn、Exists、DoesNotExist、Gt、Lt(其中NotIn、DoesNotExist可以实现排斥的功能)
values:
- S1
#namespaces: #指定亲和性对象是哪个namespace下的,如果不指定就是所有namespace下的。
topologyKey: kubernetes.io/hostname #对node的label选择
containers:
- name: with-pod-affinity
image: gcr.io/google_containers/pause:2.0
pod的互斥调度案例:创建之后的新Pod与security=S1的pod为同一个zone,但是不与app=nginx的pod为同一个Node。
apiVersion: v1
kind: Pod
metadata:
name: anti-affinity
spec:
affinity:
podAffinity: #亲和性
requiredDuringSchedulingIgnoredDuringExecution: #硬亲和性 。 也可以使用preferredDuringSchedulingIgnoredDuringExecution软亲和性,尽可能的和满足下面要求的pod调度到同一个节点。
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: failure-domain.beta.kubernetes.io/zone
podAntiAffinity: #反亲和性
requiredDuringSchedulingIgnoredDuringExecution: #硬亲和性 。 也可以使用preferredDuringSchedulingIgnoredDuringExecution软亲和性,尽可能的和满足下面要求的pod调度到不同的节点。
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
topologyKey: kubernetes.io/hostname
containers:
- name: anti-affinity
image: gcr.io/google_containers/pause:2.0
注意事项:
场景:独占节点、具有特殊硬件设备的节点(GPU 、SSD)
污点可以让node拒绝pod的运行,与NodeAffinity相反。
用法:对node设置污点,然后在pod文件里面配置容忍属性,让pod能够(不是必须)运行在有污点的节点上。
对节点添加污点:
$ kubectl taint nodes node1 key=value:NoSchedule
Taint(污点)的键值分别为key、value,效果是:
NoSchedule - 强制不调度
PreferNoSchedule - 尽可能不调度
pod配置文件添加Tolerations(容忍):
apiVersion: v1
kind: Pod
metadata:
name: pod-toleration
spec:
tolerations: #容忍设置
- key: "key" #key和effect需要和Taint(污点)的设置一致
operator: "Equal" #operator的值为Equal,则value需要和污点标签相等
value: "value"
effect: "NoSchedule" #key和effect需要和Taint(污点)的设置一致
#NoSchedule的取值还可以设置为PreferNoSchedule,尽可能的避免调度到污点的节点
containers:
- name: pod-toleration
image: gcr.io/google_containers/pause:2.0
容忍的第二种写法:
tolerations:
- key: "key" #key和effect需要和Taint(污点)的设置一致
operator: "Exists" #operator的值为Exists,则无需指定value
effect: "NoSchedule" #key和effect需要和Taint(污点)的设置一致
注意:
一个node拥有多个污点的时候,k8s调度器会忽略pod配置中容忍的污点,其他不能容忍的就是最终的效果。
场景:节点因为负载过高导致节点上的pod驱逐(Eviction),那么pod就会抢占(preemption)资源不被驱逐。设置优先级会使优先级高的pod不被驱逐,只会驱逐优先级低的pod,来保全优先级高的pod。
首先创建PriorityClass(优先级类别),且PriorityClass不属于任何namespace。
apiVersion: scheduling.k8s.io/v1beta1
kind: PriorityClass
metadata:
name: high-priority #优先级类别的名字为high-priority
value: 1000000 #优先级为1000000,数字越大,优先级越高,十亿以上的为系统保留。
globalDefault: false
description: "This priority class should be used for XYZ service pods only."
pod配置文件引用优先级类别:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
priorityClassName: high-priority #引用优先级类别名字为high-priority
场景案例:
pod案例:在每个节点都启动一个fluentd容器
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: fluentd-cloud-logging
namespace: kube-system
labels:
k8s-app: fluentd-cloud-logging
spec:
template:
metadata:
namespace: kube-system
labels:
k8s-app: fluentd-cloud-logging
spec:
containers:
- name: fluentd-cloud-logging
image: gcr.io/google_containers/fluentd-elasticsearch:1.17
resources:
limits:
cpu: 100m
memory: 200Mi
env:
- name: FLUENTD_ARGS
value: -q
volumeMounts:
- name: varlog
mountPath: /var/log
readOnly: false
- name: containers
mountPath: /var/lib/docker/containers
readOnly: false
volumes:
- name: containers
hostPath:
path: /var/lib/docker/containers
- name: varlog
hostPath:
path: /var/log