Istio详细使用(一)
1.介绍
1.1 简介
Istio 是由 Google、IBM 和 Lyft 开源的微服务管理、保护和监控框架。Istio 为希腊语,意思是”起航“。
Istio 解决了开发人员和运维人员所面临的从单体应用向分布式微服务架构转变的挑战。了解它是如何做到这一点的可以让我们更详细地理解 Istio 的服务网格。
服务网格用来描述组成这些应用程序的微服务网络以及它们之间的交互。随着服务网格的规模和复杂性不断的增长,它将会变得越来越难以理解和管理。它的需求包括服务发现、负载均衡、故障恢复、度量和监控等。服务网格通常还有更复杂的运维需求,比如 A/B 测试、金丝雀发布、速率限制、访问控制和端到端认证。
1.2 特性
- 流量管理:通过丰富的路由规则、重试、故障转移和故障注入,可以对流量行为进行细粒度的控制
- 可观测性:了解服务之间的依赖关系和它们之间的性质和流量,提供快速识别定位问题的能力。
- 策略实施:通过配置mesh而不是以改变代码的方式来控制服务之间的访问策略。
- 服务识别和安全:提供在mesh里的服务可识别性和安全性保护。
1.3 组件
1.4 架构
Istio 服务网格从逻辑上分为数据平面和控制平面。
下图展示了组成每个平面的不同组件:
Istio 的架构分为控制平面和数据平面。
- 数据平面:由一组智能代理(Envoy)以 sidecar 模式部署,协调和控制所有服务之间的网络通信。
- 控制平面:负责管理和配置代理路由流量,以及在运行时执行的政策。
2. 入门以及使用
2.1 安装
安装helm源
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update为 Istio 组件,创建命名空间
istio-system
kubectl create namespace istio-system
安装 Istio base chart,它包含了集群范围的自定义资源定义 (CRD)
helm install istio-base istio/base -n istio-system
安装 Istio discovery chart,它用于部署
istiod
服务helm install istiod istio/istiod -n istio-system
查看安装情况
安装网关
kubectl create namespace istio-ingress
helm install istio-ingress istio/gateway -n istio-ingress –wait
2.2 官方Bookinfo 应用 示例
Bookinfo 应用分为四个单独的微服务:
productpage
:这个微服务会调用details
和reviews
两个微服务,用来生成页面。details
:这个微服务中包含了书籍的信息。reviews
:这个微服务中包含了书籍相关的评论。它还会调用ratings
微服务。ratings
:这个微服务中包含了由书籍评价组成的评级信息。
reviews
微服务有 3 个版本:
- v1 版本不会调用
ratings
服务。 - v2 版本会调用
ratings
服务,并使用 1 到 5 个黑色星形图标来显示评分信息。 - v3 版本会调用
ratings
服务,并使用 1 到 5 个红色星形图标来显示评分信息。
下图展示了这个应用的端到端架构。
Bookinfo 应用中的几个微服务是由不同的语言编写的。 这些服务对 Istio 并无依赖,但是构成了一个有代表性的服务网格的例子: 它由多个服务、多个语言构成,并且 reviews
服务具有多个版本。
2.2.1 启动应用服务
Istio 默认自动注入 Sidecar. 请为
default
命名空间打上标签istio-injection=enabled
:kubectl label namespace default istio-injection=enabled
使用
kubectl
部署应用kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/bookinfo/platform/kube/bookinfo.yaml
确认所有的服务和 Pod 都已经正确的定义和启动:
要确认 Bookinfo 应用是否正在运行,请在某个 Pod 中用
curl
命令对应用发送请求,例如ratings
:kubectl exec “$(kubectl get pod -l app=ratings -o jsonpath=’{.items[0].metadata.name}’)” -c ratings – curl -sS productpage:9080/productpage | grep -o “
.* “创建网关
使用以下命令创建 Istio Gateway:
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: bookinfo-gateway spec: # The selector matches the ingress gateway pod labels. # If you installed Istio using Helm following the standard documentation, this would be "istio=ingress" selector: istio: ingress # use istio default controller servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" --- apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: bookinfo spec: hosts: - "*" gateways: - bookinfo-gateway http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products route: - destination: host: productpage port: number: 9080
确认网关创建完成:
$ kubectl get gateway NAME AGE bookinfo-gateway 32s
访问
在可以使用 Istio 控制 Bookinfo 版本路由之前,您需要定义可用的版本。
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/bookinfo/networking/destination-rule-all.yaml
kubectl get destinationrules -o yaml
2.3 Kiali——Istio Service Mesh 的可观察性工具
2.3.1Kiali 中的基本概念
在了解 Kiali 如何提供 Service Mesh 中微服务可观察性之前,我们需要先了解下 Kiali 如何划分监控类别的。
- Application:使用运行的工作负载,必须使用 Istio 的将 Label 标记为 app 才算。注意,如果一个应用有多个版本,只要 app 标签的值相同就是属于同一个应用。
- Deployment:即 Kubernetes 中的 Deployment。
- Label:这个值对于 Istio 很重要,因为 Istio 要用它来标记 metrics。每个 Application 要求包括 app 和 version 两个 label。
- Namespace:通常用于区分项目和用户。
- Service:即 Kubernetes 中的 Service,不过要求必须有 app label。
- Workload:Kubernetes 中的所有常用资源类型如 Deployment、StatefulSet、Job 等都可以检测到,不论这些负载是否加入到 Istio Service Mesh 中。
外部引用
[Istio云原生资料库]: https://jimmysong.io/kubernetes-handbook/usecases/istio.html “Istio云原生资料库”
[Istio官网]: https://istio.io/latest/zh/docs/concepts/ “Istio官网”