一:Kong的集羣方案node
Kong支持集羣方案,能夠加入多個Kong節點來保障服務的高可用性以及提升負載的能力,以下面官方圖所示,多個kong組成的集羣須要使用共享數據庫,以保證集羣數據的一致性。docker
(1)集羣狀態數據庫
檢查集羣的狀態bash
$kong cluster reachability
檢查羣集的成員服務器
$kong cluster members
(2)集羣配置網絡
集羣配置包含如下幾項tcp
cluster_listen 用於與羣集中其餘節點之間通訊的地址和端口。ide
默認值: 0.0.0.0:7946post
cluster_listen_rpc 此節點用於與羣集通訊的地址和端口。。ui
默認值: 127.0.0.1:7373
cluster_advertise 指定向外廣播的ip
默認值:none
cluster_encrypt_key Base64編碼的16字節密鑰用於加密集羣流量。
默認值:none
cluster_ttl_on_failure 集羣健康檢查的間隔
默認值: 3600
cluster_profile 集羣間Ping和超時的時序配置文件。local , lan , wan 。
默認值: wan
二:節點間的發現
節點之間的發現採用的gossip協議,當Kong節點啓動後,會將本身的IP信息加入到node列表,廣播給任何其餘的Kong節點,當另外一個Kong節點啓動後,會去讀取數據庫中的node列表,並將本身的信息加入到列表中。
三:容器方式部署集羣
集羣是爲了保證服務的高可用性和提升服務的支撐能力,必然是要部署在多臺獨立服務器上。那麼要使用容器部署,就必需要實現宿主機間的容器網絡互通。
下面以rancher爲例,在rancher上部署Kong集羣。再分享一下部署的時候出現的一些問題。
docker-compose:
kong-database: p_w_picpath: postgres:9.4 ports: - 5432:5432/tcp environment: - POSTGRES_USER=kong - POSTGRES_DB=kong labels: io.rancher.container.hostname_override: container_name io.rancher.container.pull_p_w_picpath: always kong: p_w_picpath: kong links: - kong-database:kong-database environment: - KONG_DATABASE=postgres - KONG_CASSANDRA_CONTACT_POINTS=kong-database - KONG_PG_HOST=kong-database ports: - 8000:8000/tcp - 8443:8443/tcp - 8001:8001/tcp - 7946:7946/tcp - 7946:7946/udp - 7373:7373/tcp labels: io.rancher.container.hostname_override: container_name io.rancher.container.start_once: true
rancher-compose:
.catalog: kong: scale: 3 kong-database: scale: 1
部署成功後,集羣由1個數據庫,三個kong容器,貌似沒問題
然而,當經過sehll進入到容器內部,使用kong cluster reachability發現集羣只有一個成員。
而且發現,節點是帶着172.17.0.5這個地址,顯然節點向外宣告了這個地址。
這是爲何呢?
由於咱們知道Rancher的默認manage網絡是10.42段的地址,可以跨宿主機實現容器互通。爲何會宣告172的地址呢?
咱們用ip a命令查看,發現,原來eth0下面有兩個ip,172和10.42的ip。
一個是docker0的默認的172段地址不能跨主機通訊,一個是rancher的manage的10.42網絡的地址。
顯然!!!若是要想讓集羣節點之間成功通訊,那麼必需要使節點向外宣告的ip爲10.42的地址才行。
這就要用到上面配置中的cluster_advertise參數。
默認狀況下
cluster_listen= 0.0.0.0:7946
cluster_advertise=NONE
在***、nat等狀況下,網卡擁有多個IP地址,0.0.0.0就致使沒法向外宣告正確的IP
這時就須要使用cluster_advertise:10.42.60.14:7946來指定廣播的ip,
在後面修改的過程當中發現,/usr/local/kong/kong.conf文件是不存在於鏡像中的,而是kong進程啓動的時候生成的。
後來發現是經過/usr/local/share/lua/5.1/kong/templates/kong_defaults.lua這個配置模板來生成的的配置文件,即便預先寫好的配置文件,也會在kong進程啓動後被替換掉。
因此只能修改配置文件的模板,/usr/local/share/lua/5.1/kong/templates/kong_defaults.lua將裏面的
cluster_advertise = NONE替換成cluster_advertise = container_ip:7946
而container_ip是容器啓動後才知道,可是當容器啓動後,在進去容器,修改配置文件,重啓進程也不太現實。
因此就須要咱們在容器啓動後,自動將IP信息配置到配置文件中,而後再啓動容器。
梳理一下流程應該是
1:容器啓動-->2:讀取容器IP-->3:修改配置文件模板-->4:自動建立配置文件-->5:啓動kong
利用官方kong鏡像,從新打一下鏡像
Dockerfile
FROM kong #精簡鏡像缺乏命令,copy ip命令 COPY ./ip /bin/ #在啓動腳本中,查出容器ip RUN sed -i "4i export RANCHER_IP=\`/bin/ip a|grep 10.42|sed 's/ //g'|awk -F'[t/]' '{print \$2}'\`" /docker-entrypoint.sh #將容器IP替換到lua的配置模板中(直接改配置文件沒用,由於是從模板copy過去覆蓋的) RUN sed -i "5i sed -i 's/cluster_advertise = NONE/cluster_advertise = '\$RANCHER_IP':7946/g' /usr/local/share/lua/5.1/kong/templates/kong_defaults.lua" /docker-entrypoint.sh ENTRYPOINT ["/docker-entrypoint.sh"] CMD ["kong","start"]
$docker build -t kong:rancher_cluster .
鏡像打好後,使用上面的compose新啓動服務,再進去容器看一下,發現集羣已經組建成功了,向外宣告的是10.42的地址
因而乎!!!集羣組建成功,能夠隨意增長集羣節點個數。