在docker swarm集群部署apollo(可用于生產(chǎn)環(huán)境)

寫在前面

??最近在工作中需要使用到apollo配置中心來簡化微服務(wù)開發(fā),在部署時使用docker的方式部署到線上到docker swarm集群。在網(wǎng)上翻了很多人的博文,有些由于時間久遠很多東西都發(fā)生來變化,而有些對一些坑的細節(jié)沒有做詳細說明,最后還是我在官方文檔中扒到了解決方法。
??因此在踩完了所有坑后,詳細的記錄一便流程,方便大家有相同的需求時可以按圖索驥,也作為備忘錄方便以后回顧。

一、準(zhǔn)備工作

1.1 docker環(huán)境安裝

??由于針對生產(chǎn)環(huán)境部署情景,需要在本地環(huán)境及服務(wù)器都準(zhǔn)備好docker環(huán)境,如果只是本機玩玩的話,只需準(zhǔn)備本地docker環(huán)境。至于docker的安裝網(wǎng)上有很多方法,在Mac和windows中都有安裝包進行一鍵安裝即可,在此就不多加贅述了。

1.2 源碼獲取

??首先我們?nèi)ithub上apollo的官方倉庫中獲取部署需要的文件,注意除了使用git獲取到源碼,還需要在Releases頁面中獲取以下三個服務(wù)的最新穩(wěn)定版本壓縮包,用于后續(xù)的鏡像構(gòu)建。

  • apollo-configservice
  • apollo-adminservice
  • apollo-portal

1.3 Mysql數(shù)據(jù)庫

??Apollo服務(wù)端共需要兩個數(shù)據(jù)庫:ApolloPortalDB和ApolloConfigDB,官網(wǎng)把數(shù)據(jù)庫、表的創(chuàng)建和樣例數(shù)據(jù)都分別準(zhǔn)備了sql文件(在下載的源碼包的script/sql目錄下),只需要導(dǎo)入數(shù)據(jù)庫即可。

??建議后續(xù)使用已有的mysql進行部署不要將mysql不要和apollo的三個服務(wù)放在一個docker compose進行編排。因為我們要部署的服務(wù)在啟動時需要依賴數(shù)據(jù)庫中的配置,如果在一起編排服務(wù),第一次啟動會直接掛掉,mysql啟動后還需要初始化才能正常使用,大家如果沒有現(xiàn)成的mysql要使用docker構(gòu)建,也建議部署好mysql導(dǎo)入sql文件后再啟動apollo的服務(wù)。

1.4 部署策略

分布式部署需要事先確定部署的環(huán)境以及部署方式。Apollo目前支持以下環(huán)境:

  • DEV 開發(fā)環(huán)境
  • FAT 測試環(huán)境,相當(dāng)于alpha環(huán)境(功能測試)
  • UAT 集成環(huán)境,相當(dāng)于beta環(huán)境(回歸測試)
  • PRO 生產(chǎn)環(huán)境

以ctrip為例,其部署策略如下:


ctrip部署策略.png
  • Portal部署在生產(chǎn)環(huán)境的機房,通過它來直接管理FAT、UAT、PRO等環(huán)境的配置
  • Meta Server、Config Service和Admin Service在每個環(huán)境都單獨部署,使用獨立的數(shù)據(jù)庫
  • Meta Server、Config Service和Admin Service在生產(chǎn)環(huán)境部署在兩個機房,實現(xiàn)雙活
  • Meta Server和Config Service部署在同一個JVM進程內(nèi),Admin Service部署在同一臺服務(wù)器的另一個JVM進程內(nèi)


    樣例部署圖.png

為了演示方便,本文將Apollo-portal,Apollo-adminservice和Apollo-configservice部署在一臺機器上

服務(wù)器 服務(wù) 端口 環(huán)境
192.168.20.198 apollo-portal 8070 UAT
192.168.20.198 apollo-adminservice 8080 UAT
192.168.20.198 apollo-configservice 8090 UAT

二、構(gòu)建鏡像

??首先創(chuàng)建一個apollo目錄用于后續(xù)統(tǒng)一管理我們的資源文件,并創(chuàng)建apollo-configservice、apollo-adminservice、apollo-portal三個子目錄。
??打開之前下載源碼,分別找出apollo-configservice/src/main/docker/Dockerfile、apollo-adminservice/src/main/docker/Dockerfile、apollo-portal/src/main/docker/Dockerfile三個文件并移動到之前創(chuàng)建的三個對應(yīng)子目錄下,將下載好的apollo-configservice-x.x.x-github.zip、apollo-adminservice-x.x.x-github.zip、apollo-portal-x.x.x-github.zip也一并移動到對應(yīng)的子目錄。

??此處有了源碼后如果有需求的話其實是可以自己進行打包的,但由于在本文中沒有特殊需求,并且我自己在嘗試打包中出現(xiàn)了各種依賴問題所以就放棄,如果各位有興趣可以自行嘗試。

準(zhǔn)備好的目錄結(jié)構(gòu)如下:


apollo.jpg

??部署時使用的是官方最新的1.7.1 release版本,中間出現(xiàn)了些狀況為了看里面的源碼所以我解壓了壓縮包,各位如果沒有必要可以不解壓。

以apollo-configservice為例,首先我們來看一下官方提供的Dockerfile:


Dockerfile.jpg

