Pod调度策略

调度策略概述

● 什么是调度分配

- 在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,它不会迁移到其他节点,将一直等待下去

---
kind: Pod
apiVersion: v1
metadata:
  name: myhttp
spec:
  nodeName: node-0001     # 基于节点名称进行调度
  containers:
  - name: apache
    image: myos:httpd
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

标签与Pod调度

标签管理

● 标签是什么

- 标签(Labels)是附加到Kubernetes对象上的键值对(在yaml中需要写在元数据下面)

● 标签的用途

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

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

● 查看筛选标签

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

注意:资源配置标签不能随意修改

[root@master ~]# kubectl get pods --show-labels 
NAME      READY   STATUS    RESTARTS   AGE     LABELS
myhttp    1/1     Running   0          2m34s   <none>

[root@master ~]# kubectl get namespaces --show-labels 
NAME              STATUS   AGE     LABELS
default           Active   3h44m   kubernetes.io/metadata.name=default
kube-node-lease   Active   3h44m   kubernetes.io/metadata.name=kube-node-lease
kube-public       Active   3h44m   kubernetes.io/metadata.name=kube-public
kube-system       Active   3h44m   kubernetes.io/metadata.name=kube-system

[root@master ~]# kubectl get nodes --show-labels 
NAME        STATUS   ROLES            VERSION   LABELS
master      Ready    control-plane    v1.26.0   kubernetes.io/hostname=master
node-0001   Ready    <none>           v1.26.0   kubernetes.io/hostname=node-0001
node-0002   Ready    <none>           v1.26.0   kubernetes.io/hostname=node-0002
node-0003   Ready    <none>          v1.26.0   kubernetes.io/hostname=node-0003
node-0004   Ready    <none>           v1.26.0   kubernetes.io/hostname=node-0004
node-0005   Ready    <none>           v1.26.0   kubernetes.io/hostname=node-0005
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

● 管理标签语法格式

- 设置标签

kubectl label 资源类型 [资源名称] <key>=<value>

- 删除标签

kubectl label 资源类型 [资源名称] <key>-

- 查看标签

kubectl get 资源类型 [资源名称] --show-labels

- 使用标签选择

kubectl get 资源类型 [资源名称] -l <key>=<value>

使用标签过滤
# 使用标签过滤资源对象
[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>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

● 资源文件设置标签

---
kind: Pod
apiVersion: v1
metadata:
  name: myhttp
  labels:               # 声明标签
    app: apache         # 标签键值对
spec:
  containers:
  - name: apache
    image: myos:httpd
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

Pod 资源配额

资源管理概述

● 为什么要资源配额

- 当多个应用共享固定节点数目的集群是,人们担心某些应用无法获取足够的资源,从而影响到其他正常运行,我们需要设定一些规则,用来保证应用能获取其运行所需资源

● CPU资源类型

- CPU资源的约束和请求以耗核(m)为单位。在k8s中1m是最小的调度单元,CPU的一个核心可以看作1000m

- 如果你有2颗CPU,且每CPU为4核心,那么你的CPU资源总量就是8000m

● 内存资源类型

- memory的约束和请求以字节为单位

- 可以使用以下单位来表示内存:E、P、T、G、M、k

- 对应的2的幂数:Ei、Pi、Ti、G、Mi、Ki、 1k==1000 1Ki==1024

内存资源配额
[root@master ~]# vim minpod.yaml 
---
kind: Pod
apiVersion: v1
metadata:
  name: minpod
spec:
  terminationGracePeriodSeconds: 0
  nodeSelector:                        # 配置 Pod 调度节点
    kubernetes.io/hostname: node-0003  # 在 node-0003 节点创建
  containers:
  - name: linux
    image: myos:8.5
    command: ["awk", "BEGIN{while(1){}}"]
    resources:               # 资源策略
      requests:              # 配额策略
        memory: 1100Mi       # 内存配额
    
# 验证配额策略
[root@master ~]# for i in app{1..5};do sed "s,minpod,${i}," minpod.yaml;done |kubectl apply -f -
pod/app1 created
pod/app2 created
pod/app3 created
pod/app4 created
pod/app5 created
[root@master ~]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
app1   1/1     Running   0          4s
app2   1/1     Running   0          4s
app3   1/1     Running   0          4s
app4   0/1     Pending   0          4s
app5   0/1     Pending   0          4s
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

Pod 资源配额

● 为什么要使用资源限额

- 限额策略是为了防止某些应用节点对节点资源过度使用,而配置的限制性策略,限额与配额相反,它不检查节点资源的剩余情况,只限制应用对资源的最大使用量

- 资源限额使用limits进行配置

● 限额内存、CPU

注意:如果不写配额会自动添加与限额相等的配额,想要设置区间需要在配置文件中自己手动添加

# 创建限额资源对象文件
[root@master ~]# vim maxpod.yaml 
---
kind: Pod
apiVersion: v1
metadata:
  name: maxpod
spec:
  terminationGracePeriodSeconds: 0
  containers:
  - name: linux
    image: myos:8.5
    command: ["awk", "BEGIN{while(1){}}"]
    resources:
      limits:
        cpu: 800m
        memory: 2000Mi
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.