行至水穷处 坐看“云”起时

☁️时代应用交付

pod使用hostnetwork导致pod无法访问系统的169.169.0.1的kubernetes service

k8s ver:1.6.7, 无CNI

使用hostnetwork来部署一个pod

上述配置文件使用指定hostNetwork: true。发现,pod会用linux系统自身的路由表查找到目的地169.169.0.1:443, linux系统本身没有到169.169.0.1的路由,只能走缺省路由,导致无法连接到kubernetes service,最终导致pod失败。

当pod是非host模式时候,pod发起到kubernetes service 的访问(dst ip/port 169.169.0.1:443)会经过iptables最终做DNAT转到API server的IP:6443上。

所以如果一个pod需要去访问k8s内置的kubernetes service(169.169.0.1)的时候,可能这个pod不能使用hostnetwork模式,否则会出现类似如下情况: (系统使用host linux内置缺省路由去访问169.169.0.1)

当遇到上述情形时候,可以考虑强行指定nginx controller使用不安全的api接口访问方式:

Using the flag --apiserver-host: Using this flag --apiserver-host=http://localhost:8080 it is possible to specify an unsecure api server or reach a remote kubernetes cluster using kubectl proxy. Please do not use this approach in production.

https://github.com/kubernetes/ingress/blob/master/docs/troubleshooting.md

 

如果使用了CNI的话,可能遇到指定hostnetwork后,pod并没有在host上监听相关端口,这是由于bug

https://github.com/kubernetes/kubernetes/issues/31307

V1.7才修复

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注