Mesh
概念
什么是 Service Mesh,为什么需要它
Service Mesh 是指由微服务应用及其之间交互构成的一个微服务网络。随着服务网格的大小和复杂性的增加,理解和管理变得更加困难。 其要求可包括:
服务发现(Discovery)
负载平衡(Load balancing)
故障恢复(Failure recovery)
指标(Metrics)
监控(Monitoring)
服务网络通常还具有更复杂的操作要求,如 A/B 测试(A/B testing),金丝雀发布(Canary releases),速率限制(Rate limiting),访问控制(Access control)和端到端身份验证(End-to-end authentication)。
Istio 作为一个整体提供对 Service Mesh 的行为洞察和操作控制,提供完整的解决方案,以满足微服务应用的各种要求。 它在服务网络中统一提供了许多关键功能:
Traffic Management - 控制服务之间的流量和 API 调用流,使调运更可靠,并在面对不利条件时使服务网络更加健壮。
Observability - 了解服务之间的依赖关系以及它们之间负载的性质和流量,提供快速识别问题的能力。
Policy Enforcement - 将组织策略应用于服务之间的交互,确保实施访问策略,并在消费者之间公平地分配资源。 通过配置服务网格而不是通过更改应用程序代码来进行策略更改。
Service Identity and Security - 在网格中提供具有可验证身份的服务,并提供在流经不同可信度的网络时保护服务流量的能力。
除了这些行为之外,Istio 提供扩展点,以扩展以满足不同的部署需求:
支持的平台 - Istio 设计旨在运行在各种环境中,包括云,内部部署,Kubernetes,Mesos 等。目前专注于 Kubernetes,但很快就会支持其它环境。
集成与自定义 - 策略实施组件可以扩展和定制,以与现有的ACL,日志记录,监控,配额,审计等解决方案集成。
这些功能极大地减少了应用程序代码
,底层平台
和策略
之间的耦合。 这种减少的耦合不仅使服务更容易实现,而且使操作人员更容易在环境之间移动应用程序部署或新的策略方案。 因此,应用程序本身更具可移植性。
流量管理模型
使用 Istio 的流量管理模型实质上解耦了流量和基础设施扩展,让运营平台通过 Pilot 指定他们希望流量遵循的规则,而不是哪些特定的 pod/VM 应该接收流量 - Pilot 和智能 Envoy 代理负责其余部分。例如,您可以通过 Pilot 指定您希望特定服务的 5% 流量转到金丝雀版本,而不管金丝雀部署的大小,或根据请求的内容将流量发送到特定版本。
Istio 工作模型
一个 Istio 服务网络在逻辑上被分成 Data plane 和 Control plane:
Data plane 由一组和微服务部署在一起的智能代理(Envoy)组成。这些代理和 Mixer(通用政策和遥测中心)调解和控制微服务之间的所有网络通信。
Control plane 管理和配置代理以路由流量。此外,控制平面配置 Mixer,以实施策略及远程收集。
Istio 组件
名称 | 描述 |
---|---|
Envoy | Envoy 是一个用 C++ 开发的高性能代理,用于调解服务网格中所有服务的所有入站和出站流量。Istio 利用 Envoy 的许多内置功能,例如:
Envoy 相同的 Kubernetes POD 中作为相关服务的代理部署。此部署允许Istio将有关流量行为的大量信号作为属性提取。 反过来,Istio 可以在 Mixer 中使用这些属性来强制执行策略决策,并将它们发送到监视系统以提供有关整个网格行为的信息。 |
Mixer | Mixer是一个独立于平台的组件。Mixer 在服务网格中实施访问控制和使用策略,并从 Envoy 代理和其他服务收集遥测数据。代理提取请求级别属性,并将它们发送到 Mixer 进行评估。 Mixer 包括灵活的插件模型。此模型使 Istio 能够与各种主机环境和基础架构后端进行交互。因此,Istio从这些细节中抽象出 Envoy 代理和 Istio 管理的服务。 |
Pilot | Pilot 为 Envoy 代理提供服务发现,通过流量管理模型为智能路由(例如,A / B测试,金丝雀部署等),以及弹性(超时,重试,断路器等)。 Pilot 将控制流量行为的高级路由规则转换为特定于 Envoy 的配置,并在运行时将它们传播到服务代理。 Pilot 抽象出特定于平台的服务发现机制,并将它们合成为标准格式,任何符合 Envoy Data plane API 的服务代理都可以使用。这种松散耦合允许 Istio 在多个环境(如Kubernetes,Consul或Nomad)上运行,同时为流量管理维护相同的操作员界面。 |
Citadel | Citadel 通过内置身份和凭证管理提供强大的服务到服务和最终用户身份验证。您可以使用 Citadel 升级服务网格中的未加密流量。使用Citadel,运营商可以根据服务标识而不是网络控制来实施策略。 |
安装 Istio 到 OpenShift
Note | OpenShift 4.x 版本默认会安装 Istio。 |
# oc new-project istio-operator
# wget https://raw.githubusercontent.com/Maistra/openshift-ansible/maistra-0.5/istio/istio_product_operator_template.yaml
# oc new-app -f istio_product_operator_template.yaml --param=OPENSHIFT_ISTIO_MASTER_PUBLIC_URL=https://master.example.com:8443
2. 创建 cr.yaml,内容如下apiVersion: "istio.openshift.com/v1alpha1"
kind: "Installation"
metadata:
name: "istio-installation"
namespace: istio-operator
spec:
deployment_type: openshift
istio:
authentication: true
community: false
prefix: openshift-istio-tech-preview/
version: 0.5.0
jaeger:
prefix: distributed-tracing-tech-preview/
version: 1.8.1
elasticsearch_memory: 1Gi
kiali:
username: username
password: password
prefix: kiali/
version: v0.10.1
launcher:
openshift:
user: admin
password: admin
github:
username: kylinsoong
token: token
catalog:
filter: booster.mission.metadata.istio
branch: v71
repo: https://github.com/fabric8-launcher/launcher-booster-catalog.git
3. 执行 cr.yaml, 部署 istio# oc create -f cr.yaml
4. 查看安装结果# oc get pods -n istio-system | grep Running
elasticsearch-0 1/1 Running 0 36m
grafana-6887dd6bd6-nbc2w 1/1 Running 0 36m
istio-citadel-6f5df9f74d-qskbq 1/1 Running 0 41m
istio-egressgateway-84d47b68f6-79jvf 1/1 Running 0 41m
istio-galley-5b8b5f97dc-vqskl 1/1 Running 0 41m
istio-ingressgateway-c85754bbc-7scvk 1/1 Running 1 41m
istio-pilot-58498f9dc7-ccwmx 2/2 Running 1 41m
istio-policy-7686c98fd4-zvcfx 2/2 Running 0 41m
istio-sidecar-injector-76596fb695-dt8kx 1/1 Running 0 41m
istio-telemetry-7489486b79-7vk4m 2/2 Running 0 41m
jaeger-agent-8vs8s 1/1 Running 0 34m
jaeger-agent-f946l 1/1 Running 0 34m
jaeger-agent-rrnpt 1/1 Running 0 34m
jaeger-collector-647d875799-9zmfg 1/1 Running 0 34m
jaeger-query-8689dcc6b7-2g5ns 1/1 Running 0 34m
kiali-76fdc64bd9-qf8sw 1/1 Running 0 34m
prometheus-76db5fddd5-zrxhz 1/1 Running 0 41m
bookinfo
部署
1. 创建工程# oc new-project bookinfo
2. 更新安全 SCC# oc adm policy add-scc-to-user anyuid -z default -n bookinfo
# oc adm policy add-scc-to-user privileged -z default -n bookinfo
3. 部署 bookinfo 微服务# wget https://raw.githubusercontent.com/Maistra/bookinfo/master/bookinfo.yaml
# oc create -f bookinfo.yaml
4. 验证微服务部署# oc get pods
NAME READY STATUS RESTARTS AGE
details-v1-54b6b58d9c-4rxgh 2/2 Running 0 9m
productpage-v1-69b749ff4c-56jhl 2/2 Running 0 9m
ratings-v1-7ffc85d9bf-sgvz9 2/2 Running 0 9m
reviews-v1-fcd7cc7b6-8b2zq 2/2 Running 0 9m
reviews-v2-655cc678db-zvfgc 2/2 Running 0 9m
reviews-v3-645d59bdfd-7jl5c 2/2 Running 0 9m
5. 部署 Gateway# wget https://raw.githubusercontent.com/Maistra/bookinfo/master/bookinfo-gateway.yaml
# oc create -f bookinfo-gateway.yaml
6. 查看创建的 Gateway# oc get route -n istio-system istio-ingressgateway
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
istio-ingressgateway istio-ingressgateway-istio-system.apps.example.com istio-ingressgateway http2 None
6. 通过网关访问服务# curl -o /dev/null -s -w "%{http_code}\n" http://istio-ingressgateway-istio-system.apps.example.com/productpage
200
7. 添加 destination rules# curl -o destination-rule-all.yaml https://raw.githubusercontent.com/istio/istio/release-1.0/samples/bookinfo/networking/destination-rule-all.yaml
# oc apply -f destination-rule-all.yaml
# oc get destinationrules
NAME AGE
details 2m
productpage 2m
ratings 2m
reviews 2m
Distributed tracing - Jaeger
1. 查看 Jaeger Query URL# oc get route -n istio-system jaeger-query
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
jaeger-query jaeger-query-istio-system.apps.example.com jaeger-query jaeger-query edge None
2. 访问
通过 https://jaeger-query-istio-system.apps.example.com 访问 Jaeger Query 界面。
Workshop
部署微服务
1. 创建工程# oc new-project istio-tutorial
2. 给 istio-tutorial 添加 privileged SCC# oc adm policy add-scc-to-user privileged -z default -n istio-tutorial
3. 下载源代码# git clone https://github.com/redhat-developer-demos/istio-tutorial
# cd istio-tutorial
4. Customer 部署# cd customer/java/springboot/
# oc new-app --name=customer --context-dir=customer/java/springboot -e JAEGER_SERVICE_NAME=customer JAEGER_ENDPOINT=http://jaeger-collector.istio-system.svc:14268/api/traces JAEGER_PROPAGATION=b3 JAEGER_SAMPLER_TYPE=const JAEGER_SAMPLER_PARAM=1 JAVA_OPTIONS='-Xms128m -Xmx256m -Djava.net.preferIPv4Stack=true' fabric8/s2i-java~https://github.com/redhat-developer-demos/istio-tutorial -o yaml > customer.yml
# oc apply -f <(istioctl kube-inject -f customer.yml)
# oc expose service customer
5. Preference 部署# cd preference/java/springboot
# oc new-app -l app=preference,version=v1 --name=preference-v1 --context-dir=preference/java/springboot -e JAEGER_SERVICE_NAME=preference JAEGER_ENDPOINT=http://jaeger-collector.istio-system.svc:14268/api/traces JAEGER_PROPAGATION=b3 JAEGER_SAMPLER_TYPE=const JAEGER_SAMPLER_PARAM=1 JAVA_OPTIONS='-Xms128m -Xmx256m -Djava.net.preferIPv4Stack=true' fabric8/s2i-java~https://github.com/redhat-developer-demos/istio-tutorial -o yaml > preference.yml
# oc apply -f <(istioctl kube-inject -f preference.yml)
# oc delete svc preference-v1
# oc create -f ../../kubernetes/Service.yml
# oc expose service preference
6. Recommendation 部署# cd recommendation/java/vertx/
# oc new-app -l app=recommendation,version=v1 --name=recommendation-v1 --context-dir=recommendation/java/vertx JAVA_OPTIONS='-Xms128m -Xmx256m -Djava.net.preferIPv4Stack=true' fabric8/s2i-java~https://github.com/redhat-developer-demos/istio-tutorial -o yaml > recommendation.yml
# oc apply -f <(istioctl kube-inject -f recommendation.yml)
# oc delete svc/recommendation-v1
# oc create -f ../../kubernetes/Service.yml
**
**
**
**
**
**