Kubernetes 集群外部的 HTTP/HTTPS 請求是如何達到 Pod 中的 container 的?
如上圖所示,全過程大致為:
(1) 用戶從 web/mobile/pc 等客戶端發出 HTTP/HTTPS 請求。
(2) 由于應用服務通常是通過域名的形式對外暴露,所以請求將會先進行 DNS 域名解析,得到對應的公網 IP 地址。
(3) 公網 IP 地址通常會綁定一個 Load Balancer 負載均衡器,此時請求會進入此負載均衡器。
(4) Load Balancer 再將請求轉發到 kubernetes 集群的某個流量入口點,通常是 ingress。
(5) ingress 根據用戶自定義的路由規則進一步轉發到 service。
(6) service 根據 selector(匹配 label 標簽)將請求轉發到 pod。
(7) pod 最后將請求發送給其中的 container 容器。
同一個 pod 內部可能有多個 container,但是多個容器不能共用同一個端口,因此這里會根據具體的端口號將請求發給對應的 container。
以上就是一種典型的集群外部 HTTP 請求如何達到 Pod 中的 container 的全過程。
需要注意的是,由于網絡配置靈活多變,以上請求流轉過程并不是唯一的方式,例如:
如果你使用的是云服務,那么可以通過使用 LoadBalancer 類型的 service 直接綁定一個云服務商提供的負載均衡器,然后再接 ingress 或者其它 service。
你也可以通過 NodePort 類型的 service 直接使用節點上的端口,通過這些節點自建負載均衡器。
如果你的服務特別簡單,沒啥內部流量需要管理的,這時不用 ingress 也是可以的。
容器技術的底座有三樣東西:
正是 Linux 內核的 namespace 實現了資源的隔離。因為每個 pod 有各自的 Linux namespace,所以不同的 pod 是資源隔離的。namespace 有多種,包括 PID、IPC、Network、Mount、Time 等等。其中 PID namespace 實現了進程的隔離,因此 pod 內可以有自己的 1 號進程。而 Network namespace 則讓每個 pod 有了自己的網絡。
Pod 有自己的網絡,node 節點也有自己的網絡,那么流量是如何從 node 節點到 pod 的呢?
每個 node 節點上都有:
(1)kubelet:節點的小管家。
(2)kube-proxy:操作節點的 iptables/ipvs 。
(3)plugins:
每個 node 節點有自己的 root namespace,其中也包括網絡相關的 root netns,每個 pod 有自己的 pod netns,從 node 到 pod 則可以通過 veth pairs 的方式連通,流量也正是通過此通道進行的流轉。而構建 veth pairs、設置 pod network namespace、為 pod 分配 IP 地址等等工作則正是 CNI 的任務。
至此,一個典型的 kubernetes 集群外部的 HTTP/HTTPS 請求如何達到 Pod 中的 container 的全過程就是這樣了。
參考資料:
本文鏈接:http://www.www897cc.com/showinfo-26-54961-0.htmlKubernetes 外部 HTTP 請求到達 Pod 容器的全過程
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
下一篇: 我們一起聊聊枚舉規范化