istioctl是istio的客户端命令行工具, 常用于对istio中的出现的各种问题进行诊断.istioctl支持非常多的命令, 这篇主要以proxy status、 proxy-config两个命令为主, 更多其它的命令, 可参考这里
所有操作都是基于官方提供的book-info示例进行,也是对上一篇对envoy的配置文件进行流量分析的补充.
istioctl proxy-status
istioctl proxy-status, 可以简写这istioctl ps, 一般用于检测envoy是否与pilot的连接成功, 如果不成功, 则无法获得pilot下发的配置文件
istioctl proxy-config
Istioctl proxy-config, 可以简写为istioctl pc, 主要用于查看各种资源对象,这里主要列举几个比较常用的命令
istioctl是个多级命令行工具, 都可直接通过-h 来查看用法
比如这里可以使用istioctl pc bootstrap -h 来查看二级命令bootstrap能够接受的参数
以下都会使用details-v1-78d78fbddf-z9cpj.default这个应用来做为示例
比如说, 从details中访问reviews:9080, envoy的处理逻辑是这样的
listener –> route –> cluster –> endpoint
下面通过istioctl命令行进行分析
pc bootstrap
检索pod 中 Envoy 实例的 bootstrap 配置的信息
从这个命令可以得到envoy启动时的一些静态参数,比如pilot地址, prometheus地址等.
1 | istioctl pc bootstrap details-v1-78d78fbddf-z9cpj.default |
pc listener
检索pod 中 Envoy 实例的监听器配置的信息
1 | istioctl pc listener details-v1-78d78fbddf-z9cpj.default --port=9080 --address=0.0.0.0 |
从listener中获取routeconfigname:
pc route
检索pod中Envoy 实例的路由配置的信息, 从listener获取到的9080的routeconfigname来获取route
1 | istioctl pc route details-v1-78d78fbddf-z9cpj.default |
可以看到跟9080相关的route有5条, 找到与reviews相关的信息
1 | istioctl pc route details-v1-78d78fbddf-z9cpj.default --name=9080 -ojson |
virutalhosts中的domains一项列出的所有的跟reviews相关的域名及域名:端口,envoy会把domain中的字符串与请求中的host做对比
这里匹配/ 然后转到cluster为outbound|9080||reviews.default.svc.cluster.local
pc cluster
检索pod 中 Envoy 实例的集群配置的信息
1 | istioctl pc cluster details-v1-78d78fbddf-z9cpj.default |
说明
- PORT: 指定端口, 一般与kubernetes中的svc端口一致
- SUBSET: 使用该字段对集群进行过滤
- DIRECTION: 表明是出向流量还是入向流量
- TYPE: 这个svc是静态(STATIC)配置还是通过EDS动态获取的
使用–fqdn 指定svc, 先看一个动态类型(EDS)
1 | istioctl pc cluster details-v1-78d78fbddf-z9cpj.default --fqdn details.default.svc.cluster.local --direction outbound -ojson |
![image-20200210180657173](/Users/zhoushuke/Library/Application Support/typora-user-images/image-20200210180657173.png)
再看一个静态类型(STATIC)
1 | istioctl pc cluster details-v1-78d78fbddf-z9cpj.default --direction inbound --fqdn details.default.svc.cluster.local -ojson |
如果是入向流量, 在cluster中的endpoint是127.0.0.1,因为这时请求已经被转发到了该容器上,直接响应即可
这里找到reviews与有关的cluster
1 | istioctl pc cluster details-v1-78d78fbddf-z9cpj.default --fqdn=reviews.default.svc.cluster.local -ojson |
pc endpoint
检索特定 pod 中 Envoy 实例的 endpoint 配置的信息
1 | istioctl pc endpoints details-v1-78d78fbddf-z9cpj.default |
第一列的endpoint即为真正的业务容器ip,如果实例有多个话就会有多行
比如这里通过上面动态类型的cluster来获取ep
1 | istioctl pc endpoints details-v1-78d78fbddf-z9cpj.default --cluster="outbound|9080||reviews.default.svc.cluster.local" |
![image-20200210191055227](/Users/zhoushuke/Library/Application Support/typora-user-images/image-20200210191055227.png)
由于reviews有3个实例, 因此有3条记录
最终根据发起方配置的负载均衡策略选出一个实例进行响应
至此整个请求路由就完成, 当然实际使用中还会进行一些其它的操作如重试、熔断等策略, 其原理是一样的.