【k8s】K8S中的IP地址(Node IP、Pod IP、Cluster IP、External IP、Internal-IP)
文章目錄
- 1. 概述
- 1.1 service種類
 
- 2. Node IP
- 3. Pod IP
- 4. Service Cluster IP
- 4.1 Cluster IP原理
 
- 5. External IP
- 參考
關聯文章:
 《k8s 核心概念 2 service》service 概述
 第五章 服務service 一 ( dns、ENDPOINTS) service 作用
 第五章 服務service 二
【k8s】Service種類、類型(ClusterIP、NodePort、LoadBalancer、ExternalName) service的幾種類型
 K8S中的IP地址(Node IP、Pod IP、Cluster IP、External IP) 和service有關聯的一些ip概念
1. 概述
通過《k8s 核心概念 2 service》我們知道service 的作用是提供另一種方式去訪問pod,與直接訪問pod相比,此時,service 可以避免pod發生變化后ip變化的問題。
此外,service存在不同的類型,例如Cluster IP類型僅能在集群內部訪問,而External IP類型可以在服務外訪問。不同的類型,會產生不同的ip字段,在不同場景下會有不同的字段出現。
kubernetes里有三張不同的網絡,每種IP地址,就代表一個不同的尋址空間:
- Node IP:Node節點的IP地址
- Pod IP:Pod的IP地址
- Cluster IP:內部或集群內訪問Service的IP地址
- External IP是 為了解決如何從外部訪問 service 服務的問題。
Node IP包含內部IP和外部IP2個概念,內部IP讓集群節點互相訪問,外部IP提供了外部訪問功能。
Pod IP提供訪問pod功能,但僅限于集群內訪問,不能從外部訪問。但是存在缺點,pod如果掛掉再重啟,IP會變。
Cluster IP是service Cluster IP,是服務中的一種,該類型的服務僅能從內部訪問,間接訪問pod。該服務提供了通過標簽管理一組pod,即使Pod IP變化,重啟后,他的標簽不會變,仍受其管理,因此,解決了之前提到的Pod IP會變的問題。并且由于這一組pod通常是完成相同功能的,例如都是通過8080端口提供天氣查詢服務,因此servie可以采用隨機或其他負載均衡策略,轉發至相應的pod。
External IP是 為了解決如何從外部訪問 service 服務的問題。
1.1 service種類
【k8s】Service種類、類型(ClusterIP、NodePort、LoadBalancer、ExternalName) service的幾種類型
2. Node IP
Node IP分內部和外部,內部IP僅限集群內訪問,外部IP可以從外部訪問。
首先,Node IP是kubernetes集群中每個節點的物理網卡的IP地址(包括虛擬機的網卡),這是一個真實存在的物理網絡,所有屬于這個網絡的服務器之間都能通過這個網絡進行通信,不管他們中是否有部分節點不屬于這個kebernetes集群。這也表明了Kubenetes集群之外的節點訪問Kubernetes之內的某個節點或者TCP/IP服務時,必須要通過Node IP進行通信。
內部的node IP是指k8s 管理集群內的節點,自然需要給每個節點分配IP。此時是最最原始的狀態。這個ip有什么用?很有用,例如像查看某個pod運行在哪個節點上,例如圖3;有時候需要指定pod安裝至指定的node上,此時,就需要指定node IP。
外部的Node IP通常是指每個節點在局域網內或公開的IP,可以讓不在集群內的主機或客戶端可以訪問的IP。
 
 可以把外部Node IP理解成護照,國際通用,而內部Node IP理解成身份證,僅限國內使用
nodeIP一般不會單獨使用,例如你要訪問Node1的pod1,因為Node1還存在Pod2等很多其他Pod,無法僅通過ip,還得借助其他參數,例如一個端口來映射某個pod,例如在NodePort類型的Service,每個Service都會在Node節點上開通一個端口,外部可以通過NodeIP:NodePort即可訪問Service里的Pod,和我們訪問服務器部署的項目一樣,IP:端口/項目名
在kubernetes查詢內部Node IP:
 1.kubectl get nodes
 2.kubectl describe node nodeName
顯示出來的Internal-IP字段就是NodeIP
 
 或者直接查詢 kubectl get nodes -o wide:
 
