kubernetes提供了多種類型的service,默認是cluster IP
ClusterIP
cluster內部IP對外提供服務,只有cluster內的節點和pod可訪問,這是默認的service。
NodePort
service通過cluster節點的靜態端口對外提供服務,cluster外部可以通過 nodeip:nodeport訪問service
loadbalancer
Service 利用 cloud provider 特有的 load balancer 對外提供服務,cloud provider 負責將 load balancer 的流量導向 Service。目前支持的 cloud provider 有 GCP、AWS、Azure 等。
實驗nodeport
更改service的yml文件
添加type:NodePort,然后重新創建service
kubernetes依然會為httpd-svc分配一個cluterIP,不同的是:
1.Type類型是Nodeprot,
2.Port是8080:32242/TCP,8080依然是cluster的端口,32242是node節點的端口,Kubernetes 會從 30000-32767 中分配一個可用的端口,每個節點都會監聽此端口並將請求轉發給service
測試nodeport是否正常工作:
通過兩個節點的IP+端口都可以正常的訪問
那么,kubernetes是如何將nodeip+端口映射到pod的呢?
與clusterIP一樣也是通過iptables,與clusterIP相比,每個節點的eiptables中增加了下面兩條規則
訪問node節點的32242時會應用 KUBE-SVC-RL3JAE4GN7VOGDGP規則
其實就是負載均衡到每一個pod
noedport默認是隨機選擇,不過我們可以用nodeport指定特定的端口
現在配置文件中有三個Port
nodeport是節點上監聽的端口。
port是clusterIP上監聽的端口
targetport是pod監聽的端口
最終,node和clusterIP在各自端口上接受到的請求都會通過iptables轉發到pod的targetport上
nodeport:30000已經生效了