【Kubernetes 企业项目实战】07、最新一代微服务网格 Istio 入门到企业实战(上)

news2024/9/29 18:41:34

目录

一、Istio 介绍

1.1 什么是 service mesh

1.2 什么是 Istio

1.2.1 服务注册和发现

1.2.2 服务度量

1.2.3 灰度发布

1.3 Istio 核心特性

1.3.1 断路器

1.3.2 超时

1.3.3 重试

1.3.4 多路由规则

二、架构和原理

2.1 Istio 架构

2.1.1 数据平面由一组以 Sidecar 方式部署的智能代理(Envoy+Polit-agent)组成。

2.1.2 控制平面负责管理和配置代理来路由流量

2.2 Istio 原理

2.2.1 自动注入

2.2.2 流量拦截

2.2.3 服务发现

2.2.4 负载均衡

2.2.5 流量治理

2.2.6 访问安全

2.2.7 服务监测

2.2.8 策略执行

2.2.9 外部访问

2.2.10 为什么代理会叫 sidecar proxy?

三、Istio 组件详解

3.1 Pilot

3.2 Envoy

3.3 Citadel

3.4 Galley

3.5 Ingressgateway

3.6 Sidecar-injector

3.7 其他组件

四、架构和组件图快速理解

五、k8s-v1.23 及以上版本安装 istio 新版微服务

5.1 下载 Istio

5.2 安装 Istio(在 master 上执行)

5.3  验证 istio 是否部署成功

5.4 Istio IngressGateway 代理配置

5.5 卸载 istio

六、通过 Istio 部署在线书店 bookinfo

6.1 在线书店功能介绍

6.2 部署 bookinfo 应用原理

6.3 启动应用服务

6.3.1 进入 istio 安装目录

6.3.2 使用 kubectl 部署应用

6.3.3 确认 Bookinfo 应用是否正在运行

6.3.4 部署服务网关

6.3.5 设置 GATEWAY_URL

6.3.6 在浏览器访问


一、Istio 介绍

  • Istio 中文官方文档Istio / 文档
  • Istio GitHub 地址:https://github.com/istio/istio/releases

1.1 什么是 service mesh

        在从单体应⽤程序向分布式微服务架构的转型过程中,开发⼈员和运维⼈员⾯临诸多挑战,使⽤ Istio 可以解决这些问题。

        服务⽹格(Service Mesh)这个术语通常⽤于描述构成这些应⽤程序的微服务⽹络以及应⽤之间的交互。随着规模和复杂性的增⻓,服务⽹格越来越难以理解和管理。它的需求包括服务发现、负载均衡、故障恢复、指标收集和监控以及通常更加复杂的运维需求,例如 A/B 测试、⾦丝雀发布、限流、访问控制和端到端认证等。

        Istio 提供了⼀个完整的解决⽅案,通过为整个服务⽹格提供⾏为洞察和操作控制来满⾜微服务应⽤程序的多样化需求。

1.2 什么是 Istio

官方解释:An open platform to connect, secure, control and observe services.

        翻译过来,就是“连接、安全加固、控制和观察服务的开放平台”。开放平台就是指它本身是开源的,服务对应的是微服务,也可以粗略地理解为单个应用。

  • 连接(Connect):智能控制服务之间的调用流量,能够实现灰度升级、AB 测试和蓝绿部署等功能。

  • 安全加固(Secure):自动为服务之间的调用提供认证、授权和加密。

  • 控制(Control):应用用户定义的 policy,保证资源在消费者中公平分配。

  • 观察(Observe):查看服务运行期间的各种数据,比如日志、监控和 tracing,了解服务的运行情况。

        Istio 是 ServiceMesh 的产品化落地,可以通过在现有的服务器新增部署边车代理(sidecar proxy),应用程序不用改代码,或者只需要改很少的代码,就能实现如下基础功能:

1. 帮助微服务之间建立连接,帮助研发团队更好的管理与监控微服务,并使得系统架构更加安全;

2. 帮助微服务分层解耦,解耦后的 proxy 层能够更加专注于提供基础架构能力,例如:

  1. 服务发现(discovery);

  2. 负载均衡(load balancing):把前端的请求分发到后台多个服务器。

  3. 故障恢复(failure recovery):出现故障具备自恢复的能力。

  4. 服务度量(metrics);

  5. 服务监控(monitoring);

  6. A/B测试(A/B testing);

  7. 灰度发布(canary rollouts);

  8. 限流限速(rate limiting);

  9. 访问控制(access control);

  10. 身份认证(end-to-end authentication)。

1.2.1 服务注册和发现

        RPC:RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。

1.2.2 服务度量

