使用 Istio 实现流量管理、安全和可观测性
1. 金丝雀发布与流量转移
当开发了微服务的新版本并想将其推向用户时,为降低对整个服务的潜在影响,可采用金丝雀发布(Canary Rollout)策略,也称为蓝绿部署。其核心是渐进式方法,逐步将流量从旧版本(蓝)转移到新版本(绿)。具体步骤如下:
1.
初始发布
:现有版本继续为大多数用户提供服务。
2.
早期访问
:选定一小部分有代表性的用户或系统作为金丝雀组,让他们接收新版本。
3.
监控和评估
:密切监控金丝雀组中软件的性能和行为,收集指标、日志和用户反馈,以识别问题或异常。
4.
逐步扩展
:若新版本在金丝雀组中表现稳定且符合预期,逐步将其推广到更广泛的用户群体。每次可按小比例“提升”用户到新版本。
5.
持续监控
:在整个发布过程中,持续监控和分析至关重要,以便及时发现和解决出现的问题。若检测到问题,可暂停或回滚发布以保护大多数用户。
6.
全面部署
:新版本通过金丝雀发布阶段的验证后,最终向所有用户开放。
以下是将 ratings-v2 服务向 20% 用户推出的示例,使用的 VirtualService 资源如下:
http:
- route:
- destination:
host: ratings
subset: v1
weight: 80
- destination:
host: ratings
subset: v2
weight: 20
此配置中,v1 目的地权重为 80,v2 目的地权重为 20,意味着 20% 的流量将导向 ratings 微服务的 v2 版本。
操作步骤:
$ cd ~/mdo-environments/manifests/blog-app
$ cp ~/modern-devops/ch15/traffic-management/virtual-services-canary.yaml \
virtual-services.yaml
$ git add --all
$ git commit -m "Canary rollout"
$ git push
Argo CD 同步完成后,刷新页面 10 次,会发现黑色星星出现约 2 次,这就是金丝雀发布的实际效果。可继续监控应用并逐步调整权重,将流量导向 v2。
2. 流量镜像
流量镜像(Traffic Mirroring),也称为影子测试,是一种在生产环境中测试代码的方法,可在不向最终用户暴露应用的情况下使用实时流量进行测试。传统的企业会维护一个与生产环境相似的预发布环境,运维团队在该环境中部署新版本,测试人员生成模拟流量进行测试。但这种方法存在维护成本高、模拟流量与实际流量有偏差等问题。
流量镜像的工作原理如下:
1. 部署应用的新版本并激活流量镜像。
2. 旧版本像往常一样响应请求,同时将流量的异步副本发送到新版本。
3. 新版本处理镜像流量,但不向最终用户响应。
4. 运维团队监控新版本的行为,并将问题报告给开发团队。
为 ratings 服务配置流量镜像,修改 ratings 虚拟服务如下:
http:
- route:
- destination:
host: ratings
subset: v1
weight: 100
mirror:
host: ratings
subset: v2
mirror_percent: 100
此配置将所有初始路由到 ratings:v1 的流量镜像并同时发送到 v2。
操作步骤:
$ cp ~/modern-devops/ch15/traffic-management/virtual-services-mirroring.yaml \
virtual-services.yaml
$ git add --all
$ git commit -m "Mirror traffic"
$ git push
Argo CD 同步完成后,刷新页面 5 次,可通过以下命令检查 ratings:v1 服务的日志:
$ kubectl logs $(kubectl get pod -n blog-app | \
grep "ratings-" | awk '{print $1}') -n blog-app
同样,可通过以下命令检查 ratings:v2 服务的日志:
$ kubectl logs $(kubectl get pod -n blog-app | \
grep "ratings-v2" | awk '{print $1}') -n blog-app
会发现两个服务的日志和时间戳完全匹配,证明了流量镜像功能正常。流量镜像能有效识别传统基础设施设置中难以发现的问题,是进行软件版本操作验收测试的强大方法。
3. Istio 的流量观测和告警
Istio 利用 Envoy 代理作为微服务容器的边车组件,这些代理在服务网格中引导和管理流量,同时收集有价值的遥测数据。这些数据会传输到 Prometheus 进行存储和可视化,常与 Grafana 结合使用,以提供对遥测数据的直观可视化,帮助有效监控和管理服务网格。
3.1 安装可观测性插件
使用以下命令安装可观测性插件:
$ cd ~
$ mkdir ~/mdo-environments/manifests/istio-system
$ cd ~/mdo-environments/manifests/istio-system/
$ cp ~/modern-devops/ch15/observability/*.yaml .
$ git add --all
$ git commit -m "Added observability"
$ git push
代码推送后,Argo CD 会创建新的 istio-system 命名空间并安装插件。
3.2 访问 Kiali 仪表盘
Kiali 是用于微服务和服务网格管理的强大可观测性和可视化工具,可提供服务网格行为的实时洞察。由于 Kiali 服务部署在集群 IP 上,未对外暴露,需进行端口转发以访问其仪表盘:
$ kubectl port-forward deploy/kiali -n istio-system 20001:20001
端口转发会话启动后,点击 Google Cloud Shell 的 Web 预览图标,选择将端口更改为 20001 并点击预览,即可看到 Kiali 仪表盘。点击“Graph”标签并选择 blog-app 命名空间,可切换到图形视图,查看流量流动、成功流量百分比等指标。
3.3 使用 Grafana 进行监控和告警
Grafana 是领先的开源可观测性和监控平台,提供动态仪表盘和强大的告警功能。安装 Grafana 后,通过以下命令进行端口转发:
$ kubectl port-forward deploy/grafana -n istio-system 20001:3000
端口转发会话启动后,像访问 Kiali 一样访问 Grafana 页面,进入“Home > Dashboards > Istio > Istio Service Dashboard”,可看到一个仪表盘,提供请求成功率、持续时间、大小、体积和延迟等标准服务级别指标(SLI)的可视化。还可使用 Prometheus 查询语言(PromQL)根据需求构建额外的可视化。
为了实现完整的可靠性,监控和可视化需要与告警相结合。以下是设置告警的步骤:
1.
确定告警标准
:为简化,当流量体积超过每秒 1 笔交易时触发告警。
2.
编写查询语句
:使用以下查询语句获取必要的指标:
round(sum(irate(istio_requests_total{connection_security_policy="mutual_tls",destination_
service=~"frontend.blog-app.svc.cluster.local",reporter=~"destination",source_
workload=~"istio-ingress",source_workload_namespace=~"istio-ingress"}[5m])) by (source_
workload, source_workload_namespace, response_code), 0.001)
此查询确定了通过 Istio 入口网关到前端微服务的所有交易的流量速率。
3.
创建告警规则
:导航到“Home > Alerting > Alert rules”,填写表单设置告警规则。告警规则配置为以 1 分钟为间隔监控违规情况,持续 2 分钟。规则建立后,每 1 - 2 分钟快速刷新 Blog App 主页约 15 - 20 次,即可触发告警。在生产环境中,通常设置较长的检查间隔(约 5 分钟)和告警间隔(15 分钟),以避免过多的临时问题告警。
由于未配置特定的告警通道,触发的告警仅在 Grafana 仪表盘中可见。建议使用 PagerDuty 或 Slack 等工具设置指定的告警目的地,确保关键问题能及时通知相关人员或团队。
总结
通过金丝雀发布和流量镜像等功能,Istio 提供了强大的流量管理能力,降低了生产环境中发布新版本的风险。同时,Kiali 和 Grafana 等工具为服务网格提供了可观测性和告警功能,帮助用户更好地监控和管理服务。在实际应用中,可根据具体需求进一步探索 Istio 的其他特性,以实现更高效、安全的微服务运维。
相关流程图
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(金丝雀发布):::process
B --> C{新版本稳定?}:::decision
C -->|是| D(逐步扩展):::process
C -->|否| E(暂停或回滚):::process
D --> F(全面部署):::process
F --> G(流量镜像):::process
G --> H(监控新版本):::process
H --> I{发现问题?}:::decision
I -->|是| J(报告问题):::process
I -->|否| K(继续监控):::process
K --> L([结束]):::startend
J --> M(修复问题):::process
M --> G
问题解答
| 问题 | 答案 |
|---|---|
| 1. 使用 GitOps 方法安装 Istio 应选择哪种方法? | 文档未提及具体答案,可参考 Istio 文档 https://istio.io/latest/docs/tasks/traffic-management/ 进行探索。 |
| 2. Istio 自动将边车注入工作负载需要什么配置? | A. 为命名空间应用 istio-injection-enabled: true 标签。 |
| 3. Istio 边车是否自动使用 mTLS 相互通信? | 答案为 True。 |
| 4. 哪种资源用于强制执行规定哪些服务可以相互通信的策略? | B. AuthorizationPolicy。 |
| 5. 进行金丝雀发布应使用以下哪些资源?(选两个) | A. VirtualService 和 C. DestinationRule。 |
| 6. 为什么在生产环境中使用流量镜像?(选三个) | A. 实时监控生产性能和行为分析;B. 将流量路由到新版本以复制流量,测试后端服务的性能。 |
使用 Istio 实现流量管理、安全和可观测性
4. 流量管理和可观测性的综合应用
在实际的微服务架构中,流量管理和可观测性是紧密结合的。通过金丝雀发布和流量镜像进行流量管理,同时利用 Kiali 和 Grafana 进行可观测性监控,能够确保服务的稳定运行和高效迭代。
以下是一个综合应用的示例流程:
1.
部署新版本
:使用金丝雀发布策略,将新版本逐步推向一小部分用户,通过 VirtualService 资源配置流量权重,例如:
http:
- route:
- destination:
host: ratings
subset: v1
weight: 80
- destination:
host: ratings
subset: v2
weight: 20
- 监控新版本 :在金丝雀发布过程中,使用 Kiali 仪表盘实时监控服务的运行情况,查看流量流动、成功率等指标。同时,使用 Grafana 对关键指标进行可视化和告警设置。
- 流量镜像测试 :如果需要更深入地测试新版本的性能,可以启用流量镜像功能。配置 VirtualService 资源将流量镜像到新版本:
http:
- route:
- destination:
host: ratings
subset: v1
weight: 100
mirror:
host: ratings
subset: v2
mirror_percent: 100
- 分析和优化 :根据 Kiali 和 Grafana 提供的数据,分析新版本的性能和稳定性。如果发现问题,及时调整流量权重或修复代码。如果新版本表现良好,可以逐步增加其流量权重,直到全面部署。
5. 常见问题及解决方法
在使用 Istio 进行流量管理和可观测性监控时,可能会遇到一些常见问题。以下是一些问题及解决方法:
| 问题 | 解决方法 |
|---|---|
| 金丝雀发布时新版本出现性能问题 | 暂停或回滚发布,检查代码和配置,使用 Grafana 分析性能指标,找出问题所在并修复。 |
| 流量镜像时新版本处理异常 | 检查新版本的代码和配置,确保其能够正确处理镜像流量。同时,使用 Kiali 监控流量流动,查看是否存在异常。 |
| Grafana 告警频繁 | 调整告警规则的阈值和间隔时间,避免对临时问题产生过多告警。同时,检查告警规则的合理性,确保其能够准确反映服务的实际情况。 |
| Kiali 仪表盘数据不准确 | 检查 Istio 和 Kiali 的配置,确保其正常运行。同时,检查 Prometheus 的数据收集和存储情况,确保数据的准确性。 |
6. 总结与展望
Istio 作为一个强大的服务网格解决方案,为微服务架构提供了丰富的流量管理、安全和可观测性功能。通过金丝雀发布、流量镜像等流量管理策略,能够降低新版本发布的风险,确保服务的稳定性。同时,Kiali 和 Grafana 等可观测性工具能够帮助用户实时监控服务的运行情况,及时发现和解决问题。
在未来的微服务架构中,Istio 有望发挥更加重要的作用。随着技术的不断发展,Istio 可能会提供更多的功能和优化,例如更智能的流量管理策略、更强大的安全防护机制等。同时,与其他云原生技术的集成也将更加紧密,为用户提供更加便捷和高效的服务。
相关流程图
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始部署新版本]):::startend --> B(金丝雀发布):::process
B --> C(使用 Kiali 监控):::process
C --> D{新版本性能正常?}:::decision
D -->|是| E(增加流量权重):::process
D -->|否| F(暂停或回滚):::process
E --> G{是否全面部署?}:::decision
G -->|否| B
G -->|是| H(启用流量镜像):::process
H --> I(使用 Grafana 分析):::process
I --> J{发现问题?}:::decision
J -->|是| K(调整或修复):::process
J -->|否| L([结束]):::startend
K --> H
操作步骤总结
为了方便大家回顾和操作,以下是本文中涉及的主要操作步骤总结:
-
金丝雀发布
- 配置 VirtualService 资源:
http:
- route:
- destination:
host: ratings
subset: v1
weight: 80
- destination:
host: ratings
subset: v2
weight: 20
- 提交和推送更改:
$ cd ~/mdo-environments/manifests/blog-app
$ cp ~/modern-devops/ch15/traffic-management/virtual-services-canary.yaml \
virtual-services.yaml
$ git add --all
$ git commit -m "Canary rollout"
$ git push
-
流量镜像
- 配置 VirtualService 资源:
http:
- route:
- destination:
host: ratings
subset: v1
weight: 100
mirror:
host: ratings
subset: v2
mirror_percent: 100
- 提交和推送更改:
$ cp ~/modern-devops/ch15/traffic-management/virtual-services-mirroring.yaml \
virtual-services.yaml
$ git add --all
$ git commit -m "Mirror traffic"
$ git push
- 安装可观测性插件
$ cd ~
$ mkdir ~/mdo-environments/manifests/istio-system
$ cd ~/mdo-environments/manifests/istio-system/
$ cp ~/modern-devops/ch15/observability/*.yaml .
$ git add --all
$ git commit -m "Added observability"
$ git push
- 访问 Kiali 仪表盘
$ kubectl port-forward deploy/kiali -n istio-system 20001:20001
-
使用 Grafana 进行监控和告警
- 端口转发:
$ kubectl port-forward deploy/grafana -n istio-system 20001:3000
- 编写查询语句:
round(sum(irate(istio_requests_total{connection_security_policy="mutual_tls",destination_
service=~"frontend.blog-app.svc.cluster.local",reporter=~"destination",source_
workload=~"istio-ingress",source_workload_namespace=~"istio-ingress"}[5m])) by (source_
workload, source_workload_namespace, response_code), 0.001)
- 创建告警规则:导航到“Home > Alerting > Alert rules”,填写表单设置告警规则。
通过以上步骤,你可以使用 Istio 实现微服务的流量管理、安全和可观测性监控,确保服务的稳定运行和高效迭代。
超级会员免费看

90

被折叠的 条评论
为什么被折叠?



