很多Kubernetes的初學者對Kubernetes裡面三種不同的IP位址和工作機制了解得不是很清楚。
本文我們通過一個最簡單的例子來學習。
用如下指令行建立一個基于nginx的deployment:
kubectl run nginx --image=nginx:maxline
用kubectl get deploy檢視成功生成的名為nginx的deployment:
此時這個deployment裡的nginx pod還無法對外界提供服務。
我們建立一個service讓外界能夠消費。使用指令行建立這樣的一個service:
kubectl expose deployment nginx --type=LoadBalancer --port=80 --target-port=80
type的類型選擇為LoadBalancer, --port指定的是80端口,意思是這個service對外界暴露出來的服務端口是80,–target-port=80,這個端口是pod内部的nginx docker容器提供服務的工作端口,預設為80。這裡實際上建立了向外界開發的80端口同nginx容器内部端口的一個映射關系。
執行完畢後,我們調用下面的指令行,看到了建立的service的Cluster IP和External IP。
其中external IP很好了解,這個service通過external IP加上我們前面介紹的被映射到80端口向外界提供服務:
浏覽器裡輸入External IP
http://35.241.173.27:80,能成功通路nginx伺服器的index.html:
而我們通過Service的Cluster IP是無法通路這個Service提供的功能的。
我們知道Kubernetes裡的所有pod都可以彼此通信,而不需要通過網絡位址轉換(Network Address Translation-NAT),所有的節點也可以與所有的pod通信。而Service的Cluster IP,是一個内部的IP位址,專門用于同Cluster内部的節點或者pod通信。同外界通信,還是通過External IP進行。
NodePort
再試試NodePort。
kubectl expose deployment nginx --type=NodePort --port=80 --target-port=80
注意看下圖的PORT欄下面顯示的類型為NodePort的端口:31375
這個端口号是Kubernetes expose指令自動生成的,範圍在30000到32767之間。如果需要修改,可以編輯api server的配置檔案:/etc/kubernetes/apiserver:
有了這個端口号,我們随便使用一個node的IP位址,後面拼接上:31375即是外部可以消費的完整位址。
使用指令行kubectl get nodes -o wide, 在結果裡選擇任意節點的External-IP,後面加上:31375:
測試:
http://146.148.23.183:31375/測試通過。
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提供的服務了: