首頁>技術>

雲服務環境與Docker部署工具

完成微服務的開發之後,必須為其提供-一個合 適的分散式環境進行最終的部署和釋出,才能充分發揮微服務架構的優勢。這個環境首先應該是安全可靠的,並且是可以進行任意擴充套件的分散式環境。其次,它的基礎設施應該是配備齊全的,並且穩定可靠、可擴充套件。這些基礎設施包括資料庫管理系統、檔案管理系統、訊息服務系統等服務,以及自動化測試和持續交付等工具。

我們開發的每-一個微服務都可以進行任意多副本的釋出,能夠持續保持高效能的服務狀態,所以微服務應用的基礎服務設施和構建環境也必須具有可持續擴充套件的特性。

為了給微服務提供一個可伸縮的環境,我們必須組建或租用雲服務。既可以組建私有云,也可以租用公有云,或者兩者兼而有之。

虛擬機器與基於Docker建立的容器

在Docker出現之前,為了充分利用伺服器資源,我們使用VMware等技術來構建虛擬機器。

那麼,虛擬機器與容器之間有什麼不一樣呢?有人對伺服器、虛擬機器和Docker這三者做了-一個很形象的比喻,可以用來說明它們的區別:

◎伺服器好比運輸碼頭: 擁有場地和各種裝置(伺服器硬體資源)。

◎虛擬機器好比碼頭 上的倉庫:擁有獨立的空間堆放各種貨物或集裝箱。

◎Docker 好比集裝箱:是各種貨物的打包。

所以,使用Docker工具建立的容器可以存在於任何伺服器或虛擬機器中,它比虛擬機器更加靈活、小巧,在處理一個服務的啟動、關閉和更新等操作時更快、更便捷。

安全可靠的雲服務環境

如圖12-1所示是一個基於阿里雲設計的安全雲服務架構的網路拓撲圖。從這個圖中可以看出,任何外部對伺服器的訪問,包括運維管理人員的訪問,都必須經過阿里云云盾和防火牆。

在此基礎上,我們可以構建各種叢集體系,包括微服務、閘道器、註冊中心、Nginx. 各種基礎資源和各種基礎設施等。

當然,我們也可以自己組建伺服器,建立私有云,來搭建這些環境和基礎設施。但是,從成本和便利性等綜合條件考慮,建議還是選擇雲服務供應商提供的服務。

Docker 和docker-compose的下載與配置

Docker是一個優秀的容器引擎,透過它可以為應用系統建立一一個可移植的容器。 容器運行於宿主系統上,其功能相當於一個虛擬主機。但是與虛擬主機相比,Docker 的效能更好。Docker佔用資源少,構建非常靈活、方便,且可以非常快速地啟動和關閉。

正因為如此,對於整個電商平臺的微服務應用來說,我們都將使用Docker進行部署和釋出。

在我們開發的微服務中,已經自包含了Tomcat中介軟體和打包後的Jar檔案,可以使用如下所示的Java命令直接執行:

Java -jar *.jar

由此可見,使用Docker部署微服務是非常簡便的,只需使用類似於上面所示的命令就可以在Docker中執行Jar包。

另外,使用Docker部署微服務還可以利用更多的伺服器資源,設定簡單、操作方便。而服務的更新和執行,將更加快速和高效。

下面介紹Docker及其工具的安裝,以及Docker的使用方法,以幫助讀者加深對Docker 的認識和理解。

Docker 引擎的安裝及使用

在Linux環境中安裝Docker,可以按以下步驟進行。需要注意的是,Docker需要在Linux7.0或以上的版本中才能執行。下面的安裝配置以CentOS 7.0為例。

首先,使用下列命令更新安裝環境:

# yum update

然後,編輯下列命令,配置Docker的安裝源:

# tee /etc/yum. repos .d/docker.repo <<-' EOF'[dockerrepo]name=Docker Repositorybaseurl=https://yum . dockerproject .org/ repo/main/centos/7/gpgcheck=1gpgkey=https://yum. dockerproject.org/gpgEOF

最後,使用下列命令開始安裝:

#yum install docker-engine

安裝需要一定的時間, 並且會透過網路下載一些安裝檔案。

安裝完成後可以使用下列命令啟動Docker:

service docker start

使用下列命令檢查版本:

# docker --version

使用下列命令檢視詳細的版本資訊:

# docker version

使用”下列命令可以將Docker設定為開機啟動:

docker-compose 的下載及配置

docker-compose是一個通 過編排指令碼來使用Docker引擎的工具元件,這一工具元件使得我們不必記住那麼多的命令和配置引數,即可更加方便和快速地進行應用的部署和更新。

使用下列命令可以將已經編譯的docker- compose下載到本地系統中:

curl -L https://github.com/ docker/compose/ releases/download/1.16.0-rc2/docker-compose- uname -s'-'uname -m > /usr/local/bin/docker-compose

其中,“1.16.0-rc2” 為版本號,可以先從GitHub上檢視docker-compose的最新版本,然後更改.上面命令中的版本號,即可下載最新的版本。

下載完成後執行下列命令,更改docker-compose的執行許可權:

chmod +x /usr/ local/bin/docker-compose

使用下列命令檢視docker compose的版本號:

docker-compose version

執行下列命令可以輸出docker -compose的完整幫助資訊:

# docker-compose -h

對於docker-compose,我們常用的命令有build、up、ps、 start、 stop、 down 和logs等。如果要釋出一個微服務,則只需使用一個up命令就足夠了。

另外,還可以使用help命令檢視每一-個命令的詳細幫助資訊。例如,可以使用下列命令檢視down命令的使用說明:

docker -compose help down
使用Docker方式釋出微服務

在使用Docker執行一個服務時,首先必須建立這個服務的映象,然後使用這個映象建立容器並執行服務。在同一主機中,一個映象可以建立多個容器副本,所以在-一個主機中,也可以為所部署的服務做有限度的擴充套件部署。

映象建立 及其生成指令碼

在建立映象時,我們需要一個生成指令碼, 然後將指令碼檔案與Jar 包- -起上傳到伺服器的特定目錄中,這樣就可以用來生成應用的映象了。建立映象的指令碼有一個固定的名字: Dockerfile。

一般來說,指令碼內容如下所示:

FROM java:8VOLUME / tmpADD demo-1 .0-SNAPSHOT.jar app.jarRUN bash -c 'touch /app.jar'RUN /bin/cp /usr/share/ zoneinfo/Asia/Shanghai /etc/1ocaltime \&& echo ,Asia/Shanghai' >/etc/ timezoneEXPOSE 8080ENTRYPOINTI ["java", "-Djava. security. egd=file:/dev/ ./urandom" , "-jar" ,"/app.jar"]

這個指令碼表示,引用Java 8映象將專案的Jar包生成- -個由 JDK 1.8 支撐的映象。其中,EXPOSE指定了執行服務時設定的埠號,並且設定了Shanghai時區,目的是在容器執行時,其輸出的日誌能夠顯示正確的時間。

對於我們所開發的微服務應用來說,都可以參照這個指令碼建立映象,只需修改相關的釋出包檔名和埠號即可。

服務的釋出 與更新

在部署服務時,可以建立- -個目錄(例如demo)來放置上傳的Dockerfile和打包檔案,然後在其上一層目錄中再建立一一個 docker-compose.yml檔案,並使用這一檔案編排部署指令碼。對於這個例子來說,可以編排如下所示的指令碼:

demo:build: . /demoports:"8080:8080"

然後,使用docker-compose的up命令部署應用,程式碼如下所示:

docker -compose up -d

這個命令已經包含了映象的建立、容器的生成和啟動等一系列操作。 其中,引數-d 表示在後臺中執行。

使用下列命令檢視執行的容器:

docker-compose ps

使用下列命令檢視容器的輸出日誌:

