Istio 在阿里云容器服务的部署及流量治理实践

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 在阿里云容器服务 Kubernetes 集群上部署 Istio 服务网格;实践灰度发布、故障注入、熔断等 Istio 流量管理特性

目标

  • 在阿里云容器服务 Kubernetes 集群上部署 Istio 服务网格
  • 实践灰度发布、故障注入、熔断等 Istio 流量管理特性

准备工作

  1. 安装和设置 kubectl 客户端,请参考不同的操作系统,如果已经安装请忽略:
  • macOS
curl -LO https://kubectl.oss-cn-hangzhou.aliyuncs.com/macos/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl --help
AI 代码解读
  • Linux
curl -LO https://kubectl.oss-cn-hangzhou.aliyuncs.com/linux/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl --help
AI 代码解读
  • Windows
kubectl --help
AI 代码解读

配置 kubectl 连接 Kubernetes 集群的配置,可参考文档 通过kubectl连接Kubernetes集群

实验步骤

部署Istio

  • 登录容器服务控制台,在集群列表中选择一个集群,打开更多 - 部署 Istio

image-20190622232804619

  • 保持默认配置,点击"部署 Istio"

  • 等待完成后,Istio 已经成功部署在 Kubernetes 集群中
  • 使用 kiali 查看服务网格可视化
kubectl port-forward -n istio-system "$(kubectl get -n istio-system pod --selector=app=kiali -o jsonpath='{.items..metadata.name}')" 20001
AI 代码解读

在本地浏览器中访问 http://localhost:20001 ,使用默认账户 admin/admin 登录

灰度发布

  • 创建命名空间并开启 Sidecar 自动注入:单击左侧导航栏中的集群 > 命名空间,进入命令空间页面,创建一个名称为 demo 的命名空间,并为其添加一个 istio-injection:enabled 的标签

image-20190622233445202

  • 单击左侧导航栏中服务网格 > 虚拟服务,进入虚拟服务(Virtual Service)页面,点击创建,创建一个简单的示例应用,指定应用名称为istio-app,指定应用版本为v1,选择刚刚创建的命名空间 demo

image-20190622234614452

  • 配置应用容器,使用如下镜像:registry.cn-beijing.aliyuncs.com/test-node/node-server:v1

img

  • 配置服务,服务名称为istio-app-svc,类型为虚拟集群 IP服务端口容器端口均为8080

image-20190622234710167

  • 提交应用配置,将会自动创建 Deployment、Service、DestinationRule、VirtualService

image-20190622234737721

  • 单击导航栏中的应用 > 容器组,确认所有的 Pod 都已经正确的定义和启动

image-20190622234902719

  • 创建服务客户端测试应用
kubectl apply -n demo -f - <<EOF
apiVersion: v1
kind: Service
metadata:
  name: sleep
  labels:
    app: sleep
spec:
  ports:
  - port: 80
    name: http
  selector:
    app: sleep
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: sleep
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: sleep
    spec:
      containers:
      - name: sleep
        image: registry.cn-hangzhou.aliyuncs.com/aliacs/curl
        command: ["/bin/sleep", "3650d"]
        imagePullPolicy: IfNotPresent
EOF
AI 代码解读
  • 在测试应用的 Pod 中访问 Istio 应用:登录到 sleep 应用的 Pod 中
kubectl exec -it -n demo "$(kubectl get -n demo pod --selector=app=sleep -o jsonpath='{.items..metadata.name}')" sh
AI 代码解读

执行如下命令调用之前部署的 Istio 应用:

for i in `seq 1000`
do
curl http://istio-app-svc.demo:8080;
echo '';
sleep 1;
done;
AI 代码解读

可以看到返回的信息:

Hello from v1
Hello from v1
Hello from v1
AI 代码解读
  • 单击左侧导航栏中服务网格 > 虚拟服务,进入虚拟服务(Virtual Service)页面,找到istio-app-svc服务,点击管理,在版本管理中,点击增加灰度版本,新的版本指定为v2

