我们知道
Pod
是
Kubernetes
中最小的调度单元,平时我们操作
Pod
的时间也是最多的,那么你知道
Pod
是怎样被创建出来的吗?知道他的工作流程吗?
以下提供的创建pod时序图
一: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 API
和kube-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:常见错误状态的问题
几条常用命令:
1、查看pod详细信息,包括pod事件:kubectl describe pod pod名称
2、查看pod日志:kubectl logs pod名称