建構docker-swarm結合Gitlab-runner持續內建實作hyperf部署
最近發現有用到hyperf,應需求,便按照官網的,弄一下Gitlab-runner持續內建部署,詳細可見官方文檔:Hyperf
Docker-swarm:Swarm 是 Docker 官方提供的一款叢集管理工具,其主要作用是把若幹台 Docker主機抽象為一個整體,并且通過一個入口統一管理這些 Docker 主機上的各種 Docker 資源。
Gitlab-runner:gitlab-runner 是 gitlab 提供的持續內建工具,通過.gitlab-ci.yml實作有效項目部署。
Hyperf:Hyperf 是基于 <code>Swoole 4.3+</code> 實作的高性能、高靈活性的 PHP 協程架構,是基于微服務開源的架構。詳細可見官官方文檔:Hyperf
Kong: 網關服務,主要用于資料轉發,主要作用于保護,管理和擴充微服務和API 。
對于整個架構實作,我簡單整理了一下,如圖1,大概實作的效果是這樣的:
圖1
Node2:172.25.0.30 centos7 主節點 Leander
Node3:172.25.0.33 centos7 worker
安裝dockers
配置允許使用 TCP 連接配接 Docker
配置阿裡加速倉庫鏡像位址
xxxx為你自己阿裡雲的賬号的加速地
我們來通過 Docker 啟動一個 Gitlab 服務,如下:
域名我們随便就行了。
首次登入 Gitlab 需要重置密碼,預設使用者名為 root。
這裡建議與 Gitlab 伺服器分開部署,專門提供單獨的 runner 伺服器。
這裡就直接在node2上安裝了
Node2:
找到setting àCI/CDàrunner Expand
下面URL與token為注冊runner準備
然後配置釋出用的 gitlab-runner
注冊 gitlab-runner
gitlab可以檢視已建立的runner
修改 gitlab-runner 并發執行個數
gitlab-runner啟動:
……….
或者
啟動:
重新開機:
停止:
如果有多個網絡的,指定ip
初始化會建立ingress的網絡,該網絡網段為10.0.0.0/24
建構自定義網絡,不能再用10.0.0.0/24,不然建構完的DRIVER狀态為空
可以看到network了
j4mxeizwtcki network overlay swarm
工作節點:增加容量。當将服務部署到叢集時,引擎排程任務到可用節點上,不管是工作節點還是管理節點。當工作節點加入到叢集時,可擴充叢集處理任務規模不會影響管理者raft使用。
管理節點:增加容錯能力。管理節點執行叢集編排和管理功能。在所有管理節點中,會選擇出一個上司者,來執行編排任務。當該上司者故障了,其餘的管理節點選擇出一個新的上司者,并恢複對叢集狀态的編排和管理。預設情況下,管理節點也運作任務。
Node2主節點:
檢視node加入worker叢集指令:
node3加入叢集:
檢視叢集狀态
注:
如果需要添加manager,可以檢視直接添加
顯示manager節點的TOKEN
加入manager節點到叢集
這裡有個小問題,我發現一個節點以manager角色加入叢集,然後在manager角色節點使用docker swarm leave --force,指令離開叢集,發現主節點會崩潰。
模拟過程:
主節點:
擷取managerTOKEN:
Manager節點:
manager角色加入叢集
強制離開叢集
重新加入
處理方法:
重新初始化
安裝mysql,檢測自定義的network可用性
以下以 Mysql 為例,直接使用上述 network,支援容器内使用 name 互調。可以為我們項目提供mysql服務
Portainer為容器的web可視化管理界面
注,如果是預設裝的docker.sock,在/var/run目錄下面
通路http://172.25.0.30:9000/
建立通路賬戶密碼:
admin
password
進去建立local的就行了
可以看到本地的docker
檢視叢集
也是正常的了
Hyperf代碼位址:https://github.com/hyperf/hyperf-skeleton.git
Node2:
擷取本地主機的id_keys
如果沒有這個檔案生成一下
Gitlab添加部署密鑰
添加部署密鑰,注意是可寫入,要勾選
擷取demo的git ssh位址
[email protected]:root/demo.git 這個位址是不正确的,因為我們在建構時,使用的端口并不是22端口,直接使用這個位址,clone會提示輸入密碼,無法拉取代碼,正确位址是:
ssh://[email protected]:2222/root/demo.git
進入hyperf代碼目錄删除git記錄
更改.git目錄記錄
推送代碼到demo
建立鏡像倉庫,存儲鏡像
首先建立一個命名空間,然後建立一個鏡像倉庫 demo,并使用本地倉庫。
然後到我們直接打包用的伺服器中,登入阿裡雲 Docker Registry
發現官網沒有很細節的說,直接按官網的有點問題的, 該配置 <code>CI</code> 用你的項目中做哪些操作,這個檔案位于倉庫的根目錄。
發現我在搭建的時候有點問題,就修改一下dockerfile,源images的PHP基本擴充很全,就不用安裝了,我們主要改一下源。
這個是demo項目,可以随便一點就行,添加config名字為demo_v1.0,config主要是配置一些服務參數
配置如下:
過程如下:
因為demo配置了 gitlab-ci.yml ,配置了only和tags, 推送代碼到test分支自動會檢測 test 分支和 tags,是以直接把 test 分支推送到gitlab 就行。
到這一步,我們可能會有個疑問,怎麼推送到test分支服務就起來了呢?
其實過程并不複雜,由于我們配置.gitlab-ci.yml檔案,當我們把代碼推送到指定的分支後,便會觸發gitlab-runner,通過讀取.gitlab-ci.yml進行整個項目的建構。
推送代碼到test分支
找到gitlab-demo項目àCI/CDàPipelinesàRunning,我們可以發現找到我的項目正在部署
一段時間後,可以發現兩個都建構任務都建構成功了
點進去可看建構的過程,也是排錯的地方
接下來我們就可以通路叢集任意一台機器的 9501 端口。進行測試了
檢視叢集的9501的端口是否起來了
node2:
node3:
叢集hyperf的服務端口都起來了,通路hyperf
預設的Docker Swarm 叢集是不會直接對外暴露提供通路的,是以我們可以在上層建構一個網關服務, Kong在保護,管理和擴充微服務和API的同時,也可以充當一個網關的角色通過提供日志,認證或者其他功能的插件來給給HTTP提供任何資源。
這裡有一個就是,如果機器直接對外暴露通路, 80 和 443 端口,可以把端口映射-p 80:8000、-p 443:8443 映射到本地80和443端口。
接下來隻需要把部署 KONG 網關的機器 IP 對外暴露通路,然後配置對應的 Service 即可。
配置service
添加路由
配置好的如下
通路是否代理成功
分析一:
Gitlab搭建docker浮動性大。經常出現,無限重新開機的狀态。
分析:在資源消耗,後期維護的問題上,不建議docker上安裝。
分析二:
建構項目時突然出現
fatal: git fetch-pack: expected shallow list
fatal: The remote end hung up unexpectedly
分析:這個Git的版本問題,重新安裝就好
重新運作jobs就行了
分析三:
新加入的節點,是否直接加入到工作狀态。
分析:
模拟了一下,當我們新加一個新的節點後,發現9501端口也會起來的,這就是叢集的作用;另外,模拟了好幾次後發現hyperf它都隻會在叢集的其中一個節點運作,但是其他節點是正常通路的,其它節點是起到工作分擔的作用,這也是dokcer swarm的特點。
1、發現每次建構的時候,就會建構一個新的鏡像,為了可控資源,docker需要控制鏡像的數量。
2、在服務方面,日志是不可少的,是以後期方面,日志該如何處理。
3、需要熟練Dockerfiles方面文法/編寫。
………………………….