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",
    ""
   ]
  }
 }
}

 

posted @ 2022-08-16 15:33  小吉猫  阅读(247)  评论(0编辑  收藏  举报