xiaohanliang
Docker
Docker
  • hi
  • STORAGE DRIVER
    • 1. 什么叫联合挂载
    • 2. 镜像ID是从哪来的
    • 3. 如何组装出一个镜像
    • 4. 为什么有这么多fs@aufs
    • 5. 为什么有这么多fs@overlay
    • 6. 为什么有这么多fs@dm
    • 7. 正确安装devicemapper
  • EXEC DRIVER
    • 1. 资源限制-cgroup
    • 2. 制造小型监狱
    • 3. 切换根目录是什么概念
    • 4. 标准极简容器runC
    • 5. 尝试安装runc工具
  • KUBERNETES NETWORK
    • 0. [WIP]我想串联容器网络的故事
    • 1. 容器网络是什么样的网络
    • 2. cnm认为应该怎样让容器组网
    • 3. 为什么会有一大堆cni插件
    • 4. 为什么要设计出pod
    • 5. 怎样形成一个服务
    • 6. Service就是iptables规则
    • 7. IPVS也能实现Service
    • 8. 从集群外访问服务-nodeport
    • 9. 从集群外访问服务-ingress
    • 10. 想要把域名变成IP
    • 11. DNS是怎么实现的
    • 12. 最常见的方案@flannel
    • 13. 使用tun设备封包@flannel
    • 14. 使用vxlan设备封包@flannel
    • 15. 可不可以不封包@flannel
Powered by GitBook
On this page

Was this helpful?

  1. KUBERNETES NETWORK

8. 从集群外访问服务-nodeport

Previous7. IPVS也能实现ServiceNext9. 从集群外访问服务-ingress

Last updated 4 years ago

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掉)