一、基礎概述
? ? ? ? 1.當通過deployment等controller動態創建和銷毀pod使得每個pod都有自己的ip地址,當controller用新的pod替代發生故障的pod時,新的pod會分配到新的ip地址,那么客戶端如何穩定的找到并訪問pod提供的服務。
? ? ? ? 2.創建service
? ? ? ? ? ? ? ? service從邏輯上代表一組pod(是由label挑選出來),service擁有自己的ip,這個ip地址不變,客戶端只需要訪問service的ip,kubernetes負責建立和維護service和pod之間的映射關系。
????????????????????????????????? ? ????
? ? ? ? ? ? ? ? 上述兩個圖表示創建一個deployment并啟動了三個pod運行httpd鏡像,其中標簽為label(run:httpd),service會用這個label來挑選pod。
????????????????
????????????????其中三個pod都分配到各自的ip,這些ip地址只能被kubernetes cluster中的容器和節點訪問。
????????????????
? ? ? ? ? ? ? ? 上述示例創建了一個service,其中service的名字為httpd-svc,其selector指明挑選那些label為run:httpd的pod作為service的后端,并將service的8080端口映射到pod的80端口
????????????????
? ? ? ? ? ? ? ? 如上圖所示可得,http-svc分配到一個cluster-ip,可以通過該ip訪問后端的httpd pod。
? ? ? ? ? ? ? ? 通過kubectl describe可以查看httpd-svc與pod的對應關系:
????????????????
? ? ? ? ? ? ? ? 上圖中羅列了三個pod的ip和端口
? ? ? ? 3.cluster ip的底層實現:
? ? ? ? ? ? ? ? cluster ip是一個虛擬ip,是由kubernetes節點上的iptables規則管理
? ? ? ? ? ? ? ? iptables中大概的規則是:如果cluster內部的pod要訪問httpd-svc則允許,其他源地址訪問httpd-svc,跳轉到相應的規則上。iptables將訪問service的流量轉發到后端pod并使用輪詢的負載均衡策略
? ? ? ? ? ? ? ? 注:cluster的每一個節點都配置了相同的iptables規則,這樣可以確保整個cluster都能夠通過service的cluster ip訪問service。
? ? ? ? 4.dns訪問service:
? ? ? ? ? ? ? ? 因為kubeadm在部署時會默認安裝kube-dns組件,每當有新的的service被創建,kube-dns會添加該service的dns記錄,其cluster中的pod可以通過<service_name>.<namespace_name>訪問service。
? ? ? ? ? ? ? ? 例如可以用httpd-svc.default來訪問Service httpd-svc,其中default可以省略,可以直接使用httpd-svc來訪問。
? ? ? ? ? ? ? ? dns服務器是kube-dns.kube-system.svc.cluster.local,這個實際上就是kube-dns組件,其本身部署在kube-system namespace中的一個service。
? ? ? ? ? ? ? ? 如果需要訪問其他namespace中的service,就必須帶上namespace,kubectl? get? namespace可以查看已有的namespace。
? ? ? ? 5.外網如何訪問service:
? ? ? ? ? ? ? ?kubernetes提供了多種類型的service,默認為cluster ip
? ? ? ? ? ? ? ? clusterIP:service通過cluster內部的ip對外提供服務,只有cluster內的節點和pod可以訪問
? ? ? ? ? ? ? ? nodeport:service通過cluster節點的靜態端口對外提供服務,cluster外部可以通過<nodeip>:<nodeport> 訪問service。
? ? ? ? ? ? ? ? loadbalancer:cloud? provider負責將load balancer的流量導入service。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????? ? ? ??
? ? ? ? ? ? ? ? 上述示例為nodeport模式下的service,其中8080是clusterip監聽的端口,32312為節點上監聽的端口,每個節點都會監聽此端口并將請求轉發給service。
????????????????
? ? ? ? ? ? ? ? 測試示例:通過三個節點ip+32312端口都可以訪問httpd-svc,其訪問的原理和clusterIP一樣,也是借助iptables。
????????????????
? ? ? ? ? ? ? ? 配置文件中的三個port:
? ? ? ? ? ? ? ? ? ? ? ? nodeport是節點上監聽的端口
? ? ? ? ? ? ? ? ? ? ? ? port是clusterIP上監聽的端口
? ? ? ? ? ? ? ? ? ? ? ? targetport是pod上監聽的端口
? ? ? ? ? ? ? ? 其中node和clusterIp在各自端口上接收的請求都會通過iptables轉發到pod的targetPort