1. 首页 > Linux教程 > 正文

Linux教程FG451-Kubernetes调度策略

内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。

风哥提示:

本文档介绍Kubernetes调度策略的配置方法。

Part01-调度概述

1.1 调度机制

# Kubernetes调度机制
[root@k8s-master ~]# cat > /root/k8s-scheduling.txt << 'EOF' Kubernetes调度策略 ================= 1. 调度过程 - 预选(Predicates): 过滤可用节点 - 优选(Priorities): 节点打分排序 - 绑定(Binding): 分配节点 2. 调度策略 - nodeSelector: 节点标签选择 - nodeAffinity: 节点亲和性 - podAffinity: Pod亲和性 - Taints/Tolerations: 污点与容忍 3. 高级调度 - 自定义调度器 - 调度器扩展 - 调度策略配置 4. 调度约束 - 资源限制 - 优先级与抢占 - Pod拓扑分布 EOF

Part02-nodeSelector调度

2.1 节点标签调度

# 查看节点标签
[root@k8s-master ~]# kubectl get nodes –show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-master Ready control-plane 10d v1.28.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-node1 Ready 10d v1.28.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
k8s-node2 Ready 10d v1.28.3 beta.学习交流加群风哥微信: itpux-comkubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux

# 添加节点标签
[root@k8s-master ~]# kubectl label nodes k8s-node1 zone=production
node/k8s-node1 labeled

[root@k8s-master ~]# kubectl label nodes k8s-node2 zone=development
node/k8s-node2 labeled

[root@k8s-master ~]# kubectl label nodes k8s-node1 disktype=ssd
node/k8s-node1 labeled

# 使用nodeSelector调度
[root@k8s-master ~]# cat > fgedu-app-nodeselector.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-prod-app namespace: fgedu-prod spec: replicas: 3 selector: matchLabels: app: fgedu-prod-app template: metadata: labels: app: fgedu-prod-app spec: nodeSelector: zone: production disktype: ssd containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80 EOF [root@k8s-master ~]# kubectl apply -f fgedu-app-nodeselector.yaml deployment.更多视频教程www.fgedu.net.cnapps/fgedu-prod-app created # 验证Pod调度位置 [root@k8s-master ~]# kubectl get pods -n fgedu-prod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES fgedu-prod-app-abc12-xyz789 1/1 Running 0 1m 10.244.1.10 k8s-node1
fgedu-prod-app-abc12-abc12 1/1 Running 0 1m 10.244.1.11 k8s-node1
fgedu-prod-app-abc12-def34 1/1 Running 0 1m 10.244.1.12 k8s-node1

Part03-节点亲和性

3.1 nodeAffinity配置

# 创建节点亲和性调度
[root@k8s-master ~]# cat > fgedu-app-affinity.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-affinity-app namespace: fgedu-prod spec: replicas: 3 selector: matchLabels: app: fgedu-affinity-app template: metadata: labels: app: fgedu-affinity-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: zone operator: In values: - production preferredDuringSchedulingIgnoredDuringExecution: - weight: 80 preference: matchExpressions: - key: disktype operator: In values: - ssd - weight: 20 preference: matchExpressions: - key: cpu operator: In values: - high containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80 EOF [root@k8s-master ~]# kubectl apply -f fgedu-app-affinity.yaml deployment.apps/fgedu-affinity-app created # Pod亲和性配置 [root@k8s-master ~]# cat > fgedu-app-podaffinity.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-cache-app namespace: fgedu-prod spec: replicas: 3 selector: matchLabels: app: fgedu-cache-app template: metadata: labels: app: fgedu-cache-app spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - fgedu-prod-app topologyKey: kubernetes.io/hostname podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - fgedu-cache-app topologyKey: kubernetes.io/hostname containers: - name: redis image: redis:7 ports: - containerPort: 6379 EOF [root@k8s-master ~]# kubectl apply -f fgedu-app-podaffinity.yaml deployment.apps/fgedu-cache-app created # 查看Pod分布 [root@k8s-master ~]# kubectl get pods -n fgedu-prod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE fgedu-cache-app-abc12-xyz789 1/1 Running 0 1m 10.244.1.20 k8s-node1
fgedu-cache-app-abc12-abc12 学习交流加群风哥QQ113257174 1/1 Running 0 1m 10.244.1.21 k8s-node1
fgedu-cache-app-abc12-def34 1/1 Running 0 1m 10.244.1.22 k8s-node1

Part04-污点与容忍

4.1 Taints/Tolerations配置

# 查看节点污点
[root@k8s-master ~]# kubectl describe node k8s-master | grep Taints
Taints: node-role.kubernetes.io/control-plane:NoSchedule

# 添加节点污点
[root@k8s-master ~]# kubectl taint nodes k8s-node1 dedicated=gpu:NoSchedule
node/k8s-node1 tainted

[root@k8s-master ~]# kubectl taint nodes k8s-node2 dedicated=storage:NoExecute
node/k8s-node2 tainted

# 创建容忍污点的Pod
[root@k8s-master ~]# cat > fgedu-app-toleration.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-gpu-app namespace: fgedu-prod spec: replicas: 2 selector: matchLabels: app: fgedu-gpu-app template: metadata: labels: app: fgedu-gpu-app spec: tolerations: - key: dedicated operator: Equal value: gpu effect: NoSchedule - key: dedicated operator: Equal value: storage effect: NoExecute containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80 EOF [root@k8s-master ~]# kubectl apply -f fgedu-app-toleration.yaml deployment.apps/fgedu-gpu-app created # 删除污点 [root@k8s-master ~]# kubectl taint nodes k8s-node1 dedicated=gpu:NoSchedule- node/k8s-node1 untainted # 查看污点 [root@k8s-master ~]# kubectl describe node k8s-node1 | grep Taints Taints:

# Pod拓扑分布约束
[root@k8s-master ~]# cat > fgedu-app-topology.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-distributed-app namespace: fgedu-prod spec: replicas: 6 selector: matchLabels: app: fgedu-distributed-app template: metadata: labels: app: fgedu-distributed-app spec: topologySpreadConstraints: - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: fgedu-distributed-app containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80 EOF [root@k8s-master ~]# kubectl apply -f fgedu-app-topology.yaml deployment.apps/fgedu-distributed-app created # 查看Pod分布 [root@k8s-master ~]# kubectl get pods -n fgedu-prod -o wide -l app=fgedu-distributed-app NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE fgedu-distributed-app-abc12-xyz789 1/1 Running 0 1m 10.244.1.30 k8s-node1
fgedu-distributed-app-abc12-abc12 1/1 Running 0 1m 10.244.1.31 k8s-node1
fgedu-distributed-app-abc12-def34 1/1 Running 0 1m 10.244.1.32 k8s-node1
fgedu-distributed-app-abc12-ghi56 1/1 Running 0 1m 10.244.2.30 k8s-node2
fgedu-distributed-app-abc12-jkl78 1/1 Running 0 1m 10.244.2.31 k8s-node2
fgedu-distributed-app-abc12-mno90 1/1 Running 0 1m 10.244.2.32 k8s-node2

风哥针对调度策略建议:

  • 使用标签标识节点特性
  • 配置亲和性优化性能
  • 使用污点隔离特殊节点
  • 配置拓扑分布保证高可用
  • 监控调度失败事件

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

联系我们

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

微信号:itpux-com

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