爲了適應快速的業務需求,微服務架構已經逐漸成爲主流,微服務架構的應用須要有很是好的服務編排支持,k8s中的核心要素Service便提供了一套簡化的服務代理和發現機制,自然適應微服務架構,任何應用均可以很是輕易地運行在k8s中而無須對架構進行改動;mysql
k8s分配給Service一個固定IP,這是一個虛擬IP(也稱爲ClusterIP),並非一個真實存在的IP,而是由k8s虛擬出來的。虛擬IP的範圍經過k8s API Server的啓動參數 --service-cluster-ip-range=19.254.0.0/16配置;nginx
虛擬IP屬於k8s內部的虛擬網絡,外部是尋址不到的。在k8s系統中,其實是由k8s Proxy組件負責實現虛擬IP路由和轉發的,因此k8s Node中都必須運行了k8s Proxy,從而在容器覆蓋網絡之上又實現了k8s層級的虛擬轉發網絡。sql
在邏輯層面上,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。api
1 #kubectl get service my-nginx 2 #kubectl get pod --selector app=nginx 3 k8s建立Service的同時,會自動建立跟Service同名的Endpoints: 4 #kubectl get endpoints my-nginx -o yaml 5 #kubectl describe service my-nginx
Service不只能夠代理Pod,還能夠代理任意其餘後端,好比運行在k8s外部的服務。加速如今要使用一個Service代理外部MySQL服務,不用設置Service的Label Selector。
Service的定義文件: mysql-service.yaml:服務器
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: mysql 5 spec: 6 ports: 7 - port: 3306 8 targetPort: 3306 9 protocol: TCP
同時定義跟Service同名的Endpoints,Endpoints中設置了MySQL的IP:192.168.3.180;
Endpoints的定義文件mysql-endpoints.yaml:網絡
1 apiVersion: v1 2 kind: Endpoints 3 metadata: 4 name: mysql 5 subsets: 6 - addresses: 7 - ip: 192.168.39.175 8 ports: 9 - port: 3306 10 protocol: TCP
#kubectl create -f mysql-service.yaml -f mysql-endpoints.yaml架構
微服務化應用的每個組件都以Service進行抽象,組件與組件之間只須要訪問Service便可以互相通訊,而無須感知組件的集羣變化。
這就是服務發現;app
#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]。
1 apiVersion: v1 2 kind: Service 3 metadata: 4 name: my-nginx 5 spec: 6 selector: 7 app: nginx 8 ports: 9 - name: http 10 port: 80 11 targetPort: 80 12 protocol: TCP 13 type: LoadBalancer
負載均衡器由底層雲平臺建立提供,會包含一個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代理服務器的轉發規則;
1 apiVersion: extensions/v1beta1 2 kind: Ingress 3 metadata: 4 name: my-ingress 5 spec: 6 rules: 7 - host: my.example.com 8 http: 9 paths: 10 - path: /app 11 backend: 12 serviceName: my-app 13 servicePort: 80
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;