Kubernetes 之 Pod 之间的亲和性与反亲和性

Kubernetes 之 Pod 之间的亲和性与反亲和性

Pod 亲和性定义

Pod 亲和性是指将 Pod 和 Pod 根据某些约束性条件捆绑到具有相同特性的工作节点上,例如同一区域、同一机房乃至同一机柜。这样 Pod和 Pod 可以更好的通信,解决 IO 瓶颈。它同样分为硬亲和性requiredDuringSchedulingIgnoredDuringExecution和软亲和性preferredDuringSchedulingIgnoredDuringExecution,同时亲和性下面还有一个拓扑键topologyKey,这是用来将 Pod 约束到跟跟随 Pod 同一个域上的。

Pod 亲和性使用

  1. 我们先定义一个被跟随的 Pod

    yaml 复制代码
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-affinity-bind
      namespace: default
      labels:
        app: nginx
    spec:
      containers:
      - name: k8s-test
        image: k8s-test:v1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
  2. 定义 Pod 去跟随第一个 Pod

    yaml 复制代码
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-affinity-track
      namespace: default
      labels:
        app: track
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx
            topologyKey: kubernetes.io/hostname
      containers:
      - name: k8s-test
        image: k8s-test:v1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
  3. 运行结果

    复制代码
    root@k8s-master1:~# kubectl get pods -owide --show-labels
    NAME                 READY   STATUS    RESTARTS   AGE   IP              NODE          NOMINATED NODE   READINESS GATES   LABELS
    pod-affinity-bind    1/1     Running   0          25m   10.244.194.83   k8s-worker1   <none>           <none>            app=nginx
    pod-affinity-track   1/1     Running   0          24s   10.244.194.84   k8s-worker1   <none>           <none>            app=track

Pod 反亲和性定义

Pod 反亲和性是与亲和性完全相反的定义,一旦发现它的约束条件匹配,那么这个 Pod 比与匹配 Pod 在不同的topologyKey上的工作节点上。它主要可以用来保障不是热点区域和不需要高性能响应但很重要的业务不受干扰。

Pod 反亲和性使用

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-affinity-anti
  namespace: default
  labels:
    app: anti
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - nginx
        topologyKey: kubernetes.io/hostname
  containers:
  - name: k8s-test
    image: k8s-test:v1.0
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
shell 复制代码
root@k8s-master1:~# kubectl get pods -owide                          
NAME                 READY   STATUS    RESTARTS   AGE     IP              NODE          NOMINATED NODE   READINESS GATES
pod-affinity-anti    1/1     Running   0          8m45s   10.244.126.15   k8s-worker2   <none>           <none>
pod-affinity-bind    1/1     Running   0          76m     10.244.194.83   k8s-worker1   <none>           <none>
pod-affinity-track   1/1     Running   0          51m     10.244.194.84   k8s-worker1   <none>           <none>
相关推荐
milo.qu3 小时前
RockyLinux9.7 docker部署Jisti Meet
linux·docker·容器
梦想与想象-广州大智汇5 小时前
自建docker加速镜像,使用 Cloudflare Workers/Pages 部署加速教程
运维·docker·容器
AI服务老曹7 小时前
架构师视角:如何构建支持GB28181/RTSP的异构AI视频平台?从Docker部署到源码交付的深度实践
人工智能·docker·音视频
用户78937733908539 小时前
Docker 部署踩坑记录:从“构建失败”到“服务跑通”,以及为什么数据被清空了
python·docker
Slow菜鸟10 小时前
Docker 学习篇(三)| Docker安装指南(Linux版)
linux·学习·docker
炸炸鱼.14 小时前
容器技术入门与 Docker 环境部署
docker
宁静@星空14 小时前
007-Docker构建 jar 包成镜像
docker·容器·jar
A-刘晨阳15 小时前
K8s之负载均衡
linux·运维·容器·kubernetes·负载均衡
xmlhcxr15 小时前
从 0 到 1 落地企业级 DevOps CI/CD 流水线:基于 GitLab+Jenkins+Harbor 的完整实践
运维·docker·gitlab·jenkins·harbor·devops
米高梅狮子16 小时前
11.Quota and Limits、健康检查和认证与授权
云原生·容器·架构·kubernetes·自动化