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の構成:
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つのイントラネットセグメントに適用することである.