在云端搭建自己的代碼倉庫,本地Push代碼俐芯,持續(xù)集成后自動發(fā)布篮绰。新版的Gitlab很好地支持這個需求,雖然只是自己使用镇眷,但目標還是利用三臺云主機搭建一個高可用模式的Gitlab服務(wù)咬最。
本文首先實現(xiàn)用Swarm管理集群,部署單主機模式的Gitlab欠动。云主機是收集學生優(yōu)惠卷1元買來的永乌,單核,1G內(nèi)存具伍。一開始運行起gitlab翅雏,整個系統(tǒng)卡頓了,顯然的資源不足人芽。到官網(wǎng)上查看gitlab安裝需求才知道現(xiàn)在的資源狀況只能實現(xiàn)最不值得推薦的配置:
1 core supports up to 100 users but the application can be a bit slower due to having all workers and background jobs running on the same core
1GB RAM + 3GB of swap is the absolute minimum but we strongly advise against this amount of memory. See the unicorn worker section below for more advice.
查看主機交換區(qū)大小發(fā)現(xiàn)默認交換區(qū)大小為0望几,因此需要手動增加交換區(qū)大小。
增加交換區(qū)
生成4G大小的文件在/home目錄下文件為swapflie:
$ sudo dd if=/dev/zero of=/home/swapflie bs=1M count=4096
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB) copied, 36.7799 s, 117 MB/s
把這個文件轉(zhuǎn)換成swap分區(qū)
$ sudo /sbin/mkswap /home/swapflie
使分區(qū)生效
$ sudo /sbin/swapon /home/swapfile
查看分區(qū)是否分配成功,(省略了其他指標參數(shù))
$ free -h
total used free
Swap: 4.0G 0B 4.0G
搭建Gitlab
準備Swarm集群
在資源有限的情況下管理容器集群萤厅,Swarm是一個比較好的選擇橄抹,相比于之前生產(chǎn)環(huán)境用的Kubernetes,Swarm操作簡單惕味,資源開銷小害碾,適合內(nèi)部環(huán)境使用。
如果已經(jīng)安裝了最新版本的docker(目前是1.12.5)赦拘,docker engine 已經(jīng)集成了swarm慌随。
可以用下面的命令安裝最新發(fā)布版本的docker,安裝完需要將當前用戶加入docker用戶組,并重新登錄生效阁猜。
curl -fsSL https://get.docker.com/ | sh
閱讀官方文檔丸逸,理想情況下用Swarm配合Docker Compose以及Docker Machine可以很方便地構(gòu)建docker集群。但Docker Machine創(chuàng)建docker環(huán)境相當于在云主機上創(chuàng)建另外的虛擬機(如virtual box剃袍,默認單核黄刚,1G內(nèi)存),所以只能手動在云主機上安裝相同docker環(huán)境,而不使用 Docker Machine民效。
另外Docker Compose配合Swarm憔维,文檔中有比較詳細的使用方法,一開始根據(jù)這個文檔部署環(huán)境畏邢,結(jié)果遇到很多坑业扒,查錯的過程中才知道目前這種模式仍在試驗階段,需要安裝試驗版本(docker 1.13)或者啟動試驗模式舒萎。使用Docker Compose + Swarm模式的方式需要其他方法程储,一種方式是將docker-compose.yml文件轉(zhuǎn)換成swarm服務(wù)的啟動方式,有個臨時的實現(xiàn)方法臂寝,可以試用章鲤。
這里沒有使用上面的方法,而是全部用命令行方式構(gòu)建Swarm集群:
初始化集群
Swarm的思想主要是將多臺主機抽象成一臺manager服務(wù)器咆贬,通過Swarm來啟動docker容器(service),像直接運行容器一樣败徊,不同的是容器會被負載均衡到不同主機。而對于容器的管理則可只在manager機器上進行掏缎。Swarm的架構(gòu)如圖:
這里首先實現(xiàn)兩臺主機的service部署皱蹦,managers上運行Swarm集群可視化工具,slave主機上運行g(shù)itlab.
登錄manager主機,初始化Swarm manage
docker swarm init --advertise-addr 192.168.10.11
命令返回slave節(jié)點加入集群的命令御毅,如:
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-5bgo3ocj3mqezig2v3j9mge4aknehgbcueovivzu6mz9supqzg-8igbqrbqhsh0z9l62qrrs0zi0 \
192.168.10.11:2377
該信息在集群創(chuàng)建成功后也可以在manage主機通過下面命令獲得。
docker swarm join-token worker
登錄到slave主機怜珍,加入集群
通過manage返回的token信息端蛆,加入集群
docker swarm join \
--token SWMTKN-1-5bgo3ocj3mqezig2v3j9mge4aknehgbcueovivzu6mz9supqzg-8igbqrbqhsh0z9l62qrrs0zi0 \
192.168.10.11:2377
注意我這里的兩個主機都是云主機,而且兩臺主機不在同一個局域網(wǎng)網(wǎng)段酥泛,因此需要將manage的內(nèi)網(wǎng)地址192.168.10.11換成對應(yīng)的公網(wǎng)IP今豆,才能成功注冊。如果兩臺主機在同一局域網(wǎng)柔袁,則可直接添加到集群呆躲。
給slave主機添加標簽,使manage可以通過標簽限定具體slave node捶索,后面可以看到:
docker node update --add-lable type=gitlab-node1
這里給slave機器添加type=gitlab-node1的標簽插掂。
啟動Swarm可視化服務(wù)
返回到manage主機,通過docker node ls命令查看集群節(jié)點狀態(tài),一切正常后辅甥,啟動Swarm可視化服務(wù)酝润。官方并沒有提供可視化服務(wù),在這里(docker-swarm-visualizer)有一個很好的開源實現(xiàn),可以直接使用該鏡像構(gòu)建服務(wù)璃弄。
$ docker service create --name=swarm_visual --publish=5001:8080/tcp --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock manomarks/visualizer
服務(wù)啟動通過 --constraint=node.role==manager 限定該服務(wù)在manage主機運行要销。并通過將web端口映射到云主機的5001端口∠目椋可以通過(公網(wǎng)IP:5001)的方式訪問疏咐。
創(chuàng)建gitlab數(shù)據(jù)vloumes
為了方便容器數(shù)據(jù)的共享,以及后面數(shù)據(jù)的遷移脐供,選擇創(chuàng)建volumes來在本地持久化gitlab容器數(shù)據(jù)浑塞,而不是映射到本地路徑。
登錄到slave主機患民,為gitlab創(chuàng)建volumes缩举,volumes的使用可以從后面看到:
$ docker volume create --name gitlab_config
$ docker volume create --name gitlab_logs
$ docker volume create --name gitlab_data
這里創(chuàng)建了三個volumes,分別存儲gitlab的配置文件、日志和用戶數(shù)據(jù)匹颤。
啟動Gitlab服務(wù)
在manage主機上可以直接啟動gitlab服務(wù)仅孩,并限定服務(wù)在slave主機運行。系統(tǒng)自動會到gitlub上pull相應(yīng)鏡像印蓖,并在本地運行辽慕。
sudo docker service create \
--name swarm_gitlab\
--publish 5002:443 --publish 5003:80 --publish 5004:22 \
--replicas 1 \
--mount type=volume,source=gitlab_config,destination=/etc/gitlab \
--mount type=volume,source=gitlab_logs,destination=/var/log/gitlab \
--mount type=volume,source=gitlab_data,destination=/var/opt/gitlab \
--constraint 'node.labels.type == gitlab-node1' \
gitlab/gitlab-ce:latest
命令中指定服務(wù)名為swarm_gitlab,以及http服務(wù)(443赦肃,80)和ssh服務(wù)(22)端口溅蛉,分別映射到宿主機;指定備份服務(wù)數(shù)為1他宛,映射本地路徑到容器相應(yīng)路徑船侧,這里使用volums的方式;限定在標簽type= gitlab-node1的主機上啟動服務(wù)厅各。
測試
登錄到manage主機镜撩,查看節(jié)點查看服務(wù)狀態(tài):
$ docker service ls
ID NAME REPLICAS IMAGE COMMAND
79c0rvct38j1 swarm_visual 1/1 manomarks/visualizer
dbygi9gx1318 swarm_gitlab 1/1 gitlab/gitlab-ce:latest
$ docker service ps swarm_gitlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
3haqups6rzf8ugobqzyescl21 swarm_gitlab.1 gitlab/gitlab-ce:latest VM** Running Running 9 hours ago
訪問manage主機的5001端口,可以看到Swarm集群的狀態(tài):
通過docker node的相關(guān)命令同樣也可以查看集群節(jié)點信息队塘。
訪問slave主機的5003端口袁梗,看到熟悉的Gitlab登錄界面,創(chuàng)建初試用戶和密碼憔古,創(chuàng)建用戶組遮怜,和測試Project:
小結(jié)
本文主要實現(xiàn)在有限云主機資源下搭建gitlab服務(wù),這里并沒有涉及gitlab的具體配置鸿市。這里只是簡單構(gòu)建一個可用的服務(wù)锯梁,后面再去看gitlab的管理方法即碗,以及服務(wù)的穩(wěn)定性和數(shù)據(jù)的備份與恢復。此外涝桅,第一次使用Swarm拜姿,由于資源限制,并沒有采用最佳的方式來部署服務(wù)冯遂。
原創(chuàng)文章蕊肥,轉(zhuǎn)載請注明出處,點擊到我的博客蛤肌。
更多關(guān)注公眾號: