k8s之PodIP、ClusterIP和ExternalIP

k8s之PodIP、ClusterIP和ExternalIP

https://www.cnblogs.com/embedded-linux/p/12657128.html

Pod IP

Kubernetes的最小部署單元是Pod。利用Flannel作爲不同HOST之間容器互通技術時,由Flannel和etcd維護了一張節點間的路由表。Flannel的設計目的就是爲集羣中的所有節點重新規劃IP地址的使用規則,從而使得不同節點上的容器能夠獲得“同屬一個內網”且”不重複的”IP地址,並讓屬於不同節點上的容器能夠直接通過內網IP通信。

每個Pod啓動時,會自動創建一個鏡像爲gcr.io/google_containers/pause:0.8.0的容器,容器內部與外部的通信經由此容器代理,該容器的IP也可以稱爲Pod IP。

Service ClusterIP

Service是Kubernetes最核心的概念,通過創建Service,可以爲一組具有相同功能的容器用用提供一個統一的入口地址,並且將請求進行負載分發到後端的各個容器應用上。

Pod IP 地址是實際存在於某個網卡(可以是虛擬設備)上的,但沒有網絡設備爲Service 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來服務客戶。這個流程如下圖所示:

根據Kubernetes的網絡模型,使用Service Cluster IP和Port訪問Service的客戶端可以坐落在任意代理節點上,只能Cluster內部訪問。外部要訪問Service,我們就需要給Service外部訪問IP。

External IP

外部訪問Service的方式有兩種:

1)通過設置nodePort映射到物理機,同時設置Service的類型爲NodePort。

2)通過設置LoadBalancer映射到雲服務上提供的LoadBalancer地址。這種用法僅用於公有云服務提供商的雲平臺設置Service的場景。對該Service的請求將會通過LoadBalancer轉發到後端Pod上,負載分發的實現方式則依賴於雲服務商提供的LoadBalancer的實現機制。

示例:

創建一個基於nginx的deployment

kubectl run nginx --image=nginx:maxline

ExternalIP方式提供外部Service服務(包含Cluster IP和External IP)

kubectl expose deployment nginx --type=LoadBalancer --port=80 --target-port=80

type的類型選擇爲LoadBalancer, --port指定的是80端口,意思是這個service對外界暴露出來的服務端口是80,--target-port=80,這個端口是pod內部的nginx docker容器提供服務的工作端口,默認爲80。

kubectl get svc獲取External IP和端口,通過External:port外部訪問Service。

NodePort方式提供外部Service服務

kubectl expose deployment nginx --type=NodePort --port=80 --target-port=80

kubectl get svc獲取nodePort端口, 隨便使用任意一個node的external IP地址+nodePort端口外部訪問Service。

附:Pod的端口轉發功能

有時我們出於測試的目的,需要一種簡單的辦法查看一個pod是否能正常提供服務。如果每次通過kubectl的方式創建service就太麻煩了。

這裏介紹一種簡單的辦法:pod的端口轉發功能(port forward)。

比如我們想測試下圖get pods返回的第一個pod的功能,名稱爲nginx-6f754dd4b9-74jdn:

 執行命令行 kubectl port-forward pod/nginx-6f754dd4b9-74jdn 8080:80

看到提示信息Forwarding from 127.0.0.1:8080 -> 80, 意思是把當前主機的8080端口映射到nginx pod的80工作端口: 

最後,就能夠通過localhost:8080直接訪問nginx pod提供的服務了。

參考:

1. Kubernetes中的PodIP、ClusterIP和外部IP

2. 一個簡單的例子理解Kubernetes的三種IP地址類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章