Automatische Aktualisierung und Erkennung des Docker Consul-Containers

1. Einführung in Docker Consul

1.1 Überblick über den Konsul, was ist der Konsul?

  • Consul ist eine Service-Software, die verteilte und hochverfügbare Serviceerkennung und Konfigurationsfreigabe in mehreren Rechenzentren unterstützt. Sie wurde von HashiCorp in der Sprache Go entwickelt und ist Open Source und basiert auf dem Mozilla Public License 2.0-Protokoll.

  • Es kann auch gesagt werden, dass Consul ein verteiltes, hochverfügbares System zur Realisierung der Serviceerkennung und Konfiguration verteilter Systeme ist.
    Es besteht aus mehreren Komponenten und bietet die folgenden Schlüsselfunktionen:

    • ① Serviceerkennung: Einige Clients von Consul können einen Service wie API oder MySQL bereitstellen, und andere Clients können Consul verwenden, um den Anbieter dieses Service zu ermitteln. Mithilfe von DNS oder HTTP können Anwendungen die Dienste, von denen sie abhängig sind, leicht finden.
    • ② Integritätsprüfung: Der Consul-Client kann einige Integritätsprüfungen bereitstellen. Diese Integritätsprüfungen können einem bestimmten Dienst (ob der Dienst 200 OK zurückgibt) oder dem lokalen Knoten (ob die Speichernutzungsrate unter 90% liegt) zugeordnet werden. Diese Informationen können von einem Bediener verwendet werden, um den Zustand des Clusters zu überwachen, und von der Service Discovery-Komponente verwendet werden, um sich beim Routing von fehlerhaften Hosts fernzuhalten.
    • ③ Schlüsselwertspeicher: Anwendungen können den von Consul bereitgestellten hierarchischen Schlüsselwertspeicher für einige Zwecke verwenden, einschließlich dynamischer Konfiguration, Merkmalsmarkierung, Zusammenarbeit, Führungswahl usw. Diese Komponente kann einfach über eine einfache HTTP-API verwendet werden.
    • ④ Mehrere Rechenzentren: Das Consul-Team unterstützt sehr gut mehrere Rechenzentren, sodass sich Consul-Benutzer nicht um die Erstellung weiterer Abstraktionsebenen und mehrere Regionen kümmern müssen

1.2 Merkmale und Funktionen des Konsuls

1.2.1 Funktionen

  • Unterstützung der Integritätsprüfung, wodurch Schlüssel-Wert-Paare gespeichert werden können;
  • Das Konsensprotokoll verwendet den Raft-Algorithmus, um eine hohe Verfügbarkeit der Dienste sicherzustellen.
  • Mitgliederverwaltung und Nachrichtenübertragung übernehmen das GOSSIP-Protokoll und unterstützen die ACL-Zugriffskontrolle.
  • Es ist einfach bereitzustellen und kann nahtlos mit leichten Containern wie Docker zusammenarbeiten.

1.2.2 Funktion

  • Unternehmensanwendungen entwickeln sich jetzt in Richtung Microservices. Wenn wir unsere Systemfunktionen in einzelne Microservices aufteilen, treten die folgenden Probleme auf:
    • ① Sie müssen den Netzwerkstandort von N Diensten konfigurieren und die Komplexität der Konfiguration erhöhen
    • ② Änderungen am Netzwerkstandort des Dienstes erfordern Änderungen an der Konfiguration jedes Anrufers
    • ③ Im Fall eines Clusters ist das Laden mit Ausnahme der Reverse-Proxy-Methode schwierig

1.3 Warum brauchen wir Konsul?

  • In einer verteilten Systemstruktur besteht sie häufig aus Hunderten von Geschäftsdiensten. Für Katastrophenschutz (Ausfallzeit von Knoten), Kapazitätserweiterung (Hinzufügen von Knoten) und Verbesserung der Betriebs- und Wartungseffizienz (dynamische Konfiguration) müssen Dienste in der Lage sein Vermeiden Sie Problemknoten und andere Funktionen, um die Systemstabilität zu verbessern

2. Einige Grundkonzepte des Konsuls

