K8s之调度约束(八)
注意:此篇文章接上篇:K8s之Pod进阶(七)https://blog.csdn.net/JarryZho/article/details/104383739原理:kubernetes通过watch的机制进行每个组件的协作,每个组件之间的设计实现了解耦调度方式:nodeName用于将Pod调度到指定的Node名称上(跳过调度器直接分配)nodeSelector用于将Pod调度到匹配...
注意:此篇文章接上篇:K8s之Pod进阶(七)
https://blog.csdn.net/JarryZho/article/details/104383739
原理:
kubernetes通过watch的机制进行每个组件的协作,每个组件之间的设计实现了解耦
调度方式:
nodeName用于将Pod调度到指定的Node名称上(跳过调度器直接分配)
nodeSelector用于将Pod调度到匹配Label的Node上(前提是node要有标签)
图解:
左上角的运维人员往节点中创建一个nginx资源
(1)API Server和etcd和Scheduler是master
(2)Kubelet和Docker是node节点
API Server做为唯一入口,接受create创建资源的属性信息写入到etcd中(属性信息:名称,镜像名称,限制条件),etcd完善发现机制(watch)给Scheduler调度器(查看那个节点适合),然后绑定相关pod的网络信息,反馈给API Server,收到信息后api写入etcd中,此时etcd存储了pod的网络信息(IP),node1、中的kubelet会管理pod资源,会触发容器的创建命令,安装完成后docker就会反馈状态信息给API Server,当API Server收到状态信息写入到etcd中
总结:
apiserver相当于是平台中的书记(负责记录)
etcd相当于书记的记事本(内容写在其中)
结论:API Server如果挂了,什么都玩不了
示例1: nodeName
指定创建到某一台节点服务器上
[root@master1 demo]# vim pod5.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
app: nginx
spec:
nodeName: 192.168.18.148 #指定给node1节点
containers:
- name: nginx
image: nginx:1.15
#验证就可以到node1上看是否创建了nginx
`创建`
[root@master1 demo]# kubectl create -f pod5.yaml
pod/pod-example created
[root@master1 demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-example 1/1 Running 0 37s
`查看详细事件(发现未经过调度器)`
[root@master1 demo]# kubectl describe pod pod-example
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulled 37s kubelet, 192.168.18.148 Container image "nginx:1.15" already present on machine #此处未经过Scheduled调度器直接拉取镜像
Normal Created 37s kubelet, 192.168.18.148 Created container
Normal Started 37s kubelet, 192.168.18.148 Started container
`清空pod资源`
[root@master1 demo]# kubectl delete -f .
[root@master1 demo]# kubectl get pods
No resources found.
示例2:nodeSelector
`获取标签帮助`
`需要获取node上的NAME名称`
[root@master1 demo]# kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.18.145 Ready <none> 14d v1.12.3
192.168.18.148 Ready <none> 14d v1.12.3
`给对应的node设置标签分别为ky=a和ky=b`
[root@master1 demo]# kubectl label nodes 192.168.18.148 ky=a
node/192.168.18.148 labeled
[root@master1 demo]# kubectl label nodes 192.168.18.145 ky=b
node/192.168.18.145 labeled
`查看标签`
[root@master1 demo]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
192.168.18.145 Ready <none> 14d v1.12.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.18.145,ky=b
192.168.18.148 Ready <none> 14d v1.12.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.18.148,ky=a
`pod5.yaml文件做如下修改`
[root@master1 demo]# vim pod5.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
app: nginx
spec:
nodeSelector: #修改处
ky: a #修改处
containers:
- name: nginx
image: nginx:1.15
#修改完成后按Esc退出插入模式,输入:wq保存退出
`创建新资源`
[root@master1 demo]# kubectl create -f pod5.yaml
pod/pod-example created
[root@master1 demo]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-example 1/1 Running 0 3s
`查看详细事件(通过事件可以观察经过调度器分配)`
[root@master1 demo]# kubectl describe pod pod-example
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 85s default-scheduler Successfully assigned default/pod-example to 192.168.18.148 #此时经过了Scheduled调度器
Normal Pulled 85s kubelet, 192.168.18.148 Container image "nginx:1.15" already present on machine
Normal Created 85s kubelet, 192.168.18.148 Created container
Normal Started 84s kubelet, 192.168.18.148 Started container
`查看分配节点`
[root@master1 demo]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
pod-example 1/1 Running 0 3m35s 172.17.32.2 192.168.18.148 <none>
故障排除
1.查看pod事件
kubectl describe TYPE NAME_PREFIX
2.查看pod日志(Failed状态下)
kubectl logs POD_NAME
3.进入pod(状态为running,但是服务没有提供)
kubectl exec –it POD_NAME bash
更多推荐
所有评论(0)