1. 首页 > Kubernetes教程 > 正文

Kubernetes教程FG051-Kubernetes Node Affinity和Pod Anti-Affinity实战

本文档风哥主要介绍Kubernetes Node Affinity和Pod Anti-Affinity实战,包括Node Affinity概述、Pod Anti-Affinity概述、使用场景、亲和性规划、反亲和性规划、最佳实践规划、Node Affinity实现、Pod Anti-Affinity实现、管理实现、Node Affinity案例、Pod Anti-Affinity案例、集成案例等内容,风哥教程参考Kubernetes官方文档和调度相关文档,适合想使用和理解Kubernetes调度管理的开发人员和运维人员。

Part01-基础概念与理论知识

1.1 Node Affinity概述

Node Affinity是Kubernetes中用于控制Pod调度到特定节点的机制,它允许用户指定Pod应该调度到哪些节点上。

Node Affinity的主要特性包括:

  • 节点选择:基于节点标签选择节点
  • 硬约束和软约束:硬约束(required)必须满足,软约束(preferred)尽量满足
  • 灵活的匹配规则:支持多种匹配规则,如In、NotIn、Exists、DoesNotExist、Gt、Lt等
  • 优先级排序:可以为不同的软约束设置优先级

1.2 Pod Anti-Affinity概述

Pod Anti-Affinity是Kubernetes中用于控制Pod不调度到特定节点的机制,它允许用户指定Pod不应该调度到哪些节点上。

Pod Anti-Affinity的主要特性包括:

  • Pod选择:基于Pod标签选择Pod
  • 硬约束和软约束:硬约束(required)必须满足,软约束(preferred)尽量满足
  • 灵活的匹配规则:支持多种匹配规则,如In、NotIn、Exists、DoesNotExist等
  • 命名空间作用域:可以指定在哪个命名空间内查找Pod

1.3 使用场景

Node Affinity和Pod Anti-Affinity的使用场景包括:

  • 硬件需求:将需要特定硬件的Pod调度到具有该硬件的节点上
  • 高可用性:将同一应用的Pod分散到不同的节点上,提高可用性
  • 资源优化:根据节点资源情况调度Pod,优化资源使用
  • 网络性能:将需要低延迟通信的Pod调度到同一节点或同一区域
  • 安全隔离:将不同安全级别的Pod调度到不同的节点上

Part02-生产环境规划与建议

2.1 亲和性规划

Kubernetes Node Affinity的规划:

# 亲和性规划
– 目标:
– 实现Pod的精确调度
– 提高资源利用率
– 满足应用的硬件需求
– 优化网络性能
– 范围:
– 节点标签规划
– 亲和性规则设计
– 优先级设置
– 测试和验证
– 工具选择:
– kubectl:用于管理节点标签和Pod
– Kubernetes Dashboard:用于可视化管理
– Prometheus:用于监控
– Grafana:用于可视化监控数据
– 流程设计:
– 节点标签规划:为节点添加合适的标签
– 亲和性规则设计:根据应用需求设计亲和性规则
– 优先级设置:为不同的亲和性规则设置优先级
– 测试和验证:测试亲和性规则的效果,确保其正常工作
– 监控和调整:监控Pod调度情况,根据需要调整规则
– 资源分配:
– 人力资源:集群管理员、运维人员
– 时间资源:规划时间、部署时间、测试时间
– 基础设施:计算资源、存储资源、网络资源

2.2 反亲和性规划

Kubernetes Pod Anti-Affinity的规划:

# 反亲和性规划
– 目标:
– 实现Pod的分散部署
– 提高应用的高可用性
– 避免单点故障
– 优化资源使用
– 范围:
– Pod标签规划
– 反亲和性规则设计
– 命名空间作用域设置
– 测试和验证
– 工具选择:
– kubectl:用于管理Pod标签和Pod
– Kubernetes Dashboard:用于可视化管理
– Prometheus:用于监控
– Grafana:用于可视化监控数据
– 流程设计:
– Pod标签规划:为Pod添加合适的标签
– 反亲和性规则设计:根据应用需求设计反亲和性规则
– 命名空间作用域设置:设置反亲和性规则的命名空间作用域
– 测试和验证:测试反亲和性规则的效果,确保其正常工作
– 监控和调整:监控Pod调度情况,根据需要调整规则
– 资源分配:
– 人力资源:集群管理员、运维人员
– 时间资源:规划时间、部署时间、测试时间
– 基础设施:计算资源、存储资源、网络资源

