Envoy layered runtime基础
Envoy运行时配置概述
https://www.envoyproxy.io/docs/envoy/latest/configuration/operations/runtime#config-runtime
-
相较于静态资源配置来说,xDS API的动态配置机制使得Envoy的配置系统极具弹性;
- 但有时候配置的变动仅需要修改个别的功能特性,若通过xDS接口完成未免有些动静过大,Runtime便是面向这种场景的配置接口;
- Runtime就是一个虚拟文件系统树,可通过一至多个本地文件系统目录、静态资源、RTDS动态发现和Admin Interface进行定义和配置;
-
每个配置称为一个Layer,因而也称为“Layered Runtime”,这些Layer最终叠加生效;
-
- Runtime是与Envoy一起部署的外置实时配置系统,用于支持更改配置设置而无需重启Envoy或更改主配置;
-
运行时配置相关的运行时参数也称为“功能标志(feature flags)”或“决策者(decider)”;
-
通过运行时参数更改配置将实时生效;
-
-
运行时配置的实现也称为运行时配置供应者;
-
Envoy当前支持的运行时配置的实现是由多个层级组成的虚拟文件系统;
-
Envoy在配置的目录中监视符号链接的交换空间,并在发生交换时重新加载文件树;
-
- 但Envoy会使用默认运行时值和“null”提供给程序以确保其正确运行,因此,运行时配置系统并不必不可少;
-
配置Envoy运行时环境
Envoy启用runtime格式
-
启用Envoy的运行时配置机制需要在Bootstrap文件中予以启用和配置;
-
定义在bootstrap配置文件中的layered_runtime顶级字段之下
-
一旦在bootstrap中给出layered_runtime字段,则至少要定义出一个layer;
-
runtime配置格式
layered_runtime: # 配置运行配置供应者,未指定时则使用null供应者,即所有参数均加载其默认值;
layers: # 运行时的层级列表,后面的层将覆盖先前层上的配置;
- name: ... # 运行时的层级名称,仅用于“GET /runtime”时的输出;
static_layer: {...} # 静态运行时层级,遵循运行时probobuf JSON表示编码格式;不同于静态的xDS资源,静态运行时层一样可被后面的层所覆盖;
# 此项配置,以及后面三个层级类型彼此互斥,因此一个列表项中仅可定义一层;
disk_layer: {...} # 基于本地磁盘的运行时层级;
symlink_root: ... # 通过符号链接访问的文件系统树;
subdirectory: ... # 指定要在根目录中加载的子目录;
append_service_cluster: ... # 是否将服务集群附加至符号链接根目录下的子路径上;
admin_layer: {...} # 管理控制台运行时层级,即通过/runtime管理端点查看,通过/runtime_modify管理端点修改的配置方式;
rtds_layer: {...} # 运行时发现服务(runtime discovery service)层级,即通过xDS API中的RTDS API动态发现相关的层级配置;
name: ... # 在rtds_config上为RTDS层订阅的资源;
rtds_config: {...} # RTDS的ConfigSource;
Envoy运行时配置
虚拟文件系统
-
运行时配置用于指定包含重新加载配置元素的虚拟文件系统树;
-
该虚拟文件可以通过静态引导配置、本地文件系统、管理控制台和RTDS派生的叠加来实现;
-
因此,可以将运行时视为由多个层组成的虚拟文件系统;
-
在分层运行时的引导配置中指定各层级,后续的各层级中的运行设置会覆盖较早的层级;
-
-
分层配置样例
layers:
- name: static_layer_0
static_layer:
health_check:
min_interval: 5
- name: disk_layer_0
disk_layer: { symlink_root: /srv/runtime/current, subdirectory: envoy }
- name: disk_layer_1
disk_layer: { symlink_root: /srv/runtime/current, subdirectory: envoy_override, append_service_cluster: true }
- name: admin_layer_0
admin_layer: {}
-
静态引导配置层级,直接指定配置的运行时参数及其值;
-
本地磁盘文件系统
-
本地磁盘文件系统,子目录覆盖(override_subdirectory)
-
管理控制台层级
Envoy启用runtime示例
环境说明
envoy:Front Proxy,地址为172.31.14.2
webserver01:第一个后端服务,地址为172.31.14.11
webserver02:第二个后端服务,地址为172.31.14.12
envoy配置文件
查看代码
admin:
profile_path: /tmp/envoy.prof
access_log_path: /tmp/admin_access.log
address:
socket_address:
address: 0.0.0.0
port_value: 9901
layered_runtime:
layers:
- name: static_layer_0
static_layer:
health_check:
min_interval: 5
- name: admin_layer_0
admin_layer: {}
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 80 }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: web_service_1
domains: ["*"]
routes:
- match: { prefix: "/" }
route: { cluster: local_cluster }
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: local_cluster
connect_timeout: 0.25s
type: STATIC
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: local_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address: { address: 172.31.14.11, port_value: 8080 }
- endpoint:
address:
socket_address: { address: 172.31.14.12, port_value: 8080 }
docker-compose.yaml
查看代码
version: '3.3'
services:
envoy:
image: envoyproxy/envoy:v1.23-latest
volumes:
- ./envoy.yaml:/etc/envoy/envoy.yaml
environment:
- ENVOY_UID=0
- ENVOY_GID=0
networks:
envoymesh:
ipv4_address: 172.31.14.2
aliases:
- front-proxy
depends_on:
- webserver01
- webserver02
ports:
- "9901:9901"
webserver01:
image: ikubernetes/demoapp:v1.0
environment:
- PORT=8080
hostname: webserver01
networks:
envoymesh:
ipv4_address: 172.31.14.11
aliases:
- webserver01
webserver02:
image: ikubernetes/demoapp:v1.0
environment:
- PORT=8080
hostname: webserver02
networks:
envoymesh:
ipv4_address: 172.31.14.12
aliases:
- webserver02
networks:
envoymesh:
driver: bridge
ipam:
config:
- subnet: 172.31.14.0/24
运行envoy
docker-compose up -d
测试envoy
连接envoy容器
# docker-compose exec envoy bash
root@08f93e735f05:/#
查看runtime信息
root@08f93e735f05:/# curl http://127.0.0.1:9901/runtime
{
"layers": [
"static_layer_0",
"admin_layer_0"
],
"entries": {
"health_check.min_interval": {
"final_value": "5",
"layer_values": [
"5",
""
]
}
}
}