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相同)