的操作,程式碼如下所示:

docker-compose down --rmi all

執行這個命令將停止由編排指令碼管理的所有容器,同時還將刪除相關的容器和映象。

從上面的演示可以看出,使用docker-compose來部署一一個應用是非常 方便的,我們只需使用一個簡單的命令就可以完成所有操作。

使用 Docker部署日誌分析平臺

我們可以使用一個統一的 日誌分析平臺管理微服務應用生成的日誌,這將給8志的查詢和使用提供極大的方便。

日誌分析平臺ELK由三個服務組成,分別是Elasticsearch、Logstash 和Kibana。其中:

◎Elasticsearch 是- -個分散式搜尋分析引擎,負責日誌儲存並提供搜尋功能。

◎Logstash 是一個開源資料處理管道,能提供資料收集、加工和傳輸管道的服務,負責日誌收集。

◎Kibana是一個數據視覺化平臺,可以將資料分析結果轉化為圖表等形式,即提供了Web查詢的操作介面。

因為日誌分析平臺ELK中的三個服務都是開源的,並且已經發布到公域的映象倉庫中,所以我們可以使用docker- compose工具編寫指令碼進行部署和安裝。

首先,在伺服器上建立-一個目錄,程式碼如下所示:

mkdir /logstash

進入這個目錄之後,使用如下命令建立-一個配置 檔案:

vi logstash. conf

檔案的內容如下所示: .

inputtop {port => 5000codec => j sonudpport => 5000codec => json | outputelasticsearch { hosts => [ "elasticsearch:9200" ] }}

其次,使用如下命令建立一-個編排指令碼檔案:

vi docker-compose. ym1

在檔案中編寫如下所示內容:

logstash:image: logstash:5.4.0volumes:一./logstash. conf: /etc/logstash. confports:一"5000: 5000/tcp""5000: 5000/udp"links:一elasticsearchcommand:-f /etc/logstash. confelasticsearch:image: elasticsearch:5.4.0kibana:image: kibana:5.4.0links:一elasticsearchports:一"5601 :5601"

其中,三個服務的版本號必須統一 。最後,使用如下命令啟動服務:

docker-compose up -d

第一次啟動時需要一定 的時間,因為需要從映象倉庫中拉取相關的映象。

在啟動成功之後,就可以使用日誌分析平臺了。即可以使用docker-compose中的start. stop .等命令執行平臺的啟動或關閉等操作。

在應用工程中,想要使用日誌分析平臺的日誌收集功能,就必須透過日誌配置檔案logback.xml進行配置。一個完整的日誌配置檔案中的內容如下所示:

根據實際情況進行更改。

基於Docker的高階部署工具.

我們可以在使用Docker引擎的基礎上,使用更加高階的工具來管理,現在比較流行的工具有Docker Swarm和Kubernetes等。

私域映象倉庫

為了更好地配合高階工具的應用部署,應該建立-一個私有的映象倉庫,將需要部署的映象存放在映象倉庫中,這樣在後面需要使用部署工具時,就可以從映象倉庫直接拉取映象了。

假設私域映象域名為imags.demo.net, 並且在映象倉庫中建立了一個專案test,還為這個項

目指定了相關使用者及其讀寫許可權,即可使用如下命令登入映象倉庫:

docker login imags. demo.net

根據提示,輸入映象倉庫分配的使用者名稱和密碼。

這樣,我們就可以上傳Jar包和Dockerfile檔案,然後在當前目錄中使用下列命令來建立映象了:

docker build一七imags. demo. net/test/example:1.0.0

在這個命令中,我們指定了映象的名字和版本號,如果建立成功,則可以看到類似於如下所示的輸出資訊:

Successfully built 24d82a696eefSuccessfully tagged imags . demo .net/test/example:1.0.0

映象建立成功之後,即可使用如下命令將生成的本地映象推送到映象倉庫:

docker push imags. demo.net/test/example:1.0.0

