【2】微服務架構-kong的集羣化部署

一:Kong的集羣方案node

Kong支持集羣方案,能夠加入多個Kong節點來保障服務的高可用性以及提升負載的能力,以下面官方圖所示,多個kong組成的集羣須要使用共享數據庫,以保證集羣數據的一致性。docker

wKioL1gTDZOh4cahAACLuXZN6tw271.jpg

(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容器,貌似沒問題

spacer.gifwKiom1gTDv_zsFj9AACMGDgkgho369.png

然而,當經過sehll進入到容器內部,使用kong cluster reachability發現集羣只有一個成員。

而且發現,節點是帶着172.17.0.5這個地址,顯然節點向外宣告了這個地址。

spacer.gifwKiom1gTDynDxbZCAAAaonyfTFg345.png

這是爲何呢?


由於咱們知道Rancher的默認manage網絡是10.42段的地址,可以跨宿主機實現容器互通。爲何會宣告172的地址呢?

spacer.gifwKioL1gTD1_hMoCrAABAB5kluHc936.png

咱們用ip a命令查看,發現,原來eth0下面有兩個ip,172和10.42的ip。

一個是docker0的默認的172段地址不能跨主機通訊,一個是rancher的manage的10.42網絡的地址。

spacer.gifwKiom1gTD3TSlcxWAAAydWy3ecQ013.png


顯然!!!若是要想讓集羣節點之間成功通訊,那麼必需要使節點向外宣告的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,

wKiom1gTD8jBQ9yxAAAS3EHD-PY483.png

在後面修改的過程當中發現,/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的地址

wKiom1gTEFGD1eLwAABINjcOee4954.png

因而乎!!!集羣組建成功,能夠隨意增長集羣節點個數。

wKioL1gTEOqBD6YtAAA8tIuVUhE783.png

相關文章
相關標籤/搜索