成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Kubernetes 親和性調(diào)度

GT / 2787人閱讀

摘要:換句話說(shuō),親和性選擇節(jié)點(diǎn)僅在調(diào)度時(shí)起作用。先創(chuàng)建集群反親和性打散各個(gè)副本再部署服務(wù),需要打散并且與服務(wù)共存,配置如下注意需要進(jìn)行大量處理,所以會(huì)明顯減慢大型集群的調(diào)度時(shí)間,不建議在大于幾百個(gè)節(jié)點(diǎn)的集群中使用該功能。

一、概述

前一篇文章 Kubernetes 調(diào)度器淺析,大致講述了調(diào)度器的工作原理及相關(guān)調(diào)度策略。這一章會(huì)繼續(xù)深入調(diào)度器,介紹下“親和性調(diào)度”。

Kubernetes 支持限制 Pod 在指定的 Node 上運(yùn)行,或者指定更傾向于在某些特定 Node 上運(yùn)行。
有幾種方式可以實(shí)現(xiàn)這個(gè)功能:

NodeName: 最簡(jiǎn)單的節(jié)點(diǎn)選擇方式,直接指定節(jié)點(diǎn),跳過(guò)調(diào)度器。

NodeSelector: 早期的簡(jiǎn)單控制方式,直接通過(guò)鍵—值對(duì)將 Pod 調(diào)度到具有特定 label 的 Node 上。

NodeAffinity: NodeSelector 的升級(jí)版,支持更豐富的配置規(guī)則,使用更靈活。(NodeSelector 將被淘汰.)

PodAffinity: 根據(jù)已在節(jié)點(diǎn)上運(yùn)行的 Pod 標(biāo)簽來(lái)約束 Pod 可以調(diào)度到哪些節(jié)點(diǎn),而不是根據(jù) node label。

二、NodeName

nodeName 是 PodSpec 的一個(gè)字段,用于直接指定調(diào)度節(jié)點(diǎn),并運(yùn)行該 pod。調(diào)度器在工作時(shí),實(shí)際選擇的是 nodeName 為空的 pod 并進(jìn)行調(diào)度然后再回填該 nodeName,所以直接指定 nodeName 實(shí)際是直接跳過(guò)了調(diào)度器。換句話說(shuō),指定 nodeName 的方式是優(yōu)于其他節(jié)點(diǎn)選擇方法。

方法很簡(jiǎn)單,直接來(lái)個(gè)官方示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: kube-01

當(dāng)然如果選擇的節(jié)點(diǎn)不存在,或者資源不足,那該 pod 必然就會(huì)運(yùn)行失敗。

三、NodeSelector

nodeSelector 也是 PodSpec 中的一個(gè)字段,指定鍵—值對(duì)的映射。
如果想要將 pod 運(yùn)行到對(duì)應(yīng)的 node 上,需要先給這些 node 打上 label,然后在 podSpec.NodeSelector 指定對(duì)應(yīng) node labels 即可。

步驟如下:

設(shè)置標(biāo)簽到 node 上:

kubectl label nodes kubernetes-node type=gpu

pod 配置添加 nodeSelector 字段:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    type: gpu
內(nèi)置 Node 標(biāo)簽

Kubernetes 內(nèi)置了一些節(jié)點(diǎn)標(biāo)簽:

kubernetes.io/hostname

beta.kubernetes.io/instance-type

beta.kubernetes.io/os

beta.kubernetes.io/arch

failure-domain.beta.kubernetes.io/zone

failure-domain.beta.kubernetes.io/region

有些標(biāo)簽是對(duì)云提供商使用。

還有些表示 node role 的 labels(可以指定 master、lb 等):

kubernetes.io/role

node-role.kubernetes.io

四、NodeAffinity

nodeSelector 通過(guò) k-v 的方式非常簡(jiǎn)單的支持了 pod 調(diào)度限制到具有特定標(biāo)簽的節(jié)點(diǎn)上。而 nodeAffinity 根據(jù)親和力 & 反親和力極大地?cái)U(kuò)展了能夠表達(dá)的約束信息。

