我有一个kubernetes集群,有4个节点和一个主节点。我试图在所有节点中运行5 nginx pod。目前,调度程序有时会在一台计算机上运行所有pod,有时在不同的计算机上运行。
如果我的节点发生故障并且我的所有pod都在同一个节点上运行会怎样?我们需要避免这种情况。
如何强制调度程序以循环方式在节点上运行pod,这样如果任何节点出现故障,那么至少有一个节点应该有NGINX pod处于运行模式。
这可能与否?如果可能,我们如何实现这种情况?
答案 0 :(得分:4)
我认为pod-pod反亲和功能会对你有所帮助。 Intra-pod反关联允许您根据节点上已运行的pod上的标签来约束您的pod可以调度的节点。这是一个例子。
Host: SomeName.000webhostapp.com
注意:我在这里使用 preferredDuringSchedulingIgnoredDuringExecution ,因为您有比节点更多的广告连播。
有关更多详细信息,请参阅以下链接中的 插播广告联盟关联和反关联(测试版功能) 部分: "Using data attributes"
答案 1 :(得分:4)
参考:Kubernetes in Action Chapter 16. Advanced scheduling
带有 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
您可以在kubelet配置中指定节点的最大pod数,以便在节点关闭的情况下,它将阻止K8S使来自故障节点的pod的其他节点饱和。
答案 2 :(得分:2)
如果容器指定了所需内存和CPU数量的资源请求,则调度程序应该展开您的pod。看到 http://kubernetes.io/docs/user-guide/compute-resources/
答案 3 :(得分:2)
从 2021 年开始,(v1.19 及更高版本)您可以默认使用 Pod Topology Spread Constraints topologySpreadConstraints
,我发现它比 podAntiAfinity
更适合这种情况。
主要区别在于 Anti-affinity 只能限制每个节点一个 pod,而 Pod Topology Spread Constraints 可以限制每个节点 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
有关详细信息,请参阅 KEP-895 和 an official blog post.
答案 4 :(得分:0)
我们可以使用 Taint 或 toleration 来避免将 Pod 部署到节点中或不部署到节点中。
Tolerations are applied to pods, and allow (but do not require) the pods to schedule onto nodes with matching taints.
Taints and tolerations work together to ensure that pods are not scheduled onto inappropriate nodes. One or more taints are applied to a node; this marks that the node should not accept any pods that do not tolerate the taints.
示例部署 yaml 将类似于
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:
containers:
- name: nginx-service
image: nginx:latest
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"