Kuberbetes(十四)--pod调度

652 阅读1分钟

kubernetes pod调度 这里介绍两种调度方式

方法1、使用NodeName进行pod调度:

Pod.spec.nodeName用于强制约束将Pod调度到指定的Node节点上,这里说是"调度",但其实指定了nodeName的Pod会直接跳过Scheduler的调度逻辑,直接写入PodList列表,该匹配规则是强制匹配。

[root@k8s-master ~]# vim nginxrc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: my-nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeName: k8s-node-1  #指定调度节点为k8s-node-1
      containers:
      - name: nginx
        image: daocloud.io/library/nginx:latest
        ports:
        - containerPort: 80

创建rc:

查看pod运行于哪个节点:

[root@k8s-master ~]# kubectl get pods -o wide
NAME             READY     STATUS    RESTARTS   AGE       IP         NODE
my-nginx-dwp13   1/1       Running   0          21m       10.0.6.2   k8s-node-1

方法2:使用NodeSelector进行pod调度

Pod.spec.nodeSelector是通过kubernetes的label-selector机制进行节点选择,由scheduler调度策略MatchNodeSelector进行label匹配,调度pod到目标节点,该匹配规则是强制约束。启用节点选择器的步骤为:

1.Node添加label标记

标记规则:kubectl label nodes <node-name> <label-key>=<label-value>
#kubectl label nodes k8s.node1 cloudnil.com/role=dev

确认标记
root@k8s.master1:~# kubectl get nodes k8s.node1 --show-labels
NAME        STATUS    AGE       LABELS
k8s.node1   Ready     29d       beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,cloudnil.com/role=dev,kubernetes.io/hostname=k8s.node1

2.Pod定义中添加nodeSelector

[root@k8s-master ~]# vim nginxrc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: my-nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        cloudnil.com/role: dev#指定调度节点为带有label标记为:cloudnil.com/role=dev的node节点
      containers:
      - name: nginx
        image: daocloud.io/library/nginx:latest
        ports:
        - containerPort: 80

创建rc:

查看pod运行于哪个节点:

[root@k8s-master ~]# kubectl get pods -o wide
NAME             READY     STATUS    RESTARTS   AGE       IP         NODE
my-nginx-zttrj   1/1       Running   0          5s        10.0.6.2   k8s-node-1

下面这句话忽略先:
关键在于spec.selector与spec.template.metadata.labels,这两个字段必须相同,否则下一步创建RC会失败。(也可以不写spec.selector,这样默认与spec.template.metadata.labels相同)