kubernetes雲原生紀元:一次性搞懂Scheduler 服務調度(下)

kubernetes雲原生紀元:一次性搞懂Scheduler 服務調度(下)

續 一次性搞懂Scheduler 服務調度(上)

2. pod 親和性

一個區域內,一個pod和其他pod親和關係,比如想跟某些pod運行在一起,不想跟某些pod運行在一起,pod和pod之間的親和關係.

配置

  • affinity: #親和性

  • podAffinity: #pod親和性

  • requiredDuringSchedulingIgnoredDuringExecution: #必須匹配滿足下面的條件才能滿足

  • labelSelector:
    matchExpressions: #匹配條件
    key: app # app in(web-demo) 想跟key=app的包含web-demod的pod運行在一起
    operator: In
    values:
    web-demo

  • topologyKey: kubernetes.io/hostname #節點上label的名字 每個節點的主機名,限制範圍是節點範圍條件,組合在一起就是:想跟key=app的包含web-demod的pod運行在同一臺主機上

  • preferredDuringSchedulingIgnoredDuringExecution: #可以滿足下麪條件,不是必須

  • podAffinityTerm: #可以多個,
    labelSelector:
    matchExpressions: # 匹配條件:最好 可以跟key=app 的包含web-demo-node 的pod運行在一臺主機
    key: app
    operator: In
    values:
    web-demo-node
    topologyKey: kubernetes.io/hostname

    有些值與上個章節 相同這裏不描述

affinity: #親和性
        podAffinity: #pod親和性
          requiredDuringSchedulingIgnoredDuringExecution: #必須匹配滿足下面的條件才能滿足
            - labelSelector:
                matchExpressions: #匹配條件
                  - key: app  # app in(web-demo) 想跟key=app的包含web-demod的pod運行在一起
                    operator: In
                    values:
                      - web-demo
              topologyKey: kubernetes.io/hostname #節點上label的名字 每個節點的主機名,限制範圍是節點範圍條件,組合在一起就是:想跟key=app的包含web-demod的pod運行在同一臺主機上
          preferredDuringSchedulingIgnoredDuringExecution: #可以滿足下麪條件,不是必須
            - podAffinityTerm: #可以多個,
                labelSelector:
                  matchExpressions: # 匹配條件:最好 可以跟key=app 的包含web-demo-node 的pod運行在一臺主機
                    - key: app
                      operator: In
                      values:
                        - web-demo-node
                topologyKey: kubernetes.io/hostname
              weight: 100 #權重

完整配置如下:

Web-dev-pod.yaml

#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: dev
spec:
  selector:
    matchLabels:
      app: web-demo
  replicas: 1
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
        - name: web-demo
          image: hub.zhang.com/kubernetes/demo:2020011512381579063123
          ports:
            - containerPort: 8080
      affinity: #親和性
        podAffinity: #pod親和性
          requiredDuringSchedulingIgnoredDuringExecution: #必須匹配滿足下面的條件才能滿足
            - labelSelector:
                matchExpressions: #匹配條件
                  - key: app  # app in(web-demo) 要跟key=app的包含web-demod的pod運行在一起
                    operator: In
                    values:
                      - web-demo
              topologyKey: kubernetes.io/hostname #節點上label的名字 每個節點的主機名,限制範圍是節點範圍條件,組合在一起就是:要跟key=app的包含web-demod的pod運行在同一臺主機上
          preferredDuringSchedulingIgnoredDuringExecution: #可以滿足下麪條件,不是必須
            - podAffinityTerm:
                labelSelector:
                  matchExpressions: # 匹配條件:最好 可以跟key=app 的包含web-demo-node 的pod運行在一臺主機
                    - key: app
                      operator: In
                      values:
                        - web-demo-node
                topologyKey: kubernetes.io/hostname
              weight: 100 #權重
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-demo
  namespace: dev
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: web-demo
  type: ClusterIP