2.3 最佳实践规划

Kubernetes Node Affinity和Pod Anti-Affinity的最佳实践规划:

# 最佳实践规划
– 节点标签最佳实践:
– 使用标准化的标签命名:使用清晰、一致的标签命名规则
– 避免过多标签:只添加必要的标签,避免标签过多影响性能
– 定期审查标签:定期审查和清理不必要的标签
– 使用标签选择器:使用标签选择器来组织和管理节点
– 亲和性最佳实践:
– 合理使用硬约束和软约束:优先使用软约束,避免硬约束导致Pod无法调度
– 设置合理的优先级:为不同的亲和性规则设置合理的优先级
– 避免冲突的规则:确保不同的亲和性规则之间不冲突
– 测试规则效果:在生产环境中使用前,在测试环境中测试规则效果
– 反亲和性最佳实践:
– 合理使用硬约束和软约束:优先使用软约束,避免硬约束导致Pod无法调度
– 设置合理的命名空间作用域:根据需要设置命名空间作用域
– 避免过度限制:避免过度使用反亲和性规则,导致Pod无法调度
– 测试规则效果:在生产环境中使用前,在测试环境中测试规则效果
– 部署最佳实践:
– 使用Deployment:使用Deployment管理Pod,确保Pod的高可用性
– 使用StatefulSet:对于有状态应用,使用StatefulSet管理Pod
– 配置资源请求和限制:配置Pod的资源请求和限制,确保资源使用合理
– 监控Pod状态:监控Pod的状态,及时发现和处理问题
– 运维最佳实践:
– 文档化规则:文档化所有的亲和性和反亲和性规则,便于维护和审计
– 培训和教育:对开发人员和运维人员进行培训,提高调度管理意识
– 定期审查规则:定期审查和更新亲和性和反亲和性规则,确保其符合应用需求
– 持续改进:持续改进调度策略,提高调度效率和资源利用率

Part03-生产环境项目实施方案

3.1 Node Affinity实现

Node Affinity实现的具体步骤:

# Node Affinity实现
1. 为节点添加标签:
# 查看节点
$ kubectl get nodes
# 输出
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane,master 1d v1.24.0
node2 Ready 1d v1.24.0
node3 Ready 1d v1.24.0
# 为节点添加标签
$ kubectl label nodes node1 hardware=high-performance
$ kubectl label nodes node2 hardware=standard
$ kubectl label nodes node3 hardware=standard
# 查看节点标签
$ kubectl get nodes –show-labels
# 输出
NAME STATUS ROLES AGE VERSION LABELS
node1 Ready control-plane,master 1d v1.24.0 hardware=high-performance,kubernetes.io/hostname=node1
node2 Ready 1d v1.24.0 hardware=standard,kubernetes.io/hostname=node2
node3 Ready 1d v1.24.0 hardware=standard,kubernetes.io/hostname=node3
2. 创建使用Node Affinity的Pod:
# 创建Pod
$ cat > high-performance-pod.yaml << 'EOF' apiVersion: v1 kind: Pod metadata: name: high-performance-pod spec: containers: - name: high-performance-container image: nginx:latest affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions:,风哥提示:。 - key: hardware operator: In values: - high-performance EOF $ kubectl apply -f high-performance-pod.yaml # 创建使用软约束的Pod $ cat > preferred-pod.yaml << 'EOF' apiVersion: v1 kind: Pod metadata: name: preferred-pod spec: containers: - name: preferred-container image: nginx:latest affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: hardware operator: In values: - high-performance EOF $ kubectl apply -f preferred-pod.yaml 3. 查看Pod调度情况: # 查看Pod $ kubectl get pods -o wide # 输出 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES high-performance-pod 1/1 Running 0 1m 10.244.0.2 node1
preferred-pod 1/1 Running 0 1m 10.244.0.3 node1
4. 测试硬约束:
# 创建使用不存在标签的Pod
$ cat > invalid-pod.yaml << 'EOF' apiVersion: v1 kind: Pod metadata: name: invalid-pod spec: containers: - name: invalid-container image: nginx:latest affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: hardware operator: In values: - gpu EOF $ kubectl apply -f invalid-pod.yaml # 查看Pod状态 $ kubectl get pods # 输出 NAME READY STATUS RESTARTS AGE high-performance-pod 1/1 Running 0 2m invalid-pod 0/1 Pending 0 1m preferred-pod 1/1 Running 0 2m # 查看Pod事件 $ kubectl describe pod invalid-pod # 输出 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 1m (x12 over 1m) default-scheduler 0/3 nodes are available: 3 node(s) didn't match Pod's node affinity/selector. 5. 清理资源: # 清理Pod $ kubectl delete pod high-performance-pod preferred-pod invalid-pod # 移除节点标签 $ kubectl label nodes node1 hardware- $ kubectl label nodes node2 hardware- $ kubectl label nodes node3 hardware-

