自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

離線網(wǎng)絡(luò)環(huán)境下一鍵式部署

開(kāi)發(fā) 開(kāi)發(fā)工具
在這個(gè)互聯(lián)網(wǎng)無(wú)處不在的時(shí)代,網(wǎng)絡(luò)安全尤為重要,特別是在金融和電信領(lǐng)域,出現(xiàn)網(wǎng)絡(luò)安全問(wèn)題將會(huì)帶來(lái)不可估量的損失。本文通過(guò)部署一套復(fù)雜系統(tǒng)為例,來(lái)描述如何在封閉網(wǎng)絡(luò)環(huán)境下實(shí)現(xiàn)一鍵式部署。

關(guān)鍵詞

封閉網(wǎng)絡(luò):一個(gè)相對(duì)封閉的網(wǎng)絡(luò)環(huán)境,僅可以使用有限的資源如:maven鏡像倉(cāng)庫(kù)、Centos/Ubuntu源等,無(wú)法連接互聯(lián)網(wǎng)的網(wǎng)絡(luò)環(huán)境。

一鍵部署:這里所說(shuō)的“一鍵式部署”不僅僅是指這樣的場(chǎng)景:“編碼 --> 測(cè)試 --> 提交--> CI/CD --> 部署完成”。這里更多的是在描述:“在一個(gè)離線的網(wǎng)絡(luò)環(huán)境下,運(yùn)行一個(gè)deploy.sh的文件,就可以看到所有基礎(chǔ)設(shè)施服務(wù)如:Nexus、Gitlab、Mongodb等已部署完成,然后在你編輯業(yè)務(wù)代碼并提交至遠(yuǎn)程倉(cāng)庫(kù)時(shí),會(huì)觸發(fā)CI、編譯、測(cè)試、打包、部署,至此所有的業(yè)務(wù)模塊部署成功”,實(shí)現(xiàn)基礎(chǔ)設(shè)施即代碼。

背景

在這個(gè)互聯(lián)網(wǎng)無(wú)處不在的時(shí)代,網(wǎng)絡(luò)安全尤為重要,特別是在金融和電信領(lǐng)域,出現(xiàn)網(wǎng)絡(luò)安全問(wèn)題將會(huì)帶來(lái)不可估量的損失。

基于對(duì)數(shù)據(jù)安全性、保密性和獨(dú)立性的考慮,為了更好地提供服務(wù),同時(shí)有效地保護(hù)內(nèi)部網(wǎng)絡(luò)的安全,我們需要將這些對(duì)外開(kāi)放的主機(jī)與內(nèi)部的眾多網(wǎng)絡(luò)設(shè)備分隔開(kāi)來(lái),制定安全策略限制互聯(lián)網(wǎng)連接。這樣便能在對(duì)外提供友好服務(wù)的同時(shí),***限度地保護(hù)內(nèi)部網(wǎng)絡(luò),這也導(dǎo)致了內(nèi)網(wǎng)無(wú)法連接互聯(lián)網(wǎng)而形成一個(gè)“封閉網(wǎng)絡(luò)”。

[[216526]]

痛點(diǎn)

我們通常會(huì)有這樣的需求:在一個(gè)無(wú)法連接互聯(lián)網(wǎng)的環(huán)境下setup一套dev、qa、staging包括搭建CI等環(huán)境來(lái)供不同的角色使用,但是由于安全策略或其他安全限制導(dǎo)致一些基礎(chǔ)服務(wù)無(wú)法從互聯(lián)網(wǎng)獲取,如Kubenetes、Mongodb、Kafka等基礎(chǔ)組件服務(wù),這就給自動(dòng)化部署和持續(xù)交付帶來(lái)了不便,特別是在系統(tǒng)對(duì)第三方服務(wù)依賴較多的情況下。

本文通過(guò)部署一套復(fù)雜系統(tǒng)為例,來(lái)描述如何在封閉網(wǎng)絡(luò)環(huán)境下實(shí)現(xiàn)一鍵式部署。

解決方案

基于最主要的原因: "更輕松的遷移和擴(kuò)展", 我們使用Docker來(lái)部署基礎(chǔ)組件服務(wù)。