nodeAffinity 特性的設(shè)計(jì)初衷就是為了替代 nodeSelector。

nodeAffinity 當(dāng)前支持的匹配符號(hào)包括:In、NotIn、Exists、DoesNotExists、Gt、Lt 。

nodeAffinity 當(dāng)前支持兩種調(diào)度模式:

requiredDuringSchedulingIgnoredDuringExecution: 一定要滿足的條件,如果沒(méi)有找到滿足條件的節(jié)點(diǎn),則 Pod 創(chuàng)建失敗。所有也稱為hard 模式。

preferredDuringSchedulingIgnoredDuringExecution: 優(yōu)先選擇滿足條件的節(jié)點(diǎn),如果沒(méi)有找到滿足條件的節(jié)點(diǎn),則在其他節(jié)點(diǎn)中擇優(yōu)創(chuàng)建 Pod。所有也稱為 soft 模式。

兩種模式的名字特長(zhǎng),這是 k8s 的命名風(fēng)格。其中IgnoredDuringExecution的意義就跟 nodeSelector 的實(shí)現(xiàn)一樣,即使 node label 發(fā)生變更,也不會(huì)影響之前已經(jīng)部署且又不滿足 affinity rules 的 pods,這些 pods 還會(huì)繼續(xù)在該 node 上運(yùn)行。換句話說(shuō),親和性選擇節(jié)點(diǎn)僅在調(diào)度 Pod 時(shí)起作用。

k8s 社區(qū)正在計(jì)劃提供 requiredDuringSchedulingRequiredDuringExecution  模式,便于驅(qū)逐 node 上不滿足 affinity rules 的 pods。

來(lái)個(gè)官方示例,看下怎么玩:

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      # 必須選擇 node label key 為 kubernetes.io/e2e-az-name,
      # value 為 e2e-az1 或 e2e-az2.
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/e2e-az-name
            operator: In
            values:
            - e2e-az1
            - e2e-az2
      # 過(guò)濾掉上面的必選項(xiàng)后,再優(yōu)先選擇 node label key 為 another-node-label-key
      # value 為 another-node-label-value.
      preferredDuringSchedulingIgnoredDuringExecution:
      # 如果滿足節(jié)點(diǎn)親和,積分加權(quán)重(優(yōu)選算法,會(huì)對(duì) nodes 打分)
      # weight: 0 - 100
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value
  containers:
  - name: with-node-affinity
    image: k8s.gcr.io/pause:2.0

簡(jiǎn)單看下 NodeAffinity 的結(jié)構(gòu)體,下面介紹注意事項(xiàng)時(shí)會(huì)涉及:

type NodeAffinity struct {
    RequiredDuringSchedulingIgnoredDuringExecution *NodeSelector
    PreferredDuringSchedulingIgnoredDuringExecution []PreferredSchedulingTerm
}

type NodeSelector struct {
    NodeSelectorTerms []NodeSelectorTerm
}

type NodeSelectorTerm struct {
    MatchExpressions []NodeSelectorRequirement
    MatchFields []NodeSelectorRequirement
}

配置相關(guān)的注意點(diǎn):

如果 nodeSelectornodeAffinity 兩者都指定,那 node 需要兩個(gè)條件都滿足,pod 才能調(diào)度。

如果指定了多個(gè) NodeSelectorTerms,那 node 只要滿足其中一個(gè)條件,pod 就可以進(jìn)行調(diào)度。

如果指定了多個(gè) MatchExpressions,那必須要滿足所有條件,才能將 pod 調(diào)度到該 node。

五、PodAffinity

nodeSelector & nodeAffinity 都是基于 node label 進(jìn)行調(diào)度。而有時(shí)候我們希望調(diào)度的時(shí)候能考慮 pod 之間的關(guān)系,而不只是 pod 和 node 的關(guān)系。

