一、指定调度节点
1、Pod.spec.nodeName
Pod.spec.nodeName
将 Pod
直接调度到指定的 Node
节点上,会跳过 Scheduler
的调度策略,该匹配规则是强制匹配
在资源清单里设置好 nodeName: k8s-node01
后, 创建的 pod
全部在 k8s-node01
节点上。
pod3.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: myweb
spec:
replicas: 7
template:
metadata:
labels:
app: myweb
spec:
nodeName: k8s-node01
containers:
- name: myweb
image: wangyanglinux/myapp:v1
ports:
- containerPort: 80
查看创建好的pod所在节点。
[root@k8s-master01 taint]# kubectl apply -f pod3.yaml
deployment.extensions/myweb created
[root@k8s-master01 taint]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb-c7d567d89-5f2bs 0/1 ContainerCreating 0 4s <none> k8s-node01 <none> <none>
myweb-c7d567d89-5t84s 0/1 ContainerCreating 0 4s <none> k8s-node01 <none> <none>
myweb-c7d567d89-g2k7g 0/1 ContainerCreating 0 4s <none> k8s-node01 <none> <none>
myweb-c7d567d89-l9lwq 0/1 ContainerCreating 0 4s <none> k8s-node01 <none> <none>
myweb-c7d567d89-s8cnb 0/1 ContainerCreating 0 4s <none> k8s-node01 <none> <none>
myweb-c7d567d89-t6975 0/1 ContainerCreating 0 4s <none> k8s-node01 <none> <none>
myweb-c7d567d89-wz4sc 0/1 ContainerCreating 0 4s <none> k8s-node01 <none> <none>
node01 1/1 Running 0 16m 10.244.1.154 k8s-node01 <none> <none>
pod-3 1/1 Running 0 10m 10.244.1.153 k8s-node01 <none> <none>
2、Pod.spec.nodeSelector
Pod.spec.nodeSelector
:通过 kubernetes
的 label-selector
机制选择节点,由调度器调度策略匹配 label
,而后调度 Pod
到目标节点,该匹配规则属于强制约束。
pod4.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: myweb
spec:
replicas: 2
template:
metadata:
labels:
app: myweb
spec:
nodeSelector:
disk: ssd
containers:
- name: myweb
image: wangyanglinux/myapp:v1
ports:
- containerPort: 80
使用 pod4.yaml
创建 pod
,由于集群里没有 disk: ssd
的节点,所以 pod
的状态为 Pending
。设置 k8s-node01
的 label
为 disk=ssd
之后,pod
将会运行在 k8s-node01
节点上,并且其状态变为 Running
。
[root@k8s-master01 taint]# kubectl apply -f pod4.yaml
deployment.extensions/myweb created
[root@k8s-master01 taint]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb-5d5cf6944-qm5jg 0/1 Pending 0 2s <none> <none> <none> <none>
myweb-5d5cf6944-z6q9j 0/1 Pending 0 2s <none> <none> <none> <none>
[root@k8s-master01 taint]# kubectl label node k8s-node01 disk=ssd
node/k8s-node01 labeled
[root@k8s-master01 taint]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb-5d5cf6944-qm5jg 1/1 Running 0 3m51s 10.244.1.173 k8s-node01 <none> <none>
myweb-5d5cf6944-z6q9j 1/1 Running 0 3m51s 10.244.1.172 k8s-node01 <none> <none>
将 k8s-node02
的节点 label 也设置为 disk=ssd
,修改资源清单中的 replicas: 8
。因为 k8s-node01
和 k8s-node02
都设置了 label
,所以 pod
会随机在两个节点上运行。
# 将 k8s-node02 的节点 label 也设置为 disk=ssd
[root@k8s-master01 taint]# kubectl label node k8s-node02 disk=ssd
node/k8s-node02 labeled
# 修改 replicas: 8
[root@k8s-master01 taint]# kubectl edit deployment myweb
deployment.extensions/myweb edited
# 查看 pod 在 node01 和 node02 都有分布
[root@k8s-master01 taint]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb-5d5cf6944-4jwhj 1/1 Running 0 4s 10.244.2.149 k8s-node02 <none> <none>
myweb-5d5cf6944-7hhmc 1/1 Running 0 4s 10.244.2.148 k8s-node02 <none> <none>
myweb-5d5cf6944-qm5jg 1/1 Running 0 7m32s 10.244.1.173 k8s-node01 <none> <none>
myweb-5d5cf6944-rh28l 1/1 Running 0 4s 10.244.2.147 k8s-node02 <none> <none>
myweb-5d5cf6944-rwxxg 1/1 Running 0 4s 10.244.2.146 k8s-node02 <none> <none>
myweb-5d5cf6944-v4zx2 1/1 Running 0 4s 10.244.1.174 k8s-node01 <none> <none>
myweb-5d5cf6944-vsw6j 1/1 Running 0 4s 10.244.1.175 k8s-node01 <none> <none>
myweb-5d5cf6944-z6q9j 1/1 Running 0 7m32s 10.244.1.172 k8s-node01 <none> <none>