内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。
风哥提示:
本文档介绍Kubernetes调度策略的配置方法。
Part01-调度概述
1.1 调度机制
[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
k8s-node2 Ready
# 添加节点标签
[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
