【模块一】kubernetes容器编排进阶实战之kubernetes pod Affinity与pod antiaffinity

pod Affinity与pod antiaffinity

Pod Affinity与anti-affinity简介:

  • Pod亲和性与反亲和性可以基于已经在node节点上运行的Pod的标签来约束新创建的Pod可以调度到的 目的节点,注意不是基于node上的标签而是使用的已经运行在node上的pod标签匹配。

  • 其规则的格式为如果 node节点 A已经运行了一个或多个满足调度新创建的Pod B的规则,那么新的 Pod B在亲和的条件下会调度到A节点之上,而在反亲和性的情况下则不会调度到A节点至上。

  • 其中规则表示一个具有可选的关联命名空间列表的LabelSelector,只所以Pod亲和与反亲和需可以通 过LabelSelector选择namespace,是因为Pod是命名空间限定的而node不属于任何nemespace所以 node的亲和与反亲和不需要namespace,因此作用于Pod标签的标签选择算符必须指定选择算符应用 在哪个命名空间。

  • 从概念上讲,node节点是一个拓扑域(具有拓扑结构的区域、宕机的时候的故障域),比如k8s集群中的 单台node节点、一个机架、云供应商可用区、云供应商地理区域等,可以使用topologyKey来定义亲 和或者反亲和的颗粒度是node级别还是可用区级别,以便kubernetes调度系统用来识别并选择正确的 目的拓扑域。

  • Pod 亲和性与反亲和性的合法操作符(operator)有 In、NotIn、Exists、DoesNotExist。

  • 在Pod亲和性配置中,在requiredDuringSchedulingIgnoredDuringExecution和 preferredDuringSchedulingIgnoredDuringExecution中,topologyKey不允许为空(Empty topologyKey is not allowed.)。

  • 在Pod反亲和性中配置中,requiredDuringSchedulingIgnoredDuringExecution和 preferredDuringSchedulingIgnoredDuringExecution 中,topologyKey也不可以为空(Empty topologyKey is not allowed.)。

  • 对于requiredDuringSchedulingIgnoredDuringExecution要求的Pod反亲和性,准入控制器 LimitPodHardAntiAffinityTopology被引入以确保topologyKey只能是 kubernetes.io/hostname,如果希 望 topologyKey 也可用于其他定制拓扑逻辑,可以更改准入控制器或者禁用。

  • 除上述情况外,topologyKey 可以是任何合法的标签键。

case4-4.1:部署web服务

  • 编写yaml文件,在magedu anmespace部署一个nginx服务,nginx pod将用于后续的pod 亲和及反亲和测 试,且pod的label如下:

    • app: python-nginx-selector

    • project: python

  • 部署nginx web服务:

    • kubectl apply -f case4-4.1-nginx.yaml

      • deployment.apps/python-nginx-deployment created

      • service/python-nginx-service created

case4-4.2:Pod Affinity-软亲和:

  • 基于软亲和实现多pod在一个node:先创建一个nginx服务,后续的服务和nginx运行在同一个node节点

    • kubectl apply -f case4-4.1-nginx.yaml

      • deployment.apps/python-nginx-deployment created

      • service/python-nginx-service created

  • 实现软亲和pod调度:

    • kubectl apply -f case4-4.2-podaffinity-preferredDuring.yaml

      • deployment.apps/magedu-tomcat-app2-deployment created
  • 验证pod调度结果:

    • [root@k8s-master1 Affinit-case]#cat case4-4.2-podaffinity-preferredDuring.yaml
      kind: Deployment
      #apiVersion: extensions/v1beta1
      apiVersion: apps/v1
      metadata:
      labels:
      app: magedu-tomcat-app2-deployment-label
      name: magedu-tomcat-app2-deployment
      namespace: magedu
      spec:
      replicas: 1
      selector:
      matchLabels:
      app: magedu-tomcat-app2-selector
      template:
      metadata:
      labels:
      app: magedu-tomcat-app2-selector
      spec:
      containers:
      - name: magedu-tomcat-app2-container
      image: tomcat:7.0.94-alpine
      imagePullPolicy: IfNotPresent
      #imagePullPolicy: Always
      ports:
      - containerPort: 8080
      protocol: TCP
      name: http
      affinity:
      podAffinity: #Pod亲和
      #requiredDuringSchedulingIgnoredDuringExecution: #硬亲和,必须匹配成功才调度,如果匹配失败则拒绝调度。
      preferredDuringSchedulingIgnoredDuringExecution: #软亲和,能匹配成功就调度到一个topology,匹配不成功会由kubernetes自行调度。
      - weight: 100
      podAffinityTerm:
      labelSelector: #标签选择
      matchExpressions: #正则匹配
      - key: project
      operator: In
      values:
      - pythonX
      topologyKey: kubernetes.io/hostname
      namespaces:
      - magedu

