调度分配

● 在k8s中,调度是将Pod 分配到合适的计算节点上,然后对应节点上的Kubelet运行这些pod

● kube-scheduler是默认调度器,是集群的核心组件

调度器工作

● 调度器通过k8s的检测(Watch)机制来发现集群中尚未被调度到节点上的Pod。调度器依据调度原则将Pod分配到一个合适的节点上运行。

调度流程

● 调度器给一个pod做调度选择包括两个步骤:过滤和打分

第一步过滤

● 首先要筛选出满足Pod所有的资源请求的节点,这里包含计算资源、内存、存储、网络、端口号等等,如果没有节点满足Pod的需求,Pod将一直停留在Pending状态,直到调度器能够找到合适的节点运行它。

打分

● 在打分阶段,调度器会根据打分规则,为每一个可调度节点进行打分。选出其中得分最高的节点来运行Pod。

绑定

● 在确定了某个节点运行Pod 之后,调度器将这个调度决定通知给kube-apiserver,这个过程叫做绑定。

Pod定向调度

● 基于节点名称的调度

○ 在创建Pod过程中,我们可以配置相关的调度规则,从而让Pod运行在指定的节点上

○ nodeName标签,让Pod运行在指定的节点上

○ 注意:如果标签指定的节点无法运行Pod,它不会迁移到其他节点,将一直等待下去

[root@master ~]# vim myhttp.yaml 
---
kind: Pod
apiVersion: v1
metadata:
  name: myhttp
spec:
  nodeName: node-0001     # 基于节点名称进行调度
  containers:
  - name: apache
    image: myos:httpd
[root@master ~]# kubectl apply -f myhttp.yaml  
pod/myhttp created
[root@master ~]# kubectl get pods -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP           NODE
myhttp    1/1     Running   0          3s    10.244.1.6   node-0001

标签管理

标签:是附件到k8s对象上的键值对
标签的用途

● k8s在创建、删除、修改资源对象的时候可以使用标签来确定要修改的资源对象。在Pod调度的任务中,使用标签可以更加灵活的完成调度任务。

● 标签可以在创建时附件到对象,也可以在创建之后随时添加和修改。标签可以用于组织和选择对象的子集。

● 使用 ---show-labels查询标签

# 使用标签过滤资源对象
[root@master ~]# kubectl get nodes -l kubernetes.io/hostname=master
NAME     STATUS   ROLES              AGE     VERSION
master   Ready    control-plane      3h38m   v1.26.0
添加标签
[root@master ~]# kubectl label pod myhttp app=apache
pod/myhttp labeled
[root@master ~]# kubectl get pods --show-labels 
NAME      READY   STATUS    RESTARTS   AGE   LABELS
myhttp    1/1     Running   0          14m   app=apache
删除标签
[root@master ~]# kubectl label pod myhttp app-
pod/myhttp labeled
[root@master ~]# kubectl get pods --show-labels 
NAME      READY   STATUS    RESTARTS   AGE   LABELS
myhttp    1/1     Running   0          14m   <none>
资源文件标签
[root@master ~]# vim myhttp.yaml 
---
kind: Pod
apiVersion: v1
metadata:
  name: myhttp
  labels:               # 声明标签
    app: apache         # 标签键值对
spec:
  containers:
  - name: apache
    image: myos:httpd
[root@master ~]# kubectl delete pods myhttp
pod "myhttp" deleted
[root@master ~]# kubectl apply -f myhttp.yaml  
pod/myhttp created
[root@master ~]# kubectl get pods --show-labels 
NAME      READY   STATUS    RESTARTS   AGE   LABELS
myhttp    1/1     Running   0          14m   app=apache


标签选择运算符

● 与名称和UID不同,标签不支持唯一性。

● 通过标签选择算符,客户端/用户可以识别一组对象

● 标签选择算符可以由多个需求组成。在多个需求的情况下,必须满足所有需求,相当于逻辑与(&&) 运算符

spec:
  nodeSelector:                        # 在Pod.spec中声明标签选择运算符
    key:value                        # 选择的标签