成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Kubernetes 漫游:Kube-Scheduler

云計算 云原生
LimitRange 是資源描述對象,主要用于限制命名空間內(nèi)資源的使用。它可以設置默認的資源請求和限制,以及資源使用的最大和最小值。它可以確保每個 Pod 或容器在資源使用上遵循特定的策略,從而避免單個 Pod 或容器占用過多資源。

概述

什么是 kube-scheduler ?

Kubernetes 集群的核心組件之一,它負責為新創(chuàng)建的 Pods 分配節(jié)點。它根據(jù)多種因素進行決策,包括:

1. 資源需求和限制:考慮每個 Pod 請求的資源量(如 CPU 和內(nèi)存)以及節(jié)點上可用的資源。

2. 親和性和反親和性規(guī)則:根據(jù) Pod 的親和性設置選擇最適合的節(jié)點。

3. 健康檢查:確保選擇的節(jié)點健康且能夠運行 Pod。

4. 負載均衡:盡量平衡集群中各個節(jié)點的負載。

使用

limits 和 reuqests

在部署對象中的 spec 中常常會見到關于 limits 和 requests 的聲明 ,例如:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          resources:
            limits:
              memory: 1Gi
              cpu: 1
            requests:
              memory: 256Mi
              cpu: 100m

這里的 limits 和 requests 是與 Pod 容器資源管理相關的兩個關鍵概念:

? Limits:指定容器運行時能夠使用的最大資源量

? Requests:指定容器啟動時最低需要的資源量

limits 和 requests 跟 scheduler 有什么關系 ?

在集群中 kube-scheduler 一直是默默無聞的幕后工作者,它主要工作內(nèi)容如下:

1. 當你創(chuàng)建一個 Deployment,如這個 nginx,是由 kube-scheduler 決策將其調(diào)度到哪個 Node 上運行的

2. kube-scheduler 會監(jiān)聽 apiserver 獲取集群全局視圖,然后根據(jù) Pod 的資源請求(requests 和 limits)分析

3. 最終 kube-scheduler 會結合資源請求和集群的實際情況來調(diào)度 Pod

總之,kube-scheduler 會保證 Pod 會調(diào)度到滿足其運行資源需求的 Node 節(jié)點上。

LimitRange

描述

LimitRange 是資源描述對象,主要用于限制命名空間內(nèi)資源的使用。它可以設置默認的資源請求和限制,以及資源使用的最大和最小值。它可以確保每個 Pod 或容器在資源使用上遵循特定的策略,從而避免單個 Pod 或容器占用過多資源。使用示例如下:

創(chuàng)建一個 YAML 文件保存 LimitRange 內(nèi)容,例如:mem-limit-range.yaml:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
    - default:
        memory: 512Mi
      defaultRequest:
        memory: 256Mi
      type: Container

應用到集群:

$ kubectl apply -f mem-limit-range.yaml

查看創(chuàng)建的 LimitRange 對象:

$ kubectl describe limitrange mem-limit-range

輸出:

Name:       mem-limit-range
Namespace:  default
Type        Resource  Min  Max  Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---  ---  ---------------  -------------  -----------------------
Container   memory    -    -    256Mi            512Mi          -

說明:

? Kind:設置為 LimitRange,用于限制命名空間內(nèi)資源的使用。

? Metadata:設置資源的名稱

? Spec:

Limits:

default:指定沒有明確資源限制的容器的默認內(nèi)存限制為 512Mi

defaultRequest:指定沒有明確資源請求的容器的默認內(nèi)存請求。這里設置為 256Mi

type:應用這些限制的資源類型,在這里是 Container

驗證

定義一個沒有聲明資源請求的部署對象,文件命名為: nginx-without-resource.yaml ,如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx

應用部署到集群:

$ kubectl apply -f nginx-without-resource.yaml

等 Pod 創(chuàng)建后,可以通過檢查它們的配置來確認 LimitRange 是否生效。

$ kubectl describe pod [POD_NAME]

輸出:

Containers:
    #.. ignore
        Limits:
      memory:  512Mi
    Requests:
      memory:     256Mi

