天天看點

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

        建構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,大概實作的效果是這樣的:

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

圖1

         Node2:172.25.0.30 centos7 主節點 Leander
         Node3:172.25.0.33 centos7  worker

安裝dockers

配置允許使用 TCP 連接配接 Docker

配置阿裡加速倉庫鏡像位址

xxxx為你自己阿裡雲的賬号的加速地

我們來通過 Docker 啟動一個 Gitlab 服務,如下:

域名我們随便就行了。

首次登入 Gitlab 需要重置密碼,預設使用者名為 root。

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

這裡建議與 Gitlab 伺服器分開部署,專門提供單獨的 runner 伺服器。

這裡就直接在node2上安裝了

Node2:

找到setting àCI/CDàrunner Expand

下面URL與token為注冊runner準備

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

然後配置釋出用的 gitlab-runner

注冊 gitlab-runner

gitlab可以檢視已建立的runner

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

修改 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加入叢集:

檢視叢集狀态

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

注:

如果需要添加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

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

進去建立local的就行了

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

可以看到本地的docker

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

檢視叢集

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

也是正常的了

Hyperf代碼位址:https://github.com/hyperf/hyperf-skeleton.git

Node2:

擷取本地主機的id_keys

如果沒有這個檔案生成一下

Gitlab添加部署密鑰

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

添加部署密鑰,注意是可寫入,要勾選

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

擷取demo的git ssh位址

[email protected]:root/demo.git 這個位址是不正确的,因為我們在建構時,使用的端口并不是22端口,直接使用這個位址,clone會提示輸入密碼,無法拉取代碼,正确位址是:

ssh://[email protected]:2222/root/demo.git

進入hyperf代碼目錄删除git記錄

更改.git目錄記錄

推送代碼到demo

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

建立鏡像倉庫,存儲鏡像

首先建立一個命名空間,然後建立一個鏡像倉庫 demo,并使用本地倉庫。

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署
從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

然後到我們直接打包用的伺服器中,登入阿裡雲 Docker Registry

發現官網沒有很細節的說,直接按官網的有點問題的, 該配置 <code>CI</code> 用你的項目中做哪些操作,這個檔案位于倉庫的根目錄。

發現我在搭建的時候有點問題,就修改一下dockerfile,源images的PHP基本擴充很全,就不用安裝了,我們主要改一下源。

這個是demo項目,可以随便一點就行,添加config名字為demo_v1.0,config主要是配置一些服務參數

配置如下:

過程如下:

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署
從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

因為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,我們可以發現找到我的項目正在部署

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

一段時間後,可以發現兩個都建構任務都建構成功了

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

點進去可看建構的過程,也是排錯的地方

接下來我們就可以通路叢集任意一台機器的 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

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

添加路由

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

配置好的如下

從零進階--建構docker-swarm結合Gitlab-runner持續內建實作hyperf 部署

通路是否代理成功

分析一:

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方面文法/編寫。

………………………….

繼續閱讀