如果操作成功,則可以看到如下所示的輸出資訊:

The push refers to repository [imags. demo. net/test/example]dd6bb0471434: Pushedf07ed18457b0: Pushed3929c58ac07b: Pushed1.0.0: digest:sha256: 4c51a34a68054524ecd31b724047c232802c7c85334499d0b7119abcf329a634 size:2631

當把需要釋出的映象都建立成功之後,就可以使用更加高階的工具直接從映象倉庫中拉取映象,來建立各種服務了。

Docker Swarm

Docker Swarm是Docker官方提供的一款 Docker叢集管理工具,它的架構如圖12-2所示。

Docker Swarm可以透過叢集方式管理多個安裝有Docker引擎的主機。在Docker Swarm中,是透過管理節點SwarmManager來管理叢集中的所有工作節點SwarmNode的。應用部署必須在管理節點上進行,管理節點提供了叢集中Docker主機的排程和服務發現等功能。

基於12.6.1 節建立的映象,我們可以建立一一個指令碼 檔案example.yml,在Docker Swarm環境中釋出服務,指令碼內容如下所示:

version: ' 3services:example-app:image: imags . demo . net/test/example:1.0.0deploy:replicas: 2#定義replicated 模式服務的副本數量update_ config:parallelism: 1#每次更新副本數量delay: 2s#每次更新間隔restart_ policy:condition: on- failure#定義服務的重啟條件networks:金coreports:- "8080"networks:core:external: true

使用如下命令釋出服務:

docker stack up -C example. yml --with-registry-auth example-app

使用如下命令檢視服務:

docker stack ps example-appdocker service list

Kubernetes

Kubernetes (簡稱k8s) ,是Google開源的運維管理平臺,是-一個容器叢集管理系統,可以非常便捷地實現容器叢集的自動化部署和自動化擴容、縮容等功能。使用k8s可以最大限度地簡化應用部署和管理的諸多操作,讓複雜的應用運維管理工作變得簡單、容易。

k8s被業界譽為下一代分散式架構的王者,在服務平臺的構建中,它提供了極好的效能優勢,以及高度的穩定性和可靠性。

使用k8s,不僅能快速地部署應用、快速地擴充套件應用、無縫對接新的應用,並且能夠節省伺服器等硬體資源,最佳化資源的配滾動鼠樣軸或單擊,開始截長圖k8s的特點如下:

◎可移植性:支援各種雲端伺服器和各種分散式伺服器架構。

◎可擴充套件性:支援模組化、外掛化,並且擁有可掛載、可組 合等功能。

自動化:可進行自動部署、自動重啟、自動複製、自動伸縮和擴充套件管理。

為了更加深入地理解Kubernetes,下 面介紹幾個核心概念。

1. Master

Master是Kubermetes叢集的管理節點,負責管理叢集,提供叢集的資源訪問入口,擁有Etcd儲存服務,可執行API Server 程序、Controller Manager服務程序和Scheduler排程服務程序等,並且還能起到關聯工作節點(Node) 的作用。

2. Node

Node是Kubermetes叢集架構中執行Pod的服務節點(是一個物理主機)。Node 是Kubernetes叢集操作的單元,用來承載被分配Pod的執行,是Pod執行的宿主主機。

3. Pod

Pod是運行於Node節點上的若干相關容器的組合。Pod 內包含的容器執行在同一-宿主主機上,使用相同的網路名稱空間和IP地址,共享埠資源,能夠透過localhost 進行通訊。Pod 是Kurbernetes進行建立、排程和管理的最小單位,它提供了比容器更高層次的抽象,使得部署和管理更加靈活。

4. Replication Controller

Replication Controller 是用來管理Pod的副本,保證叢集中存在指定數量的Pod副本。

Replication Controller是實現彈性伸縮、動態擴容和滾動升級的核心。

5. Service

Service定義了Pod的邏輯集合和訪問該集合的策略,是真實服務的抽象。Service提供了一個統-的服務訪問入口,以及服務代理和發現機制,關聯多個相同Label的Pod。