initContainers

initContainers 用于在主應用容器啟動之前執(zhí)行一些預備任務。常見于以下場景:

  1. 1. 準備工作:設置需要的配置文件、數(shù)據(jù)庫遷移、等待其他服務就緒等。
  2. 2. 安全性:權限提升操作,如改變文件權限或者執(zhí)行特定的安全檢查。
  3. 3. 服務依賴性:等待其他服務或數(shù)據(jù)庫可用。

initContainers 在執(zhí)行完其任務后會停止,且必須成功完成才能啟動主容器。非常適合用于啟動前的初始化任務。

示例:

在部署對象中聲明 initContainers 屬性:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      initContainers:
        - name: init-myservice
          image: busybox:1.28
          command: ['sh', '-c', 'echo The app is running! && sleep 10']
      containers:
        - name: nginx
          image: nginx

將部署對象應用到集群:

$ kubectl apply -f init-container.yaml

當 Pod 啟動后,可以通過查看事件日志驗證容器的加載順序:

Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  2m20s  default-scheduler  Successfully assigned default/nginx-deployment-6445f86ddc-fmmzw to docker-desktop
  Normal  Pulling    2m20s  kubelet            Pulling image "busybox:1.28"
  Normal  Pulled     116s   kubelet            Successfully pulled image "busybox:1.28" in 23.099396719s (23.099404677s including waiting)
  Normal  Created    116s   kubelet            Created container init-myservice
  Normal  Started    116s   kubelet            Started container init-myservice
  Normal  Pulling    106s   kubelet            Pulling image "nginx"
  Normal  Pulled     88s    kubelet            Successfully pulled image "nginx" in 18.382000675s (18.382006008s including waiting)
  Normal  Created    88s    kubelet            Created container nginx
  Normal  Started    88s    kubelet            Started container nginx

可以看到 initContainers 聲明的容器已經(jīng)加載,然后查看特定的日志,來檢查 Pod 日志輸出:

$ kubectl logs [POD_NAME] -c init-myservice

輸出:

The app is running!

驗證完成。

initContainers 和 kube-scheduler 的關系 ?

如果 initContainers 沒有聲明資源需求,默認也會使用 LimitRange 聲明的默認資源,這也意味著,initContainers 也是由 kube-scheduler 來調(diào)度創(chuàng)建的。所以在 initContainers 中加上資源需求也會影響著 kube-scheduler 的調(diào)度決策。

nodeSelector

在部署對象中,nodeSelector 屬性的作用是用于把指定 Pod 調(diào)度到具有特定標簽的節(jié)點上。如果沒有滿足要求的 Node 節(jié)點,則 Pod 會持續(xù)等待,示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
      nodeSelector:
        disktype: ssd

在這個例子中 nodeSelector 屬性值為:disktype: ssd 。這表明這個 Pod 應該被調(diào)度到標簽為 disktype=ssd 的 Node 節(jié)點上。kube-scheduler 在調(diào)度時,會選擇合適的節(jié)點以運行這個 Pod 時。

先將部署對象應用到集群中:

$ kubectl apply -f node-selector.yaml

然后查看 Pod 狀態(tài):

$ kubectl get pod

輸出:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-f5bc98d57-pmq9v    0/1     Pending   0          2m17s

可以看到創(chuàng)建的 Pod 一直保持在 "Pending" 狀態(tài)。通過事件日志查看具體原因:

$ kubectl describe pod [POD_NAME]

輸出:

Events:
  Type     Reason            Age    From               Message
  ----     ------            ----   ----               -------
  Warning  FailedScheduling  4m38s  default-scheduler  0/1 nodes are available: 1 node(s) didn't match Pod's node affinity/selector. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..

從事件日志可以看出,這個 Pod 不能被調(diào)度,因為沒有節(jié)點滿足其設定的節(jié)點選擇條件。因為我的集群中確實沒有任何標記為 disktype: ssd 的節(jié)點在運行。

Affinity 親和性

