Kubernetes(k8s)親和力Affinity

需求:

Pod和Node之間的關(guān)系

某些Pod優(yōu)先選擇有ssd=true標(biāo)簽的節(jié)點(diǎn),如果沒有在考慮部署到其它節(jié)點(diǎn);
某些Pod需要部署在ssd=true和type=physical的節(jié)點(diǎn)上分唾,但是優(yōu)先部署在ssd=true的節(jié)點(diǎn)上隙赁;

Pod和Pod之間的關(guān)系

同一個(gè)應(yīng)用的Pod不同的副本或者同一個(gè)項(xiàng)目的應(yīng)用盡量或必須不部署在同一個(gè)節(jié)點(diǎn)或者符合某個(gè)標(biāo)簽的一類節(jié)點(diǎn)上或者不同的區(qū)域;
相互依賴的兩個(gè)Pod盡量或必須部署在同一個(gè)節(jié)點(diǎn)上或者同一個(gè)域內(nèi)。

Affinity分類

image.png

節(jié)點(diǎn)親和力配置詳解

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:      # 硬親和力配置
        nodeSelectorTerms:      # 節(jié)點(diǎn)選擇器配置莫换,可以配置多個(gè)matchExpressions(滿足其一),每個(gè)matchExpressions下可以配置多個(gè)key、value類型的選擇器(都需要滿足)拉岁,其中values可以配置多個(gè)(滿足其一)
        - matchExpressions:
          - key: kubernetes.io/e2e-az-name
            operator: In      # 標(biāo)簽匹配的方式 
                                     # In:相當(dāng)于key = value的形式
                                     # NotIn:相當(dāng)于key != value的形式 
                                     # Exists:節(jié)點(diǎn)存在label的key為指定的值即可坷剧,不能配置values字段
                                     # DoesNotExist:節(jié)點(diǎn)不存在label的key為指定的值即可,不能配置values字段
            values:
            - e2e-az1
            - az-2
      preferredDuringSchedulingIgnoredDuringExecution:      # 軟親和力配置
      - weight: 1      # 軟親和力的權(quán)重喊暖,權(quán)重越高優(yōu)先級(jí)越大惫企,范圍1-100
        preference:      # 軟親和力配置項(xiàng),和weight同級(jí)陵叽,可以配置多個(gè)
          matchExpressions:      # 和硬親和力一致
          - key: another-node-label-key
            operator: In      # 標(biāo)簽匹配的方式 
                                     # In:相當(dāng)于key = value的形式
                                     # NotIn:相當(dāng)于key != value的形式 
                                     # Exists:節(jié)點(diǎn)存在label的key為指定的值即可狞尔,不能配置values字段
                                     # DoesNotExist:節(jié)點(diǎn)不存在label的key為指定的值即可,不能配置values字段
            values:
            - another-node-label-value
  containers:
  - name: with-node-affinity
    image: nginx

Pod親和力和反親和力詳解

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    podAffinity:      # pod親和力配置
      requiredDuringSchedulingIgnoredDuringExecution:      # 硬親和力配置
      - labelSelector:      # Pod的lableSelector配置巩掺,可以配置多個(gè)
          matchExpressions:      # 配置和節(jié)點(diǎn)親和力配置一致
          - key: security
            operator: In      # 配置和節(jié)點(diǎn)親和力一致
            values:
            - S1
        topologyKey: failure-domain.beta.kubernetes.io/zone      # 匹配的拓?fù)溆虻膋ey偏序,也就是節(jié)點(diǎn)上label的key,key和value相同的為同一個(gè)域胖替,可以用于標(biāo)注不同的機(jī)房和地區(qū)
    podAntiAffinity:      # pod反親和力配置
      preferredDuringSchedulingIgnoredDuringExecution:      # 軟親和力配置
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security
              operator: In
              values:
              - S2
          namespaces:      # 和哪個(gè)命名空間的Pod進(jìn)行匹配研儒,空為default命名空間,可以寫多個(gè)namespace
          - default
          topologyKey: failure-domain.beta.kubernetes.io/zone      # 匹配的拓?fù)溆虻膋ey独令,也就是節(jié)點(diǎn)上label的key殉摔,key和value相同的為同一個(gè)域,可以用于標(biāo)注不同的機(jī)房和地區(qū)
  containers:
  - name: with-pod-affinity
    image: nginx

示例1:同一個(gè)應(yīng)用部署在不同的宿主機(jī)

使用pod的親和力app=must-be-diff-nodes记焊, 通過節(jié)點(diǎn)默認(rèn)label topologyKey: kubernetes.io/hostname 實(shí)現(xiàn)每個(gè)pod都調(diào)度到不同的宿主機(jī)

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: must-be-diff-nodes
  name: must-be-diff-nodes
  namespace: kube-public
spec:
  replicas: 3
  selector:      # Pod選擇器配置,可以配置多個(gè)
    matchLabels:      # 配置和節(jié)點(diǎn)親和力一致
      app: must-be-diff-nodes
  template:
    metadata:
      labels:
        app: must-be-diff-nodes
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In      # 配置和節(jié)點(diǎn)親和力一致
                values:
                - must-be-diff-nodes
            topologyKey: kubernetes.io/hostname      # 匹配的拓?fù)溆虻膋ey栓撞,也就是節(jié)點(diǎn)上label的key遍膜,key和value相同的為同一個(gè)域,可以用于標(biāo)注不同的機(jī)房和地區(qū)
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: must-be-diff-nodes

示例2:同一個(gè)應(yīng)用不同副本固定節(jié)點(diǎn)

使用pod反親和力app=store瓤湘,通過topologyKey: "kubernetes.io/hostname"實(shí)現(xiàn)多副本的pod瓢颅,不調(diào)度到同一臺(tái)節(jié)點(diǎn)上

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-cache
spec:
  selector:
    matchLabels:
      app: store
  replicas: 3
  template:
    metadata:
      labels:
        app: store
    spec:
      nodeSelector:
          app: store
      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:應(yīng)用和緩存盡量部署在同一個(gè)域內(nèi)

使用pod的硬親和性和軟親和性,實(shí)現(xiàn)pod app=store的label盡量部署在同一個(gè)域中

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:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - store
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: web-app
        image: nginx:1.16-alpine

示例4:盡量調(diào)度到高配置服務(wù)器

通過節(jié)點(diǎn)的硬親和性弛说,一次匹配ssd=true挽懦,weight100,weight10

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: prefer-ssd
  name: prefer-ssd
  namespace: kube-public
spec:
  replicas: 3
  selector:
    matchLabels:
      app: prefer-ssd
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: prefer-ssd
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - preference:
              matchExpressions:
              - key: ssd
                operator: In
                values:
                - "true"
              - key: master
                operator: NotIn
                values:
                - "true"
            weight: 100
          - preference:
              matchExpressions:
              - key: type
                operator: In
                values:
                - physical
            weight: 10
      containers:
      - env:
        - name: TZ
          value: Asia/Shanghai
        - name: LANG
          value: C.UTF-8
        image: nginx
        imagePullPolicy: IfNotPresent
        name: prefer-ssd

TopologyKey配置詳解

匹配的拓?fù)溆虻膋ey木人,也就是節(jié)點(diǎn)上label的key信柿,key和value相同的為同一個(gè)域,可以用于標(biāo)注不同的機(jī)房和地區(qū)


image.png

image.png

示例:同一個(gè)應(yīng)用多區(qū)域部署

通過pod的硬親和性醒第,和topologyKey node節(jié)點(diǎn)的同一個(gè)key渔嚷,不同的value實(shí)現(xiàn)多區(qū)域部署

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: must-be-diff-zone
  name: must-be-diff-zone
  namespace: kube-public
spec:
  replicas: 3
  selector:
    matchLabels:
      app: must-be-diff-zone
  template:
    metadata:
      labels:
        app: must-be-diff-zone
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - must-be-diff-zone
            topologyKey: region      # region為node的label,上述圖中稠曼,region分別=daxing形病、chaoyang
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: must-be-diff-zone
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子漠吻,更是在濱河造成了極大的恐慌量瓜,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件途乃,死亡現(xiàn)場(chǎng)離奇詭異绍傲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)欺劳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門唧取,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人划提,你說我怎么就攤上這事枫弟。” “怎么了鹏往?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵淡诗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我伊履,道長(zhǎng)韩容,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任唐瀑,我火速辦了婚禮群凶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哄辣。我一直安慰自己请梢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布力穗。 她就那樣靜靜地躺著毅弧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪当窗。 梳的紋絲不亂的頭發(fā)上够坐,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音崖面,去河邊找鬼元咙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嘶朱,可吹牛的內(nèi)容都是我干的蛾坯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼疏遏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脉课!你這毒婦竟也來(lái)了救军?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤倘零,失蹤者是張志新(化名)和其女友劉穎唱遭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呈驶,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拷泽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袖瞻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片司致。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖聋迎,靈堂內(nèi)的尸體忽然破棺而出脂矫,到底是詐尸還是另有隱情,我是刑警寧澤霉晕,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布庭再,位于F島的核電站,受9級(jí)特大地震影響牺堰,放射性物質(zhì)發(fā)生泄漏拄轻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一伟葫、第九天 我趴在偏房一處隱蔽的房頂上張望恨搓。 院中可真熱鬧,春花似錦筏养、人聲如沸奶卓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至墩邀,卻和暖如春掌猛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眉睹。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工荔茬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竹海。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓慕蔚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親斋配。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孔飒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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