4个步骤排查istio服务网格的网络问题

标签: istio 服务 网格 | 发表时间:2020-10-12 11:51 | 作者:Kingsluck
出处:http://weekly.dockone.io

对 istio 用户而言,最常见的场景之一是将 istio 用作 ingress 网关,通过其暴露微服务给外部客户端访问。具体而言有两种典型的方式。一种是只运行业务服务的容器,不携带 sidecar。另一种是运行携带 sidecar 的 Pod,业务服务和 ingress 网关之间建立 mTLS 双向认证进行通信。

最近,笔者帮一位 istio 用户排查问题:为什么通过 istio ingress 网关暴露的服务不能被 istio 网格外部的 CURL 客户端访问到。下文记录了笔者排查问题时的关键步骤,希望能帮助到遇到类似问题的用户。

1. 使用 istioctl analyzer 命令

使用 istioctl analyzer 命令排查和故障服务相关的每个 istio 资源,这是我最喜欢用的 istioctl 命令。

Analyzer允许用户检查特定命名空间(namespace)或是整个 Kubernetes 集群里的每一个YAML文件。最佳实践是,在用户部署 istio 资源之前,用 analyzer 命令检查 istio 待部署资源(如 gateway,virtual service)相关的 YAML 文件。这可以帮助用户提前发现问题。

shell
$ istioctl analyze helloworld-gw-nlb.yaml -n istio-system
✔ No validation issues found when analyzing namespace: istio-system.


如果 istio 资源已经生效,用户还可以将analyzer命令作用于整个集群,以检查现有集群是否存在和用户冲突的路由(route)。执行 istioctl analyze --all-namespaces 可以检查整个集群。

2. 验证 secret 是否被正确加载

出于安全考虑,用户会以加密的方式访问服务,可能是单边TLS或双向TLS认证。用户要确保 secret 在 ingress 网关中被正确加载,以便 ingress 网关能对入站流量进行加密。

istioctl proxy-config secret 命令可以帮助用户检查 ingress 网关中加载了哪些 secret,还可以通过它验证secret 的加载的时间及其有效时长。例如,下面的命令列出了ingress 网关加载的名为 mycluster-wdc06-b-406454-85f044fc29ce613c264409c04a76c95d-0001 secret 的具体信息,它是在安装 istio 过程中默认生成在 istio-system 命名空间下的。

shell
$ istioctl proxy-config secret istio-ingressgateway-768c6bf77b-2k7hm.istio-system
RESOURCE NAME TYPE STATUS VALID CERT SERIAL NUMBER NOT AFTER NOT BEFORE
mycluster-wdc06-b-406454-85f044fc29ce613c264409c04a76c95d-0001 Cert Chain ACTIVE true 415111668488852830681974512193801089848052 2020-12-05T09:43:42Z 2020-09-06T09:43:42Z


3. 检查 istio 网络资源

接下来就轮到检查边缘服务(edge serivce)相关的 gateway、virtual service 资源,以确保它们被正确地引用。

对于 gateway 资源,需要验证以下几点:

  • a. gateway 的命名空间正确,和网关所部署的命名空间一致。

  • b. gateway 中 credentialName 要和上述步骤2中网关加载的 secret 名称一致。在 istio1.7 版本中,secret 要和 gateway 归属于同一个命名空间。

  • c. host 字段填写正确。如果 virtual service 部署在了另一个命名空间,笔者建议在 host 字段加上该命名空间作为前缀。例如,hello/.。

  • d. 如果用户使用了自定义网关,确保选择器(selector)匹配。相关 gateway 资源的选择器必须和网关 deployment 的选择器匹配。


helloworld-gw-nlb.yaml:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: helloworld-gateway
namespace: istio-system # step a
spec:
selector:
istio: ingressgateway # step d
servers:
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: mycluster-wdc06-b-406454-85f044fc29ce613c264409c04a76c95d-0001 # step b
hosts:
- "hello/hello.mycluster-wdc06-b-406454-85f044fc29ce613c264409c04a76c95d-0001.us-east.containers.appdomain.cloud". #step c


对于 virtual service 则需要注意以下几点:

  • a. 确保 gateway 字段引用正确。如果 virtual service 引用了另一个命名空间的 gateway 对象,要在
    gateway前加上该命名空间作为前缀。

  • b. host 字段要和 gateway 资源里指定的值一致。

  • c. 确保 route 配置了正确的目标地址。当涉及到多个命名空间的流量转发时,host字段要补全。


helloworld-vs.yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: helloworld
namespace: hello # step a
spec:
hosts:
- "hello.mycluster-wdc06-b-406454-85f044fc29ce613c264409c04a76c95d-0001.us-east.containers.appdomain.cloud" # step b
gateways:
- istio-system/helloworld-gateway # step a
http:
- match:
- uri:
exact: /hello
route:
- destination:
host: helloworld.hello.svc.cluster.local # step c
port:
number: 5000


4. 检查 ingress 网关的日志

检查ingress网关的日志,验证请求被网关正确接收,检查是否有错误日志。可以通过这篇文档

Requests are rejected by Envoy 查阅如何分析 ingress 网关日志及常见错误码释义。

有时候,为了方便查错,需要打开 ingress 网关的debug日志,可以通过如下命令实现:

istioctl proxy-config log {ingress-pod}.istio-system --level

或者通过以下命令检查Envoy配置是否正确:

istioctl dashboard envoy {ingress-pod}.istio-system

可以通过 Debugging Envoy and Istiod了解如何debug Envoy配置。

总结

通过以上技巧,笔者希望能帮助到大家快速定位排查 istio 相关的网络问题。