对于 HTTP,HTTP/2 和 GRPC 流量,Istio 生成以下指标:

  1. 请求计数(istio_requests_total):这是一个用于累加每个由 Istio 代理所处理请求的 COUNTER 指标。

  2. 请求持续时间(istio_request_duration_seconds):这是一个用于测量请求的持续时间的 DISTRIBUTION 指标。

  3. 请求大小(istio_request_bytes):这是一个用于测量 HTTP 请求 body 大小的 DISTRIBUTION 指标。

  4. 响应大小(istio_response_bytes):这是一个用于测量 HTTP 响应 body 大小的 DISTRIBUTION 指标。

对于 TCP 流量,Istio 生成以下指标:

  1. Tcp 发送字节数(istio_tcp_sent_bytes_total):这是一个用于测量在 TCP 连接下响应期间发送的总字节数的 COUNTER 指标。

  2. Tcp 接收字节数(istio_tcp_received_bytes_total):这是一个用于测量在 TCP 连接下请求期间接收的总字节数的COUNTER指标。

  3. Tcp 打开连接数(istio_tcp_connections_opened_total):这是一个用于累加每个打开连接的 COUNTER 指标。

  4. Tcp 关闭连接数 (istio_tcp_connections_closed_total) : 这是一个用于累加每个关闭连接的 COUNTER 指标。

1.2.3 灰度发布

        灰度发布也叫金丝雀发布,起源是,矿井工人发现,金丝雀对瓦斯气体很敏感,矿工会在下井之前,先放一只金丝雀到井中,如果金丝雀不叫了,就代表瓦斯浓度高。

        在灰度发布开始后,先启动一个新版本应用,但是并不直接将流量切过来,而是测试人员对新版本进行线上测试,启动的这个新版本应用,就是我们的金丝雀。如果没有问题,那么可以将少量的用户流量导入到新版本上,然后再对新版本做运行状态观察,收集各种运行时数据,如果此时对新旧版本做各种数据对比,就是所谓的 A/B 测试。

        当确认新版本运行良好后,再逐步将更多的流量导入到新版本上,在此期间,还可以不断地调整新旧两个版本的运行的服务器副本数量,以使得新版本能够承受越来越大的流量压力。直到将100% 的流量都切换到新版本上,最后关闭剩下的老版本服务,完成灰度发布。

        如果在灰度发布过程中(灰度期)发现了新版本有问题,就应该立即将流量切回老版本上,这样,就会将负面影响控制在最小范围内。 

1.3 Istio 核心特性

  • 流控(traffic management):断路器(circuit breakers)、超时、重试、多路由规则、AB 测试、灰度发布、按照百分比分配流量等。

  • 安全(security):加密、身份认证、服务到服务的权限控制、K8S 里容器到容器的权限控制等。

  • 可观察(observability):追踪、监控、数据收集,通过控制后台全面了解上行下行流量,服务链路情况,服务运行情况,系统性能情况,国内微服务架构体系,这一块做得比较缺乏。

  • 平台无关系(platform support):部署在 K8s、物理机、自己的虚机都没问题。

  • 集成与定制(integration and customization):可定制化扩展功能。

1.3.1 断路器

举个生活中的例子解释断路器:

        当电路发生故障或异常时,伴随着电流不断升高,并且升高的电流有可能能损坏电路中的某些重要器件,也有可能烧毁电路甚至造成火灾。若电路中正确地安置了保险丝,那么保险丝就会在电流异常升高到一定的高度和热度的时候,自身熔断切断电流,从而起到保护电路安全运行的作用。

        断路器也称为服务熔断,在多个服务调用的时候,服务 A 依赖服务 B,服务 B 依赖服务 C,如果服务 C 响应时间过长或者不可用,则会让服务 B 占用太多系统资源,而服务 A 也依赖服 B,同时也在占用大量的系统资源,造成系统雪崩的情况出现。 Istio 断路器通过网格中的边车对流量进行拦截判断处理,避免了在代码中侵入控制逻辑,非常方便的就实服务熔断的能力。

        在微服务架构中,在高并发情况下,如果请求数量达到一定极限(可以自己设置阈值),超出了设置的阈值,断路器会自动开启服务保护功能,然后通过服务降级的方式返回一个友好的提示给客户端。假设当 10 个请求中,有 10% 失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到 10s 之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开。 

服务降级(提高用户体验效果)

        比如电商平台,在针对 618、双 11 的时候会有一些秒杀场景,秒杀的时候请求量大,可能会返回报错标志“当前请求人数多,请稍后重试”等,如果使用服务降级,无法提供服务的时候,消费者会调用降级的操作,返回服务不可用等信息,或者返回提前准备好的静态页面写好的信息,而不是错误代码(如 404、502 等)。

1.3.2 超时

        什么时候需要用到超时?在生产环境中经常会碰到由于调用方等待下游的响应过长,堆积大量的请求阻塞了自身服务,造成雪崩的情况,通过超时处理来避免由于无限期等待造成的故障,进而增强服务的可用性。下面通过例子来理解:

  1. nginx 服务设置了超时时间为 3 秒,如果超出这个时间就不在等待,返回超时错误;

  2. httpd 服务设置了响应时间延迟 5 秒,任何请求都需要等待5秒后才能返回;

  3. client 通过访问 nginx 服务去反向代理 httpd 服务,由于 httpd 服务需要5秒后才能返回,但 nginx 服务只等待 3 秒,所以客户端会提示超时错误。