舉個(gè)例子,會(huì)有需求希望服務(wù) A 和 B 部署在同一個(gè)機(jī)房、機(jī)架或機(jī)器上,因?yàn)檫@些服務(wù)可能會(huì)對(duì)網(wǎng)路延遲比較敏感,需要低延時(shí);再比如,希望服務(wù) C 和 D 又希望盡量分開(kāi)部署,即使一臺(tái)主機(jī)甚至一個(gè)機(jī)房出了問(wèn)題,也不會(huì)導(dǎo)致兩個(gè)服務(wù)一起掛而影響服務(wù)可用性,提升故障容災(zāi)的能力。

podAffinity 會(huì)基于節(jié)點(diǎn)上已經(jīng)運(yùn)行的 pod label 來(lái)約束新 pod 的調(diào)度。
其規(guī)則就是“如果 X 已經(jīng)運(yùn)行了一個(gè)或者多個(gè)符合規(guī)則 Y 的 Pod,那么這個(gè) Pod 應(yīng)該(如果是反親和性,則是不應(yīng)該)調(diào)度到 X 上”。
這里的 Y 是關(guān)聯(lián) namespace 的 labelSelector,當(dāng)然 namespace 也可以是 all。和 node 不同,pod 是隸屬于 namespace 下的資源,所以基于 pod labelSelector 必須指定具體的 namespace;而 X 則可以理解為一個(gè)拓?fù)溆?,?lèi)似于 node、rack、zone、cloud region 等等,就是前面提到的 內(nèi)置 Node 標(biāo)簽 ,當(dāng)然也可以自定義。

看下 pod affinity 涉及的結(jié)構(gòu)體,便于進(jìn)行功能介紹:

type Affinity struct {
    // NodeAffinity 前面介紹了
    NodeAffinity *NodeAffinity
    // pod 親和性
    PodAffinity *PodAffinity
    // pod 反親和性
    PodAntiAffinity *PodAntiAffinity
}

type PodAffinity struct {
    // hard 模式, 必選項(xiàng)
    RequiredDuringSchedulingIgnoredDuringExecution []PodAffinityTerm
    // soft 模式, 進(jìn)行 node 優(yōu)先
    PreferredDuringSchedulingIgnoredDuringExecution []WeightedPodAffinityTerm
}

type PodAffinityTerm struct {
    LabelSelector *metav1.LabelSelector
    Namespaces []string
    TopologyKey string
}

type WeightedPodAffinityTerm struct {
    Weight int32
    PodAffinityTerm PodAffinityTerm
}

podAffinity 和 nodeAffinity 有相似的地方,使用了 labelSelector 進(jìn)行匹配,支持的匹配符號(hào)包括:In、NotIn、Exists、DoesNotExists;
也支持兩種調(diào)度模式 requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution, 功能和 nodeAffinity 一樣,這里就不在累述。

podAffinity 和 nodeAffinity 也有較大的差異,前面講了 pod 是 namespace 資源,所以必然會(huì)需要配置 namespaces,支持配置多個(gè) namespace。如果省略的話,默認(rèn)為待調(diào)度 pod 所屬的 namespace;如果定義了但是值為空,則表示使用 “all” namespaces。

還有一個(gè)較大的差別 TopologyKey, 便于理解進(jìn)行多帶帶介紹。

TopologyKey

TopologyKey 用于定義 in the same place,前面也介紹了是拓?fù)溆?/b>的概念。

看下面的圖,這兩個(gè) pod 到底該如何算在一個(gè)拓?fù)溆颍?br>

如果我們使用k8s.io/hostname,in the same place 則意味著在同一個(gè) node,那下圖的 pods 就不在一個(gè) place:

如果我們使用failure-domain.k8s.io/zone 來(lái)表示一個(gè) place,那下圖的 pods 就表示在一個(gè) zone:

當(dāng)然我們也可以自定義 node labels 作為 TopologyKey。比如我們可以給一組 node 打上 rack 標(biāo)簽,那下圖的 pods 表示在同一個(gè) place:

原則上,topologyKey 可以是任何合法的 label key。但是出于性能和安全考慮,topologyKey 存在一些限制:

對(duì)于親和性和反親和性的 requiredDuringSchedulingIgnoredDuringExecution 模式,topologyKey 不能為空

pod 反親和性 requiredDuringSchedulingIgnoredDuringExecution 模式下,LimitPodHardAntiAffinityTopology 權(quán)限控制器會(huì)限制 topologyKey 只能設(shè)置為 kubernetes.io/hostname。當(dāng)然如果你想要使用自定義 topology,那可以簡(jiǎn)單禁用即可。

pod 反親和性 preferredDuringSchedulingIgnoredDuringExecution 模式下,topologyKey 為空則表示所有的拓?fù)溆?。截?v1.12 版本,所有的拓?fù)溆蜻€只能是 kubernetes.io/hostname, failure-domain.beta.kubernetes.io/zonefailure-domain.beta.kubernetes.io/region 的組合。

除此之外,topologyKey 可以是任何合法的 label key。

示例

來(lái)個(gè)官方示例,有三節(jié)點(diǎn)集群,需要分別部署 3 份 web 和 redis 服務(wù)。希望 web 與 redis 服務(wù)共存,但需要保證各個(gè)服務(wù)的副本分散部署。
先創(chuàng)建 redis 集群:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-cache
spec:
  selector:
    matchLabels:
      app: store
  replicas: 3
  template:
    metadata:
      labels:
        app: store
    spec:
      affinity:
        // pod 反親和性, 打散 redis 各個(gè)副本
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: redis-server
        image: redis:3.2-alpine

再部署 web 服務(wù),需要打散并且與 redis 服務(wù)共存,配置如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  selector:
    matchLabels:
      app: web-store
  replicas: 3
  template:
    metadata:
      labels:
        app: web-store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web-store
            topologyKey: "kubernetes.io/hostname"
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: web-app
        image: nginx:1.12-alpine
注意1: pod affinity 需要進(jìn)行大量處理,所以會(huì)明顯減慢大型集群的調(diào)度時(shí)間,不建議在大于幾百個(gè)節(jié)點(diǎn)的集群中使用該功能。
注意2: pod antiAffinity 要求對(duì)節(jié)點(diǎn)進(jìn)行一致標(biāo)志,即集群中的所有節(jié)點(diǎn)都必須具有適當(dāng)?shù)臉?biāo)簽用于配置給 topologyKey,如果節(jié)點(diǎn)缺少指定的 topologyKey 指定的標(biāo)簽,則可能會(huì)導(dǎo)致意外行為。
六、參考資料 官方

Assigning Pods to Nodes - Kubernetes

node affinity

pod affinity

性能優(yōu)化: Improve performance of affinity/anti-affinity predicate by 20x in large clusters by bsalamat

blog

K8S 的調(diào)度 (一) 抽象優(yōu)雅的 Affinity

Scheduling in Kubernetes, Part 2: Pod Affinity – Koki – Medium

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/32907.html