如果你还有问题,欢迎随时访问链接 Istio GitHub issuecollect all required information,提出你的issue。希望你有一个愉快的istio使用体验,无论你是否在 IBM 云上的 istio。

原作者:Lin Sun
原文地址: 4 steps to debug your edge microservices in an Istio service mesh

相关 [istio 服务 网格] 推荐:

4个步骤排查istio服务网格的网络问题

- - DockOne.io
对 istio 用户而言,最常见的场景之一是将 istio 用作 ingress 网关,通过其暴露微服务给外部客户端访问. 一种是只运行业务服务的容器,不携带 sidecar. 另一种是运行携带 sidecar 的 Pod,业务服务和 ingress 网关之间建立 mTLS 双向认证进行通信. 最近,笔者帮一位 istio 用户排查问题:为什么通过 istio ingress 网关暴露的服务不能被 istio 网格外部的 CURL 客户端访问到.

Istio 中的服务和流量的抽象模型

- - IT瘾-dev
本文介绍了 Istio 和 Kubernetes 中的一些服务和流量的抽象模型. 虽然 Istio 一开始确定的抽象模型与对接的底层平台无关,但目前来看基本绑定 Kubernetes,本文仅以 Kubernetes 说明. 另外在 ServiceMesher 社区中最近有很多关于 Istio、Envoy、Kubernetes 之中的服务模型关系的讨论,本文作为一个开篇说明,Kubernetes 和 Isito 之间有哪些共有的服务模型,Istio 在 Kubernetes 的服务模型之上又增加了什么,为什么说 Kubernetes service 存在的意义仅剩下做服务发现.

微服务全链路跟踪:jaeger集成istio,并兼容uber-trace-id与b3 - lipeng的个人空间 - OSCHINA

- -
微服务全链路跟踪:grpc集成zipkin. 微服务全链路跟踪:grpc集成jaeger. 微服务全链路跟踪:springcloud集成jaeger. 微服务全链路跟踪:jaeger集成istio,并兼容uber-trace-id与b3. 微服务全链路跟踪:jaeger集成hystrix. 公司有自己的一套基于k8s的paas系统,并且集成了istio,这里主要是想讲解下springcloud服务如何集成istio.

Istio 常见的 10 个异常分析

- - DockOne.io
本文总结了使用 Istio 常见的 10 个异常. Istio 支持多平台,不过 Istio 和 Kubernetes 的兼容性是最优的,不管是设计理念,核心团队还是社区, 都有一脉相承的意思. 但 Istio 和 Kubernetes 的适配并非完全没有冲突,一个典型问题就是 Istio 需要 Kubernetes Service 按照协议进行端口命名(Port Naming).

洞若观火:使用 OpenTracing 增强 Istio 的调用链跟踪

- - IT瘾-dev
分布式调用跟踪和Opentracing规范. 什么是Opentracing. CNCF Opentracing项目. Opentracing概念模型. Opentracing数据模型. Istio对分布式调用跟踪的支持. 使用Opentracing来传递分布式跟踪上下文. 在Istio调用跟踪链中加入方法级的调用跟踪信息.

Service Mesh 最火项目: Istio 架构解析

- - IT瘾-tuicool
Istio 是一个开源的服务网格,可为分布式微服务架构提供所需的基础运行和管理要素. 随着各组织越来越多地采用云平台,开发者必须使用微服务设计架构以实现可移植性,而运维人员必须管理包含混合云部署和多云部署的大型分布式应用. Istio 采用一种一致的方式来保护、连接和监控微服务,降低了管理微服务部署的复杂性.

从一个例子入手Istio - luozhiyun - 博客园

- -
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:. 本文使用的Istio源码是 release 1.5. 本篇是Istio系列的第一篇,希望大家接下来能和我一起学习进步. Klegs的作品,颜色有一种深邃感,我很喜欢. 这篇文章是Istio系列文章的开篇,主要从一个例子入手讲一下Istio,并讲解一些基础概念,后面会基于这个例子来展开讲解istio里面的实现原理.

Service Mesh 最火项目 Istio 分层架构,你真的了解吗?

- - DockOne.io
作者 | 王夕宁  阿里巴巴高级技术专家. 参与“阿里巴巴云原生”公众号文末留言互动,即有机会获得赠书福利. 本文摘自于由阿里云高级技术专家王夕宁撰写的《Istio 服务网格技术解析与实践》一书,文章从基础概念入手,介绍了什么是服务网格及 Istio,针对 2020 服务网格的三大发展趋势,体系化、全方位地介绍了 Istio 服务网格的相关知识.

Kong 开源的的服务网格Kuma爬过了K8S这座大山

- -
2019年9月10日,Kong正式宣布开源一款Service Mesh:Kuma. 此消息一出,立即在云原生社区引起反响,各大媒体争相报道. 让我们跟随SDxCentral的总编辑,一起来看看Kong的CTO如何介绍Kuma这款Service Mesh产品以及对于SMI的看法. 关于Kuma的具体功能介绍可以阅读官网博客以及Github.

服务禁语

- tiancaicai - 白板报
前几天在一个公交汽车站拍到了一张规定,里面规定了服务禁语和礼貌用语,看了大乐. 3、乘车高峰车厢内拥挤时,禁语:“快往里走,站在前面又没有钞票检. ”文明语:“请尽量往里走,照顾没有上车的乘客”. 4、车子抛锚,禁语:“车子抛锚没有办法,人都要生毛病的,车子坏了也正常. ”文明语:“对不起,车子出现故障修一下,请大家理解.