1.3.3 重试

        istio 重试机制就是如果调用服务失败,Envoy 代理尝试连接服务的最大次数。而默认情况下,Envoy 代理在失败后并不会尝试重新连接服务。

        客户端调用 nginx,nginx 将请求转发给 tomcat。tomcat 通过故障注入而中止对外服务,nginx 设置如果访问 tomcat 失败则会重试 3 次。 

1.3.4 多路由规则

  • HTTP重定向(HTTPRedirect)

  • HTTP重写(HTTPRewrite)

  • HTTP重试(HTTPRetry)

  • HTTP故障注入(HTTPFaultInjection)

  • HTTP跨域资源共享(CorsPolicy)

二、架构和原理

2.1 Istio 架构

istio 服务网格从逻辑上分为数据平面和控制平面:

2.1.1 数据平面由一组以 Sidecar 方式部署的智能代理(Envoy+Polit-agent)组成。

        这些代理承载并控制微服务之间的所有网络通信,管理入口和出口流量,类似于一线员工。Sidecar 一般和业务容器绑定在一起(在 Kubernets 中以自动注入的方式注入到到业务 pod 中),来劫持业务应用容器的流量,并接受控制面组件的控制,同时会向控制面输出日志、跟踪及监控数据。

Envoy 和 pilot-agent 封装在同一个镜像中,即 sidecar Proxy。

2.1.2 控制平面负责管理和配置代理来路由流量

        istio1.5+ 中使用了一个全新的部署模式,重建了控制平面,将原有的多个组件整合为一个单体结构 istiod,这个组件是控制平面的核心,管理 Istio 的所有功能,主要包括 Pilot、Mixer、Citadel 等服务组件。

        istiod 是新版本中最大的变化,以一个单体组件替代了原有的架构,降低了复杂度和维护难度,但原有的多组件并不是被完全移除,而是在重构后以模块的形式整合在一起组成了 istiod。

2.2 Istio 原理

结合下图我们来理解 Istio 的各组件的功能及相互之间的协作方式:

2.2.1 自动注入

        在创建应用程序时自动注入 Sidecar 代理 Envoy 程序。在 Kubernetes 中创建 Pod 时,Kube-apiserver 调用控制面组件的 Sidecar-Injector 服务,自动修改应用程序的描述信息并注入 Sidecar。在真正创建 Pod 时,在创建业务容器的 Pod 中同时创建 Sidecar 容器。

2.2.2 流量拦截

        在 Pod 初始化时设置 iptables 规则,基于配置的 iptables 规则拦截业务容器的 Inbound 流量和 Outbound 流量到 Sidecar 上。而应用程序感知不到 Sidecar 的存在,还以原本的方式进行互相访问。上图中,流出 frontend 服务的流量会被 frontend 服务侧的 Envoy拦截,而当流量到达forecast 容器时,Inbound 流量被 forecast 服务侧的 Envoy 拦截。

2.2.3 服务发现

        服务发起方的 Envoy 调用控制面组件 Pilot 的服务发现接口获取目标服务的实例列表。上图中,frontend 服务侧的 Envoy 通过 Pilot 的服务发现接口得到 forecast 服务各个实例的地址。

2.2.4 负载均衡

        服务发起方的 Envoy 根据配置的负载均衡策略选择服务实例,并连接对应的实例地址。上图中,数据面的各个 Envoy 从 Pilot 中获取 forecast 服务的负载均衡配置,并执行负载均衡动作。

2.2.5 流量治理

        Envoy 从 Pilot 中获取配置的流量规则,在拦截到 Inbound 流量和 Outbound 流量时执行治理逻辑。上图中, frontend 服务侧的 Envoy 从 Pilot 中获取流量治理规则,并根据该流量治理规则将不同特征的流量分发到 forecast 服务的 v1 或 v2 版本。

2.2.6 访问安全

        在服务间访问时通过双方的 Envoy 进行双向认证和通道加密,并基于服务的身份进行授权管理。上图中,Pilot 下发安全相关配置,在 frontend 服务和 forecast 服务的 Envoy 上自动加载证书和密钥来实现双向认证,其中的证书和密钥由另一个管理面组件 Citadel 维护。

2.2.7 服务监测

        在服务间通信时,通信双方的 Envoy 都会连接管理面组件 Mixer 上报访问数据,并通过 Mixer 将数据转发给对应的监控后端。上图中,frontend 服务对 forecast 服务的访问监控指标、日志和调用链都可以通过这种方式收集到对应的监控后端。

