K8S之调度约束

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

一、调度方式

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

示例1:nodeName

apiVersion: v1  
kind: Pod  
metadata:
  name: pod-example  
  labels:
    app: nginx  
spec:
  nodeName: 192.168.195.150
  containers:
  - name: nginx  
    image: nginx:1.15

[root@localhost demo]# kubectl create -f pod5.yaml 
pod/pod-example created
[root@localhost demo]# kubectl get pods
pod-example                       1/1     Running   0          86s
//查看网络
[root@localhost demo]# kubectl get pods -o wide
pod-example                       1/1     Running   0          2m9s   172.17.47.7   192.168.195.150   <none>
//查看详细事件(发现未经过调度器)
[root@localhost demo]# kubectl describe pod pod-example

Events:
  Type    Reason   Age   From                      Message
  ----    ------   ----  ----                      -------
  Normal  Pulled   97s   kubelet, 192.168.195.150  Container image "nginx:1.15" already present on machine
  Normal  Created  97s   kubelet, 192.168.195.150  Created container
  Normal  Started  97s   kubelet, 192.168.195.150  Started container

//清空所有pod
[root@localhost demo]# kubectl delete -f .
[root@localhost demo]# kubectl get pods
No resources found.

示例2:nodeSelector

//获取标签帮助
[root@localhost 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@localhost demo]# kubectl get node
NAME              STATUS   ROLES    AGE   VERSION
192.168.195.150   Ready    <none>   14d   v1.12.3
192.168.195.151   Ready    <none>   14d   v1.12.3
//给对应的node设置标签分别为kgc=a和kgc=b
[root@localhost demo]# kubectl label nodes 192.168.195.150 kgc=a
node/192.168.195.150 labeled
[root@localhost demo]# kubectl label nodes 192.168.195.151 kgc=b
node/192.168.195.151 labeled
//查看标签
[root@localhost demo]# kubectl get nodes --show-labels
NAME              STATUS   ROLES    AGE   VERSION   LABELS
192.168.195.150   Ready    <none>   14d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kgc=a,kubernetes.io/hostname=192.168.195.150
192.168.195.151   Ready    <none>   14d   v1.12.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kgc=b,kubernetes.io/hostname=192.168.195.151


[root@localhost demo]# vim pod5.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeSelector: 
    kgc: b
  containers:
  - name: nginx
    image: nginx:1.15

[root@localhost demo]# kubectl apply -f pod5.yaml 
pod/pod-example created
//查看详细事件(通过事件可以观察经过调度器分配)
[root@localhost demo]# kubectl describe pod pod-example
Events:
  Type    Reason     Age   From                      Message
  ----    ------     ----  ----                      -------
  Normal  Scheduled  67s   default-scheduler         Successfully assigned default/pod-example to 192.168.195.151
  Normal  Pulling    66s   kubelet, 192.168.195.151  pulling image "nginx:1.15"
  Normal  Pulled     24s   kubelet, 192.168.195.151  Successfully pulled image "nginx:1.15"
  Normal  Created    24s   kubelet, 192.168.195.151  Created container
  Normal  Started    24s   kubelet, 192.168.195.151  Started container

二、故障排除

在这里插入图片描述

//查看pod事件
kubectl describe TYPE NAME_PREFIX  
//查看pod日志(Failed状态下)
kubectl logs POD_NAME
//进入pod(状态为running,但是服务没有提供)
kubectl exec –it POD_NAME bash
### Kubernetes 调度器工作原理 Kubernetes 调度器的核心任务是将新创建的 Pod 分配到最适合运行它的节点上[^1]。这一过程涉及多个阶段,主要包括以下几个方面: #### 1. **调度流程概述** 调度器作为一个独立的控制平面组件,持续监控集群中的未分配 Pod,并为其寻找最佳目标节点[^3]。整个调度过程可以分为两个主要阶段:过滤(Filtering)和评分(Scoring)。 - **过滤阶段**:调度器首先筛选出能够满足 Pod 运行条件的所有候选节点。这一步骤基于预定义的规则集完成,例如资源可用性、亲和性和反亲和性约束等[^4]。 - **评分阶段**:对于通过过滤阶段的节点,调度器会应用一系列优先级函数对其进行打分。最终得分最高的节点会被选中作为目标节点。 #### 2. **绑定操作** 一旦选定目标节点,调度器会向 `kube-apiserver` 发送绑定请求,通知该 Pod 应当部署在哪一节点上。此步骤称为绑定(Binding),它是调度过程中不可或缺的一部分[^5]。 --- ### 配置方法 为了实现更灵活的调度行为,用户可以通过多种方式调整默认调度逻辑: #### 自定义调度策略 Kubernetes 支持自定义调度策略文件,允许管理员指定不同的调度算法或权重设置。以下是配置自定义调度策略的一个简单示例: ```yaml apiVersion: kubescheduler.config.k8s.io/v1beta1 kind: KubeSchedulerConfiguration profiles: - schedulerName: default-scheduler plugins: score: enabled: - name: NodeResourcesBalancedAllocation weight: 1 ``` 上述 YAML 文件展示了如何修改内置插件 `NodeResourcesBalancedAllocation` 的权重值。通过这种方式,用户可以根据实际需求微调调度决策。 #### 动态调度框架 从 v1.16 开始,Kubernetes 引入了扩展性强的动态调度框架(Dynamic Scheduling Framework)。开发者可以编写自定义调度插件并将其集成至现有调度器中,从而支持更为复杂的业务场景。 --- ### 使用注意事项 在大规模生产环境中使用 Kubernetes 调度器时需要注意以下几点: - **性能优化**:随着集群规模的增长,调度延迟可能成为瓶颈。为此,建议启用多线程调度模式以提升效率[^2]。 - **高可用性设计**:为了避免单点故障风险,通常推荐采用多副本的方式部署 kube-scheduler 实例。 --- ### 示例代码 下面是一段用于测试自定义调度策略效果的小型 Python 客户端脚本: ```python from kubernetes import client, config config.load_kube_config() v1 = client.CoreV1Api() pod_manifest = { 'apiVersion': 'v1', 'kind': 'Pod', 'metadata': {'name': 'test-pod'}, 'spec': { 'schedulerName': 'custom-scheduler', # 指定自定义调度器名称 'containers': [{ 'name': 'busybox', 'image': 'busybox', 'command': ['sleep', 'infinity'] }] } } resp = v1.create_namespaced_pod(body=pod_manifest, namespace='default') print(f"Pod {resp.metadata.name} created.") ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值