NodeSelector 的演進版本,提供了更復雜的選擇規(guī)則。除了簡單的匹配,它們還支持更豐富的條件表達式,如 "存在"、"不等于"、"在集合中" 等,并且支持對 Pod 之間(Pod Affinity/Anti-Affinity)以及 Pod 與節(jié)點之間(Node Affinity)的親和性/反親和性設置。在 Kubernetes 后續(xù)版本中 Affinity 也逐漸替代了 NodeSelector。

podAffinity

podAffinity 用于定義 Pods 之間的親和性。使得某個 Pod 被調(diào)度到與其他特定標簽的 Pod 相同的節(jié)點上。

使用場景:當希望一組服務緊密地協(xié)同工作時,比如一個應用的不同組件需要低延遲通訊。

示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-anti
spec:
  replicas: 2
  selector:
    matchLabels:
      app: anti-nginx
  template:
    metadata:
      labels:
        app: anti-nginx
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
                - key: a
                  operator: In
                  values:
                    - b
            topologyKey: kubernetes.io/hostname
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
                - key: app
                  operator: In
                  values:
                    - anti-nginx
            topologyKey: kubernetes.io/hostname
      containers:
        - name: with-pod-affinity
          image: nginx

部署文件展示親和性(Affinity)設置:

  • ? PodAffinity:要求調(diào)度的 Pod 必須與具有特定標簽(鍵 a,值 b)的 Pod 在相同的節(jié)點上。
  • ? PodAntiAffinity:要求調(diào)度的 Pod 不能與具有相同標簽(鍵 app,值 anti-nginx)的 Pod 在相同的節(jié)點上。

將上面部署文件應用到集群后,查看 Pods 的分布情況:

NAME                          READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
nginx-anti-5656fcbb98-62mds   0/1     Pending   0          5s    <none>   <none>   <none>           <none>
nginx-anti-5656fcbb98-wxphs   0/1     Pending   0          5s    <none>   <none>   <none>           <none>

可以 Pod 因為親和性規(guī)則無法調(diào)度一直處于等待狀態(tài),查看特定 Pod 的事件日志可以驗證:

Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  27s   default-scheduler  0/1 nodes are available: 1 node(s) didn't match pod affinity rules. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..

利用 Pod 親和性和反親和性規(guī)則來控制 Pod 的調(diào)度位置,以實現(xiàn)特定的調(diào)度需求和負載分布。

nodeAffinity

用于定義 Pod 與節(jié)點之間的親和性。控制 Pod 被調(diào)度到具有特定標簽或?qū)傩缘墓?jié)點上。

適用場景:當您需要根據(jù)硬件特性(如 GPU、高性能存儲)或其他自定義標簽(如環(huán)境標簽)調(diào)度 Pod 時。

示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: disktype
                    operator: In
                    values:
                      - ssd
      containers:
        - name: nginx
          image: nginx

部署文件的親和性(Affinity)設置:

? nodeAffinity 被設置為要求 Pod 被調(diào)度到具有 disktype: ssd 標簽的節(jié)點上。

將上面部署文件應用到集群后,查看 Pod 的運行情況:

NAME                                READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
nginx-deployment-565d7797dc-jf5nk   0/1     Pending   0          14s   <none>   <none>   <none>           <none>

可以 Pod 因為親和性規(guī)則無法調(diào)度一直處于等待狀態(tài),查看特定 Pod 的事件日志可以驗證:

Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  89s   default-scheduler  0/1 nodes are available: 1 node(s) didn't match Pod's node affinity/selector. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..

preferredDuringSchedulingIgnoredDuringExecution

和之前的 requiredDuringScheduling 調(diào)度類型不同,preferredDuringScheduling 表明其是一個偏好性的調(diào)度,調(diào)度器會根據(jù)偏好優(yōu)先選擇滿足對應規(guī)則的節(jié)點來調(diào)度Pod。但如果找不到滿足規(guī)則的節(jié)點,調(diào)度器則會選擇其他節(jié)點來調(diào)度Pod。

示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
                - key: disktype
                  operator: In
                  values:
                    - ssd
      containers:
        - name: nginx
          image: nginx