2.2.8 策略执行

        在进行服务访问时,通过 Mixer 连接后端服务来控制服务间的访问,判断对访问是放行还是拒绝。上图中,Mixer 后端可以对接一个限流服务对从 frontend 服务到 forecast 服务的访问进行速率控制等操作。

2.2.9 外部访问

        在网格的入口处有一个 Envoy 扮演入口网关的角色。上图中,外部服务通过 Gateway 访问入口服务 frontend,对 frontend 服务的负载均衡和一些流量治理策略都在这个 Gateway 上执行。

2.2.10 为什么代理会叫 sidecar proxy?

        看了上图就容易懂了,sidecar 和 proxy 相生相伴,就像摩托车(motor)与旁边的车厢(sidecar)。未来,sidecar 和 proxy 就指微服务进程解耦成两个进程之后,提供基础能力的那个代理进程。 

三、Istio 组件详解

3.1 Pilot

Pilot 是 Istio 的主要控制组件,下发指令控制客户端。在整个系统中,Pilot 完成以下任务:

  1. 从 Kubernetes 或者其他平台的注册中心获取服务信息,完成服务发现过程。

  2. 读取 Istio 的各项控制配置,在进行转换之后,将其发给数据面进行实施。

        Pilot 将配置内容下发给数据面的 Envoy,Envoy 根据 Pilot 指令,将路由、服务、监听、集群等定义信息转换为本地配置,完成控制行为的落地。

  • Pilot 为 Envoy 提供服务发现;

  • 提供流量管理功能(例如,A/B 测试、金丝雀发布等)以及弹性功能(超时、重试、熔断器等);

  • 生成 envoy 配置;

  • 启动 envoy;

  • 监控并管理 envoy 的运行状况,比如 envoy 出错时 pilot-agent 负责重启 envoy,或者 envoy配置变更后 reload envoy。

        简单来说,Pilot 是为我们提供配置智能路由(如 A/B 测试、⾦丝雀发布等)、弹性(超时、重发、熔断等)等功能的管理系统,它提供了⼀系列 rules api,允许运维⼈员指定⼀系列⾼级的流量管理规则。Pilot 负责将我们的配置转换并写⼊到每个 sidecar(Enovy)。 

3.2 Envoy

        Envoy 是用 C++ 开发的高性能代理,用于协调服务网格中所有服务的入站和出站流量。Envoy 有许多强大的功能,例如:动态服务发现、负载均衡、TLS 终端、HTTP/2 与 gRPC 代理、断路器、健康检查、流量拆分、灰度发布、故障注入等。

Istio 中 Envoy 与服务什么关系?

为了便于理解 Istio 中 Envoy 与服务的关系,下图为 Envoy 的拓扑图,如图所示:

        Envoy 和 Service A 同属于一个 Pod,共享网络和命名空间,Envoy 代理进出 Pod A 的流量,并将流量按照外部请求的规则作用于 Service A 中。

Pilot-agent 是什么?

        Envoy 不直接跟 k8s 交互,是通过 pilot-agent 管理的。Pilot-agent 进程根据 K8S APIserver 中的配置信息生成 Envoy 的配置文件,并负责启动 Envoy 进程。

        Envoy由 Pilot-agent 进程启动,启动后,Envoy 读取 Pilot-agent 为它生成的配置文件,然后根据该文件的配置获取到 Pilot 的地址,通过数据面从 pilot 拉取动态配置信息,包括路由(route),监听器(listener),服务集群(cluster)和服务端点(endpoint)。

3.3 Citadel

        负责处理系统上不同服务之间的 TLS 通信。 Citadel 充当证书颁发机构(CA),并生成证书以允许在数据平面中进行安全的 mTLS 通信。

        Citadel 是 Istio 的核心安全组件,提供了自动生成、分发、轮换与撤销密钥和证书功能。Citadel 一直监听 Kube- apiserver,以 Secret 的形式为每个服务都生成证书密钥,并在 Pod 创建时挂载到 Pod 上,代理容器使用这些文件来做服务身份认证,进而代理两端服务实现双向 TLS 认证、通道加密、访问授权等安全功能。如下图所示,frontend 服务对 forecast 服务的访问用到了HTTP 方式,通过配置即可对服务增加认证功能,双方的 Envoy 会建立双向认证的 TLS 通道,从而在服务间启用双向认证的 HTTPS。

3.4 Galley

        Galley 是 istio 的配置验证、提取、处理和分发的组件。Galley 是提供配置管理的服务。实现原理是通过 k8s 提供的 ValidatingWebhook 对配置进行验证。

        Galley 使 Istio 可以与 Kubernetes 之外的其他环境一起工作,因为它可以将不同的配置数据转换为 Istio 可以理解的通用格式。

