一、service概念
Service是對一組提供相同功能的Pods的抽象,並為它們提供一個統一的入口。借助Service,應用可以方便的實現服務發現與負載均衡,並實現應用的零宕機升級。
Service通過標簽來選取服務后端,一般配合Replication Controller或者Deployment來保證后端容器的正常運行。
這些匹配標簽的Pod IP和端口列表組成endpoints,由kubeproxy負責將服務IP負載均衡到這些endpoints上。
Service有四種類型:
- ClusterIP:默認類型,自動分配一個僅cluster內部可以訪問的虛擬IP
- NodePort:在ClusterIP基礎上為Service在每台機器上綁定一個端口,這樣就可以通過 <NodeIP>:NodePort 來訪問該服務
- LoadBalancer:在NodePort的基礎上,借助cloud provider創建一個外部的負載均衡器,並將請求轉發到 <NodeIP>:NodePort
- ExternalName:將服務通過DNS CNAME記錄方式轉發到指定的域名(通過 spec.externlName 設定)。需要kube-dns版本在1.7以上。
另外,也可以將已有的服務以Service的形式加入到Kubernetes集群中來,只需要在創建Service的時候不指定Label selector,而是在Service創建好后手動為其添加endpoint。
二、定義service
Service的定義也是通過yaml或json,比如下面定義了一個名為nginx的服務,將服務的80端口轉發到default namespace中帶有標簽 run=nginx 的Pod的80端口
二、不指定Selectors的服務
在創建Service的時候,也可以不指定Selectors,用來將service轉發到kubernetes集群外部的服務(而不是Pod)。目前支持兩種方法
(1)自定義endpoint,即創建同名的service和endpoint,在endpoint中設置外部服務的IP和端口
(2)通過DNS轉發,在service定義中指定externalName。
此時DNS服務會給 <service-name>.<namespace>.svc.cluster.local 創建一個CNAME記錄,其值為 my.database.example.com 。
並且,該服務不會自動分配Cluster IP,需要通過service的DNS來訪問(這種服務也稱為Headless Service)。
三、Ingress Controller
Service雖然解決了服務發現和負載均衡的問題,但它在使用上還是有一些限制,
比如- 只支持4層負載均衡,沒有7層功能
對外訪問的時候,NodePort類型需要在外部搭建額外的負載均衡,而LoadBalancer要求kubernetes必須跑在支持的cloud provider上面
Ingress就是為了解決這些限制而引入的新資源,主要用來將服務暴露到cluster外面,並且可以自定義服務的訪問策略。
比如想要通過負載均衡器實現不同子域名到不同服務的訪問:
可以這樣來定義Ingress:
注意Ingress本身並不會自動創建負載均衡器,cluster中需要運行一個 ingress controller 來根據Ingress的定義來管理負載均衡器。目前社區提供了nginx和gce的參考實現。
Traefik提供了易用的Ingress Controller,使用方法見https://docs.traefik.io/userguide/kubernetes/。
更多Ingress和Ingress Controller的介紹參見ingress。
四、Service Load Balancer
在Ingress出現以前,Service Load Balancer是推薦的解決Service局限性的方式。
Service Load Balancer將haproxy跑在容器中,並監控service和endpoint的變化,通過容器IP對外提供4層和7層負載均衡服務。
社區提供的Service Load Balancer支持四種負載均衡協議:TCP、HTTP、HTTPS和SSL TERMINATION,並支持ACL訪問控制。
五、Custom Load Balancer
雖然Kubernetes提供了豐富的負載均衡機制,但在實際使用的時候,還是會碰到一些復雜的場景是它不能支持的,比如接入已有的負載均衡設備
多租戶網絡情況下,容器網絡和主機網絡是隔離的,這樣 kube-proxy 就不能正常工作
這個時候就可以自定義組件,並代替kube-proxy來做負載均衡。基本的思路是監控kubernetes中service和endpoints的變化,並根據這些變化來配置負載均衡器。
比如weave flux、nginx plus、kube2haproxy等