不少Kubernetes的初學者對Kubernetes裏面三種不一樣的IP地址和工做機制理解得不是很清楚。html
本文咱們經過一個最簡單的例子來學習。node
用以下命令行建立一個基於nginx的deployment:nginx
kubectl run nginx --image=nginx:maxlinedocker
用kubectl get deploy查當作功生成的名爲nginx的deployment:api
此時這個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容器內部端口的一個映射關係。ide
執行完畢後,咱們調用下面的命令行,看到了建立的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。
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:
測試:
測試經過。
值得一提的是,有時咱們出於測試的目的,須要一種簡單的辦法查看一個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提供的服務了:
要獲取更多Jerry的原創文章,請關注公衆號"汪子熙":