K8S高級(jí)調(diào)度——親和性和反親和性

K8S高級(jí)調(diào)度——親和性和反親和性

參考:

Assigning Pods to Nodes

Inter-pod topological affinity and anti-affinity

what

  • 親和性:應(yīng)用A與應(yīng)用B兩個(gè)應(yīng)用頻繁交互,所以有必要利用親和性讓兩個(gè)應(yīng)用的盡可能的靠近耻蛇,甚至在一個(gè)node上翰蠢,以減少因網(wǎng)絡(luò)通信而帶來的性能損耗父丰。
  • 反親和性:當(dāng)應(yīng)用的采用多副本部署時(shí),有必要采用反親和性讓各個(gè)應(yīng)用實(shí)例打散分布在各個(gè)node上费韭,以提高HA。

node

node親和性可以約束調(diào)度器基于node labels調(diào)度pod。

考慮以下場(chǎng)景:

有az1蕊程,az2兩個(gè)zone,現(xiàn)在我們只希望pod實(shí)例部署在az1

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/e2e-az-name
            operator: In
            values:
            - az1
      preferredDuringSchedulingIgnoredDuringExecution:
      - 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

兩種類型:

  • requiredDuringSchedulingIgnoredDuringExecution: hard驼唱,嚴(yán)格執(zhí)行藻茂,滿足規(guī)則調(diào)度,否則不調(diào)度玫恳,在預(yù)選階段執(zhí)行辨赐,所以違反hard約定一定不會(huì)調(diào)度到
  • preferredDuringSchedulingIgnoredDuringExecution:soft,盡力執(zhí)行京办,優(yōu)先滿足規(guī)則調(diào)度肖油,在優(yōu)選階段執(zhí)行,

后綴IgnoredDuringExecution表示如果labels發(fā)生改變臂港,使得原本運(yùn)行的pod不在滿足規(guī)則森枪,那么這個(gè)pod將忽視這個(gè)改變,繼續(xù)運(yùn)行审孽。

  • requiredDuringSchedulingRequiredDuringExecution:未實(shí)現(xiàn)县袱,與之前類似,只是后綴不同佑力,代表如果labels發(fā)生改變式散,kubelet將驅(qū)逐不滿足規(guī)則的pod

Note: 支持的operator操作: In, NotIn, Exists, DoesNotExist, Gt, Lt. 其中,NotIn and DoesNotExist用于實(shí)現(xiàn)反親和性打颤。

Note: weight范圍1-100暴拄。這個(gè)涉及調(diào)度器的優(yōu)選打分過程漓滔,每個(gè)node的評(píng)分都會(huì)加上這個(gè)weight,最后bind最高的node乖篷。

限制

  • 同時(shí)指定nodeSelector and nodeAffinity响驴,pod必須都滿足
  • nodeAffinity有多個(gè)nodeSelectorTerms ,pod只需滿足一個(gè)
  • nodeSelectorTerms多個(gè)matchExpressions 撕蔼,pod必須都滿足
  • 由于IgnoredDuringExecution豁鲤,所以改變labels不會(huì)影響已經(jīng)運(yùn)行pod

總的來說,node親和性與nodeSelector類似鲸沮,是它的擴(kuò)展琳骡。

Inter-pod

在K8S中,我們可以根據(jù)node上已運(yùn)行pod的標(biāo)簽來決定將pod調(diào)度到哪個(gè)node讼溺。

例如:pod是否(親和性:是楣号,反親和性:否)可以調(diào)度在X上;此時(shí)在X上怒坯,已經(jīng)運(yùn)行了一些pods炫狱;調(diào)度器需要考慮這些pods是否滿足規(guī)則Y。

  • 規(guī)則Y就是LabelSelector敬肚,
  • X是一個(gè)邏輯拓?fù)涓拍畋霞觯梢允莕ode,rack艳馒,az憎亚,region等等;用topologyKey表示弄慰,具體值用node label表示第美。
kubernetes.io/hostname
failure-domain.beta.kubernetes.io/zone
failure-domain.beta.kubernetes.io/region
beta.kubernetes.io/instance-type
beta.kubernetes.io/os
beta.kubernetes.io/arch

Note: 此特性有明顯的性能損耗,需要大量運(yùn)算陆爽。

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: failure-domain.beta.kubernetes.io/zone            

Note: 合法的operator包括:In, NotIn, Exists, DoesNotExist.

限制

topologyKey:

  1. 對(duì)于親和性和軟反親和性什往,不允許空topologyKey;
  2. 對(duì)于硬反親和性,LimitPodHardAntiAffinityTopology控制器用于限制topologyKey只能是kubernetes.io/hostname;
  3. 對(duì)于軟反親和性慌闭,空topologyKey被解讀成kubernetes.io/hostname, failure-domain.beta.kubernetes.io/zone and failure-domain.beta.kubernetes.io/region的組合别威;

example

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-cache
spec:
  selector:
    matchLabels:
      app: store
  replicas: 3
  template:
    metadata:
      labels:
        app: store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: redis-server
        image: redis:3.2-alpine

部署3個(gè)redis實(shí)例,并且為了提升HA驴剔,都不在一個(gè)node省古。

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

部署三個(gè)web實(shí)例,為了提升HA丧失,都不在一個(gè)node豺妓;并且為了方便與redis交互,盡量與redis在同一個(gè)node。