case4-4.3:Pod Affinity-硬亲和

  • 基于软亲和实现多pod在一个node: 先创建一个nginx服务,后续的服务和nginx运行在同一个node节点

    • root@k8s-master1:~/case/case# kubectl apply -f case4-4.1-nginx.yaml

      • deployment.apps/python-nginx-deployment created

      • service/python-nginx-service created

  • 实现硬亲和pod调度:

    • root@k8s-master1:~/case/case# kubectl apply -f case4-4.3-podaffinity-requiredDuring.yaml

      • deployment.apps/magedu-tomcat-app2-deployment created
  • 验证pod调度结果:

    • [root@k8s-master1 Affinit-case]#cat case4-4.3-podaffinity-requiredDuring.yaml
      kind: Deployment
      #apiVersion: extensions/v1beta1
      apiVersion: apps/v1
      metadata:
      labels:
      app: magedu-tomcat-app2-deployment-label
      name: magedu-tomcat-app2-deployment
      namespace: magedu
      spec:
      replicas: 1
      selector:
      matchLabels:
      app: magedu-tomcat-app2-selector
      template:
      metadata:
      labels:
      app: magedu-tomcat-app2-selector
      spec:
      containers:
      - name: magedu-tomcat-app2-container
      image: tomcat:7.0.94-alpine
      imagePullPolicy: IfNotPresent
      #imagePullPolicy: Always
      ports:
      - containerPort: 8080
      protocol: TCP
      name: http
      affinity:
      podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution: #硬亲和
      - labelSelector:
      matchExpressions:
      - key: project
      operator: In
      values:
      - python
      topologyKey: "kubernetes.io/hostname"
      namespaces:
      - magedu

case4-4.4:podAntiAffinity-硬反亲和

  • 基于硬反亲和实现多个pod调度不在一个node:先创建一个nginx服务,后续的服务和nginx运行不在同一个node节点

    • root@k8s-master1:~/case/case# kubectl apply -f case4-4.1-nginx.yaml

      • deployment.apps/python-nginx-deployment created

      • service/python-nginx-service created

  • 实现硬反亲和pod调度:

    • kubectl apply -f case4-4.4-podAntiAffinity-requiredDuring.yaml

      • deployment.apps/magedu-tomcat-app2-deployment created
  • 验证pod调度结果:

复制代码
[root@k8s-master1 Affinit-case]#cat case4-4.4-podAntiAffinity-requiredDuring.yaml 
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: magedu-tomcat-app2-deployment-label
  name: magedu-tomcat-app2-deployment
  namespace: magedu
spec:
  replicas: 1
  selector:
    matchLabels:
      app: magedu-tomcat-app2-selector
  template:
    metadata:
      labels:
        app: magedu-tomcat-app2-selector
    spec:
      containers:
      - name: magedu-tomcat-app2-container
        image: tomcat:7.0.94-alpine
        imagePullPolicy: IfNotPresent
        #imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: project
                operator: In
                values:
                  - python
            topologyKey: "kubernetes.io/hostname"
            namespaces:
              - magedu

case4-4.5:podAntiAffinity-软反亲和:

  • 基于软亲和实现多个pod调度不在一个node:先创建一个nginx服务,后续的服务和nginx运行不在同一个node节点

    • root@k8s-master1:~/case/case# kubectl apply -f case4-4.1-nginx.yaml

      • deployment.apps/python-nginx-deployment created

      • service/python-nginx-service created

  • 实现软亲和pod调度:

    • root@k8s-master1:~/case/case# kubectl apply -f case4-4.5-podAntiAffinity-preferredDuring.yaml

      • deployment.apps/magedu-tomcat-app2-deployment created
  • 验证pod调度结果:

  • [root@k8s-master1 Affinit-case]#cat case4-4.5-podAntiAffinity-preferredDuring.yaml
    kind: Deployment
    #apiVersion: extensions/v1beta1
    apiVersion: apps/v1
    metadata:
    labels:
    app: magedu-tomcat-app2-deployment-label
    name: magedu-tomcat-app2-deployment
    namespace: magedu
    spec:
    replicas: 20
    selector:
    matchLabels:
    app: magedu-tomcat-app2-selector
    template:
    metadata:
    labels:
    app: magedu-tomcat-app2-selector
    spec:
    containers:
    - name: magedu-tomcat-app2-container
    image: tomcat:7.0.94-alpine
    imagePullPolicy: IfNotPresent
    #imagePullPolicy: Always
    ports:
    - containerPort: 8080
    protocol: TCP
    name: http
    affinity:
    podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
    podAffinityTerm:
    labelSelector:
    matchExpressions:
    - key: project
    operator: In
    values:
    - python
    topologyKey: kubernetes.io/hostname
    namespaces:
    - magedu

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
未济3 天前
linux 配置环境变量
linux
傲世仙尊3 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
大勇前进3 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu3 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端