3.5 Ingressgateway

        Ingressgateway 就是入口处的 Gateway,从网格外访问网格内的服务就是通过这个 Gateway进行的。istio-ingressgateway 是一个 Loadbalancer 类型的 Service,不同于其他服务组件只有一两个端口,istio-ingressgateway 开放了一组端口,这些就是网格内服务的外部访问端口。如下图所示,网格入口网关 istio-ingressgateway 的负载和网格内的 Sidecar 是同样的执行流程,也和网格内的其他 Sidecar 一样从 Pilot 处接收流量规则并执行。

3.6 Sidecar-injector

        Sidecar-injector 是负责自动注入的组件,只要开启了自动注 入,在 Pod 创建时就会自动调用istio-sidecar-injector 向 Pod 中注入 Sidecar 容器。在 Kubernetes 环境下,根据自动注入配置,Kube-apiserver 在拦截到 Pod 创建的请求时,会调用自动注入服务 istio-sidecar-injector 生成 Sidecar 容器的描述并将其插入原 Pod 的定义中,这样,在创建的 Pod 内除了包括业务容器,还包括 Sidecar 容器,这个注入过程对用户透明。

3.7 其他组件

        除了以 “istio” 为前缀的 Istio 自有组件,在集群中一般还安装 Jaeger-agent、Jaeger-collector、Jaeger-query、Kiali、Prometheus、Grafana、 Tracing、Zipkin 等组件,这些组件提供了 Istio的调用链、监控等功能,可以选择安装来完成完整的服务监控管理功能。

四、架构和组件图快速理解

五、k8s-v1.23 及以上版本安装 istio 新版微服务

k8s-v1.23 集群环境:

5.1 下载 Istio

Istio GitHub 下载地址:GitHub - istio/istio: Connect, secure, control, and observe services.

注意:k8s-v1.23 及以上版本建议下载 Istio 1.13.1 及以上版本较为稳妥!

[root@k8s-master1 ~]# mkdir istio
[root@k8s-master1 ~]# cd istio/
[root@k8s-master1 istio]# wget https://github.com/istio/istio/releases/download/1.13.1/istio-1.13.1-linux-amd64.tar.gz
[root@k8s-master1 istio]# ls
istio-1.13.1-linux-amd64.tar.gz

[root@k8s-master1 istio]# tar -zxvf istio-1.13.1-linux-amd64.tar.gz
[root@k8s-master1 istio]# cd istio-1.13.1/

# 把 istioctl 这个可执行文件拷贝到 /usr/bin/ 目录
[root@k8s-master1 istio-1.13.1]# cp -a bin/istioctl /usr/bin/

5.2 安装 Istio(在 master 上执行)

# 查看 istio 当前⽀持的安装模式
[root@k8s-master1 istio-1.13.1]# istioctl profile list
Istio configuration profiles:
    default                    # 默认安装
    demo                       # 完全安装
    empty
    external
    minimal                    # 最⼩安装
    openshift
    preview
    remote

# 安装 istio,如果按照失败重复执行此命令,因为是从官网拉取的镜像,容易超时(耐心等待即可)
[root@k8s-master1 istio-1.13.1]# istioctl manifest apply --set profile=demo -y
✔ Istio core installed                                                                                                                                  
✔ Istiod installed                                                                                                                                      
✔ Ingress gateways installed                                                                                                                            
✔ Egress gateways installed                                                                                                                             
✔ Installation complete                                                                                                                                 Making this installation the default for injection and validation.

5.3  验证 istio 是否部署成功

[root@k8s-master1 istio-1.13.1]# kubectl get pods -n istio-system 
NAME                                   READY   STATUS    RESTARTS   AGE
istio-egressgateway-76c96658fd-8x67k   1/1     Running   0          17m
istio-ingressgateway-569d7bfb4-4qgn7   1/1     Running   0          17m
istiod-74c64d89cb-qjsr4                1/1     Running   0          21m

[root@k8s-master1 istio-1.13.1]# kubectl get svc -n istio-system 
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                      AGE
istio-egressgateway    ClusterIP      10.99.152.105    <none>        80/TCP,443/TCP                                                               17m
istio-ingressgateway   LoadBalancer   10.97.113.77     <pending>     15021:30405/TCP,80:32530/TCP,443:30759/TCP,31400:30091/TCP,15443:32393/TCP   17m
istiod                 ClusterIP      10.105.198.190   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP

5.4 Istio IngressGateway 代理配置

        由于在本地安装,并没有 ELB,默认 istio-ingressgateway 的服务类型为 LoadBalancer,所以需要安装 Nginx 代理,通过 nodePort 端口向其转发流量。

[root@k8s-master1 istio-1.13.1]# kubectl get svc -n istio-system |grep istio-ingressgateway
istio-ingressgateway   LoadBalancer   10.97.113.77     <pending>     15021:30405/TCP,80:32530/TCP,443:30759/TCP,31400:30091/TCP,15443:32393/TCP   8h

        安装 Nginx 并配置代理, 端口的映射与 istio-ingressgateway 保持一致(如 80 端口转发到32530 端口): 