配置說明:這里使用的是 preferredDuringSchedulingIgnoredDuringExecution 類型,這意味著調(diào)度器會盡量但不強制將 Pod 調(diào)度到具有 disktype: ssd 標簽的節(jié)點上。

將上面部署文件應用到集群后,查看 Pod 的運行情況:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-69c654d896-7qh8t   1/1     Running   0          28s

可以看到雖然我本地沒有滿足親和性規(guī)則的 Node 節(jié)點,但是 Pod 依然可以調(diào)度起來了。

總結:

? podAffinity 關注的是 Pod 之間的關系不同

? nodeAffinity 更關注 Pod 與節(jié)點特性之間的關系

requiredDuringScheduling:硬親和,強制型調(diào)度規(guī)則,必須滿足親和性設置,否則不能調(diào)度

preferredDuringScheduling:軟親和,偏好型調(diào)度規(guī)則,首先找到滿足設置的節(jié)點,沒有則會調(diào)度到其他節(jié)點

Taints 污點

Taints 和 Tolerations 是 Kubernetes 中用于控制 Pod 調(diào)度到特定節(jié)點的一種機制,相比 Affinity 親和性 **相似性 **的機制,Taints 的規(guī)則是屬于 排斥性 的機制,用來“排斥”不滿足特定條件的 Pod。

Taints 有三種效果:

? NoSchedule(不會調(diào)度新 Pod)

? PreferNoSchedule(盡量避免調(diào)度新 Pod)

? NoExecute(新 Pod 不會調(diào)度且已存在 Pod 可能會被遷移)

Taints 常見的應用場景:

? 對于集群中不想共享的 Node,可以加上 Taints 標簽表示獨享

? 用于多租戶 Kubernetes 計算資源隔離

? Kubernetes 本身使用 Taints 機制驅(qū)除不可用的 Node

使用示例:

給節(jié)點添加 Taint,防止所有 Pod 自動調(diào)度到該節(jié)點,除非它們具有匹配的 Tolerations:

$ kubectl taint nodes docker-desktop for-special-user=cadmin:NoSchedule

先定義一個沒有任何 Tolerations 的 Pod 來驗證:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx

將它應用到集群,查看 Pod 狀態(tài)會一直處于 Pending:

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-77b4fdf86c-wm5f9   0/1     Pending   0          23s

從事件日志可以看到是 Taints 在發(fā)揮作用:

Events:
  Type     Reason            Age   From               Message
  ----     ------            ----  ----               -------
  Warning  FailedScheduling  56s   default-scheduler  0/1 nodes are available: 1 node(s) had untolerated taint {for-special-user: cadmin}. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..

然后再 Pod 定義中添加 Tolerations,允許它被調(diào)度到帶有特定 Taint 的節(jié)點上:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
      tolerations:
        - key: "for-special-user"
          operator: "Equal"
          value: "docker-desktop"
          effect: "NoSchedule"

這個部署文件設置了一個 容忍度 (Tolerations) 規(guī)則:允許 Pod 被調(diào)度到標記為 for-special-user=docker-desktop 并且具有 NoSchedule 效果的節(jié)點上。

將它應用到集群,查看 Pod 狀態(tài):

NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-dd7d69c9c-77qlf   1/1     Running   0          31s

Pod 已經(jīng)正常調(diào)度,這也是 Taints 發(fā)揮作用。

如果節(jié)點不在需要 Tanints 作為排除,可以移除 :

$ kubectl taint nodes docker-desktop for-special-user=cadmin:NoSchedule-

輸出:

node/docker-desktop untainted

PriorityClass

PriorityClass 用于定義 Pod 的調(diào)度優(yōu)先級。常見的場景包括:

1. 確保關鍵服務優(yōu)先調(diào)度:對于關鍵組件,如數(shù)據(jù)庫、核心應用服務,可以設置更高的優(yōu)先級。

2. 管理資源爭用:在資源有限的環(huán)境中,通過設置不同的優(yōu)先級,管理不同 Pod 的調(diào)度順序。

使用 PriorityClass 的步驟:

