【模块一】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在一个

### Kubernetes Pod 的详细解释 Kubernetes(简称 K8S)是种开源的容器编排平台,用于自动化容器化应用程序的部署、扩展和管理。在 Kubernetes 中,Pod 是最基本的部署单元[^1]。 #### 什么是 Kubernetes PodPodKubernetes 集群中最小的可调度单位,它封装了个或多个紧密关联的应用程序容器、存储资源、唯的网络 IP 地址以及如何运行它们的选项配置[^2]。通常情况下,Pod 只会包含容器;然而,在某些场景下,为了满足特定需求,也可以在Pod 内部运行多个协作容器。 #### Pod 的状态 Pod 的生命周期由其状态来表示,这些状态反映了 Pod 当前所处的不同阶段。以下是常见的 Pod 状态: - **Pending**: API Server 已经接收到了该 Pod 请求并正在处理中。 - **Running**: Pod 被成功调度至某个节点上,并且所有的容器都已经启动。 - **Succeeded**: 所有容器均正常退出,任务完成。 - **Failed**: 至少有容器以失败的方式结束。 - **Unknown**: 因某种原因无法获取到 Pod 的最新状态信息[^2]。 如果遇到异常情况,比如 Node 故障或其他问题,则可能导致 Pod 进入未知状态或者持续重启等问题发生。此时可以通过查看日志文件等方式排查具体错误原因。 #### Pod 的调度方式 除了基本功能外,还可以通过多种方法实现更灵活精确地控制哪些 Pods 应该分配给哪个 Nodes 上执行工作负载: 1. 使用 Deployment 或 Replication Controller 来定义期望副本数; 2. 利用 `NodeSelector` 实现简单粗暴型指定目标机器标签匹配规则; 3. 结合高级特性如 Affinity 和 Anti-Affinity 提供更加细粒度的选择偏好逻辑支持; 4. 设置 Taints/Tolerations 对抗排斥机制从而达到保护特殊用途计算资源的目的[^3]。 需要注意的是单个独立存在的 Pod 并不具备自动恢复能力——旦所在的物理服务器出现问题就可能会丢失数据甚至完全消失不见除非另有专门设计好的高可用架构保障措施存在[^4]。 另外值得注意的点是虽然大部分核心服务模块像 kube-scheduler,kube-controller-manager 等确实参到整个流程当中去负责协调安排新实例位置等工作环节但是也有例外情形比如说这里提到过的 kube-proxy 它仅仅只是承担起内部通信代理职责而已并没有涉及到任何关于新建实体对象方面的操作行为所以也就谈不上什么影响因素了[^5]。 ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: nginx-container image: nginx:latest ``` 以上 YAML 文件展示了个简单的 Nginx Web 服务器镜像作为单容器组成的 Pod 示例说明文档结构形式。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值