[root@k8s-master1 istio-1.13.1]# yum install -y nginx
[root@k8s-master1 istio-1.13.1]# vim /etc/nginx/nginx.conf
······
events {
    worker_connections 1024;
}

stream {
    server {
        listen 80;
        proxy_pass 192.168.78.143:32530;
    }
    server {
        listen 443;
        proxy_pass 192.168.78.143:30759;
    }
    server {
        listen 31400;
        proxy_pass 192.168.78.143:30091;
    }
    server {
        listen 15021;
        proxy_pass 192.168.78.143:30405;
    }
    server {
        listen 15443;
        proxy_pass 192.168.78.143:32393;
    }
}
······

[root@k8s-master1 istio-1.13.1]# yum -y install nginx-all-modules.noarch

[root@k8s-master1 istio-1.13.1]# systemctl enable --now nginx.service 

5.5 卸载 istio

# 卸载 istio 命令(不用执行)
istioctl manifest generate --set profile=demo | kubectl delete -f -

六、通过 Istio 部署在线书店 bookinfo

bookinfo 官方文档:Istio / Bookinfo Application

6.1 在线书店功能介绍

        在线书店 bookinfo 该应用由四个单独的微服务构成,这个应用模仿在线书店的一个分类,显示一本书的信息,页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。

Bookinfo 应用分为四个单独的微服务:

  1. productpage 这个微服务会调用 details 和 reviews 两个微服务,用来生成页面;

  2. details 这个微服务中包含了书籍的信息;

  3. reviews 这个微服务中包含了书籍相关的评论,它还会调用 ratings 微服务;

  4. ratings 这个微服务中包含了由书籍评价组成的评级信息。

reviews 微服务有 3 个版本:

  1. v1 版本不会调用 ratings 服务;

  2. v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息;

  3. v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

下图展示了这个应用的端到端架构:

        Bookinfo 应用中的几个微服务是由不同的语言编写的。这些服务对 istio 并无依赖,但是构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。 

6.2 部署 bookinfo 应用原理

        要在 Istio 中运行这一应用,无需对应用自身做出任何改变。 只要简单的在 Istio 环境中对服务进行配置和运行,具体一点说就是把 Envoy sidecar 注入到每个服务之中。 最终的部署结果将如下图所示:

        所有的微服务都和 Envoy sidecar 集成在一起,被集成服务所有的出入流量都被 envoy sidecar 所劫持,这样就为外部控制准备了所需的 Hook,然后就可以利用 Istio 控制平面为应用提供服务路由、遥测数据收集以及策略实施等功能。 

6.3 启动应用服务

6.3.1 进入 istio 安装目录

# istio 默认自动注入 sidecar,需要为 default 命名空间打上标签 istio-injection=enabled
[root@k8s-master1 istio-1.13.1]# pwd
/root/istio/istio-1.13.1
[root@k8s-master1 istio-1.13.1]# kubectl label namespace default istio-injection=enabled

6.3.2 使用 kubectl 部署应用

[root@k8s-master1 istio-1.13.1]# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml 

# 确认所有的服务和 Pod 都已经正确的定义和启动
[root@k8s-master1 istio-1.13.1]# kubectl get pods 
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-5498c86cf5-6jqxj       2/2     Running   0          4m53s
productpage-v1-65b75f6885-f8zxf   2/2     Running   0          4m53s
ratings-v1-b477cf6cf-knbnh        2/2     Running   0          4m53s
reviews-v1-79d546878f-d7szq       2/2     Running   0          4m53s
reviews-v2-548c57f459-qvk9p       2/2     Running   0          4m53s
reviews-v3-6dd79655b9-8jr2p       2/2     Running   0          4m53s

[root@k8s-master1 istio-1.13.1]# kubectl get svc
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.109.213.136   <none>        9080/TCP   5m14s
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP    38d
productpage   ClusterIP   10.99.255.231    <none>        9080/TCP   5m13s
ratings       ClusterIP   10.96.108.34     <none>        9080/TCP   5m13s
reviews       ClusterIP   10.107.33.3      <none>        9080/TCP   5m13s

6.3.3 确认 Bookinfo 应用是否正在运行

# 在某个 Pod 中用 curl 命令对应用发送请求,例如 ratings:
[root@k8s-master1 istio-1.13.1]# kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"

# 显示如下信息表示应用正常运行:
<title>Simple Bookstore App</title>

6.3.4 部署服务网关

        现在 Bookinfo 服务已经启动并运行,你需要使应用程序可以从 Kubernetes 集群外部访问,例如从浏览器访问,那可以用 Istio Gateway 来实现这个目标。

[root@k8s-master1 istio-1.13.1]# kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml 

# 确认网关创建完成
[root@k8s-master1 istio-1.13.1]# kubectl get gateways
NAME               AGE
bookinfo-gateway   7m18s