img

在容器配置中使用以下镜像:registry.cn-beijing.aliyuncs.com/test-node/node-server:v2

img

在灰度策略中选择基于流量比例发布,流量比例 50%

img

  • 提交灰度发布后,查看 sleep 应用的调用结果,可以看到,v1v2版本的返回结果
Hello from v1
Hello from v2
Hello from v1
Hello from v1
Hello from v2
Hello from v1
AI 代码解读
  • 在 kiali 中查看,可以确认,调用被分发到两个版本中

image-20190617181420143

故障注入

  • 目前应用工作正常,我们为 istio-app-svc 注入故障,以测试整个应用的弹性。在 istio-app-svc 的管理界面中,打开故障注入策略,选择注入中断故障,百分比 50%,状态码 503

  • 提交后,继续查看 sleep 应用的调用结果,即可看到 istio-app-svc 服务约有 50% 的概率无法访问,输出fault filter abort
Hello from v1
Hello from v1
Hello from v1
fault filter abort
fault filter abort
fault filter abort
Hello from v1
Hello from v2
fault filter abort
Hello from v2
Hello from v2
AI 代码解读

同时,在 kiali 可视化界面中,也可以看到 sleep 服务对 istio-app-svc 服务的调用有 50% 左右的失败比例

image-20190617182052462

  • 除此之外,我们也可以为服务注入时延故障,例如在上述界面中,选择时延故障,为 50% 的请求添加 5s 的时延

image-20190617222242352

  • 确认提交之后,我们可以看到,部分调用的耗时显著增加。在 kiali 中也可以查看调用的平均请求耗时

image-20190617222423492

  • 删除故障注入策略和灰度版本 v2

image-20190617225448653

熔断

当一个服务出现故障或者延迟增大时,如果不采取措施,问题可能会逐渐传导到其他服务,导致整个应用瘫痪。在这个场景下,我们可以通过为服务调用配置熔断规则,来隔离故障。

在这一部分,我们为上述 istio-app-svc 服务配置连接池限制,使其具备熔断能力。

  • 使用 kubectl,在 DestinationRule 中设置熔断规则:
kubectl delete destinationrule -n demo istio-app-svc
kubectl apply -n demo -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: istio-app-svc
spec:
  host: istio-app-svc
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
  subsets:
  - labels:
      version: v1
    name: v1
EOF
AI 代码解读
  • 部署一个 HTTP 客户端,用于负载测试
kubectl apply -n demo -f https://istio-demo.oss-cn-hangzhou.aliyuncs.com/yaml/fortio-deploy.yaml
AI 代码解读
  • 首先使用客户端发出 100 个 HTTP 请求,并发数为 1
FORTIO_POD=$(kubectl -n demo get pod | grep fortio | awk '{ print $1 }')
kubectl -n demo exec -it $FORTIO_POD  -c fortio /usr/bin/fortio -- load -c 1 -qps 0 -n 100 -loglevel Warning http://istio-app-svc:8080
AI 代码解读

此时所有的请求都成功返回,没有触发熔断,符合我们配置的连接池参数。

Code 200 : 100 (100.0 %)
AI 代码解读
  • 在上面的熔断设置中指定了 maxConnections: 1 以及 http1MaxPendingRequests: 1。这意味着如果超过了一个连接同时发起请求,Istio 就会熔断,阻止后续的请求或连接。因此我们以并发数为 3,发出 100 个请求:
FORTIO_POD=$(kubectl -n demo get pod | grep fortio | awk '{ print $1 }')
kubectl -n demo exec -it $FORTIO_POD  -c fortio /usr/bin/fortio -- load -c 3 -qps 0 -n 100 -loglevel Warning http://istio-app-svc:8080
AI 代码解读

从结果中,可以看到,有超过 40% 的请求被 Istio 阻断了。

