k8s----pods调度约束


我们知道 PodKubernetes中最小的调度单元,平时我们操作 Pod的时间也是最多的,那么你知道 Pod是怎样被创建出来的吗?知道他的工作流程吗?

以下提供的创建pod时序图

mark

一:kubernetes 创建Pod 的 工作流

那么我们创建Pod的时候到底发生了什么呢?是怎样创建成功Pod的呢?

  • 第一步通过apiserver REST API创建一个Pod
  • 然后apiserver接收到数据后将数据写入到etcd
  • 由于kube-scheduler通过apiserver watch API一直在监听资源的变化,这个时候发现有一个新的Pod,但是这个时候该Pod还没和任何Node节点进行绑定,所以kube-scheduler就经过一系列复杂的调度策略,选择出一个合适的Node节点,将该Pod和该目标Node进行绑定,当然也会更新到etcd中去的
  • 这个时候一样的目标Node节点上的kubelet通过apiserver watch API检测到有一个新的Pod被调度过来了,他就将该Pod的相关数据传递给后面的容器运行时(container runtime),比如Docker,让他们去运行该Pod
  • 而且kubelet还会通过container runtime获取Pod的状态,然后更新到apiserver中,当然最后也是写入到etcd中去的。

这样一个典型的Pod工作流就完成了,通过这个流程我们可以看出整个过程中最重要的就是apiserver watch APIkube-scheduler的调度策略。

1.1:调度方式

1、nodeName:

  • 用于将Pod调度到指定的node名称上(跳过调度器直接分配)

2、nodeSelector:

  • 用于将pod调度到匹配label【标签】的node上

两种方式都是通过yaml文件来实现

1.2:nodeName方式

  • 创建pod资源,编写yaml文件
[root@master shuai]# vim nodename.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeName: 20.0.0.42
  containers:
  - name: nginx
    image: nginx:1.15

'创建pod资源'
[root@master shuai]# kubectl create -f nodename.yaml 

'//查看pod资源'
[root@master shuai]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
pod-example   1/1     Running   0          6m49s
  • 查看pod信息,是否经过调度器
[root@master shuai]# kubectl describe pod pod-example

'发现没有经过调度器,node节点是指定的'
Events:
  Type    Reason   Age    From                Message
  ----    ------   ----   ----                -------
  Normal  Pulling  6m20s  kubelet, 20.0.0.42  pulling image "nginx:1.15"
  Normal  Pulled   6m6s   kubelet, 20.0.0.42  Successfully pulled image "nginx:1.15"
  Normal  Created  6m6s   kubelet, 20.0.0.42  Created container
  Normal  Started  6m6s   kubelet, 20.0.0.42  Started :container

1.3:nodeSelector方式

  • 使用nodeSelector方式需要给节点打标签

  • 创建pod资源,编写yaml文件

'//获取标签帮助'
Usage:
  kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N
[--resource-version=version] [options]

'//获取node上的name名称'
[root@master shuai]# kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
20.0.0.42   Ready    <none>   14d   v1.12.3
20.0.0.43   Ready    <none>   14d   v1.12.3

'//给对应的node设置标签分别为shuai=a和shuai=b'
[root@master shuai]# kubectl label nodes 20.0.0.42 shuai=a
node/20.0.0.42 labeled
[root@master shuai]# kubectl label nodes 20.0.0.43 shuai=b
node/20.0.0.43 labeled

'//查看标签'
[root@master shuai]# kubectl get nodes --show-labels
NAME        STATUS   ROLES    AGE   VERSION   LABELS
20.0.0.42   Ready    <none>   14d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=20.0.0.42,shuai=a
20.0.0.43   Ready    <none>   14d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=20.0.0.43,shuai=b
  • 创建pod资源。编写yaml文件
[root@master shuai]# vim nodeSelector.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec: 
  nodeSelector:
    shuai: b  
  containers: 
  - name: nginx 
    image: nginx:1.15

'//创建资源'
[root@master shuai]# kubectl apply -f nodeSelector.yaml 
pod/pod-example created

[root@master shuai]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
pod-example   1/1     Running   0          31s
  • 查看pod详细信息
'是经过控制器的'
Events:
  Type    Reason     Age    From                Message
  ----    ------     ----   ----                -------
  Normal  Scheduled  8m11s  default-scheduler   Successfully assigned default/pod-example to 20.0.0.43
  Normal  Pulling    8m10s  kubelet, 20.0.0.43  pulling image "nginx:1.15"
  Normal  Pulled     7m48s  kubelet, 20.0.0.43  Successfully pulled image "nginx:1.15"
  Normal  Created    7m48s  kubelet, 20.0.0.43  Created container
  Normal  Started    7m48s  kubelet, 20.0.0.43  Started container

1.4:常见错误状态的问题

mark

几条常用命令:

1、查看pod详细信息,包括pod事件:kubectl describe pod pod名称

2、查看pod日志:kubectl logs pod名称

猜你喜欢

转载自blog.csdn.net/weixin_47151643/article/details/109079377