6. Label

Kubernetes中的任意API物件都是透過Label 進行標識的,Label 的本質是一系列的Key/Value (鍵值)對,其中key和value由使用者自己指定。

圖12-3是Kubernetes的架構圖,從這個圖中可以看出Kubemetes主要由以下幾個核心元件組成:

◎ etcd儲存了整個叢集的狀態。

◎kube-apiserver提供了資源操作的唯一 入口,並提供認證、授權、訪問控制、API註冊和發現等機制。

◎ controller-manager負責維護叢集的狀態,比如故障檢測、自動擴充套件和滾動更新等。

◎kube-schedule 負責資源的排程,按照預定的排程策略將Pod排程到相應的機器上。

◎kubelet負責維護容器的生命週期,同時也負責Volume(CVI)和網路(CNI)的管理。

◎proxy 負責為service-controller提供Cluster內部的服務發現和負載均衡。

為了更加形象地認識Kubernetes,下面我們用一個簡單的例項說明Kubernetes的使用方法。

Deployment為Pod和ReplicaSet提供了一個宣告式定義(declarative) 方法,用來替代以前的Replication Controller,以更加方便的方式管理應用。典型的應用場景包括:

◎定義 Deployment來建立Pod和ReplicaSet。

◎滾動升級和回滾應用。

◎擴容和縮容。

◎暫停和繼續 Deployment。

建立一個基 於Deployment的編排指令碼nginx- test.yml,內容如下所示:

apiVersion: apps/v1kind: DeploymentI metadata :name: nginxspec:replicas: 1selector :matchLabels:app: nginxtemplate :metadata:labels:app: nginxspec:containers :name: nginximage: nginx:1.16.1ports :- containerPort: 8060

這是隻有一個例項的Nginx服務,它使用公共映象nginx:1.16.1,容器的名字為nginx。

使用如下命令釋出服務:

kubectl create一f nginx-test. yml

使用如下命令檢視釋出的狀態:

kubectl get deployments

或者使用如下命令檢視Pod:.

kubectl get pods

對於已經發布的服務,可以使用如下命令進行擴容:

kubectl scale deployment nginx --replicas

如果叢集支援horizontal pod autoscaling,則可以為Deployment設定自動擴容,即實現自動彈性伸縮控制:

kubectl autoscale deployment nginx --min=2 --max=8 --cpu-percent=80

更新映象也比較簡單:

kubectl set image deployment/nginx nginx = nginx:1.16.2

或者對已經部署的服務進行回滾:

kubectl rollout undo deployment/nginx

更多有關Kubernetes的資訊,讀者可直接訪問官網檢視。

上面的這些操作過程全部可以在控制檯中透過操作介面來完成。

需要說明的是,DockerSwarm和Kubernetes都有服務發現功能,當我們釋出微服務應用時,是使用這些管理工具的服務發現功能,還是使用Consul的服務註冊與發現功能呢?這裡建議讀者使用Consul的服務註冊與發現功能,理由是:

(1) Consul 是一個專業的服務註冊與發現管理工具,並且融合了遠端配置管理功能。

(2)使用Consul的服務註冊與發現功能,能夠與開發環境的開發和除錯保持一致, 這樣將更方便於問題的跟蹤或者故障的分析處理。

(3) Consul能夠使用Kubernetes進行叢集釋出和管理。

小結

本文介紹了微服務應用釋出環境的組建,以及基於Docker管理工具的應用部署的管理方法。從雲服務環境的組建和應用部署的方法來看,我們可以有很多選擇,前提是必須保證微服務執行環境的安全可靠性,然後再根據系統平臺的規模選擇一一種切合實際的部署工具。 一般來說,對於一個小型系統,使用docker-compose工具就可以了;如果是一個大型系統平臺,則建議使用Kubernetes管理工具。

18
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • SpringCloud Gateway詳解