Code 200 : 57 (57.0 %)
Code 503 : 43 (43.0 %)
Response Header Sizes : count 100 avg 130.53 +/- 113.4 min 0 max 229 sum 13053
Response Body/Total Sizes : count 100 avg 242.14 +/- 0.9902 min 241 max 243 sum 24214
All done 100 calls (plus 0 warmup) 0.860 ms avg, 2757.6 qps
AI 代码解读

在 kiali 中观察可以发现,这部分请求并没有真正到达 istio-app-svc 的 Pod

image-20190617224742580

  • 通过查询 istio-proxy 的状态,可以获得更多信息,upstream_rq_pending_overflow 的值即为被熔断策略阻止的请求数
kubectl -n demo exec -it $FORTIO_POD -c istio-proxy -- sh -c 'curl localhost:15000/stats' | grep istio-app-svc | grep pending

cluster.outbound|8080|v1|istio-app-svc.demo-ab.svc.cluster.local.upstream_rq_pending_active: 0
cluster.outbound|8080|v1|istio-app-svc.demo-ab.svc.cluster.local.upstream_rq_pending_failure_eject: 0
cluster.outbound|8080|v1|istio-app-svc.demo-ab.svc.cluster.local.upstream_rq_pending_overflow: 99
cluster.outbound|8080|v1|istio-app-svc.demo-ab.svc.cluster.local.upstream_rq_pending_total: 199
AI 代码解读

清理实验环境

执行以下命令:

kubectl delete ns demo
AI 代码解读
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
指北
+关注
目录
打赏
0
0
0
0
46538
分享
相关文章
基于虚拟服务配置的渐进式迁移实践:Istio集群至ASM集群的平滑切换
本文介绍了从Istio+k8s环境迁移到阿里云ASM+ACK环境的渐进式方法,通过配置虚拟服务和入口服务实现新老集群间的服务调用与流量转发,确保业务连续性与平滑迁移
584 131
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
课时5:阿里云容器服务:最原生的集成Docker和云服务
容器化AI模型的监控与治理:确保模型持续稳定运行
在前几篇文章中,我们探讨了AI模型的容器化部署及构建容器化机器学习流水线。然而,将模型部署到生产环境只是第一步,更重要的是确保其持续稳定运行并保持性能。为此,必须关注容器化AI模型的监控与治理。 监控和治理至关重要,因为AI模型在生产环境中面临数据漂移、概念漂移、模型退化和安全风险等挑战。全面的监控涵盖模型性能、数据质量、解释性、安全性和版本管理等方面。使用Prometheus和Grafana可有效监控性能指标,而遵循模型治理最佳实践(如建立治理框架、定期评估、持续改进和加强安全)则能进一步提升模型的可信度和可靠性。总之,容器化AI模型的监控与治理是确保其长期稳定运行的关键。
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
DeepSeek大解读系列公开课上新!阿里云专家主讲云上智能算力、Kubernetes容器服务、DeepSeek私有化部署
智猩猩「DeepSeek大解读」系列公开课第三期即将开讲,聚焦阿里云弹性计算助力大模型训练与部署。三位专家将分别讲解智能算力支撑、Kubernetes容器服务在AI场景的应用实践、以及DeepSeek一键部署和多渠道应用集成,分享云计算如何赋能大模型发展。欲观看直播,可关注【智猩猩GenAI视频号】预约。 (239字符)
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
容器技术实践:在Ubuntu上使用Docker安装MySQL的步骤。
通过以上的操作,你已经步入了Docker和MySQL的世界,享受了容器技术给你带来的便利。这个旅程中你可能会遇到各种挑战,但是只要你沿着我们划定的路线行进,你就一定可以达到目的地。这就是Ubuntu、Docker和MySQL的灵魂所在,它们为你开辟了一条通往新探索的道路,带你亲身感受到了技术的力量。欢迎在Ubuntu的广阔大海中探索,用Docker技术引领你的航行,随时准备感受新技术带来的震撼和乐趣。
34 16
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
93 30

相关产品

  • 容器计算服务