8. 从集群外访问服务-nodeport
Last updated
Was this helpful?
Last updated
Was this helpful?
Service是一个 iptable 规则 :
访问xxxIP:xxx端口的包, 包头IP改成PodIP
为什么集群内可以访问这个Service? 这个包被flanneld以宿主机的名义收下, 剥去外层IP报头后丢给flannel1, 然后flannel1开始走iptables流程(就像eth0走流程一样), 在 PREROUTING 链里将内层IP改成podIP, 接着就到了路由层面, 转发给cni0网桥, 最终被Pod收到.
但为什么集群外访问不到? 你的宿主机是通网的, 我也能把包发到你的宿主机上啊, 你也给我走流程, 把包转发给pod呗? 想访问Service下Pod的唯一方法是通过iptable的规则, 而这个规则明确要求你的IP报头必须得写Service的IP, 但如果你IP报头上真写了Service的IP, 这个包宿主机压根不会收的, 宿主机心想这特么谁啊, 所以唯一的办法是通过flannel1开始走流程, 这也造成了想要访问Service必须通过flannel1走流程, 而想通过flannel1你就必须得在集群里这样一个现象.
但如果都不给提供服务, 我搭你这集群闲蛋疼? 怎样让集群外也能访问Service呢? 上面我们定义了一个Service, 大概意思是说: 这个Service我要在宿主机上开两个端口, 一个8080, 一个443, 任何访问这两个端口的请求都是在访问我Service, 请务必让这个请求转发到Pod上来, 那么这种要求是怎么做到的呢? 还是iptable规则:
这种Service生成的iptables规则没有了目的地IP的限制, 也就是说不管你是去哪儿的, 只要你到访我8080端口, 全都进入下一链, 将你目的地IP, 改成容器IP. (你可以是ServiceIP:8080, 或者是HostIP:8080, 全都命中这条规则, 全都能把目的地DNAT掉)