① Kunde

  • Stellt den Consul-Client-Modus dar, der ein Modus des Consul-Knotens ist. Alle auf dem Client-Knoten registrierten Dienste werden an den Server weitergeleitet. Es ist zustandslos und speichert keine Daten. Clientanforderungen werden über HTTP-, DNS- und GRPC-Schnittstellenanforderungen an den Servercluster im LAN weitergeleitet.

② Server

  • Stellt den Servermodus von Consul dar. Die Serverfunktionen sind mit denen des Clients identisch. Der Unterschied besteht darin, dass der Server die Daten lokal beibehält. Kommunizieren Sie mit lokalen Clients im lokalen Netzwerk und kommunizieren Sie mit anderen Rechenzentren über das WAN. Die empfohlene Anzahl von Servern in jedem Rechenzentrum beträgt 3 oder 5.

③ Server-Leader

  • Dies bedeutet, dass dieser Server ihr Chef ist. Der Unterschied zwischen ihm und anderen Servern besteht darin, dass er für die Synchronisierung der registrierten Informationen mit anderen Serverknoten verantwortlich sein muss und auch für die Integritätsüberwachung jedes Knotens. Wenn der Anführer ausfällt, verwenden alle Server im Rechenzentrum den Raft-Algorithmus, um einen Anführer unter ihnen auszuwählen.

④ Agent

  • Der Agent ist der Kernprozess von Consul. Die Aufgabe des Agenten besteht darin, Mitgliedschaftsinformationen zu verwalten, Dienste zu registrieren, Integritätsprüfungen durchzuführen, auf Anfragen zu antworten usw. Jeder Knoten des Consul-Clusters muss den Agentenprozess ausführen.

Hinweis:

  • Server und Client sind nur die Unterscheidung zwischen Konsul auf Clusterebene und haben nichts mit den auf dem Cluster basierenden Anwendungsdiensten zu tun.

Drei, der Unterschied zwischen Konsul und 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 无此功能。

Ergänzung

  • Beschreibung des internen Ports des Konsuls:
Hafen Beschreibung
TCP / 8300 Port 8300 wird für den Serverknoten verwendet, und der Client verwendet das Port-RPC-Protokoll, um den Serverknoten aufzurufen
TCP / UDP / 8301 Port 8301 wird verwendet, um zwischen allen Knoten in einem einzelnen Rechenzentrum miteinander zu kommunizieren, dh um die LAN-Pool-Informationen zu synchronisieren. Es ermöglicht dem gesamten Rechenzentrum, Serveradressen, verteilte Erkennung von Knotenfehlern und Ereignissendungen (z. B. Wahlzeit für Führungskräfte) automatisch zu erkennen.
TCP / UDP / 8302 Port 8302 wird zur Informationssynchronisation von Serverknoten zwischen einzelnen oder mehreren Rechenzentren verwendet, dh zur Synchronisation von WAN-Pool-Informationen. Es ist für die hohe Latenz des Internets optimiert und ermöglicht datencenterübergreifende Anforderungen
8500 Port 8500 basiert auf dem HTTP-Protokoll, das für die API-Schnittstelle oder den Zugriff auf die Web-Benutzeroberfläche verwendet wird
8600 Port 8600 wird als DNS-Server verwendet, mit dem Knoteninformationen nach Knotennamen abgefragt werden können

Viertens: Erstellen Sie die Docker Consul-Cluster-Architektur

4.1 Projektumgebung

第一台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 Konsulsserver konfigurieren

  • Hinweis: Für die Installation beider Knoten ist Docker-ce erforderlich, und die Firewall sollte nicht ausgeschaltet werden

4.2.1 Konsul auf dem Masterknoten bereitstellen

  • Erstellen Sie ein Arbeitsverzeichnis, laden Sie zugehörige Softwarepakete hoch und entpacken Sie sie
