一、pod创建过程

Kubernetes通过watch的机制进行每个组件的协作,每个组件之间的设计实现了解耦。
在这里插入图片描述

  • 用户使用create yaml创建pod,请求给apiseerver,apiserver.将yaml中的属性信息(metadata)写入etcd
  • apiserver触发watch机制准备创建pod,信息转发给调度器,调度器使用调度算法选择node,调度器将node信息给apiserver,apiserver_将绑定的node信息写入etcd
  • apiserver又通过watch机制,调用kubelet,指定pod信息,触发docker run命 令创建容器
  • 创建完成之后反馈给kubelet, kubelet又将pod的状态信息给apiserver,
    apiserver又将pod的状态信息写入etcd。
  • 其中kubectl get pods命令调用的时etcd_的信息

注意:图中有三次write

  1. 元信息
  2. pod分配到哪个node
  3. 记录pod状态

二、调度方式(指定节点创建pod)

两种调度方式:

  • nodeName:用于将Pod调度到指定的Node名称上(跳过调度器直接分配)
  • nodeSelector:用于将Pod调度到匹配Label的Node上

示例1:nodeName

  • 创建nginx的pod资源,指定分配到192.168.5.20节点上
###编写yaml文件
[root@k8s_master ~]# vim nginx1.yaml
apiVersion: v1  
kind: Pod  
metadata:
  name: pod-example  
  labels:
    app: nginx  
spec:
  nodeName: 192.168.5.20
  containers:
  - name: nginx  
    image: nginx:1.15

##执行创建
[root@k8s_master ~]# kubectl  apply -f nginx1.yaml 
pod/pod-example created
  • 查看资源分配情况
##查看资源分配到哪个节点
[root@k8s_master ~]# kubectl  get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE
pod-example   1/1     Running   0          56s   172.17.50.3   192.168.5.20   <none>

##查看创建日志,发现直接跳过了调度器
[root@k8s_master ~]# kubectl  describe pod pod-example
....省略部分
  Type    Reason   Age   From                   Message
  ----    ------   ----  ----                   -------
  Normal  Pulling  2m6s  kubelet, 192.168.5.20  pulling image "nginx:1.15"
  Normal  Pulled   102s  kubelet, 192.168.5.20  Successfully pulled image "nginx:1.15"
  Normal  Created  102s  kubelet, 192.168.5.20  Created container
  Normal  Started  102s  kubelet, 192.168.5.20  Started container

实例2:nodeSelector

先给node创建标签》》创建资源指定匹配该标签

  • 给后端2个node节点设置标签,分别为abc=node1和abc=node2
##创建标签
[root@k8s_master ~]# kubectl label node 192.168.5.20 abc=node1
node/192.168.5.20 labeled
[root@k8s_master ~]# kubectl label node 192.168.5.30 abc=node2
node/192.168.5.30 labeled

##查看已经创建的标签
[root@k8s_master ~]# kubectl get nodes --show-labels
NAME           STATUS   ROLES    AGE   VERSION   LABELS
192.168.5.20   Ready    <none>   23d   v1.12.3   abc=node1,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.5.20
192.168.5.30   Ready    <none>   23d   v1.12.3   abc=node2,abcd=1,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.5.30

  • 创建资源,指定分配到abc=node2标签上
##编写yaml文件
[root@k8s_master ~]# vim nginx2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example2
  labels:
    app: nginx
spec:
  nodeSelector: 
    abc: node2
  containers:
  - name: nginx
    image: nginx:1.15

##创建pod资源
[root@k8s_master ~]# kubectl create -f nginx2.yaml 
  • 查看资源分配情况
[root@k8s_master ~]# kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE
pod-example2   1/1     Running   0          50s   172.17.32.2   192.168.5.30   <none>

##查看创建日志
[root@k8s_master ~]# kubectl describe pod pod-example2
.....省略部分内容
  Type    Reason     Age   From                   Message
  ----    ------     ----  ----                   -------
  Normal  Scheduled  112s  default-scheduler      Successfully assigned default/pod-example2 to 192.168.5.30
  Normal  Pulling    110s  kubelet, 192.168.5.30  pulling image "nginx:1.15"
  Normal  Pulled     98s   kubelet, 192.168.5.30  Successfully pulled image "nginx:1.15"
  Normal  Created    98s   kubelet, 192.168.5.30  Created container
  Normal  Started    98s   kubelet, 192.168.5.30  Started container

三、pod资源状态解析

在这里插入图片描述
查看pod详细信息

kubectl describ <type>  <name>

查看pod日志(Failed状态下)

kubectl logs <pod_name>
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