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
  • Linux
curl -LO https://kubectl.oss-cn-hangzhou.aliyuncs.com/linux/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl --help
  • Windows

https://kubectl.oss-cn-hangzhou.aliyuncs.com/windows/kubectl.exe 放到系统PATH路径下

kubectl --help

配置 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

在本地浏览器中访问 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
  • 在测试应用的 Pod 中访问 Istio 应用:登录到 sleep 应用的 Pod 中
kubectl exec -it -n demo "$(kubectl get -n demo pod --selector=app=sleep -o jsonpath='{.items..metadata.name}')" sh

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

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

可以看到返回的信息:

Hello from v1
Hello from v1
Hello from v1
  • 单击左侧导航栏中服务网格 > 虚拟服务,进入虚拟服务(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
  • 在 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

同时,在 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
  • 部署一个 HTTP 客户端,用于负载测试
kubectl apply -n demo -f https://istio-demo.oss-cn-hangzhou.aliyuncs.com/yaml/fortio-deploy.yaml
  • 首先使用客户端发出 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

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

Code 200 : 100 (100.0 %)
  • 在上面的熔断设置中指定了 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

从结果中,可以看到,有超过 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

在 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

清理实验环境

执行以下命令:

kubectl delete ns demo
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
3天前
|
存储 Kubernetes 监控
使用Kubernetes进行容器编排:技术详解与实践
【5月更文挑战第16天】Kubernetes,简称K8s,是开源容器编排系统,用于自动化部署、扩展和管理容器化应用。核心概念包括节点、Pod(最小部署单元)、服务、标签和副本集。其特点有高可用性、可扩展性、自动化和可移植性。实践使用涉及安装配置集群、编写YAML部署清单、应用部署、监控管理和扩展更新。Kubernetes帮助提升应用的可用性、可扩展性和可移植性。
|
4天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第15天】 在当今的云计算时代,企业为了保持竞争力,不断寻求提高软件交付速度和服务质量的方法。本文将探讨如何通过结合DevOps原则和容器化技术来构建一个既高效又稳定的云基础设施。文章首先介绍了DevOps的核心概念及其如何促进开发与运维的协作,然后详细阐述了容器化技术如何优化应用部署和运行环境。最后,通过一个实际案例分析,展示了这种融合策略在提升自动化水平、加快部署速度以及增强系统稳定性方面的具体成效。
|
4天前
|
运维 监控 Kubernetes
构建高效自动化运维体系:基于容器技术的持续集成与持续部署(CI/CD)实践
【5月更文挑战第15天】 随着云计算和微服务架构的普及,传统的IT运维模式面临转型压力。为提高软件交付效率并降低运维成本,本文探讨了利用容器技术实现自动化运维的有效策略。重点分析了在持续集成(CI)和持续部署(CD)流程中,容器如何发挥作用,以及它们如何帮助组织实现敏捷性和弹性。通过具体案例研究,文章展示了容器化技术在自动化测试、部署及扩展中的应用,并讨论了其对系统稳定性和安全性的影响。
|
4天前
|
运维 监控 安全
构建高效自动化运维系统:基于容器技术的持续集成与持续部署(CI/CD)实践
【5月更文挑战第14天】 随着DevOps文化的深入人心,持续集成与持续部署(CI/CD)已成为现代软件工程不可或缺的组成部分。本文将探讨如何利用容器技术,尤其是Docker和Kubernetes,构建一个高效、可扩展的自动化运维系统。通过深入分析CI/CD流程的关键组件,我们将讨论如何整合这些组件以实现代码从提交到生产环境的快速、无缝过渡。文章还将涉及监控、日志管理以及安全性策略等运维考量,为读者提供一个全面的自动化运维解决方案蓝图。
|
4天前
|
运维 监控 Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第14天】 在当今快速迭代的软件发展环境中,传统的IT运维模式已难以满足业务需求。本文探讨了如何通过DevOps文化和容器化技术的融合来构建一个高效且稳定的云基础设施。文中不仅分析了DevOps的核心理念及其对于提升运维效率的影响,还深入剖析了容器化技术如Docker和Kubernetes在自动化部署、弹性伸缩及微服务架构中的关键作用。此外,文章还将分享一系列实践经验,帮助读者理解如何在实际工作中将DevOps与容器化技术有效结合,以支持业务的敏捷性和可靠性。
18 2
|
4天前
|
Kubernetes Cloud Native 持续交付
构建高效稳定的云原生应用:容器编排与微服务治理实践
【5月更文挑战第14天】 随着企业数字化转型的深入,云原生技术以其弹性、敏捷和可扩展的特性成为现代应用开发的首选模式。本文将探讨如何通过容器编排工具如Kubernetes以及微服务架构的有效治理,构建和维护高效且稳定的云原生应用。我们将分析容器化技术的优势,并结合案例讨论在多云环境下实现持续集成、持续部署(CI/CD)的最佳实践,同时解决微服务带来的分布式复杂性问题。通过本文的阐述,读者将获得一套提升系统可靠性和业务连续性的策略框架。
7 0
|
4天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第14天】 随着云计算的普及和企业数字化转型的深入,构建一个高效、稳定且能快速响应市场变化的云基础设施已成为众多组织的技术战略核心。本文将探讨如何通过DevOps文化和容器化技术的结合,实现自动化运维流程,提升服务部署效率,确保系统的可扩展性和高可用性。我们还将分析面临的挑战及解决方案,并展示在实际案例中的应用成果。
6 0
|
4天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于容器技术的持续集成与部署实践
【5月更文挑战第13天】 在现代软件开发周期中,持续集成(CI)和持续部署(CD)已成为提升开发效率、保障产品质量的关键环节。随着云计算和微服务架构的普及,容器技术如Docker和Kubernetes为运维领域带来了革命性的变革。本文旨在探讨如何利用容器技术构建一个高效、可靠的自动化运维体系,实现从代码提交到产品发布的全过程自动化管理。通过深入分析容器化技术的核心原理,结合实际案例,我们将阐述如何优化持续集成流程、确保自动化测试的覆盖率、以及实现无缝的持续部署。
26 2
|
4天前
|
安全 Devops 测试技术
深入了解阿里云云效DevOps:构建高效软件开发实践
阿里云云效DevOps,集成CI/CD与自动化测试,提升开发效率。支持持续集成确保代码质量,自动化测试加速交付,多环境及灰度发布保障安全可靠性。助团队构建高效开发实践,增强竞争力。
19 1
|
4天前
|
存储 监控 Apache
查询提速11倍、资源节省70%,阿里云数据库内核版 Apache Doris 在网易日志和时序场景的实践
网易的灵犀办公和云信利用 Apache Doris 改进了大规模日志和时序数据处理,取代了 Elasticsearch 和 InfluxDB。Doris 实现了更低的服务器资源消耗和更高的查询性能,相比 Elasticsearch,查询速度提升至少 11 倍,存储资源节省达 70%。Doris 的列式存储、高压缩比和倒排索引等功能,优化了日志和时序数据的存储与分析,降低了存储成本并提高了查询效率。在灵犀办公和云信的实际应用中,Doris 显示出显著的性能优势,成功应对了数据增长带来的挑战。
查询提速11倍、资源节省70%,阿里云数据库内核版 Apache Doris 在网易日志和时序场景的实践

相关产品

  • 容器计算服务

  • http://www.vxiaotou.com