3.2 Pod Anti-Affinity实现

Pod Anti-Affinity实现的具体步骤。,风哥提示:。

# Pod Anti-Affinity实现
1. 创建使用Pod Anti-Affinity的Deployment:
# 创建Deployment
$ cat > app-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: app-deployment spec: replicas: 3 selector: matchLabels: app: app template: metadata: labels: app: app spec: containers: - name: app-container image: nginx:latest affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - app topologyKey: kubernetes.io/hostname EOF $ kubectl apply -f app-deployment.yaml 2. 查看Pod调度情况: # 查看Pod $ kubectl get pods -o wide # 输出 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES app-deployment-675949546d-2q5k2 1/1 Running 0 1m 10.244.0.2 node1
app-deployment-675949546d-5b7c8 1/1 Running 0 1m 10.244.1.2 node2 ,学习交流加群风哥微信: itpux-com。
app-deployment-675949546d-7f8d9 1/1 Running 0 1m 10.244.2.2 node3
3. 测试Pod Anti-Affinity:
# 尝试创建更多Pod
$ kubectl scale deployment app-deployment –replicas=4
# 查看Pod状态
$ kubectl get pods
# 输出
NAME READY STATUS RESTARTS AGE
app-deployment-675949546d-2q5k2 1/1 Running 0 2m
app-deployment-675949546d-5b7c8 1/1 Running 0 2m
app-deployment-675949546d-7f8d9 1/1 Running 0 2m
app-deployment-675949546d-9p6q7 0/1 Pending 0 1m
# 查看Pod事件
$ kubectl describe pod app-deployment-675949546d-9p6q7
# 输出
Events:
Type Reason Age From Message
—- —— —- —- ——-
Warning FailedScheduling 1m (x12 over 1m) default-scheduler 0/3 nodes are available: 3 node(s) didn’t match Pod’s pod anti-affinity rules.
4. 创建使用软约束的Deployment:
# 创建Deployment
$ cat > app-deployment-preferred.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: app-deployment-preferred spec: replicas: 4 selector: matchLabels: app: app-preferred template: metadata: labels: app: app-preferred spec: containers: - name: app-container image: nginx:latest affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - app-preferred topologyKey: kubernetes.io/hostname EOF $ kubectl apply -f app-deployment-preferred.yaml 5. 查看Pod调度情况: # 查看Pod $ kubectl get pods -o wide # 输出 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES app-deployment-675949546d-2q5k2 1/1 Running 0 3m 10.244.0.2 node1
app-deployment-675949546d-5b7c8 1/1 Running 0 3m 10.244.1.2 node2
app-deployment-675949546d-7f8d9 1/1 Running 0 3m 10.244.2.2 node3
app-deployment-675949546d-9p6q7 0/1 Pending 0 2m
app-deployment-preferred-789546f5c4-2b4k5 1/1 Running 0 1m 10.244.0.3 node1
app-deployment-preferred-789546f5c4-5c6d7 1/1 Running 0 1m 10.244.1.3 node2
app-deployment-preferred-789546f5c4-7d8e9 1/1 Running 0 1m 10.244.2.3 node3
app-deployment-preferred-789546f5c4-9f0g1 1/1 Running 0 1m 10.244.0.4 node1
6. 清理资源:
# 清理Deployment
$ kubectl delete deployment app-deployment app-deployment-preferred

