在用户发送创建pod请求后,由scheduler决定pod运行在哪个node上:
在将 pod 调度到节点之前,需要考虑几个因素。其中一些包括:
流程如下:
scheduler作用:决定将POD部署到哪个node。
每个POD其实都有一个nodeName
:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 8080
nodeName: node02 # 默认不配置这个,由scheduler干这个事情。
当创建好pod后,使用Kubectl get pod xxxx -o yaml
查看pod,可以找到这个字段:
如果关掉k8s的schedular,则所有新建的POD都是Pending
状态,不会运行。此时需要手动指定nodename来解决。
下面是Manual scheduling
的测试:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
name: nginx
使用上面的yaml新建POD后,发现状态为Pending
:
master $ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 0/1 Pending 0 6s
为什么呢,因为scheduler没有运行:
而正常运行的k8s集群是有scheduler在运行的:
所以要手动指定nodeName以binding起来:
master $ cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx
name: nginx
nodeName: node01 # 加上这行
此时查看pod的状态变为running:
master $ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 8s
在scheduler挂掉的情况下,可能需要进行manual scheduling
。
如果强行让pod运行在某个节点上,可以指定nodeName
进行创建,例如让pod运行在master节点上。