書籍來源:cloudman《每天5分鐘玩轉Kubernetes》
一邊學習一邊整理老師的課程內容及試驗筆記,并與大家分享,侵權即刪,謝謝支持!
Kubernetes采用的是基于扁平地址空間的網絡模型,集群中的每個Pod都有自己的IP地址,Pod之間不需要配置NAT就能直接通信。另外,同一個Pod中的容器共享Pod的IP,能夠通過localhost通信。
這種網絡模型對應用開發(fā)者和管理員相當友好,應用可以非常方便地從傳統(tǒng)網絡遷移到Kubernetes。每個Pod可被看作是一個個獨立的系統(tǒng),而Pod中的容器則可被看作同一系統(tǒng)中的不同進程。
下面討論在這個網絡模型下集群中的各種實體如何通信。知識點前面都已經涉及,這里可當作復習和總結。
當Pod被調度到某個節(jié)點,Pod中的所有容器都在這個節(jié)點上運行,這些容器共享相同的本地文件系統(tǒng)、IPC和網絡命名空間。
不同Pod之間不存在端口沖突的問題,因為每個Pod都有自己的IP地址。當某個容器使用localhost時,意味著使用的是容器所屬Pod的地址空間。
比如Pod A有兩個容器container-A1和container-A2,container-A1在端口1234上監(jiān)聽,當container-A2連接到localhost:1234時,實際上就是在訪問container-A1。這不會與同一個節(jié)點上的Pod B沖突,即使Pod B中的容器container-B1也在監(jiān)聽1234端口。
Pod的IP是集群可見的,即集群中的任何其他Pod和節(jié)點都可以通過IP直接與Pod通信,這種通信不需要借助任何網絡地址轉換、隧道或代理技術。Pod內部和外部使用的是同一個IP,這也意味著標準的 命名服務和發(fā)現(xiàn)機制,比如DNS可以直接使用。
Pod間可以直接通過IP地址通信,但前提是Pod知道對方的IP。在Kubernetes集群中,Pod可能會頻繁地銷毀和創(chuàng)建,也就是說Pod的IP不是固定的。為了解決這個問題,Service提供了訪問Pod的抽象層。無論后端的Pod如何變化,Service都作為穩(wěn)定的前端對外提供服務。同時,Service還提供了高可用和負載均衡功能,Service負責將請求轉發(fā)給正確的Pod。
無論是Pod的IP還是Service的Cluster IP,它們只能在Kubernetes集群中可見,對集群之外的世界,這些IP都是私有的。
Kubernetes提供了兩種方式讓外界能夠與Pod通信:
- NodePort。Service通過Cluster節(jié)點的靜態(tài)端口對外提供服務。 外部可以通過:訪問Service。
- LoadBalancer。Service利用cloud provider提供的load balancer對外提供服務,cloud provider負責將load balancer的流量導向Service。目前支持的cloud provider有GCP、AWS、 Azure等。