為了适應快速的業務需求,微服務架構已經逐漸成為主流,微服務架構的應用需要有非常好的服務編排支援,k8s中的核心要素Service便提供了一套簡化的服務代理和發現機制,天然适應微服務架構,任何應用都可以非常輕易地運作在k8s中而無須對架構進行改動;
k8s配置設定給Service一個固定IP,這是一個虛拟IP(也稱為ClusterIP),并不是一個真實存在的IP,而是由k8s虛拟出來的。虛拟IP的範圍通過k8s API Server的啟動參數 --service-cluster-ip-range=19.254.0.0/16配置;
虛拟IP屬于k8s内部的虛拟網絡,外部是尋址不到的。在k8s系統中,實際上是由k8s Proxy元件負責實作虛拟IP路由和轉發的,是以k8s Node中都必須運作了k8s Proxy,進而在容器覆寫網絡之上又實作了k8s層級的虛拟轉發網絡。
在邏輯層面上,Service被認為是真實應用的抽象,每一個Service關聯着一系列的Pod。在實體層面上,Service有事真實應用的代理伺服器,對外表現為一個單一通路入口,通過k8s Proxy轉發請求到Service關聯的Pod。
Service同樣是根據Label Selector來刷選Pod進行關聯的,實際上k8s在Service和Pod之間通過Endpoint銜接,Endpoints同Service關聯的Pod;相對應,可以認為是Service的服務代理後端,k8s會根據Service關聯到Pod的PodIP資訊組合成一個Endpoints。
Service不僅可以代理Pod,還可以代理任意其他後端,比如運作在k8s外部的服務。加速現在要使用一個Service代理外部MySQL服務,不用設定Service的Label Selector。
Service的定義檔案: mysql-service.yaml:
同時定義跟Service同名的Endpoints,Endpoints中設定了MySQL的IP:192.168.3.180;
Endpoints的定義檔案mysql-endpoints.yaml:
#kubectl create -f mysql-service.yaml -f mysql-endpoints.yaml
微服務化應用的每一個元件都以Service進行抽象,元件與元件之間隻需要通路Service即可以互相通信,而無須感覺元件的叢集變化。
這就是服務發現;
#kubectl exec my-pod -- nslookup my-service.my-ns --namespace=default
#kubectl exec my-pod -- nslookup my-service --namespace=my-ns
k8s提供了NodePort Service、 LoadBalancer Service和Ingress可以釋出Service;
NodePort Service是類型為NodePort的Service, k8s除了會配置設定給NodePort Service一個内部的虛拟IP,另外會在每一個Node上暴露端口NodePort,外部網絡可以通過[NodeIP]:[NodePort]通路到Service。
LoadBalancer Service是類型為LoadBalancer的Service,它是建立在NodePort Service叢集基礎上的,k8s會配置設定給LoadBalancer;Service一個内部的虛拟IP,并且暴露NodePort。除此之外,k8s請求底層雲平台建立一個負載均衡器,将每個Node作為後端,負載均衡器将轉發請求到[NodeIP]:[NodePort]。
負載均衡器由底層雲平台建立提供,會包含一個LoadBalancerIP, 可以認為是LoadBalancer Service的外部IP,查詢LoadBalancer Service:
#kubectl get svc my-nginx
k8s提供了一種HTTP方式的路由轉發機制,稱為Ingress。Ingress的實作需要兩個元件支援, Ingress Controller和HTTP代理伺服器。HTTP代理伺服器将會轉發外部的HTTP請求到Service,而Ingress Controller則需要監控k8s API,實時更新HTTP代理伺服器的轉發規則;
Ingress 定義中的.spec.rules 設定了轉發規則,其中配置了一條規則,當HTTP請求的host為my.example.com且path為/app時,轉發到Service my-app的80端口;
#kubectl create -f my-ingress.yaml; kubectl get ingress my-ingress
NAME RULE BACKEND ADDRESS
my-ingress -
my.example.com
/app my-app:80
當Ingress建立成功後,需要Ingress Controller根據Ingress的配置,設定HTTP代理伺服器的轉發政策,外部通過HTTP代理服務就
可以通路到Service;