我已经建立了一个具有三个主节点的 kubernetes 集群。 kube-apiserver 应该是无状态的。为了从工作节点正确访问它们,我配置了一个 haproxy,它被配置为提供 apiserver 的端口 (8080)。
frontend http_front_8080
bind *:8080
stats uri /haproxy?stats
default_backend http_back_8080
backend http_back_8080
balance roundrobin
server m01 192.168.33.21:8080 check
server m02 192.168.33.22:8080 check
server m03 192.168.33.23:8080 check
但是当我使用负载均衡器 ip 作为 apiserver 地址运行节点时,我会收到以下错误:
Apr 20 12:35:07 n01 kubelet[3383]: E0420 12:35:07.308337 3383 reflector.go:271] pkg/kubelet/kubelet.go:240: Failed to watch *api.Service: too old resource version: 4001 (4041)
Apr 20 12:36:48 n01 kubelet[3383]: E0420 12:36:48.321021 3383 reflector.go:271] pkg/kubelet/kubelet.go:240: Failed to watch *api.Service: too old resource version: 4011 (4041)
Apr 20 12:37:31 n01 kube-proxy[3408]: E0420 12:37:31.381042 3408 reflector.go:271] pkg/proxy/config/api.go:47: Failed to watch *api.Service: too old resource version: 4011 (4041)
Apr 20 12:41:42 n01 kube-proxy[3408]: E0420 12:41:42.409604 3408 reflector.go:271] pkg/proxy/config/api.go:47: Failed to watch *api.Service: too old resource version: 4011 (4041)
如果我将负载均衡器 IP 更改为主节点之一,它会按预期工作(没有上面的这些错误消息)。
我的 haproxy 配置中是否缺少某些对于运行此配置至关重要的内容?
最佳答案
我也遇到了和你一样的问题。我认为 watch 需要 api 服务器端的某种状态。 解决方案是更改配置,以便来自客户端的所有请求都使用平衡源发送到同一服务器。我假设您只有多个 api 服务器,因此 kubernetes 具有高可用性(而不是负载平衡)。
frontend http_front_8080
bind *:8080
stats uri /haproxy?stats
default_backend http_back_8080
backend http_back_8080
balance source
server m01 192.168.33.21:8080 check
server m02 192.168.33.22:8080 check
server m03 192.168.33.23:8080 check
关于kubernetes - haproxy 作为 kube-apiserver 的负载均衡器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36743805/