美文网首页
k8s的亲和和反亲和

k8s的亲和和反亲和

作者: kencool | 来源:发表于2020-11-30 09:39 被阅读0次

亲和和反亲和,包含两种类型:“节点亲和”和“pod间亲和/反亲和”

为何要做node亲和

我们在日常工作中经常会遇到要在k8s环境下维护多条产品线,甚至在微服务架构中,又有前端、中台、底层之分,如何将关联密切的服务划分到一组服务器上,保持架构的相对独立,避免交叉部署带来的管理和故障诊断难题,就用到了node亲和;所谓node亲和,就是将一些关联密切的服务分到指定的带有特殊标签的一组或一台服务器上。

为何要做pod反亲和

所谓反亲和,就是不要在一起;假如一个服务有两个pod都在同一台机器上,那么这台机器一旦故障宕机,整个服务将不可用了。所以反亲和的目的,就是将相同服务的多个副本分散到不同的主机上。
添加节点
kubectl label nodes <node-name> <label-key>=<label-value>

显示节点
kubectl get nodes --show-labels

node节点亲和

pods/pod-with-node-affinity.yaml 

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

此节点亲和规则表示,pod 只能放置在具有标签键为 kubernetes.io/e2e-az-name 且 标签值为 e2e-az1 或 e2e-az2 的节点上。另外,在满足这些标准的节点中,具有标签键为 another-node-label-key 且标签值为 another-node-label-value 的节点应该优先使用。

说明:

  1. requiredDuringSchedulingIgnoredDuringExecution,这个是必须满足
  2. preferredDuringSchedulingIgnoredDuringExecution,这个是优先满足,如果实在不能满足的话,则允许一些pod在其它地方运行
  3. In,NotIn,Exists,DoesNotExist,Gt,Lt。你可以使用 NotIn 和 DoesNotExist 来实现节点反亲和行为,或者使用节点污点将 pod 从特定节点中驱逐。
  4. 如果你同时指定了 nodeSelector 和 nodeAffinity,两者必须都要满足,才能将 pod 调度到候选节点上。
  5. 如果你指定了多个与 nodeAffinity 类型关联的 nodeSelectorTerms,则如果其中一个 nodeSelectorTerms 满足的话,pod将可以调度到节点上。
  6. 如果你指定了多个与 nodeSelectorTerms 关联的 matchExpressions,则只有当所有 matchExpressions 满足的话,pod 才会可以调度到节点上。

pod亲和和反亲和

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

说明:

  • yaml 代码段中配置了 podAntiAffinity(反亲和) 和 podAffinity(亲和)。这将通知调度器将它的所有副本与具有 app=store 选择器标签的 pod 放置在一起。这还确保每个 web 服务器副本不会调度到单个节点上。
  • topologyKey可以设置成如下几种类型
    kubernetes.io/hostname  #Node
    failure-domain.beta.kubernetes.io/zone #Zone
    failure-domain.beta.kubernetes.io/region #Region
  • 可以设置node上的label的值来表示node的name,zone,region等信息,pod的规则中指定topologykey的值表示指定topology范围内的node上运行的pod满足指定规则

生产环境配置示例

node硬亲和和pod软反亲和

      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                - key: abc.com/zhongtai
                  operator: In
                  values:
                  - standard
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 50
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - nginx
              topologyKey: "kubernetes.io/hostname"

相关文章

  • k8s的亲和和反亲和

    亲和和反亲和,包含两种类型:“节点亲和”和“pod间亲和/反亲和” 为何要做node亲和 我们在日常工作中经常会遇...

  • K8S高级调度——亲和性和反亲和性

    K8S高级调度——亲和性和反亲和性 参考: Assigning Pods to Nodes Inter-pod t...

  • Kubernetes 亲和与反亲和实用示例

    K8S亲和与反亲和简介 [1] nodeSelector 提供了一种非常简单的方法来将 pod 约束到具有特定标签...

  • k8s 亲和性和反亲和性

    亲和性和反亲和性 node 亲和性 node亲和性策略表示pod部署到符合某些条件的node上. 上面的这个例子表...

  • k8s调度-亲和性和反亲和性

    一、解释 一般来说,pod的调度过程会经历如下过程: 但有时候,这种调度需要人为干涉,以便完成更加符合预期的调度,...

  • D43-内外亲和

    内外亲和包含两部分,自己和自己的关系以及自己和他人的关系,即内亲和和外亲和。 一般情况下,我们更注重外亲和,但往往...

  • 《时光道》

    亲亲复亲亲, 不亲复不亲; 道是亲和者, 者也道和亲; 若问贤者知何处, 亲和便是和亲清。

  • 教练笃行之旅D3

    第三天,主题是:亲和和回放。 今天一天在与人的交流中,时刻提醒自己:聆听,亲和,回放应用不多,感觉场合不对。 现在...

  • 《忆往事——那些年父亲给我吹过的“牛逼”》

    都说母亲和儿子亲,父亲和女儿亲,我不知道这是怎么得出的结论,但在我家,我感觉好像是这样的。从小,父亲给我的...

  • 如果你被亲应该怎么做……

    反亲回去啊!

网友评论

      本文标题:k8s的亲和和反亲和

      本文链接:https://www.haomeiwen.com/subject/aufrwktx.html