一:原理:
1:docker叢集亮點:
功能亮點
與Docker Engine內建的叢集管理:使用Docker Engine CLI建立一大群Docker引擎,您可以在其中部署應用程式服務。您不需要額外的編排軟體來建立或管理群。即自帶swarm不需要那麼多負載均衡高可用源件
分散式設計: Docker Engine在部署時不是處理節點角色之間的差異,而是在運作時處理任何專業化。您可以使用Docker Engine部署這兩種節點,管理者和從業人員。這意味着您可以從單個磁盤映像建構整個群集。
聲明式服務模型: Docker Engine使用聲明式方法來定義應用程式堆棧中各種服務的所需狀态。例如,您可能會描述一個由帶有消息隊列服務和資料庫後端的Web前端服務組成的應用程式。
縮放:對于每個服務,您可以聲明要運作的任務數量。當您向上或向下縮放時,swarm管理器會通過添加或删除任務來自動調整以保持所需的狀态。
期望的狀态協調:群管理器節點不斷監視群集狀态,并協調實際狀态與表達的期望狀态之間的任何差異。例如,如果您設定了一個服務來運作一個容器的10個副本以及一個承載其中兩個副本崩潰的工作器,那麼管理器将建立兩個新的副本來替換崩潰的副本。swarm manager将新副本配置設定給正在運作且可用的從業人員。
多主機聯網:您可以為您的服務指定一個重疊網絡。swarm管理器在初始化或更新應用程式時會自動将位址配置設定給覆寫網絡上的容器。
服務發現: Swarm管理器節點為swarm中的每個服務配置設定唯一的DNS名稱,并負載平衡正在運作的容器。您可以通過群集中嵌入的DNS伺服器來查詢在群集中運作的每個容器。
負載平衡:您可以将服務的端口暴露給外部負載平衡器。在群集内部,您可以指定如何在節點之間分發服務容器。
預設情況下是安全的:群中的每個節點都強制實施TLS互相認證和加密,以保護自身與所有其他節點之間的通信。您可以選擇使用自定義根證書或來自自定義根CA的證書。
滾動更新:在推出時,您可以逐漸将服務更新應用于節點。swarm管理器允許您控制服務部署到不同節點集之間的延遲。如果出現任何問題,您
當Docker以群集模式運作時,您仍然可以在參與群集的任何Docker主機以及群集服務上運作獨立容器。獨立容器和群集服務之間的一個主要差別是,隻有群集管理者可以管理群集,而獨立容器可以在任何守護程序上啟動。Docker守護程序可以作為管理者,工作者,或兩者兼而有之。
負載均衡
swarm管理器使用入口負載均衡來暴露你想在群集外部提供的服務。swarm管理器可以自動将服務配置設定給一個PublishedPort,或者您可以為該服務配置一個PublishedPort。您可以指定任何未使用的端口。如果您不指定端口,那麼swarm管理器将為該服務配置設定一個30000-32767範圍内的端口。
外部元件(如雲負載平衡器)可以通路群集中任何節點的已釋出端口上的服務,而不管該節點目前是否正在運作該服務的任務。群路由中的所有節點都将入口連接配接到正在運作的任務執行個體。
Swarm模式有一個内部的DNS元件,可以自動為群集中的每個服務配置設定一個DNS條目。群管理器使用内部負載平衡根據服務的DNS名稱在群集内的服務之間配置設定請求。
按照官網的文檔直接走,别翻來覆去找沒用的資料了
1. manager:172.25.67.250
2. server1:172.25.67.1
3. server2:172.25.67.2
前提:
本教程需要在每台主機上安裝Docker Engine 1.12或更高版本。安裝Docker Engine并驗證Docker Engine守護程序在每台機器上運作。如果低于1.12 不會自帶swarm ,需要pull
三台:
systemctl restart docker
[[email protected] Desktop]# docker swarm init
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on interface br0 ( and ) - specify one with --advertise-addr
錯誤原因:在manager上我有倆快網卡,沒有指定哪個ip上建立swarm
[[email protected] Desktop]# docker swarm init --advertise-addr .
Swarm initialized: current node (fj7bam3qavua00ksimls79n2) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN--ea7kwwqtwaddags5ypb44ql7qea4rjktysa9lvqkfculf4ywi-ev61dcr7g15xjb0fw8o3s1sjl \
.:
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
該–advertise-addr标志配置管理器節點将其位址釋出為192.168.99.100。群中的其他節點必須能夠通路IP位址的管理者。
輸出包括将新節點加入到群中的指令。根據–token 标志的價值,節點将作為經理或勞工加入。根據上面輸出在節點上執行,token是唯一标
[[email protected] ~]# docker swarm join --token SWMTKN-1-4ea7kwwqtwaddags5ypb44ql7qea4rjktysa9lvqkfculf4ywi-ev61dcr7g15xjb0fw8o3s1sjl 172.25.67.250:2377
This node joined a swarm as a worker.
[[email protected] ~]# docker swarm join --token SWMTKN-1-4ea7kwwqtwaddags5ypb44ql7qea4rjktysa9lvqkfculf4ywi-ev61dcr7g15xjb0fw8o3s1sjl 172.25.67.250:2377
This node joined a swarm as a worker.
運作docker info檢視群體的目前狀态:
[[email protected] Desktop]# docker info
Containers:
Running:
Paused:
Stopped:
Images:
Server Version:
Storage Driver: devicemapper
Pool Name: docker-:--pool
Pool Blocksize: kB
Base Device Size: GB
Backing Filesystem: xfs
Data file: /dev/loop4
Metadata file: /dev/loop5
Data Space Used: GB
Data Space Total: GB
Data Space Available: MB
Metadata Space Used: MB
Metadata Space Total: GB
Metadata Space Available: MB
Thin Pool Minimum Free Space: GB
Udev Sync Supported: true
Deferred Removal Enabled: false
Deferred Deletion Enabled: false
Deferred Deleted Device Count:
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
WARNING: Usage of loopback devices is strongly discouraged for production use. Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: -RHEL7 (--)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: host null bridge overlay
Swarm: active
NodeID: fj7bam3qavua00ksimls79n2
Is Manager: true
ClusterID: azzjtrdp4xx6u0xkrdlby4l0d
Managers:
Nodes:
Orchestration:
Task History Retention Limit:
Raft:
Snapshot Interval:
Heartbeat Tick:
Election Tick:
Dispatcher:
Heartbeat Period: seconds
CA Configuration:
Expiry Duration: months
Node Address:
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: -el7.x86_64
Operating System: Red Hat Enterprise Linux Server (Maipo)
OSType: linux
Architecture: x86_64
CPUs:
Total Memory: GiB
Name: foundation67.ilt.example.com
ID: ESBG:ZZAB:KUZ6:KP4:WHZ7:PSVD:KR3K:E3CY:UGX2:H4AC:BFK2:YWY
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: bridge-nf-call-ip6tables is disabled
Insecure Registries:
/
運作該docker node ls指令檢視有關節點的資訊:
[[email protected] Desktop]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
fj7bam3qavua00ksimls79n2 * foundation67.ilt.example.com Ready Active Leader
arlf5530b1mkchbbgcxdm3ikk server2 Ready Active
d58wnlal0wlt9scqu25rlnc0i server1 Ready Active
在*旁邊的節點ID表明目前連接配接此節點上。
- 部屬服務
下一步是什麼?
現在你的群由一個管理者和兩個勞工節點組成。在本教程的下一個步驟中,您将部署一個服務到群集。
運作以下指令:
[[email protected] Desktop]# docker service create --replicas 1 --name hellowalld alpine ping 172.25.67.1
bed1vdf0lv2p0o29k2ttfg7rv
該docker service create指令建立該服務。
該–name标志命名該服務helloworld。
該–replicas标志指定了正在運作的執行個體的所需狀态。
參數alpine ping xxx将服務定義為執行指令的Alpine Linux容器ping xxx。
運作docker service ls以檢視正在運作的服務的清單:
[root@foundation67 Desktop]# docker service ls
ID NAME REPLICAS IMAGE COMMAND
bed1vdf0lv2p hellowalld / alpine ping .
-
下一步是什麼?檢查群上的服務
現在你已經為這個群體部署了一個服務,你已經準備好檢查這個服務了。
運作docker service inspect –pretty 以便于閱讀的格式顯示有關服務的詳細資訊。
[[email protected] Desktop]# docker service inspect --pretty hellowalld
ID: bed1vdf0lv2p0o29k2ttfg7rv
Name: hellowalld
Mode: Replicated
Replicas:
Placement:
UpdateConfig:
Parallelism:
On failure: pause
ContainerSpec:
Image: alpine
Args: ping
提示:要以json格式傳回服務詳細資訊,請運作沒有–pretty标志的相同指令。
[[email protected] Desktop]# docker service inspect --pretty hellowalld
ID: bed1vdf0lv2p0o29k2ttfg7rv
Name: hellowalld
Mode: Replicated
Replicas:
Placement:
UpdateConfig:
Parallelism:
On failure: pause
ContainerSpec:
Image: alpine
Args: ping
Resources:
[[email protected] Desktop]# docker service inspect hellowalld
[
{
"ID": "bed1vdf0lv2p0o29k2ttfg7rv",
"Version": {
"Index":
},
"CreatedAt": "2017-11-16T01:57:14.00441158Z",
"UpdatedAt": "2017-11-16T01:57:14.00441158Z",
"Spec": {
"Name": "hellowalld",
"TaskTemplate": {
"ContainerSpec": {
"Image": "alpine",
"Args": [
"ping",
"172.25.67.1"
]
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"MaxAttempts":
},
"Placement": {}
},
"Mode": {
"Replicated": {
"Replicas":
}
},
"UpdateConfig": {
"Parallelism": ,
"FailureAction": "pause"
},
"EndpointSpec": {
"Mode": "vip"
}
},
"Endpoint": {
"Spec": {}
},
"UpdateStatus": {
"StartedAt": "0001-01-01T00:00:00Z",
"CompletedAt": "0001-01-01T00:00:00Z"
}
}
]
[[email protected] Desktop]#
運作docker service ps 以檢視哪些節點正在運作該服務:
[[email protected] Desktop]# docker service ps hellowalld
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
qwi0qzn98iqjhyavhqer8m hellowalld alpine foundation67.ilt.example.com Running Running minutes ago
在這種情況下,服務的一個執行個體helloworld正在worker2節點上運作 。您可能會看到服務在您的管理器節點上運作。預設情況下,群中的管理節點可以像工作節點一樣執行任務。
群也表明你DESIRED STATE和LAST STATE服務任務的,是以你可以看到,如果任務是根據服務定義運作。
在運作docker ps任務的節點上運作,檢視有關任務容器的詳細資訊。
[root@foundation67 Desktop]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad9beff72e alpine:latest "ping 172.25.67.1" minutes ago Up minutes hellowalld.qwi0qzn98iqjhyavhqer8m
- 擴充群中的服務
一旦您将服務部署到群集中,就可以使用Docker CLI來擴充服務中的容器數量。運作在服務中的容器被稱為“任務”。
運作以下指令以更改在群集中運作的服務的所需狀态:
ocker service scale =
[root@foundation67 Desktop]# docker service scale hellowalld=5
hellowalld scaled to
運作docker service ps 以檢視更新的任務清單:
[[email protected] Desktop]# docker service ps hellowalld
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
qwi0qzn98iqjhyavhqer8m hellowalld alpine foundation67.ilt.example.com Running Running minutes ago
yryer0ydxt2x6lpin12tlgi7 hellowalld alpine server2 Running Preparing seconds ago
adi26259g1fgvv65mc23ttyx6 \_ hellowalld alpine server2 Shutdown Rejected seconds ago "No such image: alpine:latest"
ee53jlqgpllcakio43uzgr3eq \_ hellowalld alpine server2 Shutdown Rejected seconds ago "No such image: alpine:latest"
cag3ghtb7b1zyhuqyt7sjo5br \_ hellowalld alpine server2 Shutdown Rejected seconds ago "No such image: alpine:latest"
aureyduzqcxzabujc9kl5v1km hellowalld alpine server1 Running Preparing seconds ago
mlrloz8sr18t4dtdps3akfzm \_ hellowalld alpine server1 Shutdown Rejected seconds ago "No such image: alpine:latest"
ayqmug4k8fngrudzp99hrvcu3 \_ hellowalld alpine server1 Shutdown Rejected seconds ago "No such image: alpine:latest"
swd6vs3zvaq8r4bp3sz33xk \_ hellowalld alpine server1 Shutdown Rejected seconds ago "No such image: alpine:latest"
kwbuhvpip1inkd4otgau5wf hellowalld alpine server1 Running Preparing seconds ago
b3cr57x8qa9zhctudzeijhxa5 \_ hellowalld alpine server2 Shutdown Rejected seconds ago "No such image: alpine:latest"
w4sq6hbt3z20rdnxhi1b3ax1 \_ hellowalld alpine server2 Shutdown Rejected seconds ago "No such image: alpine:latest"
z3e5gclyp4tyq4ci35y6kdxc \_ hellowalld alpine server1 Shutdown Rejected seconds ago "No such image: alpine:latest"
a9rdkip0mozxlb4haqe41ey95 hellowalld alpine foundation67.ilt.example.com Running Running about a minute ago
[[email protected] Desktop]#
您可以看到,swarm建立了4個新任務,可以擴充到總共5個運作的Alpine Linux執行個體。任務分布在群體的三個節點之間。一個正在運作manager1。
- 删除服務節點
[root@foundation67 Desktop]# docker service rm hellowalld \
>
hellowalld
[root@foundation67 Desktop]# docker service inspect helloworld
[]
Error: no such service: helloworld
- 将滾動更新應用于服務
[[email protected] 11.12 docker]# docker service create \
> --replicas 3 \
> --name redis \
> --update-delay 10s \
> redis:3.0.6
9dmtv0i662sg415rv43v41o51
您可以在服務部署時配置滾動更新政策。
該–update-delay标志配置更新服務任務或任務組之間的時間延遲。您可以将時間描述T為秒數Ts,分鐘數Tm或小時數的組合Th。是以 10m30s表示10分30秒的延遲。
預設情況下,排程程式一次更新1個任務。您可以通過此 –update-parallelism标志來配置排程程式同時更新的最大服務任務數。
預設情況下,當對單個任務的更新傳回狀态時 RUNNING,排程程式排程另一個任務以更新,直到所有任務都更新。如果在任務更新期間的任何時間FAILED,排程程式會暫停更新.
檢查redis服務:
[[email protected] docker]# docker service inspect --pretty redis
ID: dmtv0i662sg415rv43v41o51
Name: redis
Mode: Replicated
Replicas:
Placement:
UpdateConfig:
Parallelism:
Delay: s
On failure: pause
ContainerSpec:
Image: redis:
更新節點版本:
[root@foundation67 docker]# docker service update --image redis:3.0.7 redis
redis
```更新過程:
停止第一個任務。
為已停止的任務計劃更新。
啟動更新的任務的容器。
如果更新任務傳回RUNNING,請等待指定的延遲時間,然後開始下一個任務。
如果在更新期間的任何時候任務傳回FAILED,請暫停更新。
檢視更新後的狀态:變成了新的版本
<div class="se-preview-section-delimiter"></div>
[[email protected] 11.12 docker]# docker service inspect –pretty redis
ID: 9dmtv0i662sg415rv43v41o51
Name: redis
Mode: Replicated
Replicas: 3
Update status:
State: paused
Started: 2 minutes ago
Message: update paused due to failure or early termination of task 8j4ub39p2sgdi7gl060v0xhc3
Placement:
UpdateConfig:
Parallelism: 1
Delay: 10s
On failure: pause
ContainerSpec:
Image: redis:3.0.7
Resources:
删掉節點:
所有節點都已經運作并且ACTIVE 可用。swarm manager可以将任務配置設定給任何ACTIVE節點,是以到現在為止所有節點都可以接收任務。
有時,例如計劃的維護時間,您需要将節點設定為DRAIN 可用性。DRAIN可用性阻止節點從群管理器接收新任務。這也意味着管理器停止在節點上運作的任務,并在具有ACTIVE可用性的節點上啟動副本任務。
<div class="se-preview-section-delimiter"></div>
[[email protected] 11.12 docker]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
3fj7bam3qavua00ksimls79n2 * foundation67.ilt.example.com Ready Active Leader
arlf5530b1mkchbbgcxdm3ikk server2 Ready Active
d58wnlal0wlt9scqu25rlnc0i server1 Ready Active
如上所有節點都是active
檢視redis狀态;
<div class="se-preview-section-delimiter"></div>
[[email protected] 11.12 docker]# docker service ps redis |grep Running
6968c0eb1obxil5hev8gfnq8b redis.1 redis:3.0.7 server2 Running Preparing 19 seconds ago
9v4finugxexzxchvnqqyoblds redis.2 redis:3.0.7 server1 Running Preparing 14 seconds ago
975qber3zecltkv8shi75ssji redis.3 redis:3.0.6 foundation67.ilt.example.com Running Preparing 12 minutes ago
[[email protected] 11.12 docker]#
<div class="se-preview-section-delimiter"></div>
[[email protected] 11.12 docker]# docker node update –availability drain server1
server1
[[email protected] 11.12 docker]# docker service ps redis |grep Running
1ngiolv8iqhb5zkld3u7g1zpy redis.1 redis:3.0.7 server2 Running Preparing 13 seconds ago
6h9me5vp6brlbdat2foibb6su redis.2 redis:3.0.7 server2 Running Preparing 2 seconds ago
975qber3zecltkv8shi75ssji redis.3 redis:3.0.6 foundation67.ilt.example.com Running Preparing 13 minutes ago
[[email protected] 11.12 docker]#
如上,可看出節點已經下線了,任務也重新配置設定了;
<div class="se-preview-section-delimiter"></div>
[[email protected] 11.12 docker]# docker node inspect –pretty server1
ID: d58wnlal0wlt9scqu25rlnc0i
Hostname: server1
Joined at: 2017-11-16 01:51:09.159022759 +0000 utc
Status:
State: Ready
Availability: Drain
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 1
Memory: 993.1 MiB
Plugins:
Network: bridge, host, null, overlay
Volume: local
Engine Version: 1.12.6
如上,server1處于Drain狀态
- 運作 docker node update --availability active <NODE-ID>以将耗盡的節點傳回到活動狀态:
<div class="se-preview-section-delimiter"></div>
[[email protected] 11.12 docker]# docker node update –availability active server1
server1
[[email protected] 11.12 docker]# docker node inspect –pretty server1
ID: d58wnlal0wlt9scqu25rlnc0i
Hostname: server1
Joined at: 2017-11-16 01:51:09.159022759 +0000 utc
Status:
State: Ready
Availability: Active
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 1
Memory: 993.1 MiB
Plugins:
Network: bridge, host, null, overlay
Volume: local
Engine Version: 1.12.6
“`
将節點設定回Active可用性時,可以接收新的任務:
在服務更新期間要擴大規模
在滾動更新
當你設定另一個節點的Drain可用性
當一個任務在另一個活動節點上失敗時
即後備,等下一個滾動更新,加入叢集或者替代死的;