內容基於大量官網資料,請耐心閱讀html
系統及軟件版本:consul-1.5.3+CentOS7node
只有一臺服務器,我就用docker-compose搭建了
docker-compose.yml配置以下web
version: '3.0' services: consul1: image: consul:1.5.3 restart: always container_name: consul_1 #-server:表示當前使用的server模式,-node:指定當前節點在集羣中的名稱, #-config-dir:指定配置文件路徑,定義服務的,缺省值爲:/consul/config #-data-dir: consul存儲數據的目錄;缺省值爲:/consul/data #-datacenter:數據中心名稱,缺省值爲dc1 #-ui:使用consul自帶的web UI界面 #-bind: 綁定服務器的ip地址 #-client: 客戶端可訪問ip,缺省值爲:「127.0.0.1」,即僅容許環回鏈接 #-bootstrap-expect:在一個datacenter中指望的server節點數目,consul啓動時會一直等待直到達到這個數目的server纔會引導整個集羣.這個參數的值在同一個datacenter的全部server節點上必須保持一致 command: agent -server -client=0.0.0.0 -node=consul_1 -bootstrap-expect=3 volumes: - /usr/local/docker_app/consul/consul_1/config:/consul/config - /usr/local/docker_app/consul/consul_1/data/key:/consul/data/key consul2: image: consul:1.5.3 restart: always container_name: consul_2 command: agent -server -client=0.0.0.0 -retry-join=consul_1 -node=consul_2 volumes: - /usr/local/docker_app/consul/consul_2/config:/consul/config - /usr/local/docker_app/consul/consul_2/data/key:/consul/data/key consul3: image: consul:1.5.3 restart: always container_name: consul_3 command: agent -server -client=0.0.0.0 -retry-join=consul_1 -node=consul_3 volumes: - /usr/local/docker_app/consul/consul_3/config:/consul/config #證書路徑 - /usr/local/docker_app/consul/consul_3/data/key:/consul/data/key consul4: image: consul:1.5.3 container_name: consul_4 restart: always ports: - 8500:8500 command: agent -client=0.0.0.0 -retry-join=consul_1 -ui -node=client volumes: - /usr/local/docker_app/consul/consul_4/config:/consul/config - /usr/local/docker_app/consul/consul_4/data/key:/consul/data/key
docker-compse的語法就不介紹了,consul用的參數都寫了註釋,consul是C/S結構,配置三臺server,一臺client,數據卷配置了consul的配置文件,consul數據目錄中的證書目錄docker
若是出現下面報錯json
[root@coen ~]# docker-compose -f /consul-compose.yml up -d Pulling consul1 (consul:1.5.3)... ERROR: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)`
{ "registry-mirrors": ["https://registry.docker-cn.com",「http://hub-mirror.c.163.com"] }
安裝完畢,運行docker exec -i consul_1 consul members,見到下面三臺server,一臺client就搭建起來了bootstrap
Node Address Status Type Build Protocol DC Segment consul_1 172.19.0.4:8301 alive server 1.5.3 2 dc1 <all> consul_2 172.19.0.2:8301 alive server 1.5.3 2 dc1 <all> consul_3 172.19.0.5:8301 alive server 1.5.3 2 dc1 <all> client 172.19.0.3:8301 alive client 1.5.3 2 dc1 <default>
訪問http://192.168.28.128:8500能夠訪問client的UI界面windows
看上面,「dcl」數據中心(consul能多數據中心,官方推薦通常3-5臺性能佳)安全
「Services」服務列表(默認有consul)
「Ndes」節點列表
「Key / Value」分佈式KV
「ACL」Consul用來控制訪問API與數據
consul有三方面的安全保護機制服務器
先生成Encryptionapp
[root@coen docker_app]# docker exec -t consul_1 consul keygen RAo6b8QwxOTDd8Z0b4/Hiw==
「RAo6b8QwxOTDd8Z0b4/Hiw==」就是Encryption
在數據卷(/usr/local/docker_app/consul/consul_1/config/)下建立encrypt.json,寫入Encryption
[root@coen docker_app]# cd /usr/local/docker_app/consul/consul_1/config/ [root@coen config]# echo '{"encrypt": "gf/aeGk4Ok7Lcpz7p6gCZg=="}' > encrypt.json [root@coen config]# cp encrypt.json ../../consul_2/config/ [root@coen config]# cp encrypt.json ../../consul_3/config/
注意:每一個server都得寫入同樣的值,值不同server怎麼交流?client做用是轉發,不須要配置Gossip Encryption
consul是基於CA驗證的,能夠選擇官網那種一鍵生成,可是證書有效期有點短,我選擇本身生成
須要安裝openssl,這就不演示了,我在windows10上生成
#生成根證書key openssl genrsa -out ca.key 2048 #生成根證書密鑰 openssl req -new -x509 -days 7200 -key ca.key -subj "/CN=consul.com" -out ca.pem #生成服務端私鑰 openssl genrsa -out server.key 2048 #生成客戶端私鑰 openssl genrsa -out client.key 2048 #生成的服務端的CSR #CSR 主要做用是 CA 會利用 CSR 文件進行簽名使得攻擊者沒法假裝或篡改原有證書 openssl req -new -key server.key -subj "/CN=consul.com" -out server.csr #生成的客戶端的CSR openssl req -new -key client.key -subj "/CN=consul.com" -out client.csr #服務端自簽名的證書 openssl x509 -req -sha256 -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650 -in server.csr -out server.pem #客戶端自簽名的證書 openssl x509 -req -sha256 -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650 -in client.csr -out client.pem
能夠看到CA有效期7200天!私鑰和證書有效期3650天!能夠設置小一點,按期更換,更安全;「CN」是隻容許某個IP或者域名訪問,我這設置成域名「consul.com」,靈活點
整理下
由於是docker搭建的,只能找到docker內部的目錄,因此剛剛在docker-compose配置的數據捲上場
把這個目錄整到/usr/local/docker_app/consul/consul_3/data/key下,server拷server的,client拷client的
而後開始配置TLS
在數據卷(/usr/local/docker_app/consul/consul_1/config/)下建立tls.json,寫入:
{ "verify_incoming":true, "verify_outgoing": true, "ca_file": "/consul/data/key/ca.pem", "cert_file": "/consul/data/key/server/server.pem", "key_file": "/consul/data/key/server/server.key" }
官網說可使用auto_encrypt自動將證書CA發到客戶端,我試了,沒成功,懷疑是docker容器的緣由,不行就老老實實的配置
#複製到其餘server [root@coen config]# cp tls.json ../../consul_2/config/ [root@coen config]# cp tls.json ../../consul_3/config/
在數據卷(/usr/local/docker_app/consul/consul_4/config/)下建立tls.json,寫入:
{ "verify_incoming": false, "verify_incoming_rpc": true, "ports": { "http": -1, "https": 8500 }, "ca_file": "/consul/data/key/ca.pem", "cert_file": "/consul/data/key/client/client.pem", "key_file": "/consul/data/key/client/client.key" }
verify_incoming配置成false,爲啥?官網說,verify_incoming爲true的話,在client UI頁面要提供有效證書,給不了,就訪問不了了,因此爲false;verify_incoming_rpc爲true,UI能不效驗TLS提供服務,但RPC仍是驗證的,https端口8500
如今搭建好了,咱們來試一試,先用http方式請求下數據
#先重啓下consul集羣 [root@coen docker_app]# docker-compose down [root@coen docker_app]# docker-compose up -d #http請求下 [root@coen docker_app]# curl http://127.0.0.1:8500/v1/internal/ui/services Client sent an HTTP request to an HTTPS server.
報錯,說客戶端發送的是http請求https服務,已經成功!如今用https請求下UI頁面
[root@coen docker_app]# curl https://localhost:8500/ui/ -k -I HTTP/1.1 200 OK Accept-Ranges: bytes Content-Length: 6610 Content-Type: text/html; charset=utf-8 Last-Modified: Wed, 31 Jul 2019 01:42:30 GMT Date: Wed, 31 Jul 2019 01:49:03 GMT
成功!能夠在遊覽器https://192.168.28.128:8500 來訪問Ul,遊覽器信任CA證書就行,「192.168.28.128」是我虛擬機內網地址,寫大家本身的
在數據卷(/usr/local/docker_app/consul/consul_1/config/)下建立acl.json,寫入:
{ "acl":{ "enabled": true, "default_policy": "deny", "enable_token_persistence":true, "tokens":{ "master":"saFKyW4CGQP+kv79dWYX6I/LK3iuHrVyuOfS+mxBNyg=" } }, "datacenter":"dc1", "primary_datacenter": "dc1" }
#複製到其餘server [root@coen config]# cp acl.json ../../consul_2/config/ [root@coen config]# cp acl.json ../../consul_3/config/
在數據卷(/usr/local/docker_app/consul/consul_4/config/)下建立tls.json,寫入:
{ "acl":{ "enabled": true, "default_policy": "deny", "enable_token_persistence":false, "tokens":{ "agent":"saFKyW4CGQP+kv79dWYX6I/LK3iuHrVyuOfS+mxBNyg=" } }, "datacenter":"dc1", "primary_datacenter": "dc1" }
client端這裏要設置tokens-agent,agen做用於客戶端和服務器執行內部操做,我這爲了圖省事直接用sever的master了
線上不能這樣,「master」是最高權限,正常流程先配置server的「master」,而後去UI生成權限低的「agent」,配置client端,而後重啓client端,不重啓server端,數據所有存儲在server端,重啓就沒了
重啓consul集羣,訪問UI,到ACL那
輸入sever端配置的「token-agent」
能夠看到這樣的列表,初始有2個ACL,能夠設置其餘的,consul把ACL劃分紅「service_prefix」,「
key_prefix」,「node_prefix」三種"Policy"(策略),每一個都有讀寫權限,配合「role」(角色)能夠造成很是細的數據權限控制,查看官網瞭解
https://www.consul.io/docs/ac...
https://learn.hashicorp.com/c...至此,consul集羣搭完,這裏只是演示一個數據中心,consul是數據中心,要改多數據中心要改一些配置,不要照搬硬套