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"
.......
发布了20 篇原创文章 · 获赞 3 · 访问量 591

猜你喜欢

转载自blog.csdn.net/weixin_37546425/article/details/104159255