# 确定 ingress ip 和端口
[root@k8s-master1 istio-1.13.1]# kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                                      AGE
istio-ingressgateway   LoadBalancer   10.97.113.77   <pending>     15021:30405/TCP,80:32530/TCP,443:30759/TCP,31400:30091/TCP,15443:32393/TCP   61m

        如果 EXTERNAL-IP 值已设置,说明环境正在使用外部负载均衡,可以用其为 ingress gateway 提供服务。 如果 EXTERNAL-IP 值为 <none>(或持续显示<pending>), 说明环境没有提供外部负载均衡,无法使用 ingress gateway。在这种情况下,你可以使用服务的 NodePort 访问网关。

        若自身环境未使用外部负载均衡器,需要通过 node port 访问。可以通过以下命令获取 Istio Gateway 的地址:

[root@k8s-master1 istio-1.13.1]# export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')

[root@k8s-master1 istio-1.13.1]# export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')

6.3.5 设置 GATEWAY_URL

# 192.168.78.143 是安装 istio 的机器,即 k8s 控制节点 master1 的 ip
INGRESS_HOST=192.168.78.143
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
echo $GATEWAY_URL

# 确认可以从集群外部访问应用
[root@k8s-master1 istio-1.13.1]# curl -s http://${GATEWAY_URL}/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

6.3.6 在浏览器访问

        用浏览器打开网址 http://$GATEWAY_URL/productpage,也就是 192.168.78.143/productpage 来浏览应用的 Web 页面。如果刷新几次应用的页面,就会看到 productpage 页面中会随机展示 reviews 服务的不同版本的效果(红色、黑色的星形或者没有显示)。

上一篇文章:【Kubernetes 企业项目实战】06、基于 Jenkins+K8s 构建 DevOps 自动化运维管理平台(下)_Stars.Sky的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring】手动实现简易AOP和IOC

前言 XML&#xff1a;通过Dom4j对XML进行解析和验证。 IOC&#xff1a;通过获取要创建对象的Class类型、构造函数后&#xff0c;通过反射来实现。 AOP&#xff1a;通过使用JDK动态代理和Cglib动态代理实现。 一、解析XML 1.1、解析bean标签 /*** 解析bean标签* param xmlBean…

前端面试当中CDN会问啥------CDN详细教程来啦

⼀、CDN 1. CDN的概念 CDN&#xff08;Content Delivery Network&#xff0c;内容分发⽹络&#xff09;是指⼀种通过互联⽹互相连接的电脑⽹络系统&#xff0c;利 ⽤最靠近每位⽤户的服务器&#xff0c;更快、更可靠地将⾳乐、图⽚、视频、应⽤程序及其他⽂件发送给⽤户&…

代谢组学资讯,全球爆火的ChatGPT,是如何看待三阴性乳腺癌的?

领导说 今天下午6点前必须发出一篇推文 我表面毫无波澜实则内心风起云涌 那么问题来了 我如何才能在下班前发送推文准时下班呢 我要怎么写才能获得趣粉们的认可呢 全球爆火的ChatGPT&#xff0c;让我的格局一下打开~&#xff0c;它能不能成为我的“得力助手”&#xff1f;…

跳空缺口指标公式,主图显示向上向下跳空缺口

跳空缺口包含两种类型&#xff0c;向上跳空缺口和向下跳空缺口。向上跳空缺口是指当天最低价高于昨天的最高价&#xff0c;K线图出现缺口。向下跳空缺口是指当天最高价低于昨天的最低价&#xff0c;K线图出现缺口。 注意一下&#xff0c;上面的缺口定义与百科上有区别&#xf…

授权验证方式有很多、但AOP最为优雅。

前言 有时候项目中需要对接口进行校验&#xff0c;增加鉴权&#xff0c;确保 API 不被恶意调用。 项目中都是这样 这样&#xff0c;部分需要查询一些信息&#xff0c;下文需要使用 这样的代码很多&#xff0c;重复率太高。看着我蛋疼&#xff0c;对此优化一下。 方案 1 …

剑指offer 7 数组中和为0的三个数

此问题属于nsum问题&#xff0c;题目链接&#xff1a;力扣 要求在数组中找到不重复的三元组&#xff0c;三个数加起来为0&#xff0c;且每个下标只能用一次。而且需要返回所有这样的不重复数组。 1. 排序 双指针 1. 「不重复」的本质是什么&#xff1f;我们保持三重循环的大…

SpringBoot——日志文件

基本概念 日志文件记录了程序的报错信息&#xff0c;执行时间&#xff0c;用户的登录状态&#xff0c;操作时间等等 通过日志&#xff0c;我们可以轻松的找到程序的问题&#xff0c;得到程序的相关信息 springBoot启动时控制台打印的这些&#xff0c;就是程序的日志 创建日志…

Kafka报错:Controller 219 epoch 110 failed to change state for partition