3. Pod IP
其次,Pod IP是每個Pod的IP地址,它是Docker Engine根據docker0網橋的IP地址段進行分配的,通常是一個虛擬的二層網絡,前面我們說過,Kubernetes要求位于不同Node上的Pod能夠彼此直接通信,所以Kuberntes里一個Pod里的容器訪問另外一個Pod里的容器,就是通過Pod IP所在的虛擬二層網絡進行通信的,而真實的TCP/IP流量則是通過Node IP所在的物理網卡流出的。
在kubernetes查詢Pod IP:
 1.kubectl get pods
 2.kubectl describe pod podName
該方法的截圖省略。
或者直接查詢 kubectl get pod -o wide:
 
其中IP字段指pod的IP,node字段指運行在哪個節點上,也就是Node IP(這里對應node IP的內部IP概念,對應前面提到的Internal-IP字段)
4. Service Cluster IP
Service是Kubernetes最核心的概念,通過創建Service,可以為一組具有相同功能的容器用用提供一個統一的入口地址,并且將請求進行負載分發到后端的各個容器應用上。
最后,我們說說Service的Cluster IP,翻譯過來是集群IP,它也是一個虛擬的IP,但更像一個“偽造”的IP網絡,原因有一下幾點:
- Cluster IP僅僅作用于kubernetes Service這個對象,并由Kubernetes管理和分配IP地址(來源于Cluster IP地址池)
- Cluster IP無法被ping **注意,很重要**,因為沒有一個“實體網絡對象”來響應
- Cluster IP只能結合Service Port組成一個具體的通信端口,單獨的Cluster IP不具備TCP/IP通信的基礎,并且它們屬于Kubernetes集群這樣一個封閉的空間,集群之外的節點如果要訪問這個通信端口,則需要做一些額外的工作。
- 在Kubernetes集群之內,Node IP網,Pod IP網與Cluster IP網之間的通信,采用的是Kubernetes自己設計的一種編程方式的特殊的路由規則,與我們所熟知的IP路由有很大的不同。
根據上面的分析和總結,我們基本明白了:Service的Cluster IP屬于Kubernetes集群內部的地址,無法在集群外部直接使用這個地址。那么矛盾來了:實際上我們開發的業務系統中肯定多少有一部分要提供給Kubernetes集群外部的應用或者用戶來使用的,NodePort是解決上述問題最直接、最有效、最常用的做法,這個主題以后再說。
4.1 Cluster IP原理
Cluster IP是由kube-proxy使用Iptables規則重新定向到其本地端口,再均衡到后端Pod的。這個地址從我們啟動API的service-cluster-ip-range參數(舊版本為portal_net參數)指定的地址池中分配,比如–service-cluster-ip-range=10.0.0.0/16。假設這個Service的端口是1234。集群內的所有kube-proxy都會注意到這個Service。當proxy發現一個新的service后,它會在本地節點打開一個任意端口,建相應的iptables規則,重定向服務的IP和port到這個新建的端口,開始接受到達這個服務的連接。
當一個客戶端訪問這個service時,這些iptable規則就開始起作用,客戶端的流量被重定向到kube-proxy為這個service打開的端口上,kube-proxy隨機選擇一個后端pod來服務客戶。這個流程如下圖所示:
 
5. External IP
External IP是 為了解決如何從外部訪問 service 服務的問題。
外部訪問Service的方式有兩種:
1)通過設置nodePort映射到物理機,同時設置Service的類型為NodePort。
2)通過設置LoadBalancer映射到云服務上提供的LoadBalancer地址。這種用法僅用于公有云服務提供商的云平臺設置Service的場景。對該Service的請求將會通過LoadBalancer轉發到后端Pod上,負載分發的實現方式則依賴于云服務商提供的LoadBalancer的實現機制。
以NodePort類型的服務:為例:
 
 看看EXTERNAL -IP列。它顯示nodes, 表明服務可通過任何集群節點的IP地址訪問。PORT (S)列顯示集群IP (8 0) 的內部端口和節點端口(30123), 可以通過以下地址訪問該服務:
 ? 10.11.254.223:80
 ? <節點1 node’sIP>:30123
 ? <節點2 node’sIP>:30123, 等等
loadbalancer類型的服務:
 
 負載均衡器的對外 IP地址為130.211.53.173, 因此現在可以通過該IP 地址訪問該服務:
 
參考
K8S中的IP地址
 k8s之PodIP、ClusterIP和ExternalIP
總結
以上是生活随笔為你收集整理的【k8s】K8S中的IP地址(Node IP、Pod IP、Cluster IP、External IP、Internal-IP)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 原生及jq方式使用ajax
- 下一篇: android activity调用Ad
