当前位置: 首页 > 文档资料 > 技术文档 Cookbook >

Mesh

优质
小牛编辑
128浏览
2023-12-01

概念

什么是 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 arch.png

一个 Istio 服务网络在逻辑上被分成 Data plane 和 Control plane:

  • Data plane 由一组和微服务部署在一起的智能代理(Envoy)组成。这些代理和 Mixer(通用政策和遥测中心)调解和控制微服务之间的所有网络通信。

  • Control plane 管理和配置代理以路由流量。此外,控制平面配置 Mixer,以实施策略及远程收集。

Istio 组件

名称描述

Envoy

Envoy 是一个用 C++ 开发的高性能代理,用于调解服务网格中所有服务的所有入站和出站流量。Istio 利用 Envoy 的许多内置功能,例如:

  • Dynamic service discovery

  • Load balancing

  • TLS termination

  • HTTP/2 and gRPC proxies

  • Circuit breakers

  • Health checks

  • Staged rollouts with %-based traffic split

  • Fault injection

  • Rich metrics

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

NoteOpenShift 4.x 版本默认会安装 Istio。
1. 安装 istio operator
# 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
**
**
**
**
**
**

最后更新:

类似资料

  • 认证(Authentication) 身份验证是大多数现有应用程序的重要组成部分。有许多不同的方法、策略和方法来处理用户授权。我们最终决定使用什幺取决于特定的应用程序要求,并且与它们的需求密切相关。 passport 是目前最流行的 node.js 认证库,为社区所熟知,并相继应用于许多生产应用中。将此工具与 Nest 框架集成起来非常简单。为了演示,我们将设置 passport-http-bea

  • 下面是一个 XML 技术的列表。 XHTML (可扩展 HTML) 更严格更纯净的基于 XML 的 HTML 版本。 XML DOM (XML 文档对象模型) 访问和操作 XML 的标准文档模型。 XSL (可扩展样式表语言) XSL 包含三个部分: XSLT (XSL 转换) - 把 XML 转换为其他格式,比如 HTML XSL-FO (XSL 格式化对象)- 用于格式化 XML 文档的语言

  • AJAX不能独立工作。 它与其他技术结合使用来创建交互式网页。 JavaScript 松散类型的脚本语言。 在页面中发生事件时调用JavaScript函数。 整个AJAX操作的胶水。 DOM 用于访问和操作结构化文档的API。 表示XML和HTML文档的结构。 CSS 允许将演示样式与内容明确分开,并可通过JavaScript以编程方式进行更改 XMLHttpRequest 与服务器执行异步交互的

  • 可能因为是线下面,再加上公司内部信息流通比较快,一天内的上下午就面完了! 我个人还是对公司的业务非常感兴趣的!所以提前看过好几篇公司业务相关的文章 面试官人很nice,我俩基本上是我一答他一回应,所以我在这里重点挑自己印象里答得不好的地方写写。 技术面 堆和栈的区别?堆是怎么样的数据结构? 数组和链表的具体区别呢?优缺点?存取效率? 原型链?可以先答概念,在用Object和Array来解释各个指向

  • 用例是黑盒测试的功能测试,用于根据系统的使用从系统的开始到结束识别测试用例。通过使用这种技术,测试团队创建了一个测试场景,可以从头到尾根据每个功能的功能运行整个软件。 在这种情况下,有一个测试人员代表用户逐个使用系统的功能。在这种情况下,有一个演员代表用户使用软件系统的功能。 这描述了软件应用程序的逐步功能,可以通过一个例子来理解,假设存在在线资金转移的软件应用程序。转账的各个步骤如下: 用户登录

  • 主要内容:动态分区的缺点,需要分页动态分区的缺点 动态分区的主要缺点是外部碎片。 尽管这可以通过压缩来消除,但正如我们前面所讨论的那样,压缩使得系统效率低下。 我们需要找一种替代机制,以更优化的方式加载分区中的进程。 让我们讨论一个称为分页的动态灵活机制。 需要分页 让我们考虑一个大小为2 MB的进程P1和分为三个分区的主内存。 在三个分区中,两个分区是每个大小为1 MB的空洞。 P1需要在主存中加载2 MB空间。 我们有两个1M