跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kubernetes Pod亲和性
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Kubernetes Pod亲和性 = '''Pod亲和性'''(Pod Affinity)是Kubernetes中一种用于控制Pod调度行为的机制,允许用户指定Pod应该运行在哪些节点上,或者与其他Pod共同调度在同一节点或同一拓扑域(如机架、可用区等)。Pod亲和性分为两种类型: * '''Pod亲和性(Pod Affinity)''':使Pod倾向于与其他Pod运行在同一位置。 * '''Pod反亲和性(Pod Anti-Affinity)''':使Pod避免与其他Pod运行在同一位置。 Pod亲和性通常用于优化资源利用率、提高性能或增强高可用性。 == 基本概念 == Pod亲和性通过定义规则来影响调度器决策,规则可以基于: * '''标签选择器(Label Selector)''':匹配具有特定标签的Pod。 * '''拓扑域(Topology Key)''':定义调度的范围(如节点、机架、可用区等)。 === 亲和性规则类型 === * '''requiredDuringSchedulingIgnoredDuringExecution''':调度时必须满足的硬性规则,如果无法满足,Pod将不会被调度。 * '''preferredDuringSchedulingIgnoredDuringExecution''':调度时优先考虑的软性规则,如果无法满足,Pod仍会被调度。 == 语法与配置 == Pod亲和性在Pod或Deployment的`spec.affinity.podAffinity`或`spec.affinity.podAntiAffinity`字段中定义。以下是一个示例: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Pod metadata: name: web-server labels: app: web spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - cache topologyKey: kubernetes.io/hostname containers: - name: web image: nginx </syntaxhighlight> === 参数说明 === * '''labelSelector''':匹配目标Pod的标签。 * '''topologyKey''':定义调度的拓扑域(如`kubernetes.io/hostname`表示同一节点)。 * '''operator''':支持`In`、`NotIn`、`Exists`、`DoesNotExist`等操作符。 == 示例场景 == === 场景1:Pod亲和性(共同调度) === 假设有一个Web应用和一个缓存服务,希望它们运行在同一节点以减少网络延迟: <syntaxhighlight lang="yaml"> apiVersion: apps/v1 kind: Deployment metadata: name: web-deployment spec: replicas: 2 selector: matchLabels: app: web template: metadata: labels: app: web spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: cache topologyKey: kubernetes.io/hostname containers: - name: web image: nginx </syntaxhighlight> === 场景2:Pod反亲和性(高可用) === 确保同一应用的多个副本不会运行在同一节点: <syntaxhighlight lang="yaml"> apiVersion: apps/v1 kind: Deployment metadata: name: redis-ha spec: replicas: 3 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: redis topologyKey: kubernetes.io/hostname containers: - name: redis image: redis </syntaxhighlight> == 高级用法 == === 权重偏好(Weighted Preferences) === 在`preferredDuringSchedulingIgnoredDuringExecution`中,可以为规则分配权重(1-100),调度器会优先选择权重高的规则: <syntaxhighlight lang="yaml"> spec: affinity: podAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 80 podAffinityTerm: labelSelector: matchLabels: app: cache topologyKey: kubernetes.io/hostname </syntaxhighlight> === 多拓扑域规则 === 可以同时指定多个拓扑域,如节点和可用区: <syntaxhighlight lang="yaml"> spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: db topologyKey: topology.kubernetes.io/zone </syntaxhighlight> == 实际案例 == === 案例:微服务部署优化 === 假设一个电商平台需要: * 将订单服务(`order-service`)和库存服务(`inventory-service`)部署在同一节点以减少延迟。 * 避免两个订单服务副本运行在同一节点以提高可用性。 配置如下: <syntaxhighlight lang="yaml"> apiVersion: apps/v1 kind: Deployment metadata: name: order-service spec: replicas: 3 template: spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: inventory-service topologyKey: kubernetes.io/hostname podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: order-service topologyKey: kubernetes.io/hostname </syntaxhighlight> == 可视化调度逻辑 == <mermaid> graph TD A[Pod调度请求] --> B{检查亲和性规则} B -->|亲和性| C[选择匹配标签的Pod所在节点] B -->|反亲和性| D[排除匹配标签的Pod所在节点] C --> E[调度Pod] D --> E </mermaid> == 数学表达 == 亲和性调度可以形式化为一个优化问题: <math> \max \sum_{i=1}^{n} w_i \cdot f_i(x) </math> 其中: * <math>w_i</math> 是规则权重, * <math>f_i(x)</math> 是规则匹配函数。 == 总结 == Pod亲和性是Kubernetes中强大的调度工具,适用于: * 性能优化(如减少网络延迟)。 * 高可用性(如分散副本)。 * 资源利用率优化(如共享GPU节点)。 通过合理配置亲和性和反亲和性规则,可以显著提升集群的稳定性和效率。 [[Category:集成部署]] [[Category:Kubernetes]] [[Category:Kubernetes资源管理]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)