K8s脱坑前的挣扎——调度约束

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

一、调度方式

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

  • nodeSelector用于将Pod调度到匹配Label的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中

三、示例

1.nodeName

  • 创建一个资源并指定节点
[root@master01 demo]# vim pod5.yaml
apiVersion: v1
kind: Pod  
metadata:
  name: pod-example  
  labels:
    app: nginx  
spec:
  nodeName: 192.168.170.145    //指定节点
  containers:
  - name: nginx  
    image: nginx:1.15
[root@master01 demo]# kubectl apply -f pod5.yaml 
pod/pod-example created
  • 查看资源是否分配到指定节点
[root@master01 demo]# kubectl get pods  //查看pod资源
NAME          READY   STATUS    RESTARTS   AGE
pod-example   1/1     Running   0          30s 
[root@master01 demo]# kubectl get pods -o wide    //查看网络
NAME          READY   STATUS    RESTARTS   AGE    IP           NODE              NOMINATED NODE
pod-example   1/1     Running   0          103m   172.17.7.2   192.168.170.145   <none>
  • 通过查看网络可以看到指定到node1的节点
  • 查看详细事件
[root@master01 demo]# kubectl describe pod pod-example
Events:
  Type    Reason   Age   From                      Message
  ----    ------   ----  ----                      -------
  Normal  Pulling  105m  kubelet, 192.168.170.145  pulling image "nginx:1.15"
  Normal  Pulled   104m  kubelet, 192.168.170.145  Successfully pulled image "nginx:1.15"
  Normal  Created  104m  kubelet, 192.168.170.145  Created container
  Normal  Started  104m  kubelet, 192.168.170.145  Started container
  • 可以看到没有经过调度器

2.nodeSelector

  • 可以通过–help获取标签帮助
[root@master01 demo]# kubectl label --help
Usage:
  kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N
[--resource-version=version] [options]
  • 需要获取node上的NAME名称用来打标签
[root@master01 demo]# kubectl get nodes
NAME              STATUS   ROLES    AGE   VERSION
192.168.170.136   Ready    <none>   24d   v1.12.3
192.168.170.145   Ready    <none>   24d   v1.12.3
  • 给对应的node设置标签分别为accp=a和accp=b

[root@master01 demo]# kubectl label nodes 192.168.170.145 accp=a
node/192.168.170.145 labeled
[root@master01 demo]# kubectl label nodes 192.168.170.136 accp=b
node/192.168.170.136 labeled
[root@master01 demo]# kubectl get nodes --show-labels  //查看标签
NAME              STATUS   ROLES    AGE   VERSION   LABELS
192.168.170.136   Ready    <none>   24d   v1.12.3   accp=b,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.170.136
192.168.170.145   Ready    <none>   24d   v1.12.3   accp=a,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=192.168.170.145
//可以看到node1的标签为accp=a,node2的标签为accp=b
  • 通过制作的标签编写一个yaml文件
[root@master01 demo]# vim pod6.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeSelector: 
    accp: b     //使用标签指定节点为node2
  containers:
  - name: nginx
    image: nginx:1.15
[root@master01 demo]# kubectl apply -f pod6.yaml   //创建资源
pod/pod-example created
[root@master01 demo]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
pod-example   1/1     Running   0          53s
  • 查看事件
[root@master01 demo]# kubectl describe pod pod-example
。。。省略部分内容
Events:
  Type    Reason     Age   From                      Message
  ----    ------     ----  ----                      -------
  **Normal  Scheduled  65s   default-scheduler         Successfully assigned default/pod-example to 192.168.170.136**  
  Normal  Pulling    62s   kubelet, 192.168.170.136  pulling image "nginx:1.15"
  Normal  Pulled     17s   kubelet, 192.168.170.136  Successfully pulled image "nginx:1.15"
  Normal  Created    17s   kubelet, 192.168.170.136  Created container
  Normal  Started    16s   kubelet, 192.168.170.136  Started container
//可以看到第一步就是经过调度器分配
  • 资源分配到了node2
[root@master01 demo]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE    IP            NODE              NOMINATED NODE
pod-example   1/1     Running   0          3m1s   172.17.12.2   192.168.170.136   <none>

四、故障排除

在这里插入图片描述

//查看pod事件
kubectl describe TYPE NAME_PREFIX  
//查看pod日志(Failed状态下)
kubectl logs POD_NAME
//进入pod(状态为running,但是服务没有提供)
kubectl exec –it POD_NAME bash
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值