對(duì)于一個(gè)封閉的網(wǎng)絡(luò)環(huán)境來(lái)說(shuō),要獲取基礎(chǔ)服務(wù)鏡像如上文提到的Mongodb鏡像是不可能完成的任務(wù)。當(dāng)然,我們可以使用docker save將構(gòu)建好的鏡像保存成tar包,使用U盤等介質(zhì)將tar包復(fù)制到內(nèi)網(wǎng)然后使用docker load命令還原鏡像。

對(duì)于較復(fù)雜(依賴相對(duì)較多的基礎(chǔ)組件)的系統(tǒng)來(lái)說(shuō),如果每個(gè)組件都如此操作將會(huì)帶來(lái)很大的工作量,并且更容易出錯(cuò),對(duì)于后期維護(hù)來(lái)說(shuō)也是一個(gè)很大的挑戰(zhàn)。所以使用Nexus是一個(gè)很好的選擇,將Nexus作為Docker倉(cāng)庫(kù)保存所有的基礎(chǔ)組件鏡像。 這樣不僅可以解決離線網(wǎng)絡(luò)無(wú)法下載安裝包的問(wèn)題,同時(shí)可以簡(jiǎn)化配置,并保持內(nèi)網(wǎng)環(huán)境與開(kāi)發(fā)環(huán)境的一致性,給一鍵式部署提供了前提。

解決了網(wǎng)絡(luò)問(wèn)題,接下來(lái)就是部署和配置管理。同樣的道理,如果每個(gè)基礎(chǔ)服務(wù)都需要手動(dòng)部署往往比較耗時(shí),難以實(shí)現(xiàn)故障排查,并且可能帶來(lái)潛在錯(cuò)誤。所以我們需要一個(gè)自動(dòng)化部署工具來(lái)提高工作效率,降低維護(hù)成本。

經(jīng)過(guò)對(duì)主流的自動(dòng)化工具做橫向?qū)Ρ龋罱K選擇使用Ansible作為配置管理和自動(dòng)化部署工具。那么Ansible是什么?下文會(huì)給出詳細(xì)描述。

解決了上述問(wèn)題,就可以實(shí)施離線網(wǎng)絡(luò)自動(dòng)化部署了,將整個(gè)過(guò)程分為3階段,依次是:

  • Base Deploy。主要部署所有服務(wù)所依賴的基礎(chǔ)組件Docker、Nexus和Gitlab,Docker作為基礎(chǔ)平臺(tái),Nexus和Gitlab也部署在Docker平臺(tái)上,Nexus作為私有Maven倉(cāng)庫(kù)和私有Docker倉(cāng)庫(kù),Gitlab作為私有遠(yuǎn)程代碼庫(kù)。
  • Infrastructure Deploy。此階段主要使用Ansible部署集群所依賴的基礎(chǔ)服務(wù)如Kubernetes(Pass平臺(tái))、Kafka和Mongodb等服務(wù)。
  • Business Deploy。***一個(gè)階段測(cè)試持續(xù)集成和持續(xù)部署的階段,使用GoCD作為CI工具,在CI上實(shí)現(xiàn)業(yè)務(wù)服務(wù)模塊的自動(dòng)化部署。

實(shí)踐如下圖所示:

1. Base Deploy

如上文所述,使用Nexus作為私有的Docker Registry和Maven Repository,Nexus是倉(cāng)庫(kù)管理器,它極大地簡(jiǎn)化了自己內(nèi)部倉(cāng)庫(kù)的維護(hù)和外部倉(cāng)庫(kù)的訪問(wèn)。利用Nexus你可以只在一個(gè)地方就能夠完全控制訪問(wèn)和部署在你所維護(hù)倉(cāng)庫(kù)中的每個(gè)Artifact。

Nexus存儲(chǔ)著所有基礎(chǔ)設(shè)施的鏡像文件,如Kubernetes、Mongodb、Zookeeper和Kafka的鏡像等,同時(shí)需要一個(gè)Nexus鏡像文件用來(lái)部署Nexus。為Infrastructure Deploy提供基礎(chǔ)環(huán)境和部署中所有的依賴組件。