集群里面kafka报错&#xff1a;Controller 219 epoch 110 failed to change state for partition maxwell_atlas-0 from OfflinePartition to OnlinePartitionkafka.common.stateChangeFailedException: Failed to elect leader for partition maxwell_atlas-0 under strategy …

SpringWeb

SpringWeb 概述 springWeb 是 spring 框架的一个模块&#xff0c;springWeb 和 spring 无需通过中间整 合层进行整合。 springWeb 是一个基于 mvc 的 web 框架,方便前后端数据的传输. SpringWeb 拥有控制器&#xff0c;接收外部请求&#xff0c;解析参数传给服务层. SpringM…

盘点界面组件DevExtreme 2023年值得期待的一些新功能!

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…

一文学会进程控制

目录进程的诞生fork函数fork的本质fork的常规用法fork调用失败的原因进程的死亡进程退出的场景常见的进程退出方法正常终止&#xff08;代码跑完&#xff09;echo $?main函数返回调用exit调用_exitexit和_exit的区别进程等待进程等待的重要性进程等待的函数waitwaitpid进程退出…

uniapp中条件编译

官方&#xff1a;https://uniapp.dcloud.net.cn/tutorial/platform.html#%E8%B7%A8%E7%AB%AF%E5%85%BC%E5%AE%B9 #ifndef H5 代码段… #endif 表示除了H5其他都可以编译 #ifdef H5 代码段… #endef 表示只能编译H5&#xff0c;其他的都不能编译 其他编译平台请查看官方文档。 …

连接器产业深度分析报告,国产化替代如何突出重围?(附厂商名录)

前言 2022年3-4月&#xff0c;上海疫情的封城举措&#xff0c;使得其它地区连接器类产品难以进入上海产业链&#xff0c;车载连接器的终端供应受阻&#xff0c;最终影响到全国多家车企生产&#xff1b; 同年12月&#xff0c;欧洲理事会批准—2024年12月28日之前&#xff0c;各类…

MySQL数据库调优————索引调优技巧

长字段的索引调优 当某张表需要给一个长字段创建索引时&#xff0c;因为索引长度越长&#xff0c;效率越差&#xff0c;所以我们需要对其进行优化。 创建额外的长字段的Hash值列 当长字段需要创建索引时&#xff0c;我们可以为其创建额外的一列&#xff0c;用其Hash值作为值…

如何利用Power Virtual Agents机器人实现成绩查询服务

今天我们继续介绍如何利用Power Virtual Agents来实现成绩查询服务。设计思路是在PVA聊天机器人的对话框中输入学生的姓名和学号来进行成绩的查询。首先&#xff0c;在Microsoft 365的OneDrive中制作一个Excel格式的成绩单。 可以将学生的学号、姓名、各学科成绩进行添加。 在P…

【初探人工智能】2、雏形开始长成

【初探人工智能】2、雏形开始长成【初探人工智能】2、雏形开始长成安装Flask封装Web接口雏形设置接收参数功能验证聊天写代码代码补全生成图片写在后面笔者初次接触人工智能领域&#xff0c;文章中错误的地方还望各位大佬指正&#xff01; 【初探人工智能】2、雏形开始长成 在…

限时活动|凭徽章领披萨大奖,玩转Moonbeam治理论坛

动动手指&#xff0c;无需每天打卡&#xff0c;用刷手机的零碎时间领一份Web3惊喜&#xff01; 本次挑战的目标是鼓励大家参与社区治理、熟悉论坛操作。有关参与方式和原因的信息在Twitter上共享&#xff1a;有兴趣可以和ThinkWildCrypto一起探索论坛以解锁其功能、了解最近和正…

【虹科干货】如何有效运用虹科任意波形发生器工作模式?

图 1&#xff1a;显示从存储器到输出的数据路径的 AWG 概念框图 01引言 任意波形发生器 (AWG) 的强大功能之一是它们可以生成几乎无限数量的波形。 AWG 的工作模式控制这些波形输出方式的时序。 在本应用说明中&#xff0c;我们将研究虹科Spectrum M4i.66xx 系列 AWG 工作模式…

JVM的GC机制和常见GC算法

文章目录[toc]1. 堆内存的分代2. GC分类3. 什么是GC3.1 需要GC的内存区域3.2 GC回收的对象3.3 判断对象存活的两种算法3.3.1 引用计数3.3.2 可达性分析3.4 什么时候触发GC4. 常见的GC算法4.1 标记-清除算法4.2 复制算法4.3 标记-压缩算法1. 堆内存的分代 堆中内存分为新生代和老…

String类 [上]

一、编码的基础介绍 编码&#xff1a;是信息从一种形式或格式转换为另一种形式的过程。 ASCLL 编码表:主要表示的是英文的编码表 Unicode&#xff1a;是为了解决传统的字符编码方案的局限而产生的&#xff0c;它为每种语言中的每个字符设定了统一并且唯一的二进制编码二进制编码…