KubeSphere教程FG031-KubeSphere节点污点、亲和性调度配置实战
本教程详细介绍KubeSphere中节点污点、亲和性调度配置的实战操作,包括基础概念、生产环境规划、具体实施方案和实战案例。风哥教程参考KubeSphere官方文档KubeSphere容器平台使用指南、KubeSphere调度管理等相关内容。
目录大纲
Part01-基础概念与理论知识
1.1 节点污点核心概念
节点污点是指节点上的标记,用于排斥某些Pod的调度。它包括:
- 污点键(key):污点的名称
- 污点值(value):污点的值
- 污点效果(effect):污点的效果,包括NoSchedule、PreferNoSchedule和NoExecute
- NoSchedule:不允许调度Pod到该节点
- PreferNoSchedule:尽量不调度Pod到该节点
- NoExecute:立即驱逐该节点上的Pod
1.2 亲和性调度核心概念
亲和性调度是指根据节点的标签和Pod的标签,将Pod调度到合适的节点。它包括: 风哥提示:
- 节点亲和性(NodeAffinity):根据节点的标签选择节点
- Pod亲和性(PodAffinity):根据已存在的Pod的标签选择节点
- Pod反亲和性(PodAntiAffinity):根据已存在的Pod的标签避免选择节点
- 硬亲和性(requiredDuringSchedulingIgnoredDuringExecution):必须满足的条件
- 软亲和性(preferredDuringSchedulingIgnoredDuringExecution):尽量满足的条件
1.3 调度策略与规则
调度策略与规则是指定义Pod如何被调度到节点的规则。它包括:
- 调度器:负责将Pod调度到合适的节点
- 调度算法:决定Pod被调度到哪个节点的算法
- 调度策略:影响调度决策的策略
- 调度规则:具体的调度规则
Part02-生产环境规划与建议
2.1 调度策略规划
在实施节点污点、亲和性调度配置时,调度策略规划是非常重要的:
- 业务需求分析:根据业务需求,确定调度策略
- 节点角色划分:根据节点的硬件配置和用途,划分节点角色
- 污点策略制定:根据节点角色,制定污点策略
- 亲和性策略制定:根据业务需求,制定亲和性策略
2.2 节点标签规划
节点标签规划对于节点污点、亲和性调度配置也非常重要:
- 标签命名规范:制定统一的标签命名规范
- 标签分类:根据节点的属性,分类设置标签
- 标签管理:定期检查和更新节点标签
- 标签使用:合理使用标签,避免标签过多
2.3 资源规划
资源规划是节点污点、亲和性调度配置的重要组成部分:
- 资源需求分析:分析Pod的资源需求
- 节点资源分配:根据Pod的资源需求,分配节点资源
- 资源预留:为系统组件预留足够的资源
- 资源监控:监控节点的资源使用情况
Part03-生产环境项目实施方案
3.1 节点污点配置
节点污点的配置步骤:
- 添加节点污点:使用kubectl命令添加节点污点
- 查看节点污点:使用kubectl命令查看节点污点
- 删除节点污点:使用kubectl命令删除节点污点
- 验证节点污点:验证节点污点是否生效
3.2 亲和性调度配置
亲和性调度的配置步骤:
- 配置节点亲和性:在Pod配置中添加节点亲和性规则
- 配置Pod亲和性:在Pod配置中添加Pod亲和性规则
- 配置Pod反亲和性:在Pod配置中添加Pod反亲和性规则
- 验证亲和性调度:验证亲和性调度是否生效
3.3 调度策略验证
调度策略验证的步骤: 学习交流加群风哥微信: itpux-com
- 创建测试Pod:创建带有亲和性规则的测试Pod
- 查看Pod调度:查看Pod被调度到哪个节点
- 验证调度结果:验证调度结果是否符合预期
- 调整调度策略:根据验证结果,调整调度策略
Part04-生产案例与实战讲解
4.1 节点污点实战案例
下面我们来实战演示节点污点:
# 查看节点列表
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 10m v1.26.0
master2 Ready control-plane 8m v1.26.0
master3 Ready control-plane 6m v1.26.0
worker1 Ready 4m v1.26.0
worker2 Ready 3m v1.26.0
worker3 Ready 2m v1.26.0
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 10m v1.26.0
master2 Ready control-plane 8m v1.26.0
master3 Ready control-plane 6m v1.26.0
worker1 Ready
worker2 Ready
worker3 Ready
# 为worker1节点添加污点
kubectl taint nodes worker1 node-role.kubernetes.io/worker=:NoSchedule
node/worker1 tainted
kubectl taint nodes worker1 node-role.kubernetes.io/worker=:NoSchedule
node/worker1 tainted
# 查看节点污点
kubectl describe node worker1 | grep Taints
Taints: node-role.kubernetes.io/worker=:NoSchedule
kubectl describe node worker1 | grep Taints
Taints: node-role.kubernetes.io/worker=:NoSchedule
# 尝试在worker1节点上创建Pod
cat > test-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: fgedu
spec:
containers:
– name: test-container
image: nginx:1.19.10
resources:
requests:
cpu: “100m”
memory: “100Mi”
limits:
cpu: “200m”
memory: “200Mi”
EOF
kubectl apply -f test-pod.yaml
pod/test-pod created
cat > test-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: fgedu
spec:
containers:
– name: test-container
image: nginx:1.19.10
resources:
requests:
cpu: “100m”
memory: “100Mi”
limits:
cpu: “200m”
memory: “200Mi”
EOF
kubectl apply -f test-pod.yaml
pod/test-pod created
# 查看Pod调度情况
,
kubectl get pods -n fgedu -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 1/1 Running 0 1m 10.244.2.2 worker2
,
kubectl get pods -n fgedu -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 1/1 Running 0 1m 10.244.2.2 worker2
# 创建带有容忍度的Pod
cat > test-pod-toleration.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: test-pod-toleration
namespace: fgedu
spec:
containers:
– name: test-container
image: nginx:1.19.10
resources:
requests:
cpu: “100m”
memory: “100Mi”
limits:
cpu: “200m”
memory: “200Mi”
tolerations:
– key: “node-role.kubernetes.io/worker”
operator: “Exists”
effect: “NoSchedule”
EOF
kubectl apply -f test-pod-toleration.yaml
pod/test-pod-toleration created
cat > test-pod-toleration.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: test-pod-toleration
namespace: fgedu
spec:
containers:
– name: test-container
image: nginx:1.19.10
resources:
requests:
cpu: “100m”
memory: “100Mi”
limits:
cpu: “200m”
memory: “200Mi”
tolerations:
– key: “node-role.kubernetes.io/worker”
operator: “Exists”
effect: “NoSchedule”
EOF
kubectl apply -f test-pod-toleration.yaml
pod/test-pod-toleration created
# 查看Pod调度情况
kubectl get pods -n fgedu -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 1/1 Running 0 2m 10.244.2.2 worker2
test-pod-toleration 1/1 Running 0 1m 10.244.1.2 worker1
kubectl get pods -n fgedu -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 1/1 Running 0 2m 10.244.2.2 worker2
test-pod-toleration 1/1 Running 0 1m 10.244.1.2 worker1
4.2 亲和性调度实战案例
下面我们来实战演示亲和性调度: 学习交流加群风哥QQ113257174 更多视频教程www.fgedu.net.cn
# 为节点添加标签
kubectl label nodes worker1 type=frontend
kubectl label nodes worker2 type=backend
kubectl label nodes worker3 type=database
node/worker1 labeled
node/worker2 labeled
node/worker3 labeled
kubectl label nodes worker1 type=frontend
kubectl label nodes worker2 type=backend
kubectl label nodes worker3 type=database
node/worker1 labeled
node/worker2 labeled
node/worker3 labeled
# 查看节点标签
kubectl get nodes –show-labels
NAME STATUS ROLES AGE VERSION LABELS
master1 Ready control-plane 15m v1.26.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
master2 Ready control-plane 13m v1.26.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master2,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
master3 Ready control-plane 11m v1.26.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master3,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
worker1 Ready 9m v1.26.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker1,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,type=frontend
worker2 Ready 8m v1.26.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker2,kubernetes.io/os=linux,type=backend
worker3 Ready 7m v1.26.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker3,kubernetes.io/os=linux,type=database
kubectl get nodes –show-labels
NAME STATUS ROLES AGE VERSION LABELS
master1 Ready control-plane 15m v1.26.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
master2 Ready control-plane 13m v1.26.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master2,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
master3 Ready control-plane 11m v1.26.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master3,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
worker1 Ready
worker2 Ready
worker3 Ready
# 创建带有节点亲和性的Pod
cat > frontend-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: frontend-pod
namespace: fgedu
spec:
containers:
– name: frontend-container
image: nginx:1.19.10
resources:
requests:
cpu: “100m”
memory: “100Mi”
limits:
cpu: “200m”
memory: “200Mi”
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
– matchExpressions:
– key: type
operator: In
values:
– frontend
tolerations:
– key: “node-role.kubernetes.io/worker”
operator: “Exists”
effect: “NoSchedule”
EOF
kubectl apply -f frontend-pod.yaml
pod/frontend-pod created
cat > frontend-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: frontend-pod
namespace: fgedu
spec:
containers:
– name: frontend-container
image: nginx:1.19.10
resources:
requests:
cpu: “100m”
memory: “100Mi”
limits:
cpu: “200m”
memory: “200Mi”
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
– matchExpressions:
– key: type
operator: In
values:
– frontend
tolerations:
– key: “node-role.kubernetes.io/worker”
operator: “Exists”
effect: “NoSchedule”
EOF
kubectl apply -f frontend-pod.yaml
pod/frontend-pod created
# 查看Pod调度情况
kubectl get pods -n fgedu -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 1/1 Running 0 5m 10.244.2.2 worker2
test-pod-toleration 1/1 Running 0 4m 10.244.1.2 worker1
frontend-pod 1/1 Running 0 1m 10.244.1.3 worker1
kubectl get pods -n fgedu -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 1/1 Running 0 5m 10.244.2.2 worker2
test-pod-toleration 1/1 Running 0 4m 10.244.1.2 worker1
frontend-pod 1/1 Running 0 1m 10.244.1.3 worker1
4.3 反亲和性调度实战案例
下面我们来实战演示反亲和性调度: 更多学习教程公众号风哥教程itpux_com
# 创建带有Pod反亲和性的Pod
cat > backend-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: backend-pod-1
namespace: fgedu
labels:
app: backend
spec:
containers:
– name: backend-container
image: nginx:1.19.10,
resources:
requests:
cpu: “100m”
memory: “100Mi”
limits:
cpu: “200m”
memory: “200Mi”
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
– matchExpressions:
– key: type
operator: In
values:
– backend
EOF
kubectl apply -f backend-pod.yaml
pod/backend-pod-1 created
cat > backend-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: backend-pod-1
namespace: fgedu
labels:
app: backend
spec:
containers:
– name: backend-container
image: nginx:1.19.10,
resources:
requests:
cpu: “100m”
memory: “100Mi”
limits:
cpu: “200m”
memory: “200Mi”
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
– matchExpressions:
– key: type
operator: In
values:
– backend
EOF
kubectl apply -f backend-pod.yaml
pod/backend-pod-1 created
# 创建第二个带有Pod反亲和性的Pod
cat > backend-pod-2.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: backend-pod-2
namespace: fgedu
labels:
app: backend
spec:
containers:
– name: backend-container
image: nginx:1.19.10
resources:
requests:
cpu: “100m”
memory: “100Mi”
limits:
cpu: “200m”
memory: “200Mi”
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
– matchExpressions:
– key: type
operator: In
values:
– backend
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
– labelSelector:
matchExpressions:
– key: app
operator: In
values:
– backend
topologyKey: “kubernetes.io/hostname”
EOF
kubectl apply -f backend-pod-2.yaml
pod/backend-pod-2 created
cat > backend-pod-2.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: backend-pod-2
namespace: fgedu
labels:
app: backend
spec:
containers:
– name: backend-container
image: nginx:1.19.10
resources:
requests:
cpu: “100m”
memory: “100Mi”
limits:
cpu: “200m”
memory: “200Mi”
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
– matchExpressions:
– key: type
operator: In
values:
– backend
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
– labelSelector:
matchExpressions:
– key: app
operator: In
values:
– backend
topologyKey: “kubernetes.io/hostname”
EOF
kubectl apply -f backend-pod-2.yaml
pod/backend-pod-2 created
# 查看Pod调度情况
kubectl get pods -n fgedu -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 1/1 Running 0 8m 10.244.2.2 worker2
test-pod-toleration 1/1 Running 0 7m 10.244.1.2 worker1
frontend-pod 1/1 Running 0 4m 10.244.1.3 worker1
backend-pod-1 1/1 Running 0 2m 10.244.2.3 worker2
backend-pod-2 1/1 Running 0 1m 10.244.3.2 worker3
kubectl get pods -n fgedu -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 1/1 Running 0 8m 10.244.2.2 worker2
test-pod-toleration 1/1 Running 0 7m 10.244.1.2 worker1
frontend-pod 1/1 Running 0 4m 10.244.1.3 worker1
backend-pod-1 1/1 Running 0 2m 10.244.2.3 worker2
backend-pod-2 1/1 Running 0 1m 10.244.3.2 worker3
Part05-风哥经验总结与分享
5.1 常见问题与解决方案
在实施节点污点、亲和性调度配置时,常见的问题及解决方案: from K8S+DB视频:www.itpux.com
- Pod调度失败:检查节点污点和亲和性规则是否冲突,调整规则
- 调度不均衡:调整亲和性规则,确保Pod均匀分布
- 资源浪费:优化节点标签和亲和性规则,提高资源利用率
- 规则复杂:简化规则,避免过于复杂的调度规则
5.2 最佳实践建议
节点污点、亲和性调度配置的最佳实践:
- 合理使用节点污点:根据节点的用途和硬件配置,合理设置节点污点
- 优化亲和性规则:根据业务需求,优化亲和性规则
- 使用标签管理:使用标签管理节点,便于调度
- 定期检查调度效果:定期检查Pod的调度情况,调整调度策略
- 监控资源使用:监控节点的资源使用情况,避免资源浪费
5.3 性能优化技巧
节点污点、亲和性调度配置的性能优化技巧:
- 简化调度规则:避免过于复杂的调度规则,提高调度速度
- 合理设置节点标签:使用简洁明了的节点标签,便于管理
- 优化资源配置:根据Pod的资源需求,合理配置节点资源
- 使用Pod反亲和性:使用Pod反亲和性,提高应用的可用性
- 定期清理节点污点:定期清理不再需要的节点污点,避免影响调度
在实施节点污点、亲和性调度配置时,一定要合理规划调度策略,优化节点标签,并定期检查调度效果,确保Pod被调度到合适的节点。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
