1950056 林羿海 - XLab-Tongji/2021-WorkloadSimulation GitHub Wiki

1.什么是Istio

官方介绍:Istio是连接、安全加固、控制和观察服务的开放平台。开放平台就是指它本身是开源的,服务对应的是微服务,也可以粗略地理解为单个应用。

连接(Connect):智能控制服务之间的调用流量,能够实现灰度升级、AB 测试和红黑部署等功能

安全加固(Secure):自动为服务之间的调用提供认证、授权和加密。

控制(Control):应用用户定义的 policy,保证资源在消费者中公平分配。

观察(Observe):查看服务运行期间的各种数据,比如日志、监控和 tracing,了解服务的运行情况。

1.1 Agent(代理)

先从最基础的代理说起。代理具有如下功能:

拦截:代理可以选择性拦截传输的网络流量,比如一些公司限制员工在上班的时候不能访问某些游戏或者电商网站,再比如把我们和世界隔离开来的 GFW,还有在数据中心中拒绝恶意访问的网关。

统计:既然所有的流量都经过代理,那么代理也可以用来统计网络中的数据信息,比如了解哪些人在访问哪些网站,通信的应答延迟等。

缓存:如果通信双方比较”远“,访问比较慢,那么代理可以把最近访问的数据缓存在本地,后面的访问不用访问后端来做到加速。CDN 就是这个功能的典型场景。

分发:如果某个通信方有多个服务器后端,代理可以根据某些规则来选择如何把流量发送给多个服务器,也就是我们常说的负载均衡功能,比如著名的 Nginx 软件。

跳板:如果 A、B 双方因为某些原因不能直接访问,而代理可以和双方通信,那么通过代理,双方可以绕过原来的限制进行通信。这应该是广大中国网民比较熟悉的场景。

注入:既然代理可以看到流量,那么它也可以修改网络流量,可以自动在收到的流量中添加一些数据,比如有些宽带提供商的弹窗广告。

1.2 Service Mesh

Service Mesh 可以看做是传统代理的升级版,用来解决现在微服务框架中出现的问题。我们可以把 Service Mesh 看做是分布式的微服务代理。

在代理的基础上,再加上一个控制中心,一个完整的 Service Mesh 就成了。管理员只需要根据控制中心的 API 来配置整个集群的应用流量、安全规则即可,代理会自动和控制中心打交道根据用户的期望改变自己的行为。

1.3 Istio

Istio 就是我们上述提到的 Service Mesh 架构的一种实现,服务之间的通信(比如这里的 Service A 访问 Service B)会通过代理(默认是 Envoy)来进行。

2.Istio日志信息

{
    "_index": "filebeat-testbed-log-envoy-2021.07.11", 			//索引
    "_type": "_doc", 							//类型
    "_id": "jq8klHoBhYdASTQR6zRI", 					//文件id
    "_score": 1, 							//文件相关性
    "_source": {												
        "@timestamp": "2021-07-11T05:57:56.158Z", 			//产生该日志信息的时间
        "kafka": {							//kafka是一个订阅消息传递系统
            "topic": "testbed-log-envoy", 				//每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic 的。
            "partition": 0, 						//topic将被分成多个partition进行传输
            "offset": 3638785065, 					//kafka会为每条消息设置一个偏移量
            "key": "", 							//如果定义了 Key,那么同一个Key 的所有消息都进入到相同的分区里面
            "headers": [ ]						//存储一些应用或业务相关的信息
        }, 
    "message": "{\"@timestamp\":\"2021-07-11T05:57:56.158Z\",\"@metadata\":{\"beat\":\"filebeat\",\"type\":\"_doc\",\"version\":\"7.9.1\"},\"host\":{\"name\":\"testbed00007\"},\"agent\":{\"name\":\"testbed00007\",\"type\":\"filebeat\",\"version\":\"7.9.1\",\"hostname\":\"testbed00007\",\"ephemeral_id\":\"af9ac1bb-6753-47fe-9183-1f6b60183978\",\"id\":\"a616877e-bcc6-41e1-afb0-ee1c4c37e5cf\"},\"ecs\":{\"version\":\"1.5.0\"},\"log\":{\"offset\":539193,\"file\":{\"path\":\"/var/log/pods/ts_currencyservice-2-67648fdbc9-mbdhf_6aa8cfa6-566e-4612-97c9-46bdc51b41ab/istio-proxy/0.log\"}},\"stream\":\"stdout\",\"message\":\"[2021-07-11T05:57:54.135Z] \\\"POST /hipstershop.CurrencyService/GetSupportedCurrencies HTTP/2\\\" 200 - \\\"-\\\" 5 170 1 1 \\\"-\\\" \\\"grpc-go/1.31.0\\\" \\\"13bf390f-dc60-9659-be43-e4d7d2fcb340\\\" \\\"currencyservice-2:7000\\\" \\\"127.0.0.1:7000\\\" inbound|7000|| 127.0.0.1:58560 172.20.6.227:7000 172.20.7.122:55332 outbound_.7000_._.currencyservice-2.ts.svc.cluster.local default\",\"input\":{\"type\":\"container\"},\"fields\":{\"type\":\"envoy\",\"data_id\":\"log.currencyservice.envoy.ts\",\"log_topic\":\"currencyservice-envoy\"}}", 		//原始信息
        "tags": [
            "json"							//用于标记每个事件的关键字列表。
        ], 
        "input": {
            "type": "kafka"
        }, 
        "ecs": {
            "version": "1.5.0"						//ECS版本
        }, 
        "host": {							//ECS主机
            "name": "testbed00007"					//主机名
        }, 
        "agent": {							//主机使用的代理
            "version": "7.9.1", 					//代理版本
            "hostname": "testbed00007", 				//代理的主机名
            "ephemeral_id": "c5f58179-e492-4ba0-a0e0-67b1324f7e14", //代理的临时标识符
            "id": "89c2ab78-af2d-4cd9-811f-530aaebd9498", //代理的唯一标识符
            "name": "testbed00007", 					//代理名
            "type": "filebeat"						//代理类型
        }
    }
}

3.参考资料

Istio:

http://www.uml.org.cn/wfw/201909063.asp

Kafka:

https://blog.csdn.net/mzl87/article/details/93468941

https://www.sohu.com/a/258129144_464962