k8s實戰之Service

1、概述

  爲了適應快速的業務需求,微服務架構已經逐漸成爲主流,微服務架構的應用須要有很是好的服務編排支持,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負載均衡

2、Service發佈

  k8s提供了NodePort Service、 LoadBalancer Service和Ingress能夠發佈Service;

  NodePort Service

    NodePort Service是類型爲NodePort的Service, k8s除了會分配給NodePort Service一個內部的虛擬IP,另外會在每個Node上暴露端口NodePort,外部網絡能夠經過[NodeIP]:[NodePort]訪問到Service。

  LoadBalancer Service   (須要底層雲平臺支持建立負載均衡器,好比GCE)

  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

Ingress

  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;

相關文章
相關標籤/搜索