??可以看出在Dockerfile里就是一個標(biāo)準(zhǔn)的jar包部署內(nèi)容,值得注意的是需要所需的jar包是從.zip壓縮包解壓出來的,這里直接使用之前下載的壓縮包,但需要將Dockerfile中的${VERSION}改為實際下載的壓縮包版本號

一切準(zhǔn)本就緒后就可以進行鏡像構(gòu)建了:

cd apollo-configservice
docker build -t myhub/apollo-configservice .

cd apollo-adminservice
docker build -t myhub/apollo-adminservice .

cd apollo-portal
docker build -t myhub/apollo-portal .

將鏡像推送至dockerHub:

#登錄到dockerhub,首先得注冊自己得賬號
docker login -u yourname -p yourpassword docker.io
docker push myhub/apollo-configservice
docker push myhub/apollo-adminservice
docker push myhub/apollo-portal

??至此準(zhǔn)備工作就差不多了,接下來可以直接去要部署服務(wù)的目標(biāo)服務(wù)器進行部署操作了

三、服務(wù)部署

首先編輯我們的docker-stack.yml文件,用于描述我們用docker stack部署服務(wù)的細節(jié):

version: "3.7"

services:
  apollo-configservice:
    image: myhub/apollo-configservice:latest
    ports:
      - target: 8080
        published: 8080
        mode: host
    environment:
      - spring_datasource_url=jdbc:mysql://{mysqlurl}/ApolloConfigDB?characterEncoding=utf8
      - spring_datasource_username={username}
      - spring_datasource_password={password}
      - eureka.instance.ip-address=192.168.20.198
    deploy:
      placement:
        constraints:
          - 'node.hostname == 192-168-20-198'
      replicas: 1
      update_config:
        parallelism: 1
        delay: 5s
        failure_action: rollback
        monitor: 60s
        order: start-first
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 60s
      rollback_config:
        parallelism: 1
        delay: 5s
        failure_action: continue
        monitor: 60s
        order: start-first
  apollo-adminservice:
    image: myhub/gapi/apollo-adminservice:latest
    ports:
      - target: 8090
        published: 8090
        mode: host
    environment:
      - spring_datasource_url=jdbc:mysql://{mysqlurl}/ApolloConfigDB?characterEncoding=utf8
      - spring_datasource_username={username}
      - spring_datasource_password={password}
    deploy:
      placement:
        constraints:
          - 'node.hostname == 192-168-20-198'
      replicas: 1
      update_config:
        parallelism: 1
        delay: 5s
        failure_action: rollback
        monitor: 60s
        order: start-first
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 60s
      rollback_config:
        parallelism: 1
        delay: 5s
        failure_action: continue
        monitor: 60s
        order: start-first
  apollo-portal:
    image: myhub/gapi/apollo-portal:latest
    ports:
      - target: 8070
        published: 8070
        mode: host
    environment:
      - DEV_META=http://192.168.20.198:8080
      - spring_datasource_url=jdbc:mysql://{mysqlurl}/ApolloConfigDB?characterEncoding=utf8
      - spring_datasource_username={username}
      - spring_datasource_password={password}
    deploy:
      placement:
        constraints:
          - 'node.hostname == 192-168-20-198'
      replicas: 1
      update_config:
        parallelism: 1
        delay: 5s
        failure_action: rollback
        monitor: 60s
        order: start-first
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 60s
      rollback_config:
        parallelism: 1
        delay: 5s
        failure_action: continue
        monitor: 60s
        order: start-first

??需要注意的是,由于我們需要將三個服務(wù)都部署到192.168.20.198機器上,所以在deploy.placement.constraints中添加node.hostname == 192-168-20-198將服務(wù)都指定部署到192.168.20.198上。
??之后由于客戶端服務(wù)需要通過注冊中心調(diào)用apollo-configservice服務(wù)拉去配置,所以在apollo-configservice中需要
添加環(huán)境變量- eureka.instance.ip-address=192.168.20.198將自己實際IP注冊到eureka中,否則注冊信息是docker內(nèi)部網(wǎng)橋的虛擬地址,會導(dǎo)致我們拉去配置失敗。
??另外在apollo-portal需要添加環(huán)境變量- DEV_META=http://192.168.20.198:8080指定dev環(huán)境的configservice地址,官方提供的sql環(huán)境只開啟了dev環(huán)境,開啟其他環(huán)境在自后續(xù)進行說明

??準(zhǔn)備完成后就可以進行使用docker stack deploy命令部署服務(wù)了,但在此之前還需要到去ApolloConfigDB.ServerConfig表中將Key為eureka.service.url的Value由http://localhost:8080/eureka/改為http://192.168.20.198:8080/eureka/,因為apollo-configservice和apollo-adminservice服務(wù)都是通過此配置的地址注冊到eureka中,configservice和注冊中心在同一進程中沒什么問題,但adminservice在其他容器中通過localhost:8080并不能找到configservice中但注冊中心。

修改完成后運行命令以一鍵部署服務(wù):

docker stack deploy -c docker-stack.yml apollo

完成后可以使用docker stack ps命令查看詳情:

docker stack ps apollo

四、注意事項及后續(xù)升級

??進行到這里我們的服務(wù)部署就基本完成了,為了便于演示暫時只是支持了官方開箱自帶的dev環(huán)境,接下來演示如何增加新的環(huán)境。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容