调度分配
● 在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 # 选择的标签