對(duì)稱性

考慮一個(gè)場(chǎng)景琳拭,兩個(gè)應(yīng)用S1和S2⊙刀眩現(xiàn)在嚴(yán)格要求S1 pod不能與S2 pod運(yùn)行在一個(gè)node,如果僅設(shè)置S1的hard反親和性是不夠的白嘁,必須同時(shí)給S2設(shè)置對(duì)應(yīng)的hard反親和性坑鱼。即調(diào)度S1 pod時(shí),考慮node沒有S2 pod权薯,同時(shí)需要在調(diào)度S2 pod時(shí)姑躲,考慮node上沒有S1 pod睡扬∶蓑迹考慮下面兩種情況:

  1. 先調(diào)度S2,后調(diào)度S1卖怜,可以滿足反親和性屎开,
  2. 先調(diào)度S1,后調(diào)度S2马靠,違反S1的反親和性規(guī)則奄抽,因?yàn)镾2沒有反親和性規(guī)則,所以在schedule-time可以與S1調(diào)度在一個(gè)拓?fù)湎隆?/li>

這就是對(duì)稱性甩鳄,即S1設(shè)置了與S2相關(guān)的hard反親和性規(guī)則逞度,就必須對(duì)稱地給S2設(shè)置與S1相關(guān)的hard反親和性規(guī)則,以達(dá)到調(diào)度預(yù)期妙啃。

Note:

  • 反親和性(soft/hard)具備對(duì)稱性档泽,上面已經(jīng)舉過例子了
  • hard親和性不具備對(duì)稱性,例如期望S1揖赴、S2親和馆匿,那么調(diào)度S2的時(shí)候沒有必要node上一定要有S1,但是有一個(gè)隱含規(guī)則燥滑,node上有S1更好
  • soft親和性具備對(duì)稱性渐北,不是很理解,遺留

Note:

hard反親和性對(duì)稱性問題代碼已經(jīng)解決了:

kubernetes\pkg\scheduler\algorithm\predicates\predicates.go

// InterPodAffinityMatches checks if a pod can be scheduled on the specified node with pod affinity/anti-affinity configuration.
func (c *PodAffinityChecker) InterPodAffinityMatches(pod *v1.Pod, meta algorithm.PredicateMetadata, nodeInfo *schedulercache.NodeInfo) (bool, []algorithm.PredicateFailureReason, error) {
   c.satisfiesExistingPodsAntiAffinity(pod, meta, nodeInfo)
  
   c.satisfiesPodsAffinityAntiAffinity(pod, meta, nodeInfo, affinity)
}
  1. 檢查pod是否會(huì)打破已經(jīng)運(yùn)行pods(從cache中獲让 )的反親和性赃蛛,利用了pods反親和性的RequiredDuringSchedulingIgnoredDuringExecution
  2. 檢查pod的親和性/反親和性是否滿足,都是hard

ps. 所以說hard是在預(yù)選過程使用搀菩,優(yōu)選打分過程使用soft

特別注意

  • Don't co-locate pods of this service with any other pods including pods of this service: {LabelSelector: empty, TopologyKey: "node"}呕臂,在反親和性中,空的selector表示不與任何pod親和秕磷。

  • 由于hard規(guī)則在預(yù)選階段處理诵闭,所以如果只有一個(gè)node滿足hard親和性,但是這個(gè)node又不滿足其他預(yù)選判斷,比如資源不足疏尿,那么就無法調(diào)度瘟芝。所以何時(shí)用hard,何時(shí)用soft需要根據(jù)業(yè)務(wù)考量褥琐。

  • 如果所有node上都沒有符合親和性規(guī)則的target pod锌俱,那么pod調(diào)度可以忽略親和性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市敌呈,隨后出現(xiàn)的幾起案子贸宏,更是在濱河造成了極大的恐慌,老刑警劉巖磕洪,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吭练,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡析显,警方通過查閱死者的電腦和手機(jī)鲫咽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谷异,“玉大人分尸,你說我怎么就攤上這事〈踵冢” “怎么了箩绍?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尺上。 經(jīng)常有香客問我材蛛,道長,這世上最難降的妖魔是什么尖昏? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任仰税,我火速辦了婚禮,結(jié)果婚禮上抽诉,老公的妹妹穿的比我還像新娘陨簇。我一直安慰自己,他們只是感情好迹淌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布河绽。 她就那樣靜靜地躺著,像睡著了一般唉窃。 火紅的嫁衣襯著肌膚如雪耙饰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天纹份,我揣著相機(jī)與錄音苟跪,去河邊找鬼廷痘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛件已,可吹牛的內(nèi)容都是我干的笋额。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼篷扩,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼兄猩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鉴未,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤枢冤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后铜秆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淹真,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年羽峰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趟咆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片添瓷。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梅屉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鳞贷,到底是詐尸還是另有隱情坯汤,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布搀愧,位于F島的核電站惰聂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咱筛。R本人自食惡果不足惜搓幌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迅箩。 院中可真熱鬧溉愁,春花似錦、人聲如沸饲趋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奕塑。三九已至堂污,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間龄砰,已是汗流浹背盟猖。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工讨衣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人式镐。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓值依,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碟案。 傳聞我的和親對(duì)象是個(gè)殘疾皇子愿险,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容