本节主要介绍当网格中出现问题时,应该如何排查问题,以及如何解决这些问题。我们将主要学习故障排除的技巧和方向。
1.路由不生效
如果创建路由规则后并没有达到预期的效果,可以使用如下的方法来找到路由不生效的问题并解决。
1)查看Pilot是否正常:
$ kubectl get pod -l app=pilot -n istio-system NAME READY STATUS RESTARTS AGE istio-pilot-64958c46fc-cdk62 2/2 Running 0 26m
2)查看网格整体情况:
$ istioctl proxy-status PROXY CDS LDS EDS RDS PILOT VERSION istio-egressgateway-7dc5cbbc56-rc5pl.istio-system SYNCED SYNCED ZSYNCED (100%) NOT SENT istio-pilot-64958c46fc-cdk62 1.0.2 istio-ingressgateway-7958d776b5-qfpg7.istio-system SYNCED SYNCED SYNCED (100%) NOT SENT istio-pilot-64958c46fc-cdk62 1.0.2 service-go-v1-7cc5c6f574-sj2mn.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-cdk62 1.0.2 service-go-v2-7656dcc478-f8zwc.default SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-64958c46fc-cdk62 1.0.2
如果服务实例没有出现在上述的命令结果里,表明服务实例可能出了故障,没能加入网格内。
上述命令的输出结果字段解释如下:
·CDS:集群发现服务,可以理解为服务实例的集群。
·LDS:监听器发现服务,可以理解为服务实例的监听端口。
·EDS:端点发现服务,可以理解为单个服务实例发现。
·RDS:路由发现服务,根据条件路由请求到不同的集群中。
上述命令的输出结果字段的状态解释如下:
·SYNCED:表示Envoy代理已经确认收到了Pilot上一次发送的配置。
·SYNCED(100%):表示Pilot已经将集群中全部的服务实例信息发送给了Envoy代理。
·NOT SENT:表示Pilot没有发送任何配置给Envoy代理,通常是由于没有什么可发送的。
·STALE:表示Pilot已经发送了更新配置给Envoy代理,但是还没有收到Envoy代理的确认,通常可能是由于Envoy代理和Pilot之前的网络连接出现了问题或者机器性能有问题。
3)检查Envoy代理能否连接到Pilot。
在没有启用mTLS时使用如下命令:
$ SERVICE_GO_POD_NAME=$(kubectl get pod -l app=service-go -o jsonpath={.items[0].metadata.name})
$ PILOT_POD_IP=$(kubectl get pod -l app=pilot -n istio-system -o jsonpath={.items[0].status.podIP})
$ kubectl exec $SERVICE_GO_POD_NAME -c istio-proxy -- curl -s http://$PILOT_POD_IP:15003/v1/registration
命令的执行结果如下:
[
{
"service-key": "grafana.istio-system.svc.cluster.local|http",
"hosts": [
{
"ip_address": "10.244.1.7",
"port": 3000
}
]
},
...
{
"service-key": "service-go.default.svc.cluster.local|http",
"hosts": [
{
"ip_address": "10.244.1.15",
"port": 80
},
{
"ip_address": "10.244.2.10",
"port": 80
}
]
},
...
{
"service-key": "zipkin.istio-system.svc.cluster.local|http",
"hosts": [
{
"ip_address": "10.244.1.10",
"port": 9411
}
]
}
]
4)查看Pilot和Envoy的配置文件的差异:
$ istioctl proxy-status service-go-v1-7cc5c6f574-sj2mn.default Clusters Match Listeners Match Routes Match
正常情况下应该如上述的结果所示,如果出现了一不致,就说明Pilot到Envoy的配置同步出现了问题。
5)深入Envoy配置信息。
查看服务集群配置信息:
$ istioctl proxy-config clusters -n default service-go-v1-7cc5c6f574-sj2mn
SERVICE FQDN PORT SUBSET DIRECTION TYPE
BlackHoleCluster - - - STATIC
...
jaeger-query.istio-system.svc.cluster.local 16686 - outbound EDS
kube-dns.kube-system.svc.cluster.local 53 - outbound EDS
kubernetes.default.svc.cluster.local 443 - outbound EDS
prometheus.istio-system.svc.cluster.local 9090 - outbound EDS
prometheus_stats - - - STATIC
service-go.default.svc.cluster.local 80 - inbound STATIC
service-go.default.svc.cluster.local 80 - outbound EDS
...
$ istioctl proxy-config clusters service-go-v1-7cc5c6f574-sj2mn --fqdn service-go.default.svc.cluster.local -o json
[
{
"name": "inbound|80||service-go.default.svc.cluster.local",
"connectTimeout": "1.000s",
"hosts": [
{
"socketAddress": {
"address": "127.0.0.1",
"portValue": 80
}
}
],
"circuitBreakers": {
"thresholds": [
{}
]
}
},
{
"name": "outbound|80||service-go.default.svc.cluster.local",
"type": "EDS",
"edsClusterConfig": {
"edsConfig": {
"ads": {}
},
"serviceName": "outbound|80||service-go.default.svc.cluster.local"
},
"connectTimeout": "1.000s",
"circuitBreakers": {
"thresholds": [
{}
]
}
}
]
查看服务监听端口配置信息:
$ istioctl proxy-config listeners -n default service-go-v1-7cc5c6f574-sj2mn
ADDRESS PORT TYPE
...
10.108.252.151 443 TCP
10.108.252.151 15011 TCP
10.96.0.1 443 TCP
10.96.0.10 53 TCP
0.0.0.0 9090 HTTP
0.0.0.0 80 HTTP
...
$ istioctl proxy-config listeners -n default service-go-v1-7cc5c6f574-sj2mn --port 15001 -o json
[
{
"name": "virtual",
"address": {
"socketAddress": {
"address": "0.0.0.0",
"portValue": 15001
}
},
"filterChains": [
{
"filters": [
{
"name": "envoy.tcp_proxy",
"config": {
"cluster": "BlackHoleCluster",
"stat_prefix": "BlackHoleCluster"
}
}
]
}
],
"useOriginalDst": true
}
]
查看路由配置信息:
$ istioctl proxy-config routes -n default service-go-v1-7cc5c6f574-sj2mn -o json
...
"routes": [
{
"match": {
"prefix": "/"
},
"route": {
"cluster":"outbound|80||service-go.default.svc.cluster.local",
"timeout": "0.000s",
"maxGrpcTimeout": "0.000s"
},
...
查看启动时的配置信息:
$ istioctl proxy-config bootstrap -n default service-go-v1-7cc5c6f574-sj2mn -o json
{
"bootstrap": {
"node": {
"id": "sidecar~10.244.2.10~service-go-v1-7cc5c6f574-sj2mn.default~default.
svc.cluster.local",
"cluster": "service-go",
"metadata": {
"INTERCEPTION_MODE": "REDIRECT",
"ISTIO_PROXY_SHA": "istio-proxy:6953ca783697da07ebe565322d12e9
69280d8b03",
"ISTIO_PROXY_VERSION": "1.0.2",
"ISTIO_VERSION": "1.0.3",
"POD_NAME": "service-go-v1-7cc5c6f574-sj2mn",
"app": "service-go",
"istio": "sidecar",
"pod-template-hash": "7cc5c6f574",
"version": "v1"
},
"buildVersion": "0/1.8.0-dev//RELEASE"
},
查看服务实例的日志信息:
$ kubectl logs -f -n default service-go-v1-7cc5c6f574-sj2mn istio-proxy ... [2019-01-19 04:48:58.770][11][info][main] external/envoy/source/server/server.cc:401] all clusters initialized. initializing init manager [2019-01-19 04:48:58.935][11][info][upstream] external/envoy/source/server/lds_api.cc:80] lds: add/update listener '10.105.194.10_15011' [2019-01-19 04:48:58.938][11][info][upstream] external/envoy/source/server/lds_api.cc:80] lds: add/update listener '10.105.194.10_853' ... [2019-01-19 04:48:58.990][11][info][upstream] external/envoy/source/server/lds_api.cc:80] lds: add/update listener '0.0.0.0_15031' [2019-01-19 04:48:59.003][11][info][upstream] external/envoy/source/server/lds_api.cc:80] lds: add/update listener '0.0.0.0_8060' [2019-01-19 04:48:59.010][11][info][upstream] external/envoy/source/server/lds_api.cc:80] lds: add/update listener '0.0.0.0_8080'
2.mTLS异常
当启用mTLS后,服务出现无法正常访问的情况,关闭mTLS后服务可以正常访问,可以使用如下的排查步骤来发现问题并解决。
1)查看Citadel是否正常:
$ kubectl get pod -l istio=citadel -n istio-system NAME READY STATUS RESTARTS AGE istio-citadel-6955bc9cb7-dsl78 1/1 Running 0 36m
2)查看证书和密钥:
$ kubectl exec $(kubectl get pod -l app=service-go -o jsonpath={.items[0].metadata.name}) -c istio-proxy -- ls /etc/certs
cert-chain.pem
key.pem
root-cert.pem
$ kubectl exec $(kubectl get pod -l app=service-go -o jsonpath={.items[0].metadata.name}) -c istio-proxy -- cat /etc/certs/cert-chain.pem | openssl x509 -text -noout | grep Validity -A 2
Validity
Not Before: Nov 30 04:53:59 2018 GMT
Not After : Feb 28 04:53:59 2019 GMT
$ kubectl exec $(kubectl get pod -l app=service-go -o jsonpath={.items[0].metadata.name}) -c istio-proxy -- cat /etc/certs/cert-chain.pem | openssl x509 -text -noout | grep 'Subject Alternative Name' -A 1
X509v3 Subject Alternative Name:
URI:spiffe://cluster.local/ns/default/sa/default
3)检查mTLS配置。
查看默认全局mTLS策略:
$ kubectl get meshpolicy default -o yaml
apiVersion: authentication.istio.io/v1alpha1
kind: MeshPolicy
metadata:
...
name: default
...
spec:
peers:
- mtls:
mode: PERMISSIVE
由于Istio安装时会默认设置全局的mTLS策略,所以默认情况下会显示为CONFLICT状态,但是由于默认策略模式为PERMISSIVE,因此服务仍然可以正常访问。
$ istioctl authn tls-check service-go.default.svc.cluster.local HOST:PORT STATUS SERVER CLIENT AUTHN POLICY DESTINATION RULE service-go.default.svc.cluster.local:80 CONFLICT mTLS HTTP default/ -
istioctl authn tls-check命令的输出解释如下:
·HOST:PORT表示被检查服务的地址和端口。
·STATUS表示mTLS当前的状态,OK表示正常,CONFLICT表示mTLS的服务端与客户端配置存在冲突,访问异常。
·SERVER表示服务端使用的协议。
·CLIENT表示客户端使用的协议。
·AUTHN POLICY表示使用的Policy策略名称,形如“策略名称/命名空间名称”,default/default表示使用的是default命名空间的default策略。
·DESTINATION RULE表示使用的DestinationRule路由规则名称,形如“路由规则名称/命名空间名称”,service-go/default表示使用的是default命名空间的名为service-go的DestinationRule路由规则。
【实验】
模拟mTLS故障,排查问题。
1)创建测试Pod:
$ kubectl apply -f kubernetes/dns-test.yaml
2)故意设置错误的mTLS策略:
$ kubectl apply -f istio/security/mtls-service-go-bad-rule.yaml
3)查看认证策略:
$ istioctl authn tls-check service-go.default.svc.cluster.local HOST:PORT STATUS SERVER CLIENT AUTHN POLICY DESTINATION RULE service-go.default.svc.cluster.local:80 CONFLICT HTTP mTLS service-go/default service-go/default
从上面的输出结果可知,service-go服务mTLS的配置存在冲突,服务端使用了HTTP,而客户端使用了mTLS协议,因此访问会出现异常。
4)访问服务:
$ kubectl exec dns-test -c dns-test -- curl -s http://service-go/env upstream connect error or disconnect/reset before headers
5)更新mTLS策略:
$ kubectl apply -f istio/security/mtls-service-go-on.yaml
6)查看认证状态:
$ istioctl authn tls-check service-go.default.svc.cluster.local HOST:PORT STATUS SERVER CLIENT AUTHN POLICY DESTINATION RULE service-go.default.svc.cluster.local:80 OK mTLS mTLS service-go/default service-go/default
7)访问服务:
$ kubectl exec dns-test -c dns-test -- curl -s http://service-go/env
{"message":"go v2"}
8)清理:
$ kubectl delete -f istio/security/mtls-service-go-on.yaml $ kubectl delete -f kubernetes/dns-test.yaml
3.RBAC异常
当启用RBAC后,服务出现无法正常访问的情况,关闭RBAC后服务可以正常访问,可以使用如下的排查步骤来发现问题,并解决问题。
1)确保RBAC已经正确开启。
开启RBAC规则:
$ kubectl apply -f istio/security/rbac-config-on.yaml rbacconfig.rbac.istio.io/default created
查看RbacConfig:
$ kubectl get rbacconfigs.rbac.istio.io --all-namespaces NAMESPACE NAME AGE default default 48s
确保只有一个名为default的RbacConfig配置实例,否则Istio会禁用RBAC功能,并忽略所有策略。如果有多余的RbacConfig配置实例,删除所有多余的RbacConfig配置实例。
2)开启Polit的RBAC调试日志。
另外开一个终端执行如下的命令,该命令不会结束,会持续输出访问日志。设置RBAC调试日志完成后,按Ctrl+C停止该命令:
$ kubectl port-forward $(kubectl -n istio-system get pods -l istio=pilot -o jsonpath='{.items[0].metadata.name}') -n istio-system 19876:9876
使用iptables开放远程访问:
$ sudo iptables -t nat -I PREROUTING -d 11.11.11.111 -p tcp --dport 9876 -j DNAT --to-destination 127.0.0.1:19876
通过ControlZ控制功能开启RBAC调试日志。
访问地址http://11.11.11.111:9876/scopez/ ,设置RBAC的输出级别为debug,如图12-6所示。
图12-6 设置RBAC的输出级别为debug
应用服务的RBAC策略:
$ kubectl apply -f istio/security/rbac-service-go-user-agent-policy.yaml servicerole.rbac.istio.io/service-viewer created servicerolebinding.rbac.istio.io/bind-service-viewer created
查看Pilot的日志输出:
$ kubectl logs $(kubectl -n istio-system get pods -l istio=pilot -o jsonpath='{.items[0].metadata.name}') -c discovery -n istio-system | grep rbac
2019-01-19T03:07:07.413353Z info registering for apiVersion rbac.istio.io/v1alpha1
2019-01-19T05:00:56.365084Z info rbac no service role in namespace default
2019-01-19T05:00:56.365915Z info rbac no service role binding in namespace default
2019-01-19T05:00:56.366458Z info rbac built filter config for service-go.default.svc.cluster.local
2019-01-19T05:00:56.373868Z info rbac no service role in namespace default
2019-01-19T05:00:56.373952Z info rbac no service role binding in namespace default
2019-01-19T05:00:56.374160Z info rbac built filter config for service-go.default.svc.cluster.local
2019-01-19T05:02:43.948543Z debug rbac building filter config for {service-go.default.svc.cluster.local map[pod-template-hash:7656dcc478 version:v2 app:service-go] map[destination.name:service-go destination.namespace:default destination.user:default]}
3)确保Pilot正确的分发了策略
查看Envoy代理的配置:
$ kubectl exec $(kubectl get pods -l app=service-go -o jsonpath='{.items[0].metadata.name}') -c istio-proxy -- curl localhost:15000/config_dump -s
...
{
"name": "envoy.filters.http.rbac",
"config": {
"shadow_rules": {
"policies": {}
},
"rules": {
"policies": {
"service-viewer": {
"permissions": [
{
"and_rules": {
"rules": [
{
"or_rules": {
"rules": [
{
"header": {
"exact_match": "GET",
"name": ":method"
}
...
"principals": [
{
"and_ids": {
"ids": [
{
"header": {
"name": "User-Agent",
"prefix_match": "RBAC-"
}
}
]
}
从上述命令结果的"envoy.filters.http.rbac"中查看RBAC策略Envoy代理是否已经收到并应用到配置中。
4)确保Envoy代理正确的执行了策略。
设置Envoy代理RBAC的日志级别为debug:
$ kubectl exec -ti $(kubectl get pod -l app=service-go -o jsonpath={.items[0].metadata.name}) -c istio-proxy -- curl -X POST 127.0.0.1:15000/logging?rbac=debug
active loggers:
...
http: info
http2: info
...
rbac: debug
redis: info
5)创建测试Pod:
$ kubectl apply -f kubernetes/dns-test.yaml
6)访问service-go服务:
$ kubectl exec dns-test -c dns-test -- curl -s http://service-go/env
RBAC: access denied
$ kubectl exec dns-test -c dns-test -- curl -s -H "User-Agent: RBAC-TEST" http://service-go/env
{"message":"go v2"}
$ kubectl exec dns-test -c dns-test -- curl -s -H "User-Agent: RBAC-TEST" http://service-go/env
{"message":"go v1"}
7)查看Envoy代理日志:
$ kubectl logs $(kubectl get pods -l app=service-go -o jsonpath='{.items[0].metadata.name}') -c istio-proxy
[2019-01-19 04:57:30.512][19][debug][rbac] external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:65] checking request: remoteAddress: 10.244.1.16:46074, localAddress: 10.244.1.15:80, ssl: none, headers: ':authority', 'service-go'
':path', '/env'
':method', 'GET'
'user-agent', 'curl/7.35.0'
...
}
[2019-01-19 04:58:18.446][19][debug][rbac] external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:78] shadow denied
[2019-01-19 04:58:18.456][19][debug][rbac] external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:112] enforced denied
[2019-01-19 05:00:12.409][20][debug][rbac] external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:65] checking request: remoteAddress: 10.244.1.16:46594, localAddress: 10.244.1.15:80, ssl: none, headers: ':authority', 'service-go'
':path', '/env'
':method', 'GET'
'accept', '*/*'
'user-agent', 'RBAC-TEST'
...
}
[2019-01-19 05:05:25.669][20][debug][rbac] external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:78] shadow denied
[2019-01-19 05:05:25.669][20][debug][rbac] external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:108] enforced allowed
[2019-01-19T05:05:25.669Z] "GET /envHTTP/1.1" 200 - 0 19 6 1 "-" "RBAC-TEST" "9f594a94-6be0-924d-83a0-39448f020701" "service-go" "127.0.0.1:80" inbound|80||service-go.default.svc.cluster.local - 10.244.1.15:80 10.244.1.16:46074
从日志中可以看出,当'user-agent'='RBAC-TEST'请求被允许(enforced allowed),当'user-agent'='curl/7.35.0'请求被拒绝(enforced denied)。
8)清理:
#通过 ControlZ控制功能恢复 RBAC日志级别为 info #删除 iptables规则 $ sudo iptables -t nat -D PREROUTING -d 11.11.11.111 -p tcp --dport 9876 -j DNAT --to-destination 127.0.0.1:19876 #重置 Envoy代理 RBAC的日志级别为 info $ kubectl exec -ti $(kubectl get pod -l app=service-go -o jsonpath={.items[0].metadata.name}) -c istio-proxy -- curl -X POST 127.0.0.1:15000/logging?rbac=info $ kubectl delete -f istio/security/rbac-config-on.yaml $ kubectl delete -f istio/security/rbac-service-go-user-agent-policy.yaml $ kubectl delete -f kubernetes/dns-test.yaml
4.指标或日志收集异常
这里只演示指标数据收集异常的情况,日志数据收集问题的思路类似,不再演示。
1)基础环境准备。
创建测试Pod:
$ kubectl apply -f kubernetes/fortio.yaml
访问服务:
$ kubectl exec fortio -c fortio /usr/local/bin/fortio -- load -qps 10 -n 100 -loglevel Error http://service-go/env 05:18:48 I logger.go:97> Log level is now 4 Error (was 2 Info) Fortio 1.0.1 running at 10 queries per second, 2->2 procs, for 100 calls: http://service-go/env Aggregated Function Time : count 100 avg 0.0067368204 +/- 0.003404 min 0.002795267 max 0.025809888 sum 0.673682036 # target 50% 0.00593333 # target 75% 0.00833333 # target 90% 0.0105 # target 99% 0.018 # target 99.9% 0.0257289 Sockets used: 4 (for perfect keepalive, would be 4) Code 200 : 100 (100.0 %) All done 100 calls (plus 0 warmup) 6.737 ms avg, 10.0 qps
2)查看Mixer是否接收到了Envoy代理报告请求。
使用如下命令查看Mixer接收到Envoy代理报告的请求次数:
$ TELEMETRY_IP=$(kubectl get svc istio-telemetry -n istio-system -o jsonpath='{.spec.clusterIP}')
$ curl -s $TELEMETRY_IP:9093/metrics | grep grpc_server_handled_total
# HELP grpc_server_handled_total Total number of RPCs completed on the server, regardless of success or failure.
# TYPE grpc_server_handled_total counter
grpc_server_handled_total{grpc_code="OK",grpc_method="Report",grpc_service="istio.mixer.v1.Mixer",grpc_type="unary"} 52
3)查看Mixer规则是否存在。
使用如下命令查看已经创建的rule:
$ kubectl get rules --all-namespaces NAMESPACE NAME AGE istio-system kubeattrgenrulerule 28d istio-system promhttp 28d istio-system promtcp 28d istio-system stdio 28d istio-system stdiotcp 28d istio-system tcpkubeattrgenrulerule 28d
4)查看Prometheus处理程序是否存在。
使用如下命令查看已经创建的Prometheus处理程序:
$ kubectl get prometheuses.config.istio.io --all-namespaces NAMESPACE NAME AGE istio-system handler 28d
5)查看Mixer指标收集实例是否存在。
使用如下命令查看已经创建的metric实例:
$ kubectl get metrics.config.istio.io --all-namespaces NAMESPACE NAME AGE istio-system requestcount 28d istio-system requestduration 28d istio-system requestsize 28d istio-system responsesize 28d istio-system tcpbytereceived 28d istio-system tcpbytesent 28d
6)查看是否有配置错误。
使用如下命令查看是存在错误的配置,当存在计数不为0的条目时,表示存在配置错误:
$ TELEMETRY_IP=$(kubectl get svc istio-telemetry -n istio-system -o jsonpath='{.spec.clusterIP}')
$ curl -s $TELEMETRY_IP:9093/metrics | grep config_error_count
# HELP mixer_config_adapter_info_config_error_count The number of errors encountered during processing of the adapter info configuration.
# TYPE mixer_config_adapter_info_config_error_count counter
...
mixer_config_instance_config_error_count{configID="17"} 1
mixer_config_instance_config_error_count{configID="2"} 0
...
mixer_config_rule_config_error_count{configID="15"} 0
mixer_config_rule_config_error_count{configID="16"} 0
mixer_config_rule_config_error_count{configID="17"} 1
...
7)查看Mixer日志。
使用如下的命令查看Mixer日志有无错误信息。如果需要,也可以像之前开启Pilot的RBAC的日志输出级别的步骤一样,开启Mixer的debug级别的输出日志:
$ kubectl logs -f -n istio-system $(kubectl get pod -l app=telemetry -n istio-system -o jsonpath='{.items[0].metadata.name}') mixer | egrep 'error|warn'
...
2018-12-28T07:16:30.155044Z error failed to evaluate expression for field 'Dimensions[source_service]'; unknown attribute source.service.name
2018-12-28T07:16:30.155882Z error Instance not found: instance='mytcpsentbytes.metric'
2018-12-28T07:16:30.156061Z warn Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.
2018-12-28T07:16:30.265742Z error adapters adapter did not close all the scheduled daemons {"adapter": "handler.kubernetesenv.istio-system"}
2018-12-28T07:16:37.171114Z warn input set condition evaluation error: id='9', error='lookup failed: 'destination.service''
2018-12-28T07:16:47.173559Z warn input set condition evaluation error: id='9', error='lookup failed: 'destination.service''
...
8)查看Mixer是否发送了指标给Prometheus处理程序。
使用如下命令查看Mixer发送指标给Prometheus处理程序的次数:
$ TELEMETRY_IP=$(kubectl get svc istio-telemetry -n istio-system -o jsonpath='{.spec.clusterIP}')
$ curl -s $TELEMETRY_IP:9093/metrics | grep mixer_runtime_dispatch_count
# HELP mixer_runtime_dispatch_count Total number of adapter dispatches handled by Mixer.
# TYPE mixer_runtime_dispatch_count counter
mixer_runtime_dispatch_count{adapter="kubernetesenv",error="false",handler="handler.kubernetesenv.istio-system",meshFunction="kubernetes"} 884
mixer_runtime_dispatch_count{adapter="kubernetesenv",error="true",handler="handler.kubernetesenv.istio-system",meshFunction="kubernetes"} 0
mixer_runtime_dispatch_count{adapter="prometheus",error="false",handler="handler.prometheus.istio-system",meshFunction="metric"} 213
mixer_runtime_dispatch_count{adapter="prometheus",error="false",handler="tcphandler.prometheus.default",meshFunction="metric"} 83
mixer_runtime_dispatch_count{adapter="prometheus",error="true",handler="handler.prometheus.istio-system",meshFunction="metric"} 0
mixer_runtime_dispatch_count{adapter="prometheus",error="true",handler="tcphandler.prometheus.default",meshFunction="metric"} 0
mixer_runtime_dispatch_count{adapter="stdio",error="false",handler="handler.stdio.istio-system",meshFunction="logentry"} 213
mixer_runtime_dispatch_count{adapter="stdio",error="true",handler="handler.stdio.istio-system",meshFunction="logentry"} 0
9)查看Prometheus配置。
使用如下命令查看Prometheus配置文件,确认是否有Istio相关的配置:
$ PROMETHEUS_IP=$(kubectl get svc prometheus -n istio-system -o jsonpath='{.spec.clusterIP}')
$ curl -s $PROMETHEUS_IP:9090/config | grep -B15 'istio-telemetry;prometheus'
scrape_configs:
- job_name: istio-mesh
scrape_interval: 5s
scrape_timeout: 5s
metrics_path: /metrics
scheme: http
kubernetes_sd_configs:
- api_server: null
role: endpoints
namespaces:
names:
- istio-system
relabel_configs:
- source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
separator: ;
regex: istio-telemetry;prometheus