Manual Scheduling

在用户发送创建pod请求后,由scheduler决定pod运行在哪个node上:

image-20200118155639429

在将 pod 调度到节点之前,需要考虑几个因素。其中一些包括:

  • 资源要求
  • Hardware/Software policy限制
  • Affinity & Anti-Affinity
  • Data Locality

流程如下:

image-20190626234754003

scheduler作用:决定将POD部署到哪个node。

nodeName

每个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,可以找到这个字段:

image-20200315214245327

Manual scheduling

如果关掉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没有运行:

image-20200315214718113

而正常运行的k8s集群是有scheduler在运行的:

image-20200315214755419

所以要手动指定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

总结

  1. 在scheduler挂掉的情况下,可能需要进行manual scheduling

  2. 如果强行让pod运行在某个节点上,可以指定nodeName进行创建,例如让pod运行在master节点上。