同時(shí)為了方便Nexus的遷移和維護(hù),我們將Nexus也部署在Docker平臺(tái)上。使用一個(gè)簡(jiǎn)單的Shell腳本完成Base Deploy,一次部署Docker、Nexus和Gitlab(Gitlab作為私有的git倉(cāng)庫(kù))。Deploy.sh 代碼如下:

  1. #!/bin/bash 
  2. function init_docker {...} #安裝docker 
  3. function load_images {...} #加載docker容器 
  4. function run_service {...} #啟動(dòng)nexus、gitlab等服務(wù) 
  5. function upload_nexus_data {...} #上傳nexus數(shù)據(jù) 
  6. function upload_gitlab_data {...} #上傳gitlab數(shù)據(jù) 
  7.  
  8. for i in ${HOST_LIST[@]};do 
  9.   init_docker $i 
  10.   upload_data $2 
  11.   run_service $1 
  12. done 

PS: 運(yùn)行deploy.sh 之前所有主機(jī)需要配置ssh public key登錄, 避免自動(dòng)化過(guò)程中提示輸入密碼。

運(yùn)行deploy.sh即可部署Nexus和Gitlab。Nexus如下圖所示,可以運(yùn)行docker pull 獲取所有組件的鏡像包括kubernetes、ansible等 。

運(yùn)行deploy.sh即可部署Nexus和Gitlab

Git Lab如下圖所示,也可以運(yùn)行g(shù)it clone 獲取所有的代碼倉(cāng)庫(kù)包括Infrastructure Deploy的部署腳本。

Git Lab

如果條件允許可以為Nexus和Gitlab創(chuàng)建DNS記錄,或者可以通過(guò)修改本地/etc /hosts文件來(lái)通過(guò)使用特定域名訪問(wèn)Nexus和Gitlab,如下文中使用的nexus-server訪問(wèn)Nexus、gitlab-server訪問(wèn)Gitlab。

2. Infrastructure Deploy

上文提到我們使用Ansible來(lái)實(shí)現(xiàn)基礎(chǔ)設(shè)施的自動(dòng)化部署,我們知道目前主流的自動(dòng)化部署工具包括Puppet、Chef、Ansible。 對(duì)比來(lái)說(shuō),Chef對(duì)于開(kāi)發(fā)人員要更加“友好”,而Puppet則更適合運(yùn)營(yíng)和系統(tǒng)管理類的任務(wù),但是我們選擇Ansible,主要的原因是:

  • Ansible是通過(guò)ssh進(jìn)行所有操作,不需要在遠(yuǎn)程服務(wù)器上安裝客戶端,而使用Chef引擎和Puppet時(shí),都需要在其管理的服務(wù)器上安裝客戶端(雖然Chef聲稱其可以不安裝,但其無(wú)代理agent-less版本支持的功能十分有限),Ansible則會(huì)充分利用現(xiàn)有的東西,而且沒(méi)有其他任何要求[注]。
  • 通俗的說(shuō)Ansible的部署過(guò)程就是在一臺(tái)或者幾臺(tái)服務(wù)器上,執(zhí)行一系列的命令而已。Ansible playbook是Ansible更為強(qiáng)大的配置管理組件,實(shí)現(xiàn)基于文本文件編排執(zhí)行的多個(gè)任務(wù),且多次重復(fù)執(zhí)行。所以我們選擇Ansible作為配置管理和自動(dòng)化部署工具。

Ansible工作原理如下圖:

Ansible工作原理如下圖:

(圖片來(lái)自:Ansible官網(wǎng))

使用Ansible使整個(gè)過(guò)程透明化,每個(gè)部署工作都實(shí)現(xiàn)為獨(dú)立的ansible playbook role,這樣可以在不同的環(huán)境里部署指定的服務(wù),提高部署代碼的復(fù)用性。同時(shí)與Nexus配合使用,形成自動(dòng)化部署的閉環(huán),不依賴網(wǎng)絡(luò)即可提供部署中依賴的所有組件,所有的應(yīng)用程序都會(huì)以Docker image的方式提供。

