Dockerを使用して高利用可能なETCDクラスタを展開する



etcdは、分散システムまたはマシンのクラスタによってアクセスされる必要があるデータを格納する信頼性の高い方法を提供する、強く一貫した、分散キー値ストアです.それは優雅にネットワークパーティションの間、リーダー選挙を扱い、リーダーノードでさえマシン故障を許容することができます.
このポストでは、DockerとDockerのコンポジションを使用してETCDクラスタを展開する方法を見ます.

必要条件
  • のDocker
  • Dockerは、
  • をつくります
  • Docker群クラスタ(オプション)
  • 試験目的の追加要件
  • python 3
  • Pipenv
  • Pip 3

  • 構成概要

    金研
    nginxの設定は非常に簡単です.つの上流のセクションを作成して、我々のETCDサーバ名を宣言する必要があります.
        upstream etcd_servers {
            least_conn;
            server etcd-00:2379 max_fails=3 fail_timeout=5s;
            server etcd-01:2379 max_fails=3 fail_timeout=5s;
            server etcd-02:2379 max_fails=3 fail_timeout=5s;
        }
    
    注意: Dockerを実行しているので、サーバの名前は内部のDNSによって解決されます.名前はDocker Compositionで宣言されたサービスの名前です.YML ( ETCD - 00 , ETCD - 01 , ETCD - 02 )
    さて、サーバのセクションを宣言する必要があります.
        server {
            listen     2379;
            proxy_pass etcd_servers;
        }
    
    最終的な設定は次のようになります.
    worker_processes 4;
    worker_rlimit_nofile 40000;
    
    events {
        worker_connections 8192;
    }
    
    stream {
        log_format  basic   '$time_iso8601 $remote_addr '
                            '$protocol $status $bytes_sent $bytes_received '
                            '$session_time $upstream_addr '
                            '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
    
        access_log  /dev/stdout basic;
    
        upstream etcd_servers {
            least_conn;
            server etcd-00:2379 max_fails=3 fail_timeout=5s;
            server etcd-01:2379 max_fails=3 fail_timeout=5s;
            server etcd-02:2379 max_fails=3 fail_timeout=5s;
        }
        server {
            listen     2379;
            proxy_pass etcd_servers;
        }
    }
    

    電総研
    Etcdをclusterモードで設定するには、各コンテナに次の設定を指定する必要があります.
        command:
          - etcd
          - --name=etcd-02
          - --data-dir=data.etcd
          - --advertise-client-urls=http://etcd-02:2379
          - --listen-client-urls=http://0.0.0.0:2379
          - --initial-advertise-peer-urls=http://etcd-02:2380
          - --listen-peer-urls=http://0.0.0.0:2380
          - --initial-cluster=etcd-00=http://etcd-00:2380,etcd-01=http://etcd-01:2380,etcd-02=http://etcd-02:2380
          - --initial-cluster-state=new
          - --initial-cluster-token=etcd-cluster-1
    
    ここで
  • -- name :このメンバーのための人間可読の名前.
  • -- data dir :データディレクトリへのパス.
  • --クライアントURLを広告します:このメンバーのクライアントURLのリストは、残りのクラスタに広告を出します.これらのURLにはドメイン名を含めることができます.
  • -クライアントクライアントのURLを聞く:クライアントのトラフィックをリッスンするURLのリスト.このフラグは、指定された上のクライアントからの受信要求を受け入れるようにETCDに伝えますscheme://IP:port組合せ.
  • --イニシャル広告ピアURL:このメンバーの同輩URLのリストは、残りのクラスタに広告を出します.これらのアドレスは、クラスタ周辺のETCDデータを通信するために使用される.少なくとも一つはすべてのクラスタメンバーにルーティング可能でなければなりません.これらのURLにはドメイン名を含めることができます.
  • -ピアのURLを聞く:URLのリストをピアトラフィックをリッスンします.このフラグはETCDに指定されたscheme://IP:port組合せ.
  • --初期クラスタ:ブートストラップの初期クラスタ設定.
  • --初期クラスタ状態:初期クラスタ状態(“new”または“既存”).初期の静的またはDNSブートストラッピング中にすべてのメンバーに新しい設定を設定します.このオプションが存在する場合、ETCDは既存のクラスタに参加しようとします.間違った値が設定されている場合、ETCDは起動を試みますが、安全に失敗します.
  • --初期クラスタトークン:ブートストラップ中のETCDクラスタの初期クラスタトークン.
  • すべての設定フラグが利用可能です
    here
    Dockerを使ったETCDクラスタの配備
    最初のステップは リポジトリをクローン化することです.
    git clone https://github.com/garutilorenzo/docker-etcd-cluster.git
    
    次に、環境変数をリポジトリに入力してください.
    cd docker-etcd-cluster 
    docker-compose up -d
    
    では、環境の状態を確認し、コンテナの準備を待ちましょう.
    docker-compose ps
    
    
         Name                   Command               State                        Ports                      
    ----------------------------------------------------------------------------------------------------------
    etcd_etcd-00_1   etcd --name=etcd-00 --data ...   Up      2379/tcp, 2380/tcp                              
    etcd_etcd-01_1   etcd --name=etcd-01 --data ...   Up      2379/tcp, 2380/tcp                              
    etcd_etcd-02_1   etcd --name=etcd-02 --data ...   Up      2379/tcp, 2380/tcp                              
    etcd_nginx_1     /docker-entrypoint.sh ngin ...   Up      0.0.0.0:2379->2379/tcp,:::2379->2379/tcp, 80/tcp
    
    this
    環境をテストする
    環境をテストするには、 がインストールされている必要があります.
    Pipenvをインストールしたら、
    pipenv shell
    pip install -r requirements.txt
    python test/etcd-test.py 
    hey key1
    hey key2
    
    NGNXサービスのログをチェックし、ETCDホストにリダイレクトされたトラフィックを確認してください.
    docker-compose logs -f nginx
    
    Attaching to etcd_nginx_1
    nginx_1    | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    nginx_1    | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
    nginx_1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
    nginx_1    | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
    nginx_1    | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
    nginx_1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
    nginx_1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
    nginx_1    | /docker-entrypoint.sh: Configuration complete; ready for start up
    nginx_1    | 2021-10-08T09:41:23+00:00 172.28.0.1 TCP 200 422 665 0.052 172.28.0.3:2379 "665" "422" "0.000"
    nginx_1    | 2021-10-08T09:41:24+00:00 172.28.0.1 TCP 200 422 665 0.046 172.28.0.2:2379 "665" "422" "0.000"
    nginx_1    | 2021-10-08T09:50:56+00:00 172.28.0.1 TCP 200 422 665 0.029 172.28.0.4:2379 "665" "422" "0.000"
    
    pipenv
    ドッキングス
    ETCDクラスタをDocker クラスタに配備するには、次の手順に従います.
    docker stack deploy -c etcd-stack.yml etcd
    
    展開の状態を確認します.
    docker stack ps etcd
    
    mx6fvfwye547   etcd_etcd-00.1       quay.io/coreos/etcd:v3.5.0   node-2    Running         Running 3 hours ago                                        
    wybd7n4oitae   etcd_etcd-01.1       quay.io/coreos/etcd:v3.5.0   node-4    Running         Running 3 hours ago                                        
    rmlycc3uvc8t   etcd_etcd-02.1       quay.io/coreos/etcd:v3.5.0   node-2    Running         Running 3 hours ago                                        
    rexh1smoalpo   etcd_nginx.1         nginx:alpine                 node-2    Running         Running 21 hours ago    
    
    docker service ls
    
    ID             NAME                  MODE         REPLICAS   IMAGE                          PORTS
    1u709kzgmo2b   etcd_etcd-00          replicated   1/1        quay.io/coreos/etcd:v3.5.0     
    m7ze76xi58ww   etcd_etcd-01          replicated   1/1        quay.io/coreos/etcd:v3.5.0     
    1535r562g3az   etcd_etcd-02          replicated   1/1        quay.io/coreos/etcd:v3.5.0     
    v8n8qlo3dm30   etcd_nginx            replicated   1/1        nginx:alpine                   *:2379->2379/tcp
    
    あなたがswarmセットアップをテストしたいならば、開いたtest/etcdテスト.あなたのDocker群クラスタ(またはあなたのLBのIP)のサーバーの1つのIPで、そして、127.0.0.1を変えて、テストを実行してください.