首页 > 其他分享 >k8s的亲和和反亲和

k8s的亲和和反亲和

时间:2022-11-17 15:38:18浏览次数:47  
标签:node matchExpressions io 反亲 pod k8s 节点

亲和和反亲和,包含两种类型:“节点亲和”和“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"

    作者:kencool
链接:https://www.jianshu.com/p/d0fd04027b9f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:node,matchExpressions,io,反亲,pod,k8s,节点
From: https://www.cnblogs.com/linux985/p/16899612.html

相关文章

  • k8s:bootstrap方式部署 kubelet的相关参数设置:【重点一篇文章】
    重点!!相关参数必须适应!!有些参数不可以配置!!!!! kube-apiserver特别注意:使用bootstrap,apiserver中千万 【不可以】 配置以下kubelet认证相关参数--kubelet-certifica......
  • Kubernetes(K8S) 安装Nacos,报 No DataSource set
    原因,数据库为MySQL5.7需要在yaml加上参数mysql.db.param:"characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&server......
  • CentOS 卸载 K8S
    1、删除 k8s 组件kubeadmreset-f2、删除其它容器和所有镜像dockerkill$(dockerps-a-q)dockerrm$(dockerps-a-q)dockerrmi-f$(dockerimages-q)3、清除ip......
  • K8s如何启用cgroup2支持?
    什么是cgroup......
  • k8s集群搭建
    1准备三台linux服务器2docker安装三台机器全部执行docker安装操作2.1移除以前docker相关包sudoyumremovedocker\docker-client\......
  • 开发访问k8s集群的几种方法(路由和kt)
    现状k8s集群内是有一套完整网络环境,我们不能直接通过IP访问到k8s集群内的pod或者service,只能通过nodeport或者ingress才能访问到服务.痛点开发人员进行微服务开发的......
  • K8s中大量Pod是Evicted状态,这是咋回事?
    线上被驱逐实例数据最近在线上发现很多实例处于Evicted状态,通过podyaml可以看到实例是因为节点资源不足被驱逐,但是这些实例并没有被自动清理,平台的大部分用户在操作......
  • YAML:k8s世界的通用语(chrono《kubernetes入门实战课》笔记整理)
     YAML语言有一个非常关键的特性,叫“声明式”(declarative),对应的另一个词“命令式”(imperative)。命令式:docker敏玲和dockerfile就属于命令式,特点是交互性强,注重顺序和过......
  • Rancher建立的K8S集群重置
    筆者的整套架K8S集群是通過racher建立的,rancher版本為2.5.14,目前还是测试阶段,因为种种异常,整套架构都面临重建,但是之前我的master节点已经安装过集群,要彻底清理环境,否则会报......
  • k8s集群通过nginx-ingress做tcp\udp 4层网络转发
    k8s集群可以通过nginx-ingress做tcp\udp4层网络转发1.先确认K8S集群是否开启tcp/udp[root@k8s-master-pro01tmp]#kubectlgetcm-ningress-nginxNAME......