Warning
本文最后更新于 September 19, 2021,文中内容可能已过时,请谨慎使用。
下面是摘自维基百科的一段话。
微服务 (Microservices) 是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关 (Language-Independent/Language agnostic) 的 API 集相互通信。
看起来过于抽象,Service Mesh 在我看来,就是如何处理服务于服务之间的关系,如服务之间的相互调用关系,核心服务的熔断等,这不仅不含一个普通的 A 服务对 B 服务的一次 RPC 调用,也涉及RPC调用时具体的超时时间、重试次数等细节。最终目的是让整个服务形成一张网一般。而开发人员只需要注重自己的业务逻辑开发,而服务之间的联系全部交给 Service Mesh。
想象一下,你的代码不再需要考虑各种超时逻辑、也不需要考虑熔断和集成各种底层网络库。你的代码只有业务本身。
Service Mesh 的概念
微服务的架构特性
- 特点一:围绕业务构建团队
在最开始的时候,可能公司分为 前端RD、后端RD、数据库DBA、运维OPS,整个公司的全部前端服务全部交由前端RD开发,后端代码逻辑全部交由后端RD开发。比如互联网一部负责整个商城系统开发,商城系统服务本身错综复杂,但是大家写的代码都会部署到一起,是个单体服务。
微服务的诞生打破了这个结构。比如商城系统被拆分成了 售卖组、商品直播组、安全组、售后组等等,每个组自身有后端和前端开发,每个组专注于自身业务。每个组的业务本身也是分离的,互不影响。
这样的好处是服务彼此独立,独立部署,没有依赖,比如售卖组的业务量大,售卖组的服务可以多部署几份。售后组的服务少部署几份。
- 特点二:去中心化的数据管理
由于业务部署的独立,数据库也会面临一定的拆分,比如每个业务用到的数据库 database 是不同的库,业务自身使用的是不同的表。
为了满足上述的业务服务越拆越细的需求。微服务的概念便出现,随之微服务的几个核心便是服务注册\发现
,路由\流量转移
,弹性能力、熔断、超时
,安全
,可链路追踪\监控
,而这些核心的实现便是 Service Mesh
Service Mesh 发展至今,从最开始的“原始通信时代” 到依托于K8S的“SideCar”模式才发展成了真正的 Service Mesh
参考:
istlo
istlo 是什么?
Istio 提供一种简单的方式来为已部署的服务建立网络,该网络具有负载均衡、服务间认证、监控等功能,而不需要对服务的代码做任何改动。
- istio 适用于容器或虚拟机环境(特别是 k8s),兼容异构架构。
- istio 使用 sidecar(边车模式)代理服务的网络,不需要对业务代码本身做任何的改动。
- HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡。
- istio 通过丰富的路由规则、重试、故障转移和故障注入,可以对流量行为进行细粒度控制;支持访问控制、速率限制和配额。
- istio 对出入集群入口和出口中所有流量的自动度量指标、日志记录和跟踪。
安装
安装教程参考官方 (https://istio.io/latest/zh/docs/setup/getting-started/), 不过网站似乎国内打不开,下面演示一下 。
kubernetes 环境版本:v1.21.4
安装方法参考:ubuntu20.04 部署 Kubernetes (k8s)
下载针对你操作系统的安装文件
$ curl -L https://raw.githubusercontent.com/istio/istio/master/release/downloadIstioCandidate.sh | sh -
如果想要指定版本、不同处理器体系则可以使用
$ curl -L https://raw.githubusercontent.com/istio/istio/master/release/downloadIstioCandidate.sh | ISTIO_VERSION=1.6.8 TARGET_ARCH=x86_64 sh -
转到istio的目录。例如 istio-1.11.2
cd istio-1.11.2
安装目录包含: samples/
目录下的示例应用程序 和 bin/
目录下的 istioctl
客户端二进制工具。可将 istioctl
加入到 PATH 中。
istio本身提供不同模式的 Configuration Profile
对于本次安装,我们选择 demo
模式,这个是专门为了展示和学习而准备的。
$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Egress gateways installed
✔ Installation complete
Thank you for installing Istio 1.11. Please take a few minutes to tell us about your install/upgrade experience! https://forms.gle/kWULBRjUv7hHci7T6
给 namespace 添加标签,指示istio在部署应用时自动注入 envoy sidecar 代理。可以简单的理解为当部署应用清单时,它会帮你改写清单,把具体的sidecar配置给你添加进去。
kubectl label namespace default istio-injection=enabled
查看istio部署的pods
$ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-egressgateway-6cb7bdc7fb-8h2n6 1/1 Running 0 6m15s
istio-ingressgateway-694d8d7656-z4ccc 1/1 Running 0 6m15s
istiod-6c68579c55-lmp8r 1/1 Running 0 7m
部署 bookinfo 应用
bookinfo 是官方推荐的一个微服务案例。主要包含以下4个微服务,主页productpage服务是由python开发的,主要会调用评论和详细内容两个服务。评论服务有三个版本,reviews 微服务有 3 个版本:
v1 版本不会调用 ratings 服务。
v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
应用很快会起来,等到应用就绪后,istio 的sidecar 代理将一起被部署。
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.80.140.94 <none> 9080/TCP 61s
kubernetes ClusterIP 10.80.0.1 <none> 443/TCP 24d
productpage ClusterIP 10.80.6.178 <none> 9080/TCP 61s
ratings ClusterIP 10.80.32.218 <none> 9080/TCP 61s
reviews ClusterIP 10.80.60.33 <none> 9080/TCP 61s
和
1
2
3
4
5
6
7
8
9
10
| kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-79f774bdb9-kl2dg 0/2 PodInitializing 0 2m40s
nfs-client-provisioner-6d9cb7bf7d-wclzl 1/1 Running 38 24d
productpage-v1-6b746f74dc-xt7qh 0/2 PodInitializing 0 2m39s
ratings-v1-b6994bb9-r8pqp 2/2 Running 0 2m40s
reviews-v1-545db77b95-l6ctg 0/2 PodInitializing 0 2m40s
reviews-v2-7bf8c9648f-72k95 2/2 Running 0 2m40s
reviews-v3-84779c7bbc-zkp5r 0/2 PodInitializing 0 2m40s
|
此时的bookinfo应用已经部署,但是还不能被外界访问,想要访问则需要创建 istio 入站网关 Ingress,他会在网格边缘把一个路径映射到路由。
1
| $ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
|
访问网关有2个变量控制,INGRESS_HOST 和 INGRESS_PORT
1
2
3
4
| $ kubectl get svc istio-ingressgateway -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 10.80.53.173 <pending> 15021:32628/TCP,80:30554/TCP,443:30266/TCP,31400:30402/TCP,15443:30959/TCP 83m
|
设置 EXTERNAL-IP 的值之后, 你的环境就有了一个外部的负载均衡,可以用它做入站网关。 但如果 EXTERNAL-IP 的值为 (或者一直是 状态), 则你的环境则没有提供可作为入站流量网关的外部负载均衡。 在这个情况下,你还可以用服务(Service)的 节点端口 访问网关 (但是k8s的NodePort设置要求的范围是 30000-32767)。
由于我本地的测试环境没有 Loadblance ,所以就用NodePort方式访问吧。
1
2
3
4
| $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
$ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
$ export INGRESS_HOST=172.16.101.135
$ export GATEWAT_URL=$INGRESS_HOST:$INGRESS_PORT
|
浏览器访问 http://172.16.101.135:30554/productpage
可以看到这个微服务。
istio 可以可以添加 kiali 仪表盘、Prometheus、grafana 还有 Jaeger 等。
- 安装 并 等待其部署完成
1
2
| kubectl apply -f samples/addons
kubectl rollout status deployment/kiali -n istio-system
|
- 访问 kiali 仪表盘
kiali 在希腊语中是望远镜的意思,其官方定义是 istio 的可观察性控制台,通过服务拓扑帮助你理解服务网格的结构。通过服务拓扑帮助你理解服务网格的结构,并且具有配置网格的功能。
1
| istioctl dashboard kiali
|
我因为是在远端虚拟机搭建的k8s集群,所以将 kiali 改为 NodePort 模式
- 在左侧的导航栏菜单选择
Graph
, 然后在Namespace下拉列表选择 default。kiali 仪表盘提供了网络的概览,以及 bookinfo 示例应用的各个服务的关系,它还提供过滤器可视化流量的流动。
Virtual Service 动态路由
要路由到一个版本,需要为微服务进行默认模板的设置,在这种情况下,Virtual Service 将所有的流量路由到每一个v1版本的pod上。
Virtual Service 的作用正是 1. 定义路由规则。 2. 满足描述条件的请求去哪里
这里涉及到一个满足描述条件,这正是目标规则 (Destination Rule) 的功能,即 1. 定义子集策略。 2. 描述到达目标的子集怎么处理
- 执行以下命令,使所有的 review 流量都打到 review v1 版本上
1
2
| $ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
...
|
这个清单定义了4个 Virtual Service ,可以看到 所有的服务都被打向了 v1 版本。v1 版本是怎么定义出来的呢?在 destination-rule-all.yaml
, subsets
中,将不同的labels中定义的版本进行标记,如 subsets.name.labels.version: v1, 可以使用 kubectl get destinationrules
查看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
...
|
Gateway 管理进入网格的流量
网关是运行在网格边缘的负载均衡器,接收外部请求转发到网格内部的服务,配置对外端口与内部服务的对应关系。
在之前搭建 bookinfo 时,其实我们已经创建了一个网关,这个网关暴露了bookinfo 这个微服务的对外应用 productpage
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
|
网关的 VirtualService 有一个 gateways, 正是上面创建 Gateway
,这个服务有5个被暴露出来的 uri,只有匹配的 uri 的流量才被打到 productpage 服务里。
ServiceEntry 服务入口
服务入口的作用是添加外部服务到内部网格内,是希望将管理内部服务队外部服务的请求,起到扩展网格的功能。
一般默认情况下,整个微服务是可以访问外部服务的。所以需要我们先禁止以下微服务访问外部。
Istio有一个安装选项global.outboundTrafficPolicy.mode
用来配置sidecar对外部服务(未在istio内部服务注册中定义的服务)的处理方式。 如果选项值为ALLOW_ANY,sidecar将允许调用未知的服务,如果选项值为REGISTRY_ONLY,那么Istio代理将会阻止调用任何未在服务网格注册中定义的服务或ServiceEntry的host。
查看当前的规则则可以使用以下命令,没有任何输出表示默认的 ALLOW_ANY
1
| kubectl get istiooperator installed-state -n istio-system -o jsonpath='{.spec.meshConfig.outboundTrafficPolicy.mode}'
|
在禁止直接访问之前。安装一个带 curl
命令的pod,访问微服务外的服务。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $ kubectl apply -f samples/sleep/sleep.yaml
$ kubectl exec sleep-557747455f-svc9k -- curl http://httpbin.org/headers
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.78.0-DEV",
"X-Amzn-Trace-Id": "Root=1-6147eadc-3c6f1cdb3884436b76fca6f1",
"X-B3-Sampled": "1",
"X-B3-Spanid": "b0c944c749e6dcd8",
"X-B3-Traceid": "5822ffcb03b68b61b0c944c749e6dcd8",
"X-Envoy-Attempt-Count": "1",
"X-Envoy-Peer-Metadata": "ChkKDkFQUF9DT05UQUlORVJTEgcaBXNsZWVwChoKCkNMVVNURVJfSUQSDBoKS3ViZXJuZXRlcwoZCg1JU1RJT19WRVJTSU9OEggaBjEuMTEuMgrEAQoGTEFCRUxTErkBKrYBCg4KA2FwcBIHGgVzbGVlcAohChFwb2QtdGVtcGxhdGUtaGFzaBIMGgo1NTc3NDc0NTVmCiQKGXNlY3VyaXR5LmlzdGlvLmlvL3Rsc01vZGUSBxoFaXN0aW8KKgofc2VydmljZS5pc3Rpby5pby9jYW5vbmljYWwtbmFtZRIHGgVzbGVlcAovCiNzZXJ2aWNlLmlzdGlvLmlvL2Nhbm9uaWNhbC1yZXZpc2lvbhIIGgZsYXRlc3QKGgoHTUVTSF9JRBIPGg1jbHVzdGVyLmxvY2FsCiAKBE5BTUUSGBoWc2xlZXAtNTU3NzQ3NDU1Zi1zdmM5awoWCglOQU1FU1BBQ0USCRoHZGVmYXVsdApJCgVPV05FUhJAGj5rdWJlcm5ldGVzOi8vYXBpcy9hcHBzL3YxL25hbWVzcGFjZXMvZGVmYXVsdC9kZXBsb3ltZW50cy9zbGVlcAoXChFQTEFURk9STV9NRVRBREFUQRICKgAKGAoNV09SS0xPQURfTkFNRRIHGgVzbGVlcA==",
"X-Envoy-Peer-Metadata-Id": "sidecar~10.100.1.55~sleep-557747455f-svc9k.default~default.svc.cluster.local"
}
}
|
将 istio改为禁止调用未在网格内注册过的服务。
1
2
3
4
| $ istioctl install --set profile=demo -y --set meshConfig.outboundTrafficPolicy.mode=REGISTRY_ONLY
$ kubectl get istiooperator installed-state -n istio-system -o jsonpath='{.spec.meshConfig.outboundTrafficPolicy.mode}'
REGISTRY_ONLY
|
再访问已经无法访问
…
使用ServiceEntry将一个外部服务注册到服务网格中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: httpbin-ext
spec:
hosts:
- httpbin.org
ports:
- number: 80
name: http
protocol: HTTP
resolution: DNS
location: MESH_EXTERNAL
EOF
|
此时便可再访问外部服务。这里的 location: MESH_EXTERNAL
便是指定访问网格外的服务白名单
参考:https://blog.frognew.com/2021/07/learning-istio-1.10-11.html
流量转移:灰度发布
istio 可以实现改写路由的权重,可以完成 灰度发布、蓝绿部署、A/B 测试 等功能。
其本质还是利用 Virtual Service 进行服务权重的调整,bookinfo 里的 reviews 服务有3个版本,我们即可利用 reviews 服务进行测试。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 50
- destination:
host: reviews
subset: v3
weight: 50
|
其本质是修改路由的权重值。
Egress 控制出口流量
查看 egress 网关已安装。
1
2
3
4
5
6
| $ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-68cc7d6d78-bnwc8 1/1 Running 0 13h
istio-egressgateway-6cb7bdc7fb-8h2n6 1/1 Running 0 17h
istio-ingressgateway-694d8d7656-z4ccc 1/1 Running 0 17h
|
查看之前的 Service Entry 已配置
1
2
3
| $ kubectl get se
NAME HOSTS LOCATION RESOLUTION AGE
httpbin-ext ["httpbin.org"] MESH_EXTERNAL DNS 49m
|
配置 Egress 网关、Destination 和 Virtual Service (Destination 和 Virtual Service 配置略)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: istio-egressgateway
spec:
selector:
istio: egressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- httpbin.org
|
详见: https://cloud.tencent.com/developer/article/1469811
超时重试
一般一个微服务架构里,最常见的就是服务之间的相互调用。这种调用关系是基于网络的,网络是不可靠的,另外被调用方也有可能因为服务故障导致处理请求慢,调用方对其他服务的调用必然涉及到超时重试,一般来说,业务的服务应该关注业务而不是在这些调用超时、重试之类的细枝末节上,所以微服务的超时重试便由此诞生。
演示过程:
- 给 ratings 服务添加延迟
- 给 reviews 服务添加超时策略
- 给 ratings 服务添加重试策略
先将 review 切换到 v2 版本
1
2
3
4
5
6
7
8
9
10
11
12
13
| apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
|
为 rating 服务添加延迟 2s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percent: 100.0
fixedDelay: 2s
route:
- destination:
host: ratings
subset: v1
|
为 review 服务添加超时时间 1s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
timeout: 1s
|
此时review 服务将无法响应,页面上可以看到挂掉了。下来验证重试和超时。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percentage:
value: 100.0
fixedDelay: 5s
route:
- destination:
host: ratings
subset: v1
retries:
attempts: 2
perTryTimeout: 1s
|
熔断
熔断是一种过载保护的手段, 目的是避免服务的级联失败。
一个熔断器可以有三种状态:关闭、打开和半开,默认情况下处于关闭状态。在关闭状态下,无论请求成功或失败,到达预先设定的故障数量阈值前,都不会触发熔断。而当达到阈值时,熔断器就会打开。当调用处于打开状态的服务时,熔断器将断开请求,这意味着它会直接返回一个错误,而不去执行调用。通过在客户端断开下游请求的方式,可以在生产环境中防止级联故障的发生。在经过事先配置的超时时长后,熔断器进入半开状态,这种状态下故障服务有时间从其中断的行为中恢复。如果请求在这种状态下继续失败,则熔断器将再次打开并继续阻断请求。否则熔断器将关闭,服务将被允许再次处理请求。
设置熔断器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: httpbin
spec:
host: httpbin
trafficPolicy:
connectionPool:
tcp:
maxConnections: 1
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
outlierDetection:
consecutiveErrors: 1
interval: 1s
baseEjectionTime: 3m
maxEjectionPercent: 100
EOF
|
参考: https://www.servicemesher.com/blog/istio-circuit-breaking/
日志
系统的运行状态,除了通过 istio 自带的 prometheus
、kiali
、grafna
查看相关的日志。但是总是需要看更详细的文本日志输出。
原始的调用结构是 服务A 直接调用 服务B ,但是现在服务A 的sidecar 调用服务B 的sidecar然后才能调用服务B 。
那么想要定位问题,就是查看envoy的日志了。
首先确保envoy 日志是打开的
1
2
3
| $kubectl describe configmap istio -n istio-system | grep "accessLogFile"
accessLogFile: /dev/stdout
|
envoy 的日志是定制的,在服务的pod里叫做 istio-proxy
这个contianer。
1
2
3
4
5
6
7
8
9
10
| $ kubectl logs -f productpage-v1-6b746f74dc-xt7qh istio-proxy
[2021-09-20T14:12:23.277Z] "GET /details/0 HTTP/1.1" 200 - via_upstream - "-" 0 178 24 23 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" "768f9804-849c-9aca-b4f0-f85c838304e4" "details:9080" "10.100.1.49:9080" outbound|9080|v1|details.default.svc.cluster.local 10.100.1.51:54256 10.80.140.94:9080 10.100.1.51:46546 - -
[2021-09-20T14:12:23.310Z] "GET /reviews/0 HTTP/1.1" 200 - via_upstream - "-" 0 295 41 41 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" "768f9804-849c-9aca-b4f0-f85c838304e4" "reviews:9080" "10.100.0.19:9080" outbound|9080|v1|reviews.default.svc.cluster.local 10.100.1.51:54950 10.80.60.33:9080 10.100.1.51:55736 - -
[2021-09-20T14:12:23.253Z] "GET /productpage HTTP/1.1" 200 - via_upstream - "-" 0 4288 106 105 "10.100.0.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" "768f9804-849c-9aca-b4f0-f85c838304e4" "172.16.101.135:30554" "10.100.1.51:9080" inbound|9080|| 127.0.0.6:33335 10.100.1.51:9080 10.100.0.0:0 outbound_.9080_._.productpage.default.svc.cluster.local default
[2021-09-20T14:12:23.411Z] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 304 - via_upstream - "-" 0 0 32 29 "10.100.0.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" "8df34a40-a462-99b3-afe3-ea90df5f09d4" "172.16.101.135:30554" "10.100.1.51:9080" inbound|9080|| 127.0.0.6:53397 10.100.1.51:9080 10.100.0.0:0 outbound_.9080_._.productpage.default.svc.cluster.local default
[2021-09-20T14:12:23.429Z] "GET /static/bootstrap/css/bootstrap-theme.min.css HTTP/1.1" 304 - via_upstream - "-" 0 0 20 19 "10.100.0.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" "11b436e3-bad2-9608-b389-9eb8f422ca68" "172.16.101.135:30554" "10.100.1.51:9080" inbound|9080|| 127.0.0.6:48115 10.100.1.51:9080 10.100.0.0:0 outbound_.9080_._.productpage.default.svc.cluster.local default
[2021-09-20T14:12:23.436Z] "GET /static/jquery.min.js HTTP/1.1" 304 - via_upstream - "-" 0 0 18 17 "10.100.0.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" "105258af-c512-9df4-b8cd-7063eb29ee70" "172.16.101.135:30554" "10.100.1.51:9080" inbound|9080|| 127.0.0.6:50457 10.100.1.51:9080 10.100.0.0:0 outbound_.9080_._.productpage.default.svc.cluster.local default
[2021-09-20T14:12:23.436Z] "GET /static/bootstrap/js/bootstrap.min.js HTTP/1.1" 304 - via_upstream - "-" 0 0 26 24 "10.100.0.0" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" "adfefa36-12a2-90a2-b223-11c829cc2133" "172.16.101.135:30554" "10.100.1.51:9080" inbound|9080|| 127.0.0.6:52945 10.100.1.51:9080 10.100.0.0:0 outbound_.9080_._.productpage.default.svc.cluster.local default
|
envoy 日志配置项
配置项 | 说明 |
---|
global.proxy.accessLogFile | 日志输出文件,空为关闭输出 |
global.proxy.accessLogEncoding | 日志编码格式:JSON、TEXT |
global.proxy.accessLogFormat | 配置显示在日志中的字段,空为默认格式 |
global.proxy.logLevel | 日志级别,空为 warning |