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

  1. 登录容器服务控制台,在集群列表中选择一个集群,打开更多 - 部署 Istio
  2. 保持默认配置,点击"部署 Istio"
  3. 等待完成后,Istio 已经成功部署在 Kubernetes 集群中
  4. 使用 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 登录

灰度发布

  1. 创建命名空间并开启 Sidecar 自动注入:单击左侧导航栏中的集群 > 命名空间,进入命令空间页面,创建一个名称为 demo 的命名空间,并为其添加一个 istio-injection:enabled 的标签
  2. 单击左侧导航栏中服务网格 > 虚拟服务,进入虚拟服务(Virtual Service)页面,点击创建,创建一个简单的示例应用,指定应用名称为istio-app,指定应用版本为v1,选择刚刚创建的命名空间 demo
  3. 配置应用容器,使用如下镜像:registry.cn-beijing.aliyuncs.com/test-node/node-server:v1
  4. 配置服务,服务名称为istio-app-svc,类型为虚拟集群 IP ,服务端口容器端口均为8080
  5. 提交应用配置,将会自动创建 Deployment、Service、DestinationRule、VirtualService
  6. 单击导航栏中的应用 > 容器组,确认所有的 Pod 都已经正确的定义和启动
  7. 创建服务客户端测试应用
kubectl apply -n demo -f - <<EOF
apiVersion: v1
kind: Service
metadata:name: sleeplabels:app: sleep
spec:ports:- port: 80name: httpselector:app: sleep
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: sleep
spec:replicas: 1template:metadata:labels:app: sleepspec:containers:- name: sleepimage: pstauffer/curlcommand: ["/bin/sleep", "3650d"]imagePullPolicy: IfNotPresent
EOF
  1. 在测试应用的 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
  1. 单击左侧导航栏中服务网格 > 虚拟服务,进入虚拟服务(Virtual Service)页面,找到istio-app-svc服务,点击管理,在版本管理中,点击增加灰度版本,新的版本指定为v2

在容器配置中使用以下镜像:

registry.cn-beijing.aliyuncs.com/test-node/node-server:v2

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

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

故障注入

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

  

  1. 提交后,继续查看 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% 左右的失败比例

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

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

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

熔断

  1. 在 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-svctrafficPolicy:connectionPool:tcp:maxConnections: 1http:http1MaxPendingRequests: 1maxRequestsPerConnection: 1subsets:- labels:version: v1name: v1- labels:version: v2name: v2
EOF
  1. 部署一个 HTTP 客户端,用于负载测试
kubectl apply -n demo -f https://raw.githubusercontent.com/istio/istio/master/samples/httpbin/sample-client/fortio-deploy.yaml
  1. 在上面的熔断设置中指定了 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

  1. 通过查询 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 pendingcluster.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


原文链接
本文为云栖社区原创内容,未经允许不得转载。

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

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

相关文章

mysql创建操作用户

使用root用户创建一个新的数据库wiki 创建一个新的连接 由于新建的用户名下没有表&#xff0c;因此会抛出异常 就好了

Java-数组的使用

