我一直有一个非常令人沮丧的问题,即Kubernetes服务在部署几个小时后随机停止在其群集IP上可用。他们几乎似乎正在衰老。
我的广告正在使用hostNetwork: true
和dnsPolicy: ClusterFirstWithHostNet
。这是事情变得有趣的地方 - 我在受影响的集群上有两个命名空间(登台和生产)。在另一个只有一个命名空间的相同集群上,这个问题似乎还没有出现!
在尝试查看kube-proxy
日志时,我看到了以下内容:
admin@gke ~ $ tail /var/log/kube-proxy.log
E0115 12:13:01.669222 5 proxier.go:1372] can't open "nodePort for staging/foo:foo-sip-1" (:31765/tcp), skipping this nodePort: listen tcp :31765: bind: address already
in use
E0115 12:13:01.671353 5 proxier.go:1372] can't open "nodePort for staging/foo:http-api" (:30932/tcp), skipping this nodePort: listen tcp :30932: bind: address already in use
E0115 12:13:01.671548 5 proxier.go:1372] can't open "nodePort for staging/our-lb:our-lb-http" (:32477/tcp), skipping this nodePort: listen tcp :32477: bind: address alrea
dy in use
E0115 12:13:01.671641 5 proxier.go:1372] can't open "nodePort for staging/foo:foo-sip-0" (:30130/tcp), skipping this nodePort: listen tcp :30130: bind: address already
in use
E0115 12:13:01.671710 5 proxier.go:1372] can't open "nodePort for default/foo:foo-sip-0" (:30132/tcp), skipping this nodePort: listen tcp :30132: bind: address already
in use
E0115 12:13:02.510177 5 proxier.go:1372] can't open "nodePort for default/our-lb:our-lb-http" (:31613/tcp), skipping this nodePort: listen tcp :31613: bind: address alrea
dy in use
E0115 12:13:06.577412 5 server.go:661] starting metrics server failed: listen tcp 127.0.0.1:10249: bind: address already in use
E0115 12:13:11.578446 5 server.go:661] starting metrics server failed: listen tcp 127.0.0.1:10249: bind: address already in use
E0115 12:13:16.580441 5 server.go:661] starting metrics server failed: listen tcp 127.0.0.1:10249: bind: address already in use
E0115 12:13:21.583691 5 server.go:661] starting metrics server failed: listen tcp 127.0.0.1:10249: bind: address already in use
我现在已从受影响的群集中删除了一个命名空间,其余的一个似乎已自行修复;但我很好奇为什么Kubernetes在资源创建时没有警告我,如果它不竞争资源,那么为什么它稍后会以导致这种情况的方式重新分配它们问题?这可能不是DNS缓存问题,因为getent hosts
向我显示了服务的正确群集IP - IP无法访问!在我看来,它似乎是Kubernetes网络设置中的错误。
我应该创建一个问题,还是有一些明显我做错了?
答案 0 :(得分:1)
听起来你有hostNetwork: true
的pod并使用type: NodePort
的服务,并设置修复节点端口号与你的pod将使用的相同。
通常,除非您有非常引人注目的用例,否则应避免使用hostNetwork: true
。它主要用于需要访问主机网络的遗留应用程序或守护程序。
如果您确实需要将服务与主机网络上的pod一起使用,则应使用type: ClusterIP
的服务。