在離線環(huán)境下使用Ansible是完全可行的,但是離線環(huán)境也無(wú)法直接安裝Ansible,為了統(tǒng)一管理我們也使用Docker鏡像來(lái)提供Ansible。在內(nèi)網(wǎng)成功部署了Nexus后,使用docker pull nexus-server:5000/:即可獲得Ansible鏡像。同時(shí)Ansible所需playbook role文件則保存在Gitlab中,執(zhí)行g(shù)it clone gitlab-server:2289/.git 下載deploy代碼庫(kù)。 deploy代碼庫(kù)結(jié)構(gòu)如下:

  1. ├── environments 
  2. │   └── uat 
  3. │       └── inventory 
  4. │   └── dev 
  5. │       └── inventory 
  6. ├── roles 
  7. │   ├── docker 
  8. │   ├── kubernetes 
  9. │   ├── mongodb-cluster 
  10. ├── docker.yml # 在PaaS集群所有VM節(jié)點(diǎn)安裝docker 
  11. ├── kubernetes.yml # 部署PaaS平臺(tái) 
  12. ├── mongodb-cluster.yml # 部署mongodb sharding 集群 
  13. └── all.yml 
  14.  
  15. # all.yml 一鍵部署所有的基礎(chǔ)設(shè)施 
  16. --- 
  17. - include: mongodb-cluster.yml 
  18. - include: kubernetes.yml 
  19. - include: docker.yml 

運(yùn)行以下命令即可實(shí)現(xiàn)基礎(chǔ)設(shè)施的一鍵自動(dòng)部署:

  1. docker run --rm -v WORKDIR:$(pwd) ansible:2.2.1 ansible-playbook -i uat/inventory all.yml 

3. Business Deploy

***Business Deploy就是標(biāo)準(zhǔn)的持續(xù)集成/交付過(guò)程,使用GoCD作為CI/CD工具,完成業(yè)務(wù)模塊的持續(xù)集成和部署。關(guān)于持續(xù)集成和持續(xù)交付,請(qǐng)參考https://en.wikipedia.org/wiki/Continuous_delivery/

總結(jié)

玩過(guò)紅警的朋友應(yīng)該知道,在開(kāi)局的時(shí)候你只有一個(gè)基地,需要采集資源、升級(jí)建筑、造兵攻打直到消滅所有的國(guó)家,一切都是自給自足。當(dāng)然紅警是可以離線玩的, 上文描述的過(guò)程和紅警很類似,你只有一個(gè)基地,就是將所有部署所需要的文件如Nexus data、Gitlab repo等按照特定的目錄結(jié)構(gòu)打成的zip包,使用U盤或者其他存儲(chǔ)介質(zhì)拷貝到離線的網(wǎng)絡(luò)環(huán)境,就像雙擊紅警基地一樣,運(yùn)行deploy.sh即可一鍵部署所有的基礎(chǔ)設(shè)施服務(wù)。

對(duì)于所有組件的升級(jí),也比較容易,我們只需要將升級(jí)后的Docker鏡像拷貝到內(nèi)網(wǎng),重新執(zhí)行Ansible腳本即可實(shí)現(xiàn)基礎(chǔ)服務(wù)的更新。

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2023-06-15 10:00:00

Jenkins任務(wù)操作

2021-06-30 22:03:05

數(shù)據(jù)庫(kù)交付設(shè)計(jì)

2024-04-08 13:59:03

大模型Replicate

2015-02-09 15:25:52

換膚

2025-04-29 10:13:58

2015-06-09 10:36:13

Cloud FoundAzurePaaS

2023-09-08 23:30:19

2012-07-03 16:03:07

2010-11-08 13:58:14

Check Point互聯(lián)網(wǎng)安全移動(dòng)訪問(wèn)軟件刀片

2015-07-30 16:18:14

企業(yè)網(wǎng)D1Net

2025-02-06 09:22:28

2023-09-12 07:06:04

2014-07-04 16:23:15

開(kāi)發(fā)者CrossApp

2022-04-29 09:55:55

NocalhostKubeVela混合云

2018-11-27 12:25:21

華為

2015-11-03 15:29:49

ONOS開(kāi)放網(wǎng)絡(luò)操作系統(tǒng)SDN

2012-07-24 10:53:41

掃描儀

2023-09-14 20:55:52

NodeJSDocker

2025-04-17 04:00:00

2020-05-14 12:09:56

Centos7EFK部署
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)