[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
  • Richten Sie den Konsulendienst ein
## 设置代理
[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 &
  • Clusterinformationen anzeigen
[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
  • Die Clusterinformationen können über http api abgerufen werden
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 Konfiguration des Back-End-Servers

  • Lassen Sie den Containerdienst automatisch dem Nginx-Cluster beitreten, dh stellen Sie eine
    Verbindung zum Konsul auf dem Nginx-Server her, um den Nginx-Containerdienst zu erstellen
[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
  • Erstellen Sie zwei Nginx-Container
[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 设置容器主机名
  • Besuchen Sie die URL http://192.168.140.22:8500/.
    Wenn der Zugriff fehlschlägt, müssen Sie 主节点上überprüfen, ob die Firewall aktiviert ist. Sie können die folgende Konfiguration durchführen
[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

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
此时表示nginx与httpd服务已注册到consul

4.3 Hinzufügen einer Compose-Vorlage zum Consul-Cluster

  • Zweck: um zu erkennen, dass der Container automatisch dem Nginx-Cluster beitritt

4.3.1 Einführung in die Compose-Vorlage

  • Consul-Template ist ein Daemon-Prozess. Benutzer können Consul-Cluster-Informationen in Echtzeit abfragen, eine beliebige Anzahl angegebener Vorlagen im Dateisystem aktualisieren und Konfigurationsdateien generieren. Nach Abschluss des Updates können Sie den Shell-Befehl ausführen, um den Update-Vorgang auszuführen und Nginx neu zu laden

  • Eigenschaften:

1.consul-template是基于Consul的自动替换配置文件的应用

2.可以查询Consul中的服务目录,key、key-values

3.其强大的抽象功能和查询语言模板使得Consul-Template特别适合动态的创建配置文件,

例如:Nginx/Apache Proxy Balancers、Haproxy Backends

4.3.2 Konfigurations-Roadmap

  • Ideen (am Beispiel von Nginx):
① 定义template nginx.ctmpl 模板

此配置文件仅与consul有关(consul使用此配置文件模板生成nignx的主配置文件)

② 配置nginx(修改文件,添加配置文件的路径)

③ 启动template(自动生成/更新配置文件供与nginx使用)

4.3.3 Konfigurationsprozess

  • Der Masterknoten installiert die Consul-Vorlage und bereitet die Template-Nginx-Vorlagendatei vor
先上传并解压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;
  }
}
  • Kompilieren und installieren Sie den nginx-Dienst manuell auf dem Masterknoten
[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	 //编译安装
  • Ändern Sie die Nginx-Konfigurationsdatei und starten Sie 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
  • Vorlage konfigurieren und starten
配置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

Fügen Sie hier eine Bildbeschreibung ein

参数详解:

-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 Testen

  • Starten Sie ein anderes Terminal und prüfen Sie, ob die Konfigurationsdatei test.conf in der Datei nginx / vhost generiert wurde
[root@docker ~]# cd /usr/local/nginx/conf/vhost/
[root@docker vhost]# ls
tang.conf  test.conf

Fügen Sie hier eine Bildbeschreibung ein

  • Zeigen Sie die Adresspoolinformationen in der Konfigurationsdatei test.conf an (ob sie automatisch aktualisiert und hinzugefügt wurden).
[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;
  }
}

Fügen Sie hier eine Bildbeschreibung ein

  • Fügen Sie dem Backend-Server erneut einen Container hinzu und prüfen Sie, ob die Konfigurationsdatei in vhost automatisch erkannt / aktualisiert wird
[root@nginx ~]# docker run -itd -p:87:80 --name test-03 -h test03 nginx		//添加容器
[root@docker ~]# cat /usr/local/nginx/conf/vhost/tang.conf

Fügen Sie hier eine Bildbeschreibung ein

um zusammenzufassen

  • Docker-Consul soll die automatische Erkennung von Back-End-Knoten (zusätzliche oder reduzierte Server) und die automatische Aktualisierung (dynamische Aktualisierung) des Front-End-Nginx-Reverse-Proxy-Adresspools (Upstream) realisieren. Mit anderen Worten, Docker-Consul realisiert die automatische Aktualisierung und Erkennung von Diensten
  • Die einfache Container-Orchestrierung von Docker Compose konzentriert sich auf das Schreiben der Konsul-Vorlage, die Einstellung der Objekte, auf die der Serverknoten zeigt, und die Parametervariablen.

Ich denke du magst

Origin blog.csdn.net/weixin_42449832/article/details/114822603
Empfohlen
Rangfolge