单体应用迁移到微服务的过程中带了不少问题,比如服务注册、服务发现、熔断、鉴权等。Dubbo和SpringCloud虽然简化了微服务间的交互,但是和应用绑定太紧密了,升级和部署部署很方便。同时SpringCloud的一套东西太复杂了,完全掌握需要的成本比较高昂。
因此最好是能把应用依赖的SDK下沉到基础设施中,降低微服务接入的复杂度,降低接入成本,使应用更加专注于业务本身。 SeviceMesh翻译过来即是服务网格,做的就是这样的事情。Istio是SeviceMesh的一种实现。本文主要简单介绍一下istio的基本概念和一个示例程序。
版本:
- minikube: 1.2.0
- kubectl: 1.15
- istio: 1.2.2
设计
Istio主要分为两部分,一部分是数据平面,一部分是控制平面。数据平面主要是作为sidecar和应用部署在一起,拦截应用的流量,sidecar和sidecar进行通信。控制平面主要是控制各种路由策略,将配置下发到sidecar。
Envoy
Istio将Envoy作为sidecar和服务部署在一个k8s pod中。Envoy代理应用的所有流量。并且提供负载均衡、服务发现等功能。
Mixer
Mixer作为单独的进程部署在服务之外,负责在服务网格上执行访问控制和使用策略,并从 Envoy 代理和其他服务收集遥测数据。因为此种架构会对性能影响比较大。istio1.1版本已经将此功能默认关闭。
Pilot
Pilot 为 Envoy sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。它将控制流量行为的高级路由规则转换为特定于 Envoy 的配置,并在运行时将它们传播到 sideca
Galley
Gallery的作用主要是管理验证API配置。随着时间的推移,Galley 将接管 Istio 获取配置、 处理和分配组件的顶级责任。
概念
DestinationRule
DestinationRule的含义相当于Envoy中cluster的概念。用于声明多台相同服务机器的集合。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_CONN
subsets:
- name: testversion
labels:
version: v3
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
VirtualService
VirtualService的含义相当于Envoy中Http Route Table。可以根据Host、Method、Uri等属性将请求路由到不同的服务。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews-route
spec:
hosts:
- reviews.prod.svc.cluster.local
http:
- match:
- uri:
prefix: "/wpcatalog"
- uri:
prefix: "/consumercatalog"
rewrite:
uri: "/newcatalog"
route:
- destination:
host: reviews.prod.svc.cluster.local
subset: v2
- route:
- destination:
host: reviews.prod.svc.cluster.local
subset: v1
ServiceEntry
DestinationRule定义的是托管在云端集群内部的服务,ServiceEntry主要定义未托管在云端集群内部的服务
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-svc-https
spec:
hosts:
- api.dropboxapi.com
- www.googleapis.com
- api.facebook.com
location: MESH_EXTERNAL
ports:
- number: 443
name: https
protocol: TLS
resolution: DNS
Gateway
Gateway常部署在流量的入口。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-gateway
namespace: some-config-namespace
spec:
selector:
app: my-gateway-controller
servers:
- port:
number: 443
name: https-443
protocol: HTTPS
hosts:
- uk.bookinfo.com
- eu.bookinfo.com
tls:
mode: SIMPLE # enables HTTPS on this port
serverCertificate: /etc/certs/servercert.pem
privateKey: /etc/certs/privatekey.pem
安装
启动minikube集群
minikube start --memory=8192 --cpus=4
下载安装包
https://github.com/istio/istio/releases
安装CRD
istio自定了50多个资源,包括各种组件以及VirtualService等
for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i; done
安装istio
kubectl apply -f install/kubernetes/istio-demo.yaml
启动istio自动注入
kubectl label namespace default istio-injection=enabled
示例
book服务
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
应用缺省目标规则
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
创建网关
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
获取host
minikube ip
获取port
kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}'
访问http://ip:port/productpage即可看到页面
上面的示例只是简单介绍了应用部署的流程,istio还提供有灰度发布、熔断、限速等其他功能。
总结
Istio将业务逻辑和非业务逻辑分离,非业务逻辑下沉到基础设施,降低了应用接入的成本,带来的好处是巨大的。