相關(guān)文章

  • kubernetes調(diào)度機(jī)制

    摘要:的調(diào)度機(jī)制組件調(diào)度器會(huì)將調(diào)度到資源滿足要求并且評(píng)分最高的上。這個(gè)特性的設(shè)計(jì)初衷是為了替代,并擴(kuò)展更強(qiáng)大的調(diào)度策略。和完全相同,以進(jìn)行強(qiáng)制的約束。軟規(guī)則除了,,還有一條軟規(guī)則配置后,沒(méi)有相關(guān)污點(diǎn)策略的會(huì)盡量避免調(diào)度到該上。 k8s的調(diào)度機(jī)制 scheduler組件 k8s調(diào)度器會(huì)將pod調(diào)度到資源滿足要求并且評(píng)分最高的node上。我們可以使用多種規(guī)則比如:1.設(shè)置cpu、內(nèi)存的使用要求;...

    selfimpr 評(píng)論0 收藏0
  • Kubernetes之Pod生命周期詳解

    摘要:下面通過(guò)該文章來(lái)簡(jiǎn)述的基礎(chǔ)信息并詳述的生命周期。聲明周期鉤子函數(shù)為容器提供了兩種生命周期鉤子于容器創(chuàng)建完成之后立即運(yùn)行的鉤子程序。向容器指定發(fā)起請(qǐng)求,響應(yīng)碼為或者是為成功,否則失敗。 簡(jiǎn)述 Kubernetes 是一種用于在一組主機(jī)上運(yùn)行和協(xié)同容器化應(yīng)用程序的系統(tǒng),提供應(yīng)用部署、規(guī)劃、更新維護(hù)的機(jī)制。應(yīng)用運(yùn)行在 kubernetes 集群之上,實(shí)現(xiàn)服務(wù)的擴(kuò)容、縮容,執(zhí)行滾動(dòng)更新以及在不...

    高勝山 評(píng)論0 收藏0
  • Kubernetes 調(diào)度器淺析

    摘要:與已運(yùn)行相關(guān)的過(guò)濾規(guī)則負(fù)責(zé)檢查待調(diào)度與上已有之間的親和性關(guān)系。并且每個(gè)打分函數(shù)都可以配置對(duì)應(yīng)的權(quán)重值,下面介紹調(diào)度器策略配置時(shí),也會(huì)涉及權(quán)重值的配置。默認(rèn)權(quán)重值是,如果覺(jué)得某個(gè)打分函數(shù)特別重要,便可以加大該權(quán)重值。 一、概述 Kubernetes 是 Google 開(kāi)源的容器集群管理系統(tǒng)(谷歌內(nèi)部:Borg),而今天要介紹的 kube-scheduler 是 k8s 系統(tǒng)的核心組件之一...

    ranwu 評(píng)論0 收藏0
  • Cloud + TiDB 技術(shù)解讀

    摘要:作為一個(gè)開(kāi)源的分布式數(shù)據(jù)庫(kù)產(chǎn)品,具有多副本強(qiáng)一致性的同時(shí)能夠根據(jù)業(yè)務(wù)需求非常方便的進(jìn)行彈性伸縮,并且擴(kuò)縮容期間對(duì)上層業(yè)務(wù)無(wú)感知。另外本身維護(hù)了數(shù)據(jù)多副本,這點(diǎn)和分布式文件系統(tǒng)的多副本是有重復(fù)的。 作者:鄧栓來(lái)源:細(xì)說(shuō)云計(jì)算 作為一款定位在 Cloud-native 的數(shù)據(jù)庫(kù),現(xiàn)如今 TiDB 在云整合上已取得了階段性的進(jìn)展。日前 Cloud TiDB 產(chǎn)品在 UCloud 平臺(tái)正式開(kāi)啟...

    JouyPub 評(píng)論0 收藏0
  • Kubernetes容器編排的三大支柱

    摘要:在這種情況下,以防干擾其他集群租戶,調(diào)度器可能會(huì)考慮將作為驅(qū)逐的候選對(duì)象。其結(jié)果是負(fù)載均衡和調(diào)度之間交互作用。 每當(dāng)談及Kubernetes,我們經(jīng)常聽(tīng)到諸如資源管理、調(diào)度和負(fù)載均衡等術(shù)語(yǔ)。雖然Kubernetes提供了許多功能,但更關(guān)鍵的還是要了解這些概念,只有這樣才能更好地理解如何放置、管理并恢復(fù)工作負(fù)載。在這篇文章中,我提供了每個(gè)功能的概述,并解釋了它們是如何在Kubernete...

    劉厚水 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<