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