熱啟動 Python 包裝器

通常,Envoy 會進行熱啟動以進行組態變更和二進位更新。然而,在許多情況下,使用者會希望使用標準的程序管理器,例如 monit、runit 等。我們提供/restarter/hot-restarter.py使其變得簡單易懂。

重新啟動器會像這樣被調用

hot-restarter.py start_envoy.sh

start_envoy.sh可能會像這樣定義(使用類似 salt/jinja 的語法)

#!/bin/bash

ulimit -n {{ pillar.get('envoy_max_open_files', '102400') }}
sysctl fs.inotify.max_user_watches={{ pillar.get('envoy_max_inotify_watches', '524288') }}

exec /usr/sbin/envoy -c /etc/envoy/envoy.cfg --restart-epoch $RESTART_EPOCH --service-cluster {{ grains['cluster_name'] }} --service-node {{ grains['service_node'] }} --service-zone {{ grains.get('ec2_availability-zone', 'unknown') }}

關於 inotify.max_user_watches 的注意事項:如果 Envoy 被設定為監看 Linux 機器上目錄中的許多組態檔案,請增加此值,因為 Linux 對可監看的最大檔案數量強制執行限制。

RESTART_EPOCH 環境變數會在每次重新啟動時由重新啟動器設定,且必須傳遞給 --restart-epoch 選項。

警告

如果您想要使用 --use-dynamic-base-id 選項,則必須特別小心。該旗標僅能在 RESTART_EPOCH 為 0 時設定,而您的 start_envoy.sh 必須取得選定的基礎 ID(透過 --base-id-path),儲存它,並在後續的調用中(當 RESTART_EPOCH 大於 0 時)將其用作 --base-id 的值。

重新啟動器處理下列訊號

  • SIGTERMSIGINT (Ctrl-C):將會乾淨地終止所有子程序並退出。

  • SIGHUP:將會通過重新調用傳遞給熱啟動腳本的第一個參數來進行熱啟動。

  • SIGCHLD:如果任何子程序意外關閉,重新啟動腳本將會關閉所有程序並退出,以避免處於非預期的狀態。控制程序管理器應接著重新啟動重新啟動器腳本以再次啟動 Envoy。

  • SIGUSR1:將會轉發至 Envoy 作為重新開啟所有存取日誌的訊號。這用於原子移動和重新開啟日誌輪換。