1. 創(chuàng)建 PriorityClass:apiVersion: scheduling.k8s.io/v1kind: PriorityClassmetadata:  name: high-priorityvalue: 1000000globalDefault: falsedescription: "This priority class should be used for XYZ service pods only."

說明:

? value:這是一個整數(shù),表示該 PriorityClass 的優(yōu)先級。較高的數(shù)值表示更高的優(yōu)先級。

? globalDefault:表示為集群中所有沒有指定優(yōu)先級的 Pod 的默認優(yōu)先級。

1. 在 Pod 中指定 PriorityClass:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  priorityClassName: high-priority
  containers:
  - name: mycontainer
    image: myimage

通過 priorityClassName 應用剛才創(chuàng)建的 PriorityClass,從而確保該 Pod 具有更高的調(diào)度優(yōu)先級。

自定義 scheduler

默認的調(diào)度器是面向通用的使用場景設計的,如果默認的 Kubernetes 調(diào)度器無法滿足需求,也可以通過自定義的調(diào)度器來滿足更加個性化的需求,示例:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  schedulerName: my-custom-scheduler
  containers:
  - name: mycontainer
    image: myimage

社區(qū)也有很多成熟開源的自定義調(diào)度器,例如:

? 騰訊 TKE 的調(diào)度器

? 華為 volcano 調(diào)度器

另外也可以參考 kube-scheduler 源碼實現(xiàn)一個自己的調(diào)度器。

責任編輯:武曉燕 來源: 小二十七
相關推薦

2021-12-31 08:43:45

插件KubeScheduler

2023-11-26 13:36:20

協(xié)議Raft

2021-08-17 07:15:15

ciliumKubernetes集群

2023-03-06 00:27:02

Kubernetesscheduler系統(tǒng)

2023-10-27 08:03:29

Kubernetes開源工具

2017-08-23 11:10:44

Kubernetes 調(diào)度詳解

2022-08-27 22:36:18

Kubernetes調(diào)度器

2021-06-17 06:29:16

kube-vip Kubernetes開源項目

2022-03-24 07:44:41

OPA安全策略Rego

2021-09-09 07:45:25

kube-vip Kuberneteshostname

2018-07-02 06:33:25

物聯(lián)網(wǎng)手機漫游網(wǎng)絡

2021-04-02 14:23:12

WiFi網(wǎng)絡技術

2021-03-31 21:20:15

WiFi網(wǎng)絡漫游

2011-08-09 09:48:20

JavaScript

2017-12-28 16:57:42

智慧中心

2013-09-25 09:52:16

wifi 2.0無線網(wǎng)絡

2023-10-30 22:23:12

Cacherkube版本

2023-03-03 15:37:32

GMP 模型goroutine

2021-01-29 08:22:03

調(diào)度器Yarn架構

2022-12-06 08:30:06

SchedulerReact
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产日韩欧美在线 | 精品一区二区三区四区在线 | 欧美在线视频免费 | 久久国产精品久久久久久 | 国产精品黄色 | 日韩性在线 | 国产精品不卡一区 | 激情一区二区三区 | 成人av一区二区亚洲精 | 欧美精品一区二区三区蜜桃视频 | 国产精品久久久久久久久久久久久 | 99精品99久久久久久宅男 | 日本aa毛片a级毛片免费观看 | 成人一级视频在线观看 | 欧美国产一区二区 | 成人午夜免费福利视频 | 蜜臀91视频| 在线播放中文字幕 | www一级片| 国产成人精品一区二区三区在线 | 欧美激情综合 | 99国内精品久久久久久久 | a黄毛片| 久久久精品 | 欧美一级片免费看 | 操亚洲 | 亚洲高清三级 | 中文字幕日韩欧美一区二区三区 | 亚洲欧美久久 | 国产精品区一区二区三 | 婷婷久久网 | 亚洲成人网在线播放 | japan25hdxxxx日本| h在线免费观看 | 亚洲精品视频在线观看视频 | 国产高清一区二区 | 亚洲天堂av在线 | 在线免费亚洲视频 | 二区亚洲 | 欧美日韩在线成人 | 99久久精品国产一区二区三区 |