Istio可观测性
Istio可观测性
Istio的可观测性包括metrics,日志,分布式链路跟踪以及可视化展示。下面主要介绍如何在istio中部署基于Prometheus的metrics监控,基于jaeger的链路跟踪和基于kiali的可视化界面。
Prometheus
配置说明
在istio网格中,每个组件都会暴露一个提供metrics的endpoint。Prometheus可以从这些endpoints上抓取metrics(通过Prometheus配置文件来设置scraping,端口以及TLS等)。
为了采集整个网格的metrics,需要配置Prometheus scraping组件:
- 控制面(
istiod
deployment) - ingress和egress网关
- Envoy sidecar
- 用户应用(如果该应用也可以暴露Prometheus metrics的话)
为了简化metrics的配置,istio提供了如下两种操作模式:
Option 1:合并metrics
为了简化配置,istio可以通过prometheus.io
annotations来控制所有scraping。这使Istio的scraping可以使用标准配置(例如Helm stable/prometheus
charts提供的配置)来做到开箱即用。
该选项默认是启用的,但可以在安装期间通过传入--set meshConfig.enablePrometheusMerge=false
来禁用该功能。当启用时,会在所有的控制面pod上添加prometheus.io
annotations来配置scraping。如果已经存在这些annotations,则会被覆盖。通过该选项,Envoy sidecar会将istio的metrics和应用的metrics进行合并,合并后的metrics暴露地址为:/stats/prometheus:15020
.
通过kubect describe pod命令可以查看pod的annotation,需要注意的是控制面和数据暴露的端口是不同的。数据面暴露的端口为15020,如下:
prometheus.io/path: /stats/prometheus
prometheus.io/port: 15020
prometheus.io/scrape: true
但istiod的端口为15014,ingress-gateway和egress-gateway的端口为15090。总体来说与官方端口描述一致。
该选项会以明文方式暴露所有的metrics。
下面特性可能并不适用于所有场景:
- 在抓取metrcis时启用TLS
- 应用暴露的metrics与istio的metrics的名称相同。例如,应用暴露了一个名为
istio_requests_total
的metric,可能是因为应用本身也运行了Envoy - 部署的Prometheus没有基于标准的
prometheus.io
annotation抓取metrics。
如果有必要,则可以在pod上添加prometheus.istio.io/merge-metrics: "false"
annotation来禁用metrics合并功能。
Option 2:自定义抓取metrics配置
内置的demo profile会安装Prometheus,并包含了所有必要的scraping配置。可以在使用istioctl部署istio时传入参数--set values.prometheus.enabled=true
来部署Prometheus。
但内置的Prometheus缺少高级自定义配置功能,如认证的持久化等,导致其不大合适在生产环境中使用。为了使用已经存在的Prometheus,需要在Prometheus配置中添加scraping配置prometheus/configmap.yaml
。
该配置会添加抓取控制面以及所有Envoy sidecar的metrcis的功能。此外,还配置了一个job,用来抓取添加了prometheus.io
annotation的所有数据面pod的应用metrics。
TLS设置
控制面,网关和Envoy sidecar的metrics都以明文方式暴露。然而,应用metrics会遵循istio对负载的配置。例如如果启用了Strict mTLS,那么Prometheus需要使用istio证书来配置scrape
对于自建的Prometheus,参考为没有sidecar的应用程序提供证书和密钥一文来为Prometheus提供证书,并添加TLS scraping配置。
总结
istio的metrics分为两类:istio自身的metrics和应用产生的metrics,前者以明文方式暴露,后者遵循对应负载的配置,即,如果负载启用了TLS,则Prometheus也需要配置TLS才能获取应用的metrics。
istio的metrics主要通过kubernetes_sd_config服务发现进行采集。其中prometheus.io/path
和prometheus.io/port
annotation分别对应metrics meta_kubernetes_pod_annotation_prometheus_io_scrape
和meta_kubernetes_pod_annotation_prometheus_io_path
。简单配置如下:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: kubernetes_pod_name
更多配置可以参见官方提供的配置。
Jaeger
概述
分布式跟踪使用户可以通过分布在多个服务中的网格跟踪请求。通过这种方式可以了解请求延迟,并通过可视化实现序列化和并行。
Istio利用Envoy的分布式跟踪特性提供开箱即用的跟踪集成。特别地,istio提供了选项来安装不同的跟踪后端,以及配置代理来发送这些后端自动发送跟踪span。查看Zipkin, Jaeger和Lightstep来了解istio如何与这些跟踪系统共同工作。
跟踪上下文的传递
虽然istio代理可以自动发送span,但它们需要一些提示来将整个跟踪联系在一起。应用需要传递合适的HTTP首部,这样当代理发送span信息时,这些span可以正确地关联到单个跟踪中。
为了实现上述目的,应用需要在传入请求中收集并传递如下首部到任何传出请求中:
x-request-id
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
x-ot-span-context
此外,基于OpenCensus (如Stackdriver)的跟踪集成需要传递下面首部:
x-cloud-trace-context
traceparent
grpc-trace-bin
如果查看istio的productpage
例子的Python源码,可以看到应用会使用OpenTracing库从HTTP请求中抽取需要的首部:
def getForwardHeaders(request):
headers = {}
# x-b3-*** headers can be populated using the opentracing span
span = get_current_span()
carrier = {}
tracer.inject(
span_context=span.context,
format=Format.HTTP_HEADERS,
carrier=carrier)
headers.update(carrier)
# ...
incoming_headers = ['x-request-id', 'x-datadog-trace-id', 'x-datadog-parent-id', 'x-datadog-sampled']
# ...
for ihdr in incoming_headers:
val = request.headers.get(ihdr)
if val is not None:
headers[ihdr] = val
return headers
reviews
应用会使用requestHeaders
做类似的事情:
@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(@PathParam("productId") int productId, @Context HttpHeaders requestHeaders) {
// ...
if (ratings_enabled) {
JsonObject ratingsResponse = getRatings(Integer.toString(productId), requestHeaders);
当在应用程序中执行下游调用时,需要包含这些首部。
使用Jaeger
本例将使用Bookinfo。
部署
使用如下方式快速部署一个用于演示的Jaeger。当然也可以参考Jaeger官方文件进行自定义部署。
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/addons/jaeger.yaml
可以参考此处修改采样率
访问Jaeger
上面部署的Jaeger对应的k8s service名为tracing
,查看该service,可以看到容器和service暴露的端口均为16686。
# oc describe svc tracing
Name: tracing
Namespace: istio-system
Labels: app=jaeger
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"jaeger"},"name":"tracing","namespace":"istio-system"},"s...
Selector: app=jaeger
Type: ClusterIP
IP: 10.84.179.208
Port: http-query 80/TCP
TargetPort: 16686/TCP
Endpoints: 10.80.2.226:16686
Session Affinity: None
Events: <none>
在openshift上创建一个route(ingress),即可访问该Jaeger。
使用Boofinfo生成traces
在浏览器上多次访问
http://$GATEWAY_URL/productpage
来生成跟踪信息为了查看跟踪数据,需要服务发送请求。请求的数量取决于istio的采样率,采样率是在安装istio的时候设置的,默认为1%,即在看到第一个trace之前需要至少发送100个请求。使用如下命令向productpage发送100个请求:
$ for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
在dashboard的左边,在Service下拉列表中选择
productpage.default
,并点击Find Traces,可以看到生成了两条span点击最近时间内到
/productpage
的请求的细节此外还可以点击右上角的Alternate Views切换视图,可以更直观地看到请求的访问情况:
trace由一组span构成,每个span对应一个Bookinfo服务,在执行到
/productpage
的请求或内部Istio组件(如istio-ingressgateway
)时生成。
Kiali
本节展示如何可视化istio网格的方方面面。
本节将安装Kiali插件并使用基于Web的图形用户界面查看网格和Istio配置对象的服务图,最后,使用Kiali Developer API以consumable JSON的形式生成图形数据。
本任务并没有涵盖Kiali的所有特性,更多参见Kiali website。
本节将使用Boofinfo应用。
部署
Kiali依赖Prometheus,因此首先要部署Prometheus。使用如下命令快速部署一个用于演示的Prometheus:
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/addons/prometheus.yaml
使用如下方式快速部署一个用于演示的Kiali。如果要用于生产环境,建议参考quick start guide 和customizable installation methods。
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/addons/kiali.yaml
注:由于Kiali依赖Prometheus,因此需要将Kiali和Prometheus关联起来。修改上面kiali.yaml中的如下字段,然后部署即可:
custom_metrics_url: http://prometheus.istio-system.svc.cluster.local:9090
url: http://prometheus.istio-system.svc.cluster.local:9090
同样地,为名为kiali
的k8s service创建一个route
即可访问,端口为20001。
生成服务图
使用如下命令检查kiali的service
$ kubectl -n istio-system get svc kiali
可以使用如下三种方式向网格发送流量
通过浏览器访问
http://$GATEWAY_URL/productpage
使用如下
curl
命令$ curl http://$GATEWAY_URL/productpage
使用
watch
持续访问$ watch -n 1 curl -o /dev/null -s -w %{http_code} $GATEWAY_URL/productpage
在Overview页面浏览网格概况,该页面展示了网格中所有命名空间下的服务。可以看到default命名空间下有流量(Bookinfo应用安装到的default命名空间下)
为了查看一个命名空间的图表,在Boofinfo所在的命名空间中查看
bookinfo
的图表如下,三角形表示service,方形表示app可以在
Display
中选择不同的Edge来展示metrics的概况,如上图显示了Response Time
。unknow是因为没有走istio的gateway,而使用了openshift的route为了显示服务网格中的不同类型的图表,在Graph Type下拉框中可以选择如下图标类型:App, Versioned App, Workload, Service
App图表类型会将所有版本的app聚合为一个图表节点。下图可以看到,它使用一个reviews 节点来表示三个版本的reviews app
Versioned App图表类型使用一个node展示了不同版本的app,同时对特定app的不同版本进行分组。下图展示了reviews 组,其包含3个小的节点,三个节点表示三个版本的reviews app
Workload 图表类型使用节点展示了服务网格中的每个负载。该图形类型不要求使用
app
和version
标签,因此如果选择不在组件上使用这些标签时,就可以使用该图表类型。Service 图表类型使用节点展示网格中的每个服务,但排除所有应用程序和工作负载
检查Istio配置
为了查看Istio配置的详细配置,可以在左边菜单栏中点击 Applications, Workloads和Services。下图展示了Bookinfo应用的信息
创建加权路由
可以使用Kiali加权路由向导来定义指定百分比的请求流量来路由到两个或更多负载。
将bookinfo图表切换为Versioned app graph
确保在Display下拉框中选择了Requests percentage来查看路由到每个负载的流量百分比
确保在Display下拉框中选择了Service Nodes来显示service节点
通过点击
reviews
服务(三角形)关注bookinfo
图表中的reviews
服务在右上角的下拉框中选择Show Details进入ratings的service设置
在Action下拉框中,选择Create Weighted Routing来访问加权路由向导
通过拖动滑块来调整到负载的流量百分比。将
reviews-v1
设置为30%,reviews-v2
设置为0%,将reviews-v3
设置为70%。点击Create创建该路由。对应会在istio中创建用于流量划分的一个VirtualService和一个DestinationRule:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
labels:
kiali_wizard: weighted_routing
name: reviews
namespace: default
spec:
hosts:
- reviews.default.svc.cluster.local
http:
- route:
- destination:
host: reviews.default.svc.cluster.local
subset: v1
weight: 30
- destination:
host: reviews.default.svc.cluster.local
subset: v2
weight: 0
- destination:
host: reviews.default.svc.cluster.local
subset: v3
weight: 70
kind: DestinationRule
metadata:
labels:
kiali_wizard: weighted_routing
name: reviews
namespace: default
spec:
host: reviews.default.svc.cluster.local
subsets:
- labels:
version: v1
name: v1
- labels:
version: v2
name: v2
- labels:
version: v3
name: v3
点击左边导航栏的Graph按钮返回到
bookinfo
图表向bookinfo应用发送请求。例如使用如下命令每秒发送一个请求:
$ watch -n 1 curl -o /dev/null -s -w %{http_code} $GATEWAY_URL/productpage
一段时间后,可以看到流量百分比会体现为新的流量路由,即v1版本接收到30%的流量,v2版本没有流量,v3版本接收到70%的流量
验证Istio配置
Kiali可以验证Istio的资源来确保它们遵循正确的约定和语义。根据配置错误的严重性,可以将Istio资源配置中检测到的任何问题标记为错误或警告。
下面将尝试对服务端口名称进行无效性修改来查看Kiali如何报告错误:
将
details
服务的端口名称从http
修改为foo
# kubectl patch service details -n default --type json -p '[{"op":"replace","path":"/spec/ports/0/name", "value":"foo"}]'
点击左侧导航栏的Services 转到服务列表
选择
bookinfo
所在的命名空间注意在
details
一行中显示的错误图标点击Name一栏对应的
details
来查看详细信息将端口名称切换回
http
,可以看到bookinfo
又变的正常了# kubectl patch service details -n default --type json -p '[{"op":"replace","path":"/spec/ports/0/name", "value":"http"}]'
查看和修改Istio的配置YAML
Kiali提供了一个YAML编辑器,可以用于查看和修改Istio的配置资源。YAML编辑器也提供了校验配置的功能。
创建一条Bookinfo的destination rules
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
点击导航栏左边的
Istio Config
转到istio的配置列表选择
bookinfo
所在的命名空间注意在右上角有提示配置的错误和告警信息
将鼠标悬停在
details
行Configuration 列中的错误图标上,可以查看其他消息。单击Name列中的
details
链接,导航到details
的destination rule视图。可以看到有校验未通过的错误提示
点击
YAML
查看Istio的destination rule规则,Kiali用颜色高亮除了未通过有效性校验的行将鼠标悬停在红色图标上可以查看工具提示消息,该消息提示触发错误的验证检查。
删除创建的bookinfo的destination rule,进行环境恢复
$ kubectl delete -f samples/bookinfo/networking/destination-rule-all.yaml
在官方文档中,上述YAML中是存在黄色的告警图标,但实际部署时并没有出现。
关于Kiali Developer API
为了生成表示图表和其他指标,健康,以及配置信息的JSON文件,可以参考Kiali Developer API。例如,可以通过访问$KIALI_URL/api/namespaces/graph?namespaces=default&graphType=app
来获取使用app
图表类型的JSON表示格式。
Kiali Developer API建立在Prometheus查询之上,并取决于标准的Istio metric配置,它还会执行kubernetes API调用来获取服务的其他详细信息。为了更好地使用Kiali,请在自己的应用组件中使用metadata labels app
和version
。
请注意,Kiali Developer API可能在不同版本间发送变更,且不保证向后兼容。
其他特性
Kiali还有其他丰富的特性,如与Jaeger跟踪的集成。
更多细节和特性,参见Kiali官方文档。
卸载
$ kubectl delete -f https://raw.githubusercontent.com/istio/istio/release-1.7/samples/addons/kiali.yaml
Istio可观测性的更多相关文章
- 15分钟在笔记本上搭建 Kubernetes + Istio开发环境
11月13~15日,KubeCon 上海大会召开,云原生是这个秋天最火热的技术.很多同学来问如何上手 Kubernetes和Istio 服务网格开发.本文将帮助你利用Docker CE桌面版,15分钟 ...
- 【译文连载】 理解Istio服务网格(第七章 安全)
全书目录 第一章 概述 第二章 安装 第三章 流控 第四章 服务弹性 第五章 混沌测试 第六章 可观测性 本文目录 第7章 安全 7.1 身份认证 7.1.1 Kubernetes上的Istio的身份 ...
- istio ServiceMesh
什么是ServiceMesh?什么是Istio? 微服务的一种概念,随着微服务的来临,衍生出一系列的问题,比如服务发现.负载均衡.路由.流量控制.服务间通讯的可靠性.微服务的监控等一系列的问题.使用a ...
- Istio on ACK集成生态(2): 扩展AlertManager集成钉钉助力可观测性监控能力
阿里云容器服务Kubernetes(简称ACK)支持一键部署Istio,可以参考文档在ACK上部署使用Isito.Istio on ACK提供了丰富的监控能力,为网格中的服务收集遥测数据,其中Mixe ...
- 【译文连载】 理解Istio服务网格(第六章 可观测性)
全书目录 第一章 概述 第二章 安装 第三章 流控 第四章 服务弹性 第五章 混沌测试 本文目录 第6章 可观测性 6.1 分布式调用链跟踪(tracing) 6.1.1 基本概念 6.1.2 Ja ...
- Istio on ACK集成生态(1): 集成TSDB助力可观测性存储
阿里云容器服务Kubernetes(简称ACK)支持一键部署Istio,可以参考文档在ACK上部署使用Isito.Istio on ACK提供了丰富的监控能力,为网格中的服务收集遥测数据,其中Mixe ...
- 如何在 Istio 中支持 Dubbo、Thrift、Redis 以及任何七层协议?
赵化冰,腾讯云高级工程师,Istio Member,ServiceMesher管理委员,Istio 项目贡献者, Aerika 项目创建者 ,热衷于开源.网络和云计算.目前主要从事服务网格的开源和研发 ...
- 灵雀云Istio技术实践专题整理
Istio技术实践专题(1) Service Mesh Istio 基本概念和架构基础 Istio被称作Kubernetes的最佳云原生拍档.从今天起,我们推出"Istio技术实践" ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格
多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...
随机推荐
- Linux 下使用 killall 命令终止进程的 8 大用法
Linux 的命令行提供很多命令来杀死进程.比如,你可以向 kill 命传递一个PID来杀死进程:pkill 命令使用一个正则表达式作为输入,所以和该模式匹配的进程都被杀死. 但是还有一个命令叫 ki ...
- c++ explict
explicit 用于一个参数的构造函数:防止隐式转换. 什么意思呢? myClass(int x); 这是个构造函数 我们可以使用 myClass a(4); 或 myClass a=4;来调用它 ...
- heap相关算法的简单实现
// 12:06 PM/09/28/2017 #pragma once //向下调整算法 主要用来make_heap 以及pop_heap inline void adjustDown(int* he ...
- Spring bean自定义命名策略(注解实现)
我们都知道项目后台开发是从 控制层——业务层——mybatis层,@Controller.@Service.@Mapper...等等注解可以将对象自动加载到bean容器中,还能实现相应的功能,使用起来 ...
- SpringCloud系列之服务容错保护Netflix Hystrix
1. 什么是雪崩效应? 微服务环境,各服务之间是经常相互依赖的,如果某个不可用,很容易引起连锁效应,造成整个系统的不可用,这种现象称为服务雪崩效应. 如图,引用国外网站的图例:https://www. ...
- Windows10 无法完全关闭Hyper-V导致VirtualBox 虚拟机无法启动
win10本来已经安装使用了VirtualBox. 突然心血来潮决定试试系统自带的虚拟机Hyper-V.发现并没有想象中的好用.随后在启用或关闭 Windows功能中关闭了Hyper-V. 这时我发现 ...
- docker安装gitlab并部署CICD
摘要 本文主要实现了在docker下安装gitlab,将gitlab绑定在宿主机的180端口,将gitlab的clone的URL添加指定端口号:部署了CI/CD,并公布了测试项目. 安装docker[ ...
- 你真的理解索引吗?从数据结构层面解析mysql索引原理
从<mysql存储引擎InnoDB详解,从底层看清InnoDB数据结构>中,我们已经知道了数据页内各个记录是按主键正序排列并组成了一个单向链表的,并且各个数据页之间形成了双向链表.在数据页 ...
- 2020-07-26:如何用 socket 编程实现 ftp 协议?
福哥答案2020-07-26: 功能用户输入user username.pass password注册,注册后输入dir查看服务器文件列表,输入get filename path下载文件到指定路径. ...
- 聊聊Java内省Introspector
前提 这篇文章主要分析一下Introspector(内省,应该读xing第三声,没有找到很好的翻译,下文暂且这样称呼)的用法.Introspector是一个专门处理JavaBean的工具类,用来获取J ...