八 pod:pod的调度——将 Pod 指派给节点( 二 )

【八 pod:pod的调度——将 Pod 指派给节点】第二个pod创建成功,现在创建第三个pod 。
开篇我们已经介绍过集群架构,Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点,k8s集群只有2个worker节点,master节点默认不运行应用pod,主机端口80已经被占用两台worker节点全部占用,所以pod2无法运行 。
[root@k8scloude1 pod]# sed 's/pod1/pod2/' schedulepod1.yaml | kubectl apply -f -pod/pod2 created#主机端口80已经被占用两台worker节点全部占用,pod2无法运行[root@k8scloude1 pod]# kubectl get podsNAMEREADYSTATUSRESTARTSAGEpod1/1Running016mpod11/1Running05m28spod20/1Pending05s观察pod在k8s集群的分布情况 , NODE显示pod运行在哪个节点
[root@k8scloude1 pod]# kubectl get podsNAMEREADYSTATUSRESTARTSAGEpod1/1Running018mpod11/1Running07m28s[root@k8scloude1 pod]# kubectl get pods -o wideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATESpod1/1Running029m10.244.251.208k8scloude3<none><none>pod11/1Running018m10.244.112.156k8scloude2<none><none>删除pod
[root@k8scloude1 pod]# kubectl delete pod pod2pod "pod2" deleted[root@k8scloude1 pod]# kubectl delete pod pod1 podpod "pod1" deletedpod "pod" deleted上面三个pod都是k8s自动调度的,下面我们手动指定pod运行在哪个节点 。
3.3 使用nodeName 字段指定pod运行在哪个节点使用nodeName 字段指定pod运行在哪个节点,这是一种比较直接的方式,nodeName 是 Pod 规约中的一个字段 。如果 nodeName 字段不为空,调度器会忽略该 Pod,而指定节点上的 kubelet 会尝试将 Pod 放到该节点上 。使用 nodeName 规则的优先级会高于使用 nodeSelector 或亲和性与非亲和性的规则 。
使用 nodeName 来选择节点的方式有一些局限性:

  • 如果所指代的节点不存在,则 Pod 无法运行,而且在某些情况下可能会被自动删除 。
  • 如果所指代的节点无法提供用来运行 Pod 所需的资源,Pod 会失败,而其失败原因中会给出是否因为内存或 CPU 不足而造成无法运行 。
  • 在云环境中的节点名称并不总是可预测的,也不总是稳定的 。
创建pod,nodeName: k8scloude3表示pod要运行在名为k8scloude3的节点
[root@k8scloude1 pod]# vim schedulepod2.yaml #kind: Pod表示资源类型为Podlabels指定pod标签metadata下面的name指定pod名字containers下面全是容器的定义#image指定镜像名字imagePullPolicy指定镜像下载策略containers下面的name指定容器名#resources指定容器资源(CPU,内存等)env指定容器里的环境变量dnsPolicy指定DNS策略#restartPolicy容器重启策略ports指定容器端口containerPort容器端口hostPort节点上的端口#nodeName: k8scloude3指定pod在k8scloude3上运行[root@k8scloude1 pod]# cat schedulepod2.yamlapiVersion: v1kind: Podmetadata:creationTimestamp: nulllabels:run: pod1name: pod1namespace: podspec:nodeName: k8scloude3containers:- image: nginximagePullPolicy: IfNotPresentname: pod1resources: {}ports:- name: httpcontainerPort: 80protocol: TCPhostPort: 80dnsPolicy: ClusterFirstrestartPolicy: Alwaysstatus: {}[root@k8scloude1 pod]# kubectl apply -f schedulepod2.yamlpod/pod1 created可以看到pod运行在k8scloude3节点
[root@k8scloude1 pod]# kubectl get pod -o wideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEREADINESS GATESpod11/1Running07s10.244.251.209k8scloude3<none><none>[root@k8scloude1 pod]# kubectl delete pod pod1 --forcewarning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.[root@k8scloude1 pod]# kubectl get podsNo resources found in pod namespace.创建pod,nodeName: k8scloude1让pod运行在k8scloude1节点
[root@k8scloude1 pod]# vim schedulepod3.yaml #kind: Pod表示资源类型为Podlabels指定pod标签metadata下面的name指定pod名字containers下面全是容器的定义#image指定镜像名字imagePullPolicy指定镜像下载策略containers下面的name指定容器名#resources指定容器资源(CPU,内存等)env指定容器里的环境变量dnsPolicy指定DNS策略#restartPolicy容器重启策略ports指定容器端口containerPort容器端口hostPort节点上的端口#nodeName: k8scloude1让pod运行在k8scloude1节点[root@k8scloude1 pod]# cat schedulepod3.yamlapiVersion: v1kind: Podmetadata:creationTimestamp: nulllabels:run: pod1name: pod1namespace: podspec:nodeName: k8scloude1containers:- image: nginximagePullPolicy: IfNotPresentname: pod1resources: {}ports:- name: httpcontainerPort: 80protocol: TCPhostPort: 80dnsPolicy: ClusterFirstrestartPolicy: Alwaysstatus: {}[root@k8scloude1 pod]# kubectl apply -f schedulepod3.yamlpod/pod1 created可以看到pod运行在k8scloude1,注意

推荐阅读