---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-demo
  namespace: dev
spec:
  rules:
    - host: web.demo.com
      http:
        paths:
          - path: /
            backend:
              serviceName: web-demo
              servicePort: 80

我們創建一下:

發現他被創建到121因爲121上有給pod的label是app=web-demo,符合我們的預期。

image-20200120151501763

image-20200120151530633

image-20200120151550246

我們可以測試一下把條件換成其他的,還會不會創建服務成功,這裏就不測試了。

3. Pod反親和性

pod反親和性和Pod親和性可以配置到一起的,他的工作原理正好跟Pod親和性相反,很容易理解。

理解pod反親和性 必須理解Pod親和性,這裏多餘參數不多說跟Pod親和性的參數一直,但是在的基礎上變成了不要

  • ==podAntiAffinity: ===# 反親和性

具體配置如下:

affinity: #親和性
        podAntiAffinity: # 反親和性
          requiredDuringSchedulingIgnoredDuringExecution: #必須匹配滿足下面的條件才能滿足
            - labelSelector:
                matchExpressions: #匹配條件
                  - key: app  # app in(web-demo) 不想跟key=app的包含web-demod的pod運行在一起
                    operator: In
                    values:
                      - web-demo
              topologyKey: kubernetes.io/hostname #節點上label的名字 每個節點的主機名,限制範圍是節點範圍條件,組合在一起就是:想跟key=app的包含web-demod的pod運行在同一臺主機上
          preferredDuringSchedulingIgnoredDuringExecution: #可以滿足下麪條件,不是必須
            - podAffinityTerm:
                labelSelector:
                  matchExpressions: # 匹配條件:最好不要 可以跟key=app 的包含web-demo-node 的pod運行在一臺主機
                    - key: app
                      operator: In
                      values:
                        - web-demo-node
                topologyKey: kubernetes.io/hostname
              weight: 100 #權重

具體配置:

web-dev-pod.yaml

#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: dev
spec:
  selector:
    matchLabels:
      app: web-demo
  replicas: 1
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
        - name: web-demo
          image: hub.zhang.com/kubernetes/demo:2020011512381579063123
          ports:
            - containerPort: 8080
      affinity: #親和性
        podAntiAffinity: # 反親和性
          requiredDuringSchedulingIgnoredDuringExecution: #必須匹配滿足下面的條件才能滿足
            - labelSelector:
                matchExpressions: #匹配條件
                  - key: app  # app in(web-demo) 想跟key=app的包含web-demod的pod運行在一起
                    operator: In
                    values:
                      - web-demo
              topologyKey: kubernetes.io/hostname #節點上label的名字 每個節點的主機名,限制範圍是節點範圍條件,組合在一起就是:想跟key=app的包含web-demod的pod運行在同一臺主機上
          preferredDuringSchedulingIgnoredDuringExecution: #可以滿足下麪條件,不是必須
            - podAffinityTerm:
                labelSelector:
                  matchExpressions: # 匹配條件:最好 可以跟key=app 的包含web-demo-node 的pod運行在一臺主機
                    - key: app
                      operator: In
                      values:
                        - web-demo-node
                topologyKey: kubernetes.io/hostname
              weight: 100 #權重
---
#service
apiVersion: v1
kind: Service
metadata:
  name: web-demo
  namespace: dev
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: web-demo
  type: ClusterIP

---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-demo
  namespace: dev
spec:
  rules:
    - host: web.demo.com
      http:
        paths:
          - path: /
            backend:
              serviceName: web-demo
              servicePort: 80

我們創建下:

[root@master-001 ~]# kubectl apply -f web-dev-pod.yaml -n dev

沒有問題他正確的運行在有pod標籤爲app=web-demo的機器上了

還有一種問題就是,他不想跟自己運行在一臺機器:

假設因爲自己標籤配置上app=web-demo-pod 而反親和性配置的同樣的標籤,然後把副本數改兩個

