1. DockerConsulの概要
1.1執政官の概要、執政官とは何ですか?
-
Consulは、複数のデータセンターで分散型の高可用性サービス検出と構成共有をサポートするサービスソフトウェアです。HashiCorpによってGo言語で開発され、Mozilla Public License2.0プロトコルに基づくオープンソースです。
-
Consulは、分散システムのサービス検出と構成を実現するための分散型の高可用性システムであるとも言えます。
複数のコンポーネントがあり、次の主要な機能を提供します。- ①サービス検出:Consulの一部のクライアントはapiやmysqlなどのサービスを提供でき、他のクライアントはConsulを使用してこのサービスのプロバイダーを検出できます。DNSまたはHTTPを使用すると、アプリケーションは依存するサービスを簡単に見つけることができます。
- ②ヘルスチェック:Consulクライアントはいくつかのヘルスチェックを提供できます。これらのヘルスチェックは、指定されたサービス(サービスが200 OKを返すかどうか)またはローカルノード(メモリ使用率が90%未満かどうか)に関連付けることができます。この情報は、オペレーターがクラスターの状態を監視するために使用でき、サービス検出コンポーネントがルーティング時に異常なホストから離れるために使用できます。
- ③Key-Valueストレージ:アプリケーションは、動的構成、機能マーキング、コラボレーション、リーダー選出など、いくつかの目的でConsulが提供する階層型Key-Valueストレージを使用できます。このコンポーネントは、単純なHTTPAPIを介して簡単に使用できます。
- ④複数のデータセンター:領事チームは複数のデータセンターを非常によくサポートしています。つまり、領事のユーザーは、より多くの抽象化レイヤーを作成したり、複数のリージョンを作成したりすることを心配する必要はありません。
1.2領事の特徴と機能
1.2.1機能
- ヘルスチェックをサポートし、キーと値のペアの保存を可能にします。
- コンセンサスプロトコルは、Raftアルゴリズムを使用して、高いサービス可用性を保証します。
- メンバー管理とメッセージブロードキャストはGOSSIPプロトコルを採用し、ACLアクセス制御をサポートします。
- デプロイは簡単で、Dockerなどの軽量コンテナーとシームレスに連携できます。
1.2.2機能
- 現在、エンタープライズアプリケーションはマイクロサービスに向けて開発されています。システム機能を個々のマイクロサービスに分割すると、次の問題が発生します。
- ①Nサービスのネットワークロケーションを構成する必要があり、構成の複雑さが増す
- ②サービスのネットワーク上の場所を変更するには、各発信者の構成を変更する必要があります
- ③クラスターの場合、リバースプロキシ方式以外ではロードが困難です。
1.3なぜ領事が必要なのですか
- 分散システム構造では、多くの場合、数百のビジネスサービスで構成されます。耐災害性(ノードのダウンタイム)、容量の拡張(ノードの追加)、および運用と保守の効率の向上(動的構成)のために、サービスは柔軟な発見を実現するために、問題のあるノードやその他の機能を回避してシステムの安定性を向上させる
2.領事のいくつかの基本的な概念
①クライアント
- 領事ノードのモードである領事クライアントモードを表します。クライアントノードに登録されているすべてのサービスはサーバーに転送されます。ステートレスであり、データを永続化しません。クライアント要求は、HTTP、DNS、およびGRPCインターフェース要求を介してLAN内のサーバークラスターに転送されます。
②サーバー
- 領事のサーバーモードを表します。サーバーの機能はクライアントと同じです。違いは、サーバーがデータをローカルに保持することです。ローカルエリアネットワーク内のローカルクライアントと通信し、WANを介して他のデータセンターと通信します。各データセンターの推奨サーバー数は3または5です。
③サーバーリーダー
- これは、このサーバーが上司であることを意味します。他のサーバーとの違いは、登録された情報を他のサーバーノードに同期する必要があり、各ノードのヘルスモニタリングも担当することです。リーダーがダウンした場合、データセンター内のすべてのサーバーはRaftアルゴリズムを使用して、サーバーの中からリーダーを選択します。
④エージェント
- エージェントは領事のコアプロセスです。エージェントの仕事は、メンバーシップ情報の維持、サービスの登録、ヘルスチェック、クエリへの応答などです。Consulクラスターの各ノードはエージェントプロセスを実行する必要があります。
注意:
- サーバーとクライアントは、クラスターレベルでの領事の単なる区別であり、クラスター上に構築されたアプリケーションサービスとは何の関係もありません。
三、領事とetcdの違い
1.consul 使用 Raft 算法来保证一致性,比复杂的 Paxos 算法更直接。
相比较而言,zookeeper 采用的是 Paxos,而 etcd使用的则是 Raft。
2.consul 支持 多数据中心,内外网的服务采用不同的端口进行监听。多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况等。
zookeeper 和 etcd 均不提供多数据中心功能的支持。
3.consul 支持 健康检查。 etcd 不提供此功能。
4.consul 支持 HTTP、DNS 和 GPRS 协议接口。 zookeeper 的集成较为复杂,etcd 只支持 http 协议。\
5.consul 官方提供 WEB管理界面,etcd 无此功能。
補足
- 領事の内部ポートの説明:
港 | 説明 |
---|---|
TCP / 8300 | ポート8300はサーバーノードに使用され、クライアントはポートRPCプロトコルを使用してサーバーノードを呼び出します |
TCP / UDP / 8301 | ポート8301は、単一のデータセンター内のすべてのノード間で相互に通信するため、つまりLANプール情報を同期するために使用されます。これにより、データセンター全体がサーバーアドレス、ノード障害の分散検出、およびイベントブロードキャスト(リーダー選出時間など)を自動的に検出できるようになります。 |
TCP / UDP / 8302 | ポート8302は、単一または複数のデータセンター間のサーバーノードの情報同期、つまりWANプール情報の同期に使用されます。インターネットの高遅延に最適化されており、データセンター間の要求を可能にします |
8500 | ポート8500はHTTPプロトコルに基づいており、APIインターフェイスまたはWebUIアクセスに使用されます |
8600 | ポート8600はDNSサーバーとして使用され、ノード名でノード情報を照会できます。 |
第4に、Docker領事クラスターアーキテクチャを構築します
4.1プロジェクト環境
第一台centos 7 IP地址:192.168.140.22 (主节点)
需求的软件包:Docker-ce、Compose、Consul、Consul-template
第二台centos 7 IP地址:192.168.140.21 (nginx服务器)
需求的软件包:Docker-ce 、registrator
4.2領事サーバーを構成する
- 注:両方のノードのインストールにはDocker-ceが必要であり、ファイアウォールをオフにしないでください
4.2.1マスターノードに領事を配置する
- 作業ディレクトリを作成し、関連するソフトウェアパッケージをアップロードして解凍します
[root@docker ~]# mkdir consul
[root@docker ~]# cd consul/
[root@docker consul]# rz -E //上传压缩包
rz waiting to receive.
[root@docker consul]# ls
consul_0.9.2_linux_amd64.zip
[root@docker consul]# unzip consul_0.9.2_linux_amd64.zip -d /usr/bin //解压到指定目录
Archive: consul_0.9.2_linux_amd64.zip
inflating: /usr/bin/consul
- 領事サービスを設定する
## 设置代理
[root@docker consul]# consul agent \
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.140.22 \
> -client=0.0.0.0 \
> -node=consul-server01 &> /var/log/consul.log &
[1] 114525
[root@docker consul]# jobs
[1]+ 运行中 consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.140.22 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
- クラスター情報を表示する
[root@docker consul]# consul members //查看集群信息
Node Address Status Type Build Protocol DC
consul-server01 192.168.140.22:8301 alive server 0.9.2 2 dc1
[root@docker consul]# consul info | grep leader //查看管理信息
leader = true
leader_addr = 192.168.140.22:8300
- クラスター情報はhttpapiから取得できます
curl 127.0.0.1:8500/v1/status/peers '/查看集群server成员'
curl 127.0.0.1:8500/v1/status/leaders '//查看集群Raf leader'
curl 127.0.0.1:8500/v1/catalog/services '//查看注册的所有服务'
curl 127.0.0.1:8500/v1/catalog/nginx '//查看nginx服务的信息'
curl 127.0.0.1:8500/v1/catalog/nodes '//集群节点详细信息'
4.2.2バックエンドサーバーの構成
- コンテナサービスが自動的にnginxクラスタに参加するようにします。
つまり、nginxサーバーの領事に接続してnginxコンテナサービスを作成します。
[root@docker consul]# docker run -d \
> --name=registrator \
> --net=host \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> -ip=192.168.140.21 \
> consul://192.168.140.22:8500
Unable to find image 'gliderlabs/registrator:latest' locally
latest: Pulling from gliderlabs/registrator
Image docker.io/gliderlabs/registrator:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
c87f684ee1c2: Pull complete
a0559c0b3676: Pull complete
a28552c49839: Pull complete
Digest: sha256:6e708681dd52e28f4f39d048ac75376c9a762c44b3d75b2824173f8364e52c10
Status: Downloaded newer image for gliderlabs/registrator:latest
4bf16763f7f0cbbe66f0e9ea37a8def1b858b0559aba5fac2935446a1cb2847b
查看镜像和容器列表
[root@nginx ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@nginx ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bf16763f7f0 gliderlabs/registrator:latest "/bin/registrator -i…" 2 minutes ago Restarting (1) 32 seconds ago registrator
- 2つのnginxコンテナを作成します
[root@nginx ~]# docker run -itd -p 85:80 --name test-01 -h test01 nginx
//创建容器,用来测试服务发现功能是否正常
[root@nginx ~]# docker run -itd -p:86:80 --name test-02 -h test02 nginx
//-name 给容器命名;-h 设置容器主机名
- URL http://192.168.140.22:8500/
にアクセスします。アクセスに失敗し主节点上
た場合は、ファイアウォールがオンになっているかどうかを確認する必要があります。次の構成を実行できます。
[root@docker ~]# systemctl start firewalld.service
[root@docker ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
[root@docker ~]# firewall-cmd --zone=public --add-port=8500/tcp
success
此时表示nginx与httpd服务已注册到consul
4.3Consulクラスターにcompose-templateを追加する
- 目的:コンテナーが自動的にNginxクラスターに参加することを実現する
4.3.1compose-templateの概要
-
Consul-Templateはデーモンプロセスです。ユーザーはConsulクラスター情報をリアルタイムで照会し、ファイルシステム上の指定されたテンプレートをいくつでも更新し、構成ファイルを生成できます。更新が完了したら、シェルコマンドを実行して更新操作を実行し、Nginxをリロードすることを選択できます
-
特徴:
1.consul-template是基于Consul的自动替换配置文件的应用
2.可以查询Consul中的服务目录,key、key-values
3.其强大的抽象功能和查询语言模板使得Consul-Template特别适合动态的创建配置文件,
例如:Nginx/Apache Proxy Balancers、Haproxy Backends
4.3.2構成ロードマップ
- アイデア(例としてnginxを取り上げます):
① 定义template nginx.ctmpl 模板
此配置文件仅与consul有关(consul使用此配置文件模板生成nignx的主配置文件)
② 配置nginx(修改文件,添加配置文件的路径)
③ 启动template(自动生成/更新配置文件供与nginx使用)
4.3.3構成プロセス
- マスターノードはconsul-templateをインストールし、テンプレートnginxテンプレートファイルを準備します
先上传并解压consul-template软件包
[root@docker consul]# rz -E //上传consul-template软件包
rz waiting to receive.
[root@docker consul]# ls
consul_0.9.2_linux_amd64.zip consul-template_0.19.3_linux_amd64.zip
[root@docker consul]# unzip consul-template_0.19.3_linux_amd64.zip -d /usr/bin
Archive: consul-template_0.19.3_linux_amd64.zip
inflating: /usr/bin/consul-template
在consul服务器上编写template nginx模板文件,添加nginx模板
[root@docker consul]# vim nginx.ctmpl
upstream http_backend {
{
{
range service "nginx"}}
server {
{
.Address}}:{
{
.Port}};
{
{
end}}
}
server {
listen 88;
server_name localhost 192.168.140.22;
access_log /var/log/nginx/tang.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
- マスターノードにnginxサービスを手動でコンパイルしてインストールします
[root@docker consul]# yum install gcc gcc-c++ pcre-devel zlib-devel -y
[root@docker consul]# rz -E //上传Nginx1.12.2软件包
[root@docker consul]# tar zxvf nginx-1.12.2.tar.gz -C /opt
[root@docker consul]# cd /opt/nginx-1.12.2/
[root@docker nginx-1.12.2]# ./configure --prefix=/usr/local/nginx && make && make install //编译安装
- nginx構成ファイルを変更し、nginxを起動します
[root@docker nginx-1.12.2]# cd /usr/local/nginx/conf/
[root@docker conf]# vim nginx.conf
...//在http模块下 添加
http {
include mime.types;
include vhost/*.conf; //添加的配置,且vhost目录需手动创建
...//省略部分信息
[root@docker conf]# mkdir vhost //创建vhost文件目录
[root@docker conf]# mkdir /var/log/nginx //创建nginx访问日志目录
[root@docker conf]# ln -s /usr/local/nginx/sbin/nginx /usr/bin //创建软链接
[root@docker conf]# nginx //启动nginx
- テンプレートを構成して開始します
配置template
[root@docker ~]# cd consul/
[root@docker consul]# unzip consul-template_0.19.3_linux_amd64.zip //解压缩consul-template
Archive: consul-template_0.19.3_linux_amd64.zip
inflating: consul-template
[root@docker consul]# mv consul-template /usr/bin //将脚本放入/usr/bin中
启动template
[root@docker consul]# consul-template -consul-addr 192.168.140.22:8500 \
> -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/tang.conf:/usr/local/nginx/sbin/nginx -s reload" \
> --log-level=info
参数详解:
-consul-addr 192.168.140.22:8500:指向consul服务端节点
-template "/root/consul/nginx.ctmpl:指定模板路径
:/usr/local/nginx/conf/vhost/test.conf:指定文件生成到vhost中并命名为test.conf
:/usr/local/nginx/sbin/nginx -s reload:不中断服务reload重载nginx服务让配置文件生效
–log-level=info:产生日志,级别为info(日志生成位置在nginx.ctml中定义“access_log”)
4.4テスト
- 別のターミナルを起動し、test.conf構成ファイルがnginx / vhostファイルに生成されているかどうかを確認します
[root@docker ~]# cd /usr/local/nginx/conf/vhost/
[root@docker vhost]# ls
tang.conf test.conf
- test.conf構成ファイルのアドレスプール情報を表示します(自動的に更新および追加されたかどうか)
[root@docker vhost]# vim test.conf
upstream http_backend {
server 192.168.140.21:85;
server 192.168.140.21:86;
}
server {
listen 88;
server_name localhost 192.168.140.22;
access_log /var/log/nginx/tang.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
- バックエンドサーバーにコンテナを再度追加し、vhostの構成ファイルが自動的に検出/更新されるかどうかを確認します
[root@nginx ~]# docker run -itd -p:87:80 --name test-03 -h test03 nginx //添加容器
[root@docker ~]# cat /usr/local/nginx/conf/vhost/tang.conf
総括する
- docker-consulは、バックエンドノード(追加または削減されたサーバー)の自動検出、およびフロントエンドnginxリバースプロキシアドレスプール(アップストリーム)の自動更新(動的更新)を実現することです。言い換えれば、docker-consulはサービスの自動更新と検出を実現します
- Docker Composeの単純なコンテナーオーケストレーションは、consul-templateの記述、サーバーノードが指すオブジェクトの設定、およびパラメーター変数に焦点を当てています。