3.3 管理实现

Node Affinity和Pod Anti-Affinity管理的具体步骤。

# 管理实现
1. 监控Pod调度情况:
# 安装Prometheus和Grafana
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update
$ helm install prometheus prometheus-community/kube-prometheus-stack
# 查看监控面板
$ kubectl port-forward deployment/prometheus-grafana 3000:3000
# 打开浏览器访问 http://localhost:3000
2. 配置调度告警:
# 创建告警规则
$ cat > scheduling-alert.yaml << 'EOF' apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: scheduling-alerts spec: groups: - name: pod-scheduling rules: - alert: PodPending expr: sum by (namespace, pod) (kube_pod_status_phase{phase="Pending"}) > 0
for: 5m
labels:
severity: critical
annotations:
summary: “Pod pending”
description: “Pod {{ $labels.pod }} in namespace {{ $labels.namespace }} has been pending for more than 5 minutes”
EOF
$ kubectl apply -f scheduling-alert.yaml
3. 管理节点标签:
# 列出节点标签
$ kubectl get nodes –show-labels
# 添加节点标签
$ kubectl label nodes node1 environment=production
# 更新节点标签
$ kubectl label nodes node1 environment=staging –overwrite
# 删除节点标签
$ kubectl label nodes node1 environment-
4. 管理Pod亲和性和反亲和性:
# 查看Pod的亲和性和反亲和性
$ kubectl get pod high-performance-pod -o jsonpath='{.spec.affinity}’
# 更新Pod的亲和性和反亲和性
$ kubectl patch pod high-performance-pod -p ‘{“spec”:{“affinity”:{“nodeAffinity”:{“preferredDuringSchedulingIgnoredDuringExecution”:[{“weight”:100,”preference”:{“matchExpressions”:[{“key”:”environment”,”operator”:”In”,”values”:[“production”]}]}}]}}}’
5. 配置调度策略:
# 查看调度器配置
$ kubectl get configmap kube-scheduler -n kube-system -o yaml
# 更新调度器配置
$ kubectl edit configmap kube-scheduler -n kube-system,学习交流加群风哥QQ113257174。
6. 测试调度策略:
# 创建测试Pod
$ cat > test-pod.yaml << 'EOF' apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: nginx:latest affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 preference: matchExpressions: - key: environment operator: In values: - production podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - test topologyKey: kubernetes.io/hostname EOF $ kubectl apply -f test-pod.yaml # 查看Pod调度情况 $ kubectl get pods -o wide 7. 清理资源: # 清理Pod $ kubectl delete pod test-pod # 清理告警规则 $ kubectl delete prometheusrule scheduling-alerts # 卸载Prometheus和Grafana $ helm uninstall prometheus

Part04-生产案例与实战讲解

4.1 Node Affinity案例

Node Affinity的实战案例。

# 案例:使用Node Affinity部署需要GPU的应用
# 场景:部署一个需要GPU的机器学习应用,使用Node Affinity确保应用调度到具有GPU的节点上
# 问题:
– 机器学习应用需要GPU资源
– 集群中只有部分节点具有GPU
– 需要确保应用调度到具有GPU的节点上
# 解决方案:
1. 为节点添加GPU标签:
# 查看节点
$ kubectl get nodes
# 输出
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane,master 1d v1.24.0
node2 Ready 1d v1.24.0
node3 Ready 1d v1.24.0
# 为具有GPU的节点添加标签
$ kubectl label nodes node2 hardware=gpu
# 查看节点标签
$ kubectl get nodes –show-labels
# 输出
NAME STATUS ROLES AGE VERSION LABELS
node1 Ready control-plane,master 1d v1.24.0 kubernetes.io/hostname=node1
node2 Ready 1d v1.24.0 hardware=gpu,kubernetes.io/hostname=node2
node3 Ready 1d v1.24.0 kubernetes.io/hostname=node3
2. 创建使用Node Affinity的Deployment:
# 创建Deployment
$ cat > ml-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: ml-deployment spec: replicas: 2 selector: matchLabels: app: ml-app template: metadata: labels: app: ml-app spec: containers: - name: ml-container image: tensorflow/tensorflow:latest-gpu resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: hardware operator: In values: - gpu EOF $ kubectl apply -f ml-deployment.yaml 3. 查看Pod调度情况: # 查看Pod $ kubectl get pods -o wide # 输出 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ml-deployment-675949546d-2q5k2 1/1 Running 0 1m 10.244.1.2 node2
ml-deployment-675949546d-5b7c8 1/1 Running 0 1m 10.244.1.3 node2
4. 测试Node Affinity:
# 尝试创建更多Pod
$ kubectl scale deployment ml-deployment –replicas=3
# 查看Pod状态
$ kubectl get pods
# 输出,更多视频教程www.fgedu.net.cn。
NAME READY STATUS RESTARTS AGE
ml-deployment-675949546d-2q5k2 1/1 Running 0 2m
ml-deployment-675949546d-5b7c8 1/1 Running 0 2m
ml-deployment-675949546d-7f8d9 0/1 Pending 0 1m
# 查看Pod事件
$ kubectl describe pod ml-deployment-675949546d-7f8d9
# 输出
Events:
Type Reason Age From Message
—- —— —- —- ——-
Warning FailedScheduling 1m (x12 over 1m) default-scheduler 0/3 nodes are available: 1 node(s) didn’t match Pod’s node affinity/selector, 2 node(s) didn’t have enough resource: nvidia.com/gpu.
5. 清理资源:
# 清理Deployment
$ kubectl delete deployment ml-deployment
# 移除节点标签
$ kubectl label nodes node2 hardware-
# 输出结果:
# Node Affinity配置成功
# 应用成功调度到具有GPU的节点上
# 超过GPU资源限制的Pod无法调度
# 资源利用率得到优化

4.2 Pod Anti-Affinity案例

Pod Anti-Affinity的实战案例。

# 案例:使用Pod Anti-Affinity提高应用的高可用性
# 场景:部署一个高可用性的Web应用,使用Pod Anti-Affinity确保Pod分散到不同的节点上
# 问题:
– Web应用需要高可用性
– 单节点故障会导致应用不可用
– 需要确保Pod分散到不同的节点上
# 解决方案:
1. 创建使用Pod Anti-Affinity的Deployment:
# 创建Deployment
$ cat > web-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: web-deployment spec: replicas: 3 selector: matchLabels: app: web-app template: metadata: labels: app: web-app spec: containers: - name: web-container image: nginx:latest ports: - containerPort: 80 affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - web-app topologyKey: kubernetes.io/hostname EOF $ kubectl apply -f web-deployment.yaml 2. 查看Pod调度情况: # 查看Pod $ kubectl get pods -o wide # 输出 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-deployment-675949546d-2q5k2 1/1 Running 0 1m 10.244.0.2 node1
web-deployment-675949546d-5b7c8 1/1 Running 0 1m 10.244.1.2 node2
web-deployment-675949546d-7f8d9 1/1 Running 0 1m 10.244.2.2 node3
3. 测试高可用性:
# 模拟节点故障
$ kubectl cordon node1
$ kubectl drain node1 –ignore-daemonsets
# 查看Pod状态
$ kubectl get pods -o wide
# 输出
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-deployment-675949546d-5b7c8 1/1 Running 0 2m 10.244.1.2 node2
web-deployment-675949546d-7f8d9 1/1 Running 0 2m 10.244.2.2 node3
web-deployment-675949546d-9p6q7 1/1 Running 0 1m 10.244.1.3 node2
4. 恢复节点:
# 恢复节点
$ kubectl uncordon node1
5. 清理资源:
# 清理Deployment
$ kubectl delete deployment web-deployment
# 输出结果:
# Pod Anti-Affinity配置成功
# Pod分散到不同的节点上
# 节点故障时,Pod自动重新调度到其他节点
# 应用的高可用性得到保障

4.3 集成案例

Node Affinity和Pod Anti-Affinity的集成案例。

# 案例:使用Node Affinity和Pod Anti-Affinity部署微服务应用
# 场景:部署一个微服务应用,包括前端、后端和数据库,使用Node Affinity和Pod Anti-Affinity优化调度
# 问题:
– 微服务应用需要不同的资源需求
– 前端和后端需要低延迟通信
– 数据库需要高IO性能
– 需要确保应用的高可用性
# 解决方案:
1. 为节点添加标签:
# 查看节点
$ kubectl get nodes
# 输出
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane,master 1d v1.24.0
node2 Ready 1d v1.24.0
node3 Ready 1d v1.24.0
# 为节点添加标签
$ kubectl label nodes node1 role=frontend
$ kubectl label nodes node2 role=backend
$ kubectl label nodes node3 role=database,更多学习教程公众号风哥教程itpux_com。
# 查看节点标签
$ kubectl get nodes –show-labels
# 输出
NAME STATUS ROLES AGE VERSION LABELS
node1 Ready control-plane,master 1d v1.24.0 role=frontend,kubernetes.io/hostname=node1
node2 Ready 1d v1.24.0 role=backend,kubernetes.io/hostname=node2
node3 Ready 1d v1.24.0 role=database,kubernetes.io/hostname=node3
2. 创建前端Deployment:
# 创建Deployment
$ cat > frontend-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: frontend-deployment spec: replicas: 2 selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: containers: - name: frontend-container image: nginx:latest ports: - containerPort: 80 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: role operator: In values: - frontend podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - frontend topologyKey: kubernetes.io/hostname EOF $ kubectl apply -f frontend-deployment.yaml 3. 创建后端Deployment: # 创建Deployment $ cat > backend-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: backend-deployment spec: replicas: 2 selector: matchLabels: app: backend template: metadata: labels: app: backend spec: containers: - name: backend-container image: node:latest ports: - containerPort: 3000 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: role operator: In values: - backend podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - backend topologyKey: kubernetes.io/hostname EOF $ kubectl apply -f backend-deployment.yaml 4. 创建数据库StatefulSet: # 创建StatefulSet $ cat > database-statefulset.yaml << 'EOF' apiVersion: apps/v1 kind: StatefulSet metadata: name: database-statefulset spec: serviceName: database replicas: 2 selector: matchLabels: app: database template: metadata: labels: app: database spec: containers: - name: database-container image: mysql:8.0 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD value: password - name: MYSQL_DATABASE value: fgedudb affinity:,from K8S+DB视频:www.itpux.com。 nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: role operator: In values: - database podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions:。 - key: app operator: In values: - database topologyKey: kubernetes.io/hostname EOF $ kubectl apply -f database-statefulset.yaml 5. 查看Pod调度情况: # 查看Pod $ kubectl get pods -o wide # 输出 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES frontend-deployment-675949546d-2q5k2 1/1 Running 0 1m 10.244.0.2 node1
frontend-deployment-675949546d-5b7c8 1/1 Running 0 1m 10.244.0.3 node1
backend-deployment-675949546d-7f8d9 1/1 Running 0 1m 10.244.1.2 node2
backend-deployment-675949546d-9p6q7 1/1 Running 0 1m 10.244.1.3 node2
database-statefulset-0 1/1 Running 0 1m 10.244.2.2 node3
database-statefulset-1 0/1 Pending 0 1m
6. 测试调度:
# 为node2添加database标签
$ kubectl label nodes node2 role=database –overwrite
# 查看Pod状态
$ kubectl get pods -o wide
# 输出
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
frontend-deployment-675949546d-2q5k2 1/1 Running 0 2m 10.244.0.2 node1
frontend-deployment-675949546d-5b7c8 1/1 Running 0 2m 10.244.0.3 node1
backend-deployment-675949546d-7f8d9 1/1 Running 0 2m 10.244.1.2 node2
backend-deployment-675949546d-9p6q7 1/1 Running 0 2m 10.244.1.3 node2
database-statefulset-0 1/1 Running 0 2m 10.244.2.2 node3
database-statefulset-1 1/1 Running 0 1m 10.244.1.4 node2
7. 清理资源:
# 清理Deployment和StatefulSet
$ kubectl delete deployment frontend-deployment backend-deployment
$ kubectl delete statefulset database-statefulset
# 移除节点标签
$ kubectl label nodes node1 role-
$ kubectl label nodes node2 role-
$ kubectl label nodes node3 role-
# 输出结果:
# Node Affinity和Pod Anti-Affinity配置成功
# 前端Pod调度到frontend节点
# 后端Pod调度到backend节点
# 数据库Pod调度到database节点
# 应用的资源需求得到满足
# 应用的高可用性得到保障

Part05-风哥经验总结与分享

5.1 亲和性使用技巧

Kubernetes Node Affinity使用的技巧。

  • 合理使用硬约束和软约束:优先使用软约束,避免硬约束导致Pod无法调度
  • 设置合理的优先级:为不同的亲和性规则设置合理的优先级,确保重要的规则得到优先考虑
  • 使用标准化的标签:使用标准化的标签命名规则,便于管理和维护
  • 定期审查标签:定期审查和清理不必要的标签,避免标签过多影响性能
  • 测试规则效果:在生产环境中使用前,在测试环境中测试规则效果,确保其正常工作
  • 监控调度情况:监控Pod的调度情况,及时发现和处理调度问题
  • 避免过度约束:避免过度使用亲和性规则,导致Pod无法调度
  • 结合资源请求和限制:结合Pod的资源请求和限制,确保节点有足够的资源满足Pod的需求

5.2 反亲和性使用技巧

Kubernetes Pod Anti-Affinity使用的技巧:

  • 合理使用硬约束和软约束:优先使用软约束,避免硬约束导致Pod无法调度
  • 设置合理的命名空间作用域:根据需要设置命名空间作用域,确保反亲和性规则在适当的范围内生效
  • 使用合适的topologyKey:根据需要选择合适的topologyKey,如kubernetes.io/hostname、zone等
  • 避免过度限制:避免过度使用反亲和性规则,导致Pod无法调度
  • 测试规则效果:在生产环境中使用前,在测试环境中测试规则效果,确保其正常工作
  • 监控调度情况:监控Pod的调度情况,及时发现和处理调度问题
  • 结合StatefulSet:对于有状态应用,结合StatefulSet使用反亲和性,确保Pod的稳定部署
  • 考虑集群规模:根据集群规模调整反亲和性规则,确保在小规模集群中也能正常调度

Kubernetes调度的未来趋势:

  • 更智能的调度策略:使用AI技术实现智能化调度,根据应用需求和集群状态自动调整调度策略
  • 多维度调度:考虑更多维度的因素,如能耗、网络延迟、成本等,实现更优化的调度
  • 边缘计算支持:扩展调度策略到边缘节点,支持边缘计算场景
  • 自定义调度器:提供更灵活的自定义调度器接口,允许用户根据特定需求实现自定义调度逻辑
  • 调度可视化:提供更直观的调度可视化工具,帮助用户理解和优化调度策略
  • 跨集群调度:支持跨多个集群的调度,实现资源的更有效利用
  • 实时调度:实现实时调度,根据集群状态的变化及时调整Pod的调度
  • 安全感知调度:考虑安全因素的调度,确保Pod调度到安全的节点上

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息