etcd+confd+nginxを使用して動的逆エージェントを実現
confd紹介
confdは軽量レベルの構成管理ツールで、ソースアドレス:https://github.com/kelseyhightower/confdこれにより、etcd、consul、dynodb、redis、zookeeperなどに構成情報を格納できます.confdは定期的にこれらのストレージノードpullの最新の構成から、サービスを再ロードし、プロファイルの更新を完了します.
シーン
既存のアプリケーションサービスa 1,a 2,a 3,...はhttpサービスを提供する.前にnginxがエージェントとしてあり,nginxの構成のupstreamには以上のアプリケーションサービスのアドレスが配置されている.アプリケーションサービスはいずれもマイクロサービス化され、k 8 sを走っている.業務発展の需要に応じて、応用サービスa 1,a 2,...は動的に削除しなければならない.現在解決すべき要件は、a 1,a 2,...サービス個数を動的に増加させると、nginxのupstreamリストを自動的に更新することである.
我々が望むnginxのupstreamの構成:
編集/etc/confd/templates/nginx.conf.tmpl:
主な文法解釈:-{{range getvs"/pro/nginx/upstream/*}}}}//は、どのディレクトリを巡る値を表す-server{.}}}}}//出力値-{{end}//range終了
conf.d/nginxを編集します.toml:
パラメータ解釈:-src:nginx構成テンプレートを表すアドレス-dest:テンプレート置換後、出力される実際のnginxの構成アドレス-keys:リスニングするetcdkey、使用するものを書く-check_cmd:構成を有効にする前に、構成の可用性を確認することを示します.チェックに失敗した場合はreloadは実行されません.構成なし、チェックなし、reloadを直接実行できます.cmd. - reload_cmd:nginxを再ロードするコマンドを表します.構成する必要があります.
nginxが存在するdockerでconfdを同時に起動します.
http://172.16.1.1:2379等アドレスは、対応するetcdのアドレスです.
アプリケーションa 1,...で、起動後、etcdの/pro/nginx/upstream/addr_に自分のipを登録するof_a 1,値は対応するipである.
前提はnginxが存在するpodがa 1などのネットワークを1つのイントラネットセグメントに適用することである.
confdは軽量レベルの構成管理ツールで、ソースアドレス:https://github.com/kelseyhightower/confdこれにより、etcd、consul、dynodb、redis、zookeeperなどに構成情報を格納できます.confdは定期的にこれらのストレージノードpullの最新の構成から、サービスを再ロードし、プロファイルの更新を完了します.
シーン
既存のアプリケーションサービスa 1,a 2,a 3,...はhttpサービスを提供する.前にnginxがエージェントとしてあり,nginxの構成のupstreamには以上のアプリケーションサービスのアドレスが配置されている.アプリケーションサービスはいずれもマイクロサービス化され、k 8 sを走っている.業務発展の需要に応じて、応用サービスa 1,a 2,...は動的に削除しなければならない.現在解決すべき要件は、a 1,a 2,...サービス個数を動的に増加させると、nginxのupstreamリストを自動的に更新することである.
我々が望むnginxのupstreamの構成:
upstream hash_sid {
hash $arg_sid;
server addr_of_a1;
server addr_of_a2;
...
}
編集/etc/confd/templates/nginx.conf.tmpl:
worker_processes 2;
events {
use epoll;
worker_connections 10000;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
proxy_connect_timeout 2;
client_max_body_size 100m;
upstream hash_sid {
hash $arg_sid;
{{range getvs "/pro/nginx/upstream/*"}}
server {{.}};
{{end}}
}
server {
#listen *:443;
listen 443 ssl;
server_name *.yourdomain.com;
ssl_certificate /etc/openresty/cert/yourdomain.pem;
ssl_certificate_key /etc/openresty/cert/yourdomain.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
charset utf-8;
access_log logs/443.access.log;
error_log logs/443.error.log;
# http
location ^~ /shop/ {
proxy_pass http://hash_sid;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
# websocket WebSocket
location ^~ /chat {
proxy_pass http://hash_sid;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
主な文法解釈:-{{range getvs"/pro/nginx/upstream/*}}}}//は、どのディレクトリを巡る値を表す-server{.}}}}}//出力値-{{end}//range終了
conf.d/nginxを編集します.toml:
[template]
src = "nginx.conf.tmpl"
dest = "/usr/local/openresty/nginx/conf/nginx.conf"
keys = [
"/pro/nginx/upstream/",
"/pro/nginx/redis/",
]
check_cmd = "/usr/local/openresty/bin/openresty -t -c {{.src}}"
reload_cmd = "/usr/local/openresty/bin/openresty -s reload"
パラメータ解釈:-src:nginx構成テンプレートを表すアドレス-dest:テンプレート置換後、出力される実際のnginxの構成アドレス-keys:リスニングするetcdkey、使用するものを書く-check_cmd:構成を有効にする前に、構成の可用性を確認することを示します.チェックに失敗した場合はreloadは実行されません.構成なし、チェックなし、reloadを直接実行できます.cmd. - reload_cmd:nginxを再ロードするコマンドを表します.構成する必要があります.
nginxが存在するdockerでconfdを同時に起動します.
confd -watch -backend etcdv3 -node http://172.16.1.1:2379 -node http://172.16.1.2:2379 -node http://172.16.1.3:2379
http://172.16.1.1:2379等アドレスは、対応するetcdのアドレスです.
アプリケーションa 1,...で、起動後、etcdの/pro/nginx/upstream/addr_に自分のipを登録するof_a 1,値は対応するipである.
前提はnginxが存在するpodがa 1などのネットワークを1つのイントラネットセグメントに適用することである.