Administration interface
Administration interface和Layered Runtime
管理接口admin
Envoy內(nèi)建了一個(gè)管理服務(wù)(administration server),它支持查詢和修改操作,甚至有可能暴露私有數(shù)據(jù)(例如統(tǒng)計(jì)數(shù)據(jù)、集群名稱和證書信息等),因此非常有必要精心編排其訪問控制機(jī)制以避免非授權(quán)訪問;
admin:access_log: [] # 訪問日志協(xié)議的相關(guān)配置,通常需要指定日志過濾器及日志配置等;access_log_path: ... # 管理接口的訪問日志文件路徑,無須記錄訪問日志時(shí)使用/dev/null;profile_path: ... # cpu profiler的輸出路徑,默認(rèn)為/var/log/envoy/envoy.prof;address: # 監(jiān)聽的套接字;socket_address: protocol: ...address: ...port_value: ...下面是一個(gè)簡單的配置示例
admin: access_log_path: /tmp/admin_access.log address: socket_address: { address: 0.0.0.0, port_value: 9901 } # 提示:此處 僅為出于方便測試的目的,才設(shè)定其監(jiān)聽于對外通信的任意IP地址;安全起見,應(yīng)該使用127.0.0.1;為Envoy添加Admin Interface
以前面一節(jié)中配置的“L7 Front Proxy”添加管理接口的方法,僅需要在其用到的envoy.yaml
配置文件中添加相關(guān)的配置信息即可;
下面給出的簡單的測試命令
admin: access_log_path: /tmp/admin_access.log address: socket_address: { address: 0.0.0.0, port_value: 9901 } 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 …… clusters: - name: local_cluster connect_timeout: 0.25s type: STATIC …… ~$ curl 172.31.5.2:9901/listeners listener_0::0.0.0.0:80 ~$ curl 172.31.5.2:9901/ready LIVE ~$ curl 172.31.5.2:9901/config_dump { "configs": [ { "@type": "type.googleapis.com/envoy.admin.v3.BootstrapConfigDump", "bootstrap": { "node": { "hidden_envoy_deprecated_build_version": "98c1c9e9a40804b93b074badad1cdf284b47d58b/1.18.3/Clean/RELEAS E/BoringSSL", "user_agent_name": "envoy", "user_agent_build_version": { "version": { "major_number": 1, "minor_number": 18, "patch": 3 }, …… }管理接口admin速覽
admin接口內(nèi)置了多個(gè)/path,不同的path可能會(huì)分別接受不同的GET或POST請求;
admin commands are: /: Admin home page # GET /ready:Outputs a string and error code reflecting the state of the server. # GET,返回envoy服務(wù)當(dāng)前的狀態(tài); /certs: print certs on machine # GET,列出已加載的所有TLS證書及相關(guān)的信息; /clusters: upstream cluster status # GET,額外支持使用“GET /clusters?format=json” /config_dump: dump current Envoy configs # GET,打印Envoy加載的各類配置信息;支持include_eds、master和resource等查詢參數(shù); /contention: dump current Envoy mutex contention stats (if enabled) # GET,互斥跟蹤 /cpuprofiler: enable/disable the CPU profiler # POST,啟用或禁用cpuprofiler /healthcheck/fail: cause the server to fail health checks # POST,強(qiáng)制設(shè)定HTTP健康狀態(tài)檢查為失敗; /healthcheck/ok: cause the server to pass health checks # POST,強(qiáng)制設(shè)定HTTP健康狀態(tài)檢查為成功; /heapprofiler: enable/disable the heap profiler # POST,啟用或禁用heapprofiler; /help: print out list of admin commands /hot_restart_version: print the hot restart compatibility version # GET,打印熱重啟相關(guān)的信息; /listeners: print listener addresses # GET,列出所有偵聽器,支持使用“GET /listeners?format=json” /drain_listeners:Drains all listeners. # POST,驅(qū)逐所有的listener,支持使用inboundonly(僅入站偵聽器)和graceful(優(yōu)雅關(guān)閉)等查詢參數(shù); /logging: query/change logging levels # POST,啟用或禁用不同子組件上的不同日志記錄級別 /memory: print current allocation/heap usage # POST,打印當(dāng)前內(nèi)在分配信息,以字節(jié)為單位; /quitquitquit: exit the server # POST,干凈退出服務(wù)器; /reset_counters: reset all counters to zero # POST,重圍所有計(jì)數(shù)器; /tap:This endpoint is used for configuring an active tap session. # POST,用于配置活動(dòng)的帶標(biāo)簽的session; //reopen_logs:Triggers reopen of all access logs. Behavior is similar to SIGUSR1 handling. # POST,重新打開所有的日志,功能類似于SIGUSR1信號; /runtime: print runtime values # GET,以json格式輸出所有運(yùn)行時(shí)相關(guān)值; /runtime_modify: modify runtime values # POST /runtime_modify?key1=value1&key2=value2,添加或修改在查詢參數(shù)中傳遞的運(yùn)行時(shí)值 /server_info: print server version/status information # GET,打印當(dāng)前Envoy Server的相關(guān)信息; /stats: print server stats # 按需輸出統(tǒng)計(jì)數(shù)據(jù),例如GET /stats?filter=regex,另外還支持json和prometheus兩種輸出格式; /stats/prometheus: print server stats in prometheus format # 輸出prometheus格式的統(tǒng)計(jì)信息;管理接口
幾個(gè)示例輸出
? GET /clusters:列出所有已配置的集群,包括每個(gè)集群中發(fā)現(xiàn)的所有上游主機(jī)以及每個(gè)主機(jī)的統(tǒng)計(jì)信息;支持輸出為json格式;
◆ 集群管理器信息:“version_info string”,無CDS時(shí),則顯示為“version_info::static”
◆ 集群相關(guān)的信息:斷路器、異常點(diǎn)檢測和用于表示是否通過CDS添加的標(biāo)識(shí)“add_via_api”
◆ 每個(gè)主機(jī)的統(tǒng)計(jì)信息:包括總連接數(shù)、活動(dòng)連接數(shù)、總請求數(shù)和主機(jī)的健康狀態(tài)等;不健康的原因通常有以下三種
-
failed_active_hc:未通過主動(dòng)健康狀態(tài)檢測;
-
failed_eds_health:被EDS標(biāo)記為不健康;
-
failed_outlier_check:未通過異常檢測機(jī)制的檢查;
? GET /listeners:列出所有已配置的偵聽器,包括偵聽器的名稱以及監(jiān)聽的地址;支持輸出為json格式;
? POST /reset_counters:將所有計(jì)數(shù)器重圍為0;不過,它只會(huì)影響Server本地的輸出,對于已經(jīng)發(fā)送到
外部存儲(chǔ)系統(tǒng)的統(tǒng)計(jì)數(shù)據(jù)無效;
? GET /config_dump:以json格式打印當(dāng)前從Envoy的各種組件加載的配置信息;
? GET /ready:獲取Server就緒與否的狀態(tài),LIVE狀態(tài)為200,否則為503;
集群統(tǒng)計(jì)信息中主機(jī)的狀態(tài)說明
Envoy 運(yùn)行時(shí)配置概述
相較于靜態(tài)資源配置來說,xDS API的動(dòng)態(tài)配置機(jī)制使得Envoy的配置系統(tǒng)極具彈性;
? 但有時(shí)候配置的變動(dòng)僅需要修改個(gè)別的功能特性,若通過xDS接口完成未免有些動(dòng)靜過大,Runtime便是面向這種場景的配置接口;
? Runtime就是一個(gè)虛擬文件系統(tǒng)樹,可通過一至多個(gè)本地文件系統(tǒng)目錄、靜態(tài)資源、RTDS動(dòng)態(tài)發(fā)現(xiàn)和Admin Interface進(jìn)行定義和配置;
◆ 每個(gè)配置稱為一個(gè)Layer,因而也稱為“Layered Runtime”,這些Layer最終疊加生效;
換句話說,Runtime是與Envoy一起部署的外置實(shí)時(shí)配置系統(tǒng),用于支持更改配置設(shè)置而無需重啟Envoy或更改主配置;
? 運(yùn)行時(shí)配置相關(guān)的運(yùn)行時(shí)參數(shù)也稱為“功能標(biāo)志(feature flags)”或“決策者(decider)”;
? 通過運(yùn)行時(shí)參數(shù)更改配置將實(shí)時(shí)生效;
運(yùn)行時(shí)配置的實(shí)現(xiàn)也稱為運(yùn)行時(shí)配置供應(yīng)者;
? Envoy當(dāng)前支持的運(yùn)行時(shí)配置的實(shí)現(xiàn)是由多個(gè)層級組成的虛擬文件系統(tǒng)
◆ Envoy在配置的目錄中監(jiān)視符號鏈接的交換空間,并在發(fā)生交換時(shí)重新加載文件樹;
? 但Envoy會(huì)使用默認(rèn)運(yùn)行時(shí)值和“null”提供給程序以確保其正確運(yùn)行,因此,運(yùn)行時(shí)配置系統(tǒng)并不必不可少;
配置Envoy運(yùn)行時(shí)環(huán)境
啟用Envoy的運(yùn)行時(shí)配置機(jī)制需要在Bootstrap文件中予以啟用和配置
?定義在bootstrap配置文件中的layered_runtime頂級字段之下
? 一旦在bootstrap中給出layered_runtime字段,則至少要定義出一個(gè)layer;
layered_runtime: # 配置運(yùn)行配置供應(yīng)者,未指定時(shí)則使用null供應(yīng)者,即所有參數(shù)均加載其默認(rèn)值; layers: # 運(yùn)行時(shí)的層級列表,后面的層將覆蓋先前層上的配置; - name: ... # 運(yùn)行時(shí)的層級名稱,僅用于“GET /runtime”時(shí)的輸出; static_layer: {...} # 靜態(tài)運(yùn)行時(shí)層級,遵循運(yùn)行時(shí)probobuf JSON表示編碼格式;不同于靜態(tài)的xDS資源,靜態(tài)運(yùn)行時(shí)層一樣可被后面的層所覆蓋; # 此項(xiàng)配置,以及后面三個(gè)層級類型彼此互斥,因此一個(gè)列表項(xiàng)中僅可定義一層; disk_layer: {...} # 基于本地磁盤的運(yùn)行時(shí)層級; symlink_root: ... # 通過符號鏈接訪問的文件系統(tǒng)樹; subdirectory: ... # 指定要在根目錄中加載的子目錄; append_service_cluster: ... # 是否將服務(wù)集群附加至符號鏈接根目錄下的子路徑上; admin_layer: {...} # 管理控制臺(tái)運(yùn)行時(shí)層級,即通過/runtime管理端點(diǎn)查看,通過/runtime_modify管理端點(diǎn)修改的配置方式; rtds_layer: {...} # 運(yùn)行時(shí)發(fā)現(xiàn)服務(wù)(runtime discovery service)層級,即通過xDS API中的RTDS API動(dòng)態(tài)發(fā)現(xiàn)相關(guān)的層級配置; name: ... # 在rtds_config上為RTDS層訂閱的資源; rtds_config:RTDS的ConfigSource;Front Proxy and TlS
Front proxy
在Envoy Mesh中,作為Front Proxy的Envoy通常是獨(dú)立運(yùn)行的進(jìn)程,它將客戶端請求代理至Mesh中的各Service,而這些Service中的每個(gè)應(yīng)用實(shí)例都會(huì)隱藏于一個(gè)Sidecar Proxy模式的envoy
實(shí)例背后;
? 我們這里仍然以docker-compose為編排工具,以便于將更多的精力集中于Envoy及Mesh之上
TLS
Envoy Mesh 中的TLS模式大體有如下幾種常用場景
Front Proxy面向下游客戶端提供https服務(wù),但Front Proxy、Mesh內(nèi)部的各服務(wù)間依然使用http協(xié)議
◆ https → http
? Front Proxy面向下游客戶端提供https服務(wù),而且Front Proxy、Mesh內(nèi)部的各服務(wù)間也使用https協(xié)議
◆ https → https
◆ 但是內(nèi)部各Service間的通信也有如下兩種情形
-
僅客戶端驗(yàn)證服務(wù)端證書
-
客戶端與服務(wù)端之間互相驗(yàn)證彼此的證書(mTLS)
◆ 注意:對于容器化的動(dòng)態(tài)環(huán)境來說,證書預(yù)配和管理將成為顯著難題
? Front Proxy直接以TCP Proxy的代理模式,在下游客戶端與上游服務(wù)端之間透傳tls協(xié)議;
◆ https-passthrough
◆ 集群內(nèi)部的東西向流量同樣工作于https協(xié)議模型
TLS Front Proxy
僅需要配置Listener面向下游客戶端提供tls通信,下面是Front Proxy Envoy的配置示例
static_resources:listeners:- name: listener_httpaddress:socket_address: { address: 0.0.0.0, port_value: 8443 }filter_chains: - filters:- name: envoy.filters.network.http_connection_managertyped_config: @type":type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerstat_prefix: ingress_httpcodec_type: AUTOroute_config:name: local_routevirtual_hosts:- name: web_service_01domains: ["*"]routes:- match: { prefix: "/" }route: { cluster: web_cluster_01 }http_filters: - name: envoy.filters.http.routertransport_socket:name: envoy.transport_sockets.tlstyped_config:"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContextcommon_tls_context:tls_certificates:# The following self-signed certificate pair is generated using:# $ openssl req -x509 -newkey rsa:2048 -keyout front-proxy.key -out front-proxy.crt -days 3650 -nodes -subj '/CN=www.magedu.com'- certificate_chain:filename: "/etc/envoy/certs/front-proxy.crt"private_key:filename: "/etc/envoy/certs/front-proxy.key“Upstream and downstream TLS
除了Listener中面向下游提供tls通信,Front Proxy還要以tls協(xié)議與Envoy Mesh中的各Service建
立tls連接;
? 下面左側(cè)是Envoy Mesh中的某Service的Sidecar Proxy Envoy的配置示例,右則是Front Proxy Envoy
中的Cluster面向上游通信的配置示例
static_resources:listeners:- name: listener_0address:socket_address: { address: 0.0.0.0, port_value: 443 }filter_chains:- filters:- name: envoy.filters.network.http_connection_managertyped_config:……h(huán)ttp_filters: - name: envoy.filters.http.router transport_socket: name: envoy.transport_sockets.tls typed_config: "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext common_tls_context: tls_certificates: - certificate_chain: filename: "/etc/envoy/certs/webserver.crt" private_key: filename: "/etc/envoy/certs/webserver.key" clusters: - name: web_cluster_01connect_timeout: 0.25stype: STATIClb_policy: ROUND_ROBINload_assignment:cluster_name: web_cluster_01endpoints:- lb_endpoints:- endpoint:address:socket_address: { address: 172.31.8.11, port_value: 443 }- endpoint:address:socket_address: { address: 172.31.8.12, port_value: 443 }transport_socket:name: envoy.transport_sockets.tlstyped_config:"@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContextFront Proxy https passthrough
TLS passthrough模式的Front Proxy需要使用TCP Proxy類型的Listener,Cluster的相關(guān)配置中也無需再指定transport_socket相關(guān)的配置;
? 但Envoy Mesh中各Service需要基于tls提供服務(wù)
static_resources:listeners:- name: listener_httpaddress:socket_address: { address: 0.0.0.0, port_value: 8443 }filter_chains:- filters:- name: envoy.filters.network.tcp_proxytyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxycluster: web_cluster_01stat_prefix: https_passthroughclusters:- name: web_cluster_01connect_timeout: 0.25stype: STATIClb_policy: ROUND_ROBINload_assignment:cluster_name: web_cluster_01endpoints:- lb_endpoints:- endpoint:address:socket_address: { address: 172.31.9.11, port_value: 443 }- endpoint:address:socket_address: { address: 172.31.9.12, port_value: 443 }總結(jié)
以上是生活随笔為你收集整理的Administration interface的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快两年的时间,我都干了啥
- 下一篇: 多重 for 循环,如何提高效率?