k8s!pod资源工作流程与调度约束

一 pod资源

1.1k8s创建pod工作流程

在这里插入图片描述
创建过程:

1、用户创建pod的信息通过API Server存储到etcd中,etcd记录pod的元信息并将结果返回API Server。
2、API Server告知调度器请求资源调度分配,调度器给后端打分,将优先级高的node与pod绑定并告知API Server。
3、API Server将此信息写入etcd,得到etcd回复后调用kubelet创建pod。
4、kubelet使用docker run创建pod内的容器,得到反馈信息后将容器信息告知API Server。
5、API Server将收到的信息写入etcd并得到回馈。
6、此时使用kubectl get pod就可以查看到信息了。

1.2 调度方式
  1. nodeName:
    用于将Pod调度到指定的node名称上(跳过调度器直接分配)

  2. nodeSelector:
    用于将pod调度到匹配label的node上
    两种方式都是通过yaml文件来实现

1.2.1:nodeName方式
  1. 编写yaml文件
[root@master test]# vim nodename-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeName: 192.168.233.133	'//使用nodeName方式并指定node节点'
  containers:
  - name: nginx
    image: nginx:1.15
  1. 创建pod资源
[root@master test]# kubectl create -f nodename-test.yaml 
pod/pod-example created
[root@master test]# kubectl get pod -w
NAME          READY   STATUS              RESTARTS   AGE
pod-example   0/1     ContainerCreating   0          9s
pod-example   1/1   Running   0     18s
^C
  1. 查看pod信息,是否经过调度器
[root@master test]# kubectl describe pod pod-example
。。。省略内容
Events:	'//发现没有经过调度器,node节点也是指定的'
  Type    Reason   Age   From                      Message
  ----    ------   ----  ----                      -------
  Normal  Pulling  67s   kubelet, 192.168.233.133  pulling image "nginx:1.15"
  Normal  Pulled   50s   kubelet, 192.168.233.133  Successfully pulled image "nginx:1.15"
  Normal  Created  49s   kubelet, 192.168.233.133  Created container
  Normal  Started  49s   kubelet, 192.168.233.133  Started container
1.2.2:nodeSelector方式
  1. 使用nodeSelector方式需要给节点打标签
[root@master test]# kubectl label --help	'//查看用法'
Usage:
  kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N
[--resource-version=version] [options]
[root@master test]# kubectl get node	'//查看node节点名称'
NAME              STATUS   ROLES    AGE   VERSION
192.168.233.132   Ready    <none>   16d   v1.12.3
192.168.233.133   Ready    <none>   16d   v1.12.3
[root@master test]# kubectl label node 192.168.233.132 node=node01
node/192.168.233.132 labeled	'//给node打标签,标签不可以直接是数字'
[root@master test]# kubectl label node 192.168.233.133 node=node02
node/192.168.233.133 labeled
[root@master test]# kubectl get nodes --show-labels	'//查看标签'
NAME              STATUS   ROLES    AGE   VERSION   LABELS
192.168.233.132   Ready    <none>   16d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.233.132,node=node01
192.168.233.133   Ready    <none>   16d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.233.133,node=node02
  1. 编写yaml文件
[root@master test]# vim nodeselector-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeSelector:
    node= node01
  containers:
  - name: nginx
    image: nginx:1.15
  1. 创建pod资源
[root@master test]# kubectl create -f nodeselector-test.yaml 
pod/pod-example created
[root@master test]# kubectl get pod -w
NAME          READY   STATUS              RESTARTS   AGE
pod-example   0/1     ContainerCreating   0          13s
pod-example   1/1   Running   0     30s
  1. 查看pod详细信息
[root@master test]# kubectl describe pod pod-example
Events:	'//发现是经过控制器的,分配的节点ip也是对的'
  Type    Reason     Age   From                      Message
  ----    ------     ----  ----                      -------
  Normal  Scheduled  2m3s  default-scheduler         Successfully assigned default/pod-example to 192.168.233.132
  Normal  Pulling    2m2s  kubelet, 192.168.233.132  pulling image "nginx:1.15"
  Normal  Pulled     93s   kubelet, 192.168.233.132  Successfully pulled image "nginx:1.15"
  Normal  Created    93s   kubelet, 192.168.233.132  Created container
  Normal  Started    93s   kubelet, 192.168.233.132  Started container
1.3 常见错误状态的问题
  • 使用kubectl get pod命令查看pod资源会遇到如下状态
状态说明
PendingPod创建已经提交到Kubernetes。但是,因为某种原因而不能顺利创建。例如下载镜像慢,调度不成功。
RunningPod已经绑定到-一个节点,并且已经创建了所有容器。至少有一个容器正在运行中,或正在启动或重新启动。
SucceededPod中的所有容器都已成功终止,不会重新启动。
FailedPod的所有容器均已终止,且至少有一个容器已在故障中终止。也就是说,容器要么以非零状态退出,要么被系统终止。
Unknown由于某种原因apiserver无法获得Pod的状态,通常是由于Master与Pod所在主机kubelet通信时出错。

几条常用命令:

 kubectl logs pod名称 
  1. 查看pod详细信息,包括pod事件:
 kubectl describe pod pod名称 
  1. 查看pod日志:
 kubectl logs pod名称 
  1. 进入pod:
 kubectl exec -it pod名称 环境(如bash) 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值