public class ArrayDemo03 {public static void main(String[] args) {int[] arrays {1,2,3,4,5};// JDK1.5&#xff0c; 没有下标&#xff0c;增强写法 // for (int array : arrays) { // System.out.println(array); // }printArray(arrays);Syste…

为何你的 SaaS 想法总是失败?没想清楚这 4 个原因可能会继续失败!

作者 | Elliot Bonneville译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国最初&#xff0c;作者是准备进行一个”7 天 SaaS 挑战“的&#xff0c;但当他真正坐下来的时候就面临了第一个问题&#xff1a;他还没有决定要做什么。不过幸好的是&#xff0c;作者有一个完整…

重磅开源|AOP for Flutter开发利器——AspectD

问题背景 随着Flutter这一框架的快速发展&#xff0c;有越来越多的业务开始使用Flutter来重构或新建其产品。但在我们的实践过程中发现&#xff0c;一方面Flutter开发效率高&#xff0c;性能优异&#xff0c;跨平台表现好&#xff0c;另一方面Flutter也面临着插件&#xff0c;…

Vue-cli 3.X 构建工具零基础快速上手

文章目录一、环境准备1. 安装node2. 配置镜像二、安装Vue CLI2.1. 查看当前vuecli版本2.2. 安装最新版本2.3. 安装指定版本三、创建web项目3.1. 指定创建的项目名称3.2. 安装序列图3.3. 安装序列图简述一、环境准备 声明&#xff1a;命令均在在cmd窗口执行 1. 安装node 2. 配置…

分布式数据库选型——数据水平拆分方案

概述 水平拆分的概念随着分布式数据库的推广已为大部分人熟知。分库分表、异构索引、小表广播、这些功能几乎是产品功能需求标配。然而有些客户使用分布式数据库后的体验不尽如意。本文尝试从数据的角度总结分布式数据的复制&#xff08;replication&#xff09;和分区&#x…

从代码到 Docker、Kubernetes、Istio、Knative……,或许是时候重新思考从代码到云的编程了...

作者 | Lakmal Warusawithana译者 |弯月 责编 | 徐威龙封图| CSDN 下载于视觉中国早些时候&#xff0c;开发人员只需编写程序、构建&#xff0c;然后运行。如今&#xff0c;开发人员还需要考虑各种运行方式&#xff0c;作为可执行文件在机器上运行&#xff08;很有可能是虚拟机…

容器服务Windows Kubernetes使用阿里云日志服务来收集容器日志

目前&#xff0c;容器服务Windows Kubernetes支持将业务容器产生的stdout输出、日志文件同步到阿里云日志服务&#xff08;SLS&#xff09;进行统一管理。 支撑组件安装 在Windows Kubernetes集群安装界面勾选使用日志服务&#xff0c;集群会安装支持日志收集的必要组件logta…

Java-Arrays类

public class ArrayDemo06 {public static void main(String[] args) {int[] a {1,4,2,6,5,8,7};System.out.println(a); //hashCode [I1b6d3586// 打印数组元素 Arrays.toStringSystem.out.println(Arrays.toString(a)); // [1, 4, 2, 6, 5, 8, 7]// 自己写一个方法去打印…

看完这一篇,你就对 Spring Security 略窥门径了 | 原力计划

作者 | BoCong-Deng来源 | CSDN 博客&#xff0c;责编 | 夕颜头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID:CSDNnews&#xff09;写在前面开发Web应用&#xff0c;对页面的安全控制通常是必须的。比如&#xff1a;对于没有访问权限的用户需要转到登录表单页面。要实现访…

Java-冒泡排序

public class ArrayDemo07 {public static void main(String[] args) {int[] a {3,5,1,7,8,4};int[] sort sort(a);System.out.println(Arrays.toString(sort)); // [1, 3, 4, 5, 7, 8]}/*每次将 最大 或 最小的数 后移*/public static int[] sort(int[] array){// 临时变量…

借助 Cloud Toolkit 快速创建 Dubbo 工程

Cloud Toolkit 是一个 IDE 插件&#xff0c;帮助开发者更高效地开发、测试、诊断并部署应用。在最新版的插件中&#xff0c;提供了快速创建 Dubbo 工程的功能&#xff0c;下面就来快速体验下吧。 Dubbo 采用全 Spring 配置方式&#xff0c;透明化接入应用&#xff0c;对应用没…

vue-cli-service不是内部或外部命令,也不是可运行的程序

报错信息: “不是内部或外部命令&#xff0c;也不是可运行的程序” 步骤一: 检查package.json 中是否有 vue-cli-server,没有则需安装 步骤二 : 执行npm install命令 npm run serve

另一种声音:容器是不是未来?

作者 | Ian Eyberg译者 | 天道酬勤 责编 | 徐威龙封图| CSDN 下载于视觉中国CSDN 云计算旨在为读者提供更多角度的声音&#xff0c;本文仅代表作者个人观点&#xff0c;不代表CSDN云计算任何立场。前几天作者看到了这则推文&#xff0c;可以这么说&#xff0c;是它促使我开始就…

Java-稀疏数组

public class ArrayDemo08 {public static void main(String[] args) {// 1. 创建一个二维数组 11*11 0: 没有棋子 1: 黑棋 2: 白棋int[][] array1 new int[11][11];array1[1][2] 1;array1[2][3] 2;// 输出原始的数组System.out.println("输出原始的数组");for…

揭秘|每秒千万级的实时数据处理是怎么实现的?

1、设计背景 闲鱼目前实际生产部署环境越来越复杂&#xff0c;横向依赖各种服务盘宗错节&#xff0c;纵向依赖的运行环境也越来越复杂。当服务出现问题的时候&#xff0c;能否及时在海量的数据中定位到问题根因&#xff0c;成为考验闲鱼服务能力的一个严峻挑战。 线上出现问题…

Vue3.x 使用ref和reactive、toRef

文章目录一、使用ref1. 引入2. 定义ref变量3. 赋值.value4. return 返回值5. 将数据渲染到页面二、使用reactive 和 toRef1. 引入2. 定义reactive变量3. 赋值变量.对象4. return 返回值5. 将数据渲染到页面三、效果图源码3.1. 效果图3.2. 源码一、使用ref 1. 引入 从vue里面引…

同学,要不要来挑战双11零点流量洪峰?

阿里妹导读&#xff1a;双十一的零点&#xff0c;整个电商系统的请求速率到达峰值。如果将这些请求流量只分配给少部分 server&#xff0c;这些机器接收到的请求速率会远超过处理速率&#xff0c;新来的任务来不及处理&#xff0c;就会产生请求任务堆积。 今年的中间件性能挑战…

GitHub 疑遭中间人攻击,最大暗网托管商再被黑!

整理 | 伍杏玲出品 | 程序人生&#xff08;ID&#xff1a;coder_life&#xff09;近期&#xff0c;在全球关注新冠肺炎疫情之际&#xff0c;黑客却频频动作&#xff0c;发动攻击&#xff1a;GitHub 疑遭中间人攻击&#xff0c;无法访问从26日下午开始&#xff0c;有网友表示国内…

Java-什么是面向对象

https://www.bilibili.com/video/BV12J41137hu?p60