Pra*_*ash 10 scheduler kubernetes kubernetes-pod
我有一个kubernetes集群,有4个节点和一个主节点.我试图在所有节点中运行5 nginx pod.目前,调度程序有时在一台机器上运行所有pod,有时在不同的机器上运行.
如果我的节点发生故障并且我的所有pod都在同一节点中运行会发生什么?我们需要避免这种情况.
如何强制调度程序以循环方式在节点上运行pod,这样如果任何节点出现故障,那么至少在一个节点上应该有NGINX pod处于运行模式.
这可能吗?如果可能,我们如何实现这种情况?
Bum*_*Kim 17
截至 2021 年(v1.19 及更高版本),您可以默认使用Pod 拓扑扩展约束 ,我发现它比这种情况更适合。topologySpreadConstraintspodAntiAfinity
主要区别在于,反亲和性只能限制每个节点有一个 pod,而 Pod 拓扑扩展约束可以限制每个节点有 N 个 pod。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-example-deployment
spec:
replicas: 6
selector:
matchLabels:
app: nginx-example
template:
metadata:
labels:
app: nginx-example
spec:
containers:
- name: nginx
image: nginx:latest
# This sets how evenly spread the pods
# For example, if there are 3 nodes available,
# 2 pods are scheduled for each node.
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: nginx-example
Run Code Online (Sandbox Code Playgroud)
带有requiredDuringSchedulingIgnoredDuringExecution的podAntiAfinity 可用于防止将同一pod调度到相同的主机名。如果喜欢更宽松的约束,请使用preferredDuringSchedulingIgnoredDuringExecution。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 5
template:
metadata:
labels:
app: nginx
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution: <---- hard requirement not to schedule "nginx" pod if already one scheduled.
- topologyKey: kubernetes.io/hostname <---- Anti affinity scope is host
labelSelector:
matchLabels:
app: nginx
container:
image: nginx:latest
Run Code Online (Sandbox Code Playgroud)
您可以在kubelet配置中指定节点的最大Pod数量,这样在节点关闭的情况下,将防止K8S饱和来自发生故障的节点的Pod的另一个节点。
小智 5
我认为跨Pod的反关联功能会为您提供帮助。容器间抗关联性使您可以基于节点上已经运行的容器上的标签来限制容器有资格在其上调度的节点。这是一个例子。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
run: nginx-service
name: nginx-service
spec:
replicas: 3
selector:
matchLabels:
run: nginx-service
template:
metadata:
labels:
service-type: nginx
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: service-type
operator: In
values:
- nginx
topologyKey: kubernetes.io/hostname
containers:
- name: nginx-service
image: nginx:latest
Run Code Online (Sandbox Code Playgroud)
注意:我在这里使用preferredDuringSchedulingIgnoredDuringExecution,因为您的Pod比节点多。
有关更多详细信息,您可以参考以下链接的Pod间亲和力和反亲和力(测试版功能)部分:https : //kubernetes.io/docs/concepts/configuration/assign-pod-node/
小智 0
如果您的容器指定了所需的内存和 CPU 量的资源请求,那么调度程序应该分散您的 Pod。请参阅 http://kubernetes.io/docs/user-guide/compute-resources/
| 归档时间: |
|
| 查看次数: |
4566 次 |
| 最近记录: |