Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update lazyload doc #206

Merged
merged 1 commit into from
Nov 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 26 additions & 61 deletions staging/src/slime.io/slime/modules/lazyload/README_zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,118 +4,83 @@
- [思路](#思路)
- [架构](#架构)
- [安装和使用](#安装和使用)
- [特性介绍](#特性介绍)
- [完整使用样例](#完整使用样例)
- [E2E测试介绍](#e2e测试介绍)
- [ServiceFence说明](#servicefence说明)
- [常见问题](#常见问题)
- [更多信息](#更多信息)



# 懒加载概述

[English](./README.md)

## 特点

1. 支持1.8+的Istio版本,无侵入性,[版本适配详情](https://github.com/slime-io/slime/issues/145)
2. 可自动对接整个服务网格
3. 兜底转发过程支持Istio所有流量治理能力
4. 兜底逻辑简单,与服务数量无关,无性能问题
5. 支持为服务手动或自动启用懒加载
6. 支持Accesslog和Prometheus等多种动态服务依赖获取方式
7. 支持添加静态服务依赖关系,动静依赖关系结合,功能全面



## 特点

1. 场景丰富:支持动态和静态管理 `Sidecar` 资源
2. 治理完善:支持 Istio 所有流量治理能力
3. 对 Istio 友好:无侵入性,支持1.8以上的 Istio
4. 使用简单:可自动对接整个服务网格

## 背景

懒加载即按需加载。

没有懒加载时,服务数量过多时,Envoy配置量太大,新上的应用长时间处于Not Ready状态。为应用配置Custom Resource `Sidecar`,并自动的获取服务依赖关系,更新Sidecar可以解决此问题。



## 思路
## 背景

引入一个服务`global-sidecar`,它是一个兜底应用。它会被集群的Istiod注入sidecar容器。该sidecar容器拥有全量的配置和服务发现信息。兜底路由替换为指向global-sidecar
懒加载即按需加载

引入新的Custom Resource Definition `ServiceFence`。详见[ServiceFence说明](#ServiceFence说明)
没有懒加载时,服务网格内服务数量过多时,Envoy 配置量太大,新上的应用长时间处于 Not Ready 状态。为应用配置 Custom Resource `Sidecar`,并自动的获取服务依赖关系,管理 `Sidecar` 可以解决此问题。但是社区的 `Sidecar` 资源没有自动管理的手段。

最后,将控制逻辑包含到lazyload controller组件中。它会为启用懒加载的服务创建ServiceFence和Sidecar,根据配置获取到服务调用关系,更新ServiceFence和Sidecar
其次,在按需配置的场景下,应用必然面对第一次访问新的目标服务缺少相关 xds 配置的问题,需要解决



## 架构

整个模块由Lazyload controller和global-sidecar两部分组成。Lazyload controller无需注入sidecar,global-sidecar则需要注入。

<img src="./media/lazyload-architecture-20211222_zh.png" style="zoom:80%;" />
## 思路

首先解决 `Sidecar` 资源的自动管理问题。

我们引入了新的 CRD `ServiceFence`, 来辅助管理 `Sidecar` 资源。我们可以在 `ServiceFence` 中存储服务的静态、动态依赖关系,从而管理相应的 `Sidecar` 资源。 `lazyload controller` 组件是控制器。它会为启用懒加载的服务创建 `ServiceFence` 和 `Sidecar`,根据配置获取到服务调用关系,更新 `ServiceFence` 和 `Sidecar` 。

具体的细节说明可以参见[架构](./lazyload_tutorials_zh.md#%E6%9E%B6%E6%9E%84)
其次,解决首次访问的兜底问题。

我们引入了一个组件 `global-sidecar`,来负责流量兜底。它会被集群的 Istiod 注入标准的 sidecar 容器,因此拥有全量的配置和服务信息。然后,通过 `EnvoyFilter` 将兜底路由替换为指向 `global-sidecar` ,实现对请求的兜底和正确转发。


## 安装和使用

1. 根据global-sidecar的部署模式不同,该模块目前分为两种模式:

- Cluster模式:使用cluster级别的global-sidecar:集群唯一global-sidecar应用

- Namespace模式:使用namespace级别的global-sidecar:每个使用懒加载的namespace下一个global-sidecar应用
## 架构

2. 根据服务依赖关系指标来源不同,该模块分为两种模式:
整个模块由 `lazyload controller` 和 `global-sidecar` 两部分组成。`lazyload controller` 无需注入 sidecar ,global-sidecar 则需要注入。

- Accesslog模式:global-sidecar通过入流量拦截,生成包含服务依赖关系的accesslog
- Prometheus模式:业务应用在完成访问后,生成metric,上报prometheus。此种模式需要集群对接Prometheus
<img src="./media/lazyload-architecture-20211222_zh.png" style="zoom:80%;" />

总的来说,Lazyload模块有4种使用模式,较为推荐Cluster+Accesslog模式。

详见 [安装和使用](./lazyload_tutorials_zh.md#%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8)

根据服务依赖关系指标来源的不同,分为两种模式:

- Accesslog 模式:`global-sidecar` 通生成包含服务依赖关系的 `accesslog` 作为指标
- Prometheus 模式:业务应用在完成访问后,生成 promtheus metric ,作为指标

## 特性介绍
推荐 Accesslog 模式。具体的细节说明可以参见[架构](./lazyload_tutorials_zh.md#%E6%9E%B6%E6%9E%84)

- 可基于Accesslog开启懒加载
- 支持为服务手动或自动启用懒加载
- 支持自定义兜底流量分派
- 支持添加静态服务依赖关系
- 支持自定义服务依赖别名
- 日志输出到本地并轮转

详见 [特性介绍](./lazyload_tutorials_zh.md#%E7%89%B9%E6%80%A7%E4%BB%8B%E7%BB%8D)



## 完整使用样例
## 安装和使用

详见 [示例: 为bookinfo的productpage服务开启懒加载](./lazyload_tutorials_zh.md#%E7%A4%BA%E4%BE%8B)



## E2E测试介绍

在进行功能开发时,可以通过E2E测试验证模块功能正确性。

详见 [E2E测试教程](https://github.com/slime-io/slime/blob/master/doc/zh/slime_e2e_test_zh.md)



## ServiceFence说明

ServiceFence可以看作是针对某一服务的Sidecar资源,区别是ServiceFence不仅会根据依赖关系生成Sidecar资源,同时会根据VirtualService规则判断服务的真实后端,并自动扩大Fence的范围。

例如,c.default.svc.cluster.local在fence中。此时有一条路由规则的host为c.default.svc.cluster.local,其destinatoin为d.default.svc.cluster.local,那么d服务也会被自动扩充到Fence中。

<img src="./media/ll.png" alt="服务围栏" style="zoom: 67%;" />



## 常见问题
## 更多信息

详见 [FAQ](./lazyload_tutorials_zh.md#FAQ)
懒加载详细介绍参见 [懒加载教程](./lazyload_tutorials_zh.md)

Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,22 @@ spec:
pullPolicy: Always
repository: docker.io/slimeio/slime-lazyload
tag: v0.5.0_linux_amd64
resources:
requests:
cpu: 300m
memory: 300Mi
limits:
cpu: 600m
memory: 600Mi
module:
- name: lazyload # custom value
kind: lazyload # should be "lazyload"
enable: true
general: # replace previous "fence" field
autoPort: true
autoFence: true
defaultFence: false
wormholePort: # replace to your application service ports, and extend the list in case of multi ports
- "80"
- "9080"
global:
misc:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@ spec:
pullPolicy: Always
repository: docker.io/slimeio/slime-lazyload
tag: v0.5.0_linux_amd64
resources:
requests:
cpu: 300m
memory: 300Mi
limits:
cpu: 600m
memory: 600Mi
module:
- name: lazyload # custom value
kind: lazyload # should be "lazyload"
Expand All @@ -18,8 +25,12 @@ spec:
- "80"
- "9080"
global:
autoPort: true
autoFence: true
defaultFence: false
misc:
globalSidecarMode: cluster # inform the mode of global-sidecar
metricSourceType: prometheus
metric: # indicate the metric source
prometheus:
address: http://prometheus.istio-system:9090
Expand Down
Loading