【发布时间】:2021-03-06 21:40:08
【问题描述】:
我正在尝试传播我的 ingress-nginx-controller 豆荚:
- 每个可用区都有相同的 pod 数 (+- 1)。
- Pod 更喜欢当前运行最少 Pod 的节点。
根据此处的其他问题,我在我的 pod 部署中设置了 Pod 拓扑传播约束:
replicas: 4
topologySpreadConstraints:
- labelSelector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
- labelSelector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
我目前有 2 个节点,每个节点位于不同的可用区:
$ kubectl get nodes --label-columns=topology.kubernetes.io/zone,kubernetes.io/hostname
NAME STATUS ROLES AGE VERSION ZONE HOSTNAME
ip-{{node1}}.compute.internal Ready node 136m v1.20.2 us-west-2a ip-{{node1}}.compute.internal
ip-{{node2}}.compute.internal Ready node 20h v1.20.2 us-west-2b ip-{{node2}}.compute.internal
在为该部署运行 kubectl rollout restart 后,我在一个节点中获得 3 个 pod,在另一个节点中获得 1 个 pod,其偏差为 2 > 1:
$ kubectl describe pod ingress-nginx-controller -n ingress-nginx | grep 'Node:'
Node: ip-{{node1}}.compute.internal/{{node1}}
Node: ip-{{node2}}.compute.internal/{{node2}}
Node: ip-{{node1}}.compute.internal/{{node1}}
Node: ip-{{node1}}.compute.internal/{{node1}}
为什么我的约束没有得到遵守?如何调试 pod 调度程序?
我的 kubectl 版本:
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"21+", GitVersion:"v1.21.0-beta.0.607+269d62d895c297", GitCommit:"269d62d895c29743931bfaaec6e8d37ced43c35f", GitTreeState:"clean", BuildDate:"2021-03-05T22:28:02Z", GoVersion:"go1.16", Compiler:"gc", Platform:"darwin/arm64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-13T13:20:00Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
【问题讨论】:
-
我目前的理论是 Pod 传播拓扑也考虑了之前推出的 pod。在所有新的 Pod 运行后,k8s 会终止一些之前的 rollout Pod,这可能会导致不平衡。
-
你能提供你的 pod yaml 吗?如果部署 yaml 甚至更好
-
@SahadatHossain 在这里,这是一个亚马逊 nginx-ingress 清单,编辑很少:gist.github.com/roim/64de522ec887409ad5c6cf4ac0343de0 我确实发现其他人描述了同样的问题:github.com/kubernetes/kubernetes/issues/98215 我能够通过扩展我的部署来获得正确的拓扑到 1 个副本,然后再到 4 个。如果推出后的不良拓扑确实是根本原因,我可能会考虑 Kubernetes 解调度器作为一种缓解措施。
-
@roim 你能告诉你你的集群是如何创建的吗?它是自我管理的解决方案还是提供商管理的解决方案(
amazon nginx-ingress是否有机会告诉这是EKS)?另外,作为一种解决方法,您是否考虑过使用Daemonset?不同之处在于,不是区域中的Pod,而是每个Node上的Pod。 -
@DawidKruk 集群是自托管的,使用 kOps 创建,我安装了 nginx-ingress 及其 AWS 官方清单 (kubernetes.github.io/ingress-nginx/deploy)。我会看看一个 Daemonset,这听起来很有希望
标签: kubernetes