image-20200120155237360

我們創建一下:

發現他在120創建一個121創建一個。當我們有些服務不想讓他跑在同一臺機器上,我就可以使用這種設置。

image-20200120155512585

相反我們想把一樣的服務跑在同一臺機器上,就可以改成podiAffinity:發現創建不成功,因爲我們之前創建過podAntiAffinity的又沒有其他機器 所有就僵住了

4. taint污點&&Toleration容忍

它跟podiAffinitypod親和性相反,他說拒絕node pod的運行,可以在node上設置一個或多個污點,拒絕pod運行在這個機器上,除非某些pod 明確聲明可以容忍這些污點,否則它是不可能運行在當前機器的。

這種場景比如,某幾臺機器專門單獨給某些類型或者某幾個應用進行使用,我們就可以在機器上打一個污點,其他pod在正常調度的時候就不可能被調度上來,只有這些特色的pod才能調度上來。在比如某些機器的硬件CPU ssd非常少不想給一般的pod使用。給他打上污點,需要用這些pod的設備,配置上污點容忍就可以。

給node打污點

. node打上污點方法 的三種類型以及介紹


kubectl taint nodes node1 key=value:NoSchedule
kubectl taint nodes node1 key=value:NoExecute
kubectl taint nodes node1 key=value:PreferNoSchedule

NoSchedule:K8Snode添加這個effecf類型污點,新的不能容忍的pod不能再調度過來,但是老的運行在node上不受影響

NoExecute:K8Snode添加這個effecf類型污點,新的不能容忍的pod不能調度過來,老的pod也會被驅逐

PreferNoSchedule:pod會嘗試將pod分配到該節點

node刪除污點

在污點類型後加上-

kubectl taint nodes kube11 key:NoSchedule-

通過kubectl taint 爲一個節點打污點例如:

kubectl taint nodes node1 key=value:NoSchedule
[root@master-001 ~]# kubectl get node
NAME         STATUS   ROLES    AGE   VERSION
master-001   Ready    master   18d   v1.16.3
node-001     Ready    <none>   18d   v1.16.3
[root@master-001 ~]# kubectl taint nodes node-001 gpu=true:NoSchedule
node/node-001 tainted

這樣就把鍵爲gpu,值爲true,效果爲NoSchedule的污點添加到了節點node-001上.這樣除非pod有符合的容忍(toleration),否則不會被調度到此節點上

除了NoSchedule(不要把這樣的pod)到這個節點這樣的污點類型,還有 PreferNoSchedule(最好不要把這樣的pod調度到這個節點),還有一種更嚴格的 NoExecute(除了必須不調度之外,如果已經有這樣的pod運行在這樣的節點上了,會把pod去除掉,沒有設置容忍時間就會立刻馬上去除掉)

pod設置容忍

配置tolerations容忍需要在yaml配置文件配置跟containers同級

容忍條件解釋:當gpu=true 的時候我容忍這個污點可以把pod運行在這個節點

注意:容忍污點後是可以運行這個節點上,但是不是說必須運行在這個節點上

tolerations: # 容忍    容忍條件解釋:當gpu=true 的時候我容忍這個污點
  - key: "gpu"
    operator: "Equal" #Equal相等的意思
    value: "true"
    effect: "Noschedule"

完整配置

#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
  namespace: dev
spec:
  selector:
    matchLabels:
      app: web-demo
  replicas: 1 #兩個實例
  template:
    metadata:
      labels:
        app: web-demo-pod
    spec:
      containers:
        - name: web-demo
          image: hub.zhang.com/kubernetes/demo:2020011512381579063123
          ports:
            - containerPort: 8080
      tolerations: # 容忍    容忍條件解釋:當gpu=true 的時候我容忍這個污點
        - key: "gpu"
          operator: "Equal" #Equal相等的意思
          value: "true"
          effect: "Noschedule"
.......
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章