app網(wǎng)站維護(hù)廣州網(wǎng)站建設(shè)推薦
docker swarm lock/unlock
的作用
Docker Swarm 提供了**加密集群狀態(tài)(Encrypted Raft logs)**的功能,可以防止 Swarm 集群的管理數(shù)據(jù)(如任務(wù)分配、集群配置等)在磁盤上被未授權(quán)訪問。
docker swarm lock
:鎖定 Swarm 集群,要求解鎖密鑰才能恢復(fù)集群管理功能。docker swarm unlock
:使用解鎖密鑰解鎖 Swarm,讓管理節(jié)點繼續(xù)運行。
1. docker swarm lock
(手動鎖定集群)
這個命令會手動鎖定 Swarm,即使 Swarm 仍然在運行,所有的 Swarm 操作都會暫停,直到解鎖:
docker swarm lock
鎖定后:
- 現(xiàn)有的容器仍然繼續(xù)運行。
- 但是 Swarm 不會進(jìn)行任務(wù)調(diào)度、服務(wù)管理、節(jié)點加入等操作。
2. docker swarm unlock
(手動解鎖)
當(dāng) Swarm 被鎖定后,管理節(jié)點重啟時需要手動解鎖:
docker swarm unlock
這時需要輸入 解鎖密鑰(Swarm 初始化時生成的)。
如果丟失解鎖密鑰,Swarm 無法恢復(fù),除非你強制重新創(chuàng)建 Swarm 集群(會導(dǎo)致數(shù)據(jù)丟失)。
查看解鎖密鑰:
docker swarm unlock-key
這個命令可以顯示當(dāng)前的解鎖密鑰。
3. Swarm 自動加密
當(dāng)你初始化 Swarm 并啟用了加密(默認(rèn)開啟),Swarm 狀態(tài)會加密存儲,管理節(jié)點重啟時默認(rèn)需要解鎖:
docker swarm init --autolock
如果使用 --autolock
參數(shù),Swarm 在管理節(jié)點重啟時會自動鎖定,你必須手動運行:
docker swarm unlock
才能讓 Swarm 繼續(xù)工作。
4. 關(guān)閉自動鎖定
如果不想 Swarm 在每次管理節(jié)點重啟后都鎖定,可以關(guān)閉:
docker swarm update --autolock=false
這樣 Swarm 以后重啟時不會要求手動解鎖。
5. 總結(jié)
命令 | 作用 |
---|---|
docker swarm lock | 手動鎖定 Swarm,不允許管理操作 |
docker swarm unlock | 手動解鎖 Swarm,恢復(fù)管理功能 |
docker swarm init --autolock | 啟用自動鎖定,管理節(jié)點重啟后必須解鎖 |
docker swarm unlock-key | 查看 Swarm 解鎖密鑰 |
docker swarm update --autolock=false | 關(guān)閉自動鎖定,管理節(jié)點重啟時無需手動解鎖 |
如果你的 Swarm 集群涉及敏感數(shù)據(jù),建議開啟 --autolock
,這樣即使主機被攻擊,攻擊者也無法直接訪問 Swarm 狀態(tài)數(shù)據(jù)。
舊節(jié)點重啟的隱患
1. Swarm 舊管理節(jié)點的安全隱患
當(dāng)一個 Swarm 管理節(jié)點(Manager)宕機后,你可能會:
- 直接重啟這個節(jié)點
- 使用備份數(shù)據(jù)恢復(fù) Swarm
但這樣做可能會帶來問題:
? 問題 1:舊節(jié)點可能會訪問 Swarm 的歷史數(shù)據(jù)
Swarm 管理節(jié)點的 Raft 數(shù)據(jù)庫 存儲了整個集群的狀態(tài)。
如果你重啟了一個 很久之前的管理節(jié)點,它的 Raft 數(shù)據(jù)庫可能是 舊數(shù)據(jù),但 Swarm 仍然會自動解密 Raft 日志,讓它繼續(xù)運行。
這樣會帶來:
- 安全風(fēng)險:攻擊者如果拿到一個舊的 Swarm 備份,可以用它恢復(fù)一個 Swarm,并獲取所有 Swarm 配置。
- 數(shù)據(jù)不一致:這個節(jié)點的數(shù)據(jù)可能過時,但仍然可以影響當(dāng)前的 Swarm 配置,導(dǎo)致集群異常。
? 問題 2:腦裂(Split-Brain)問題
如果一個 Swarm 集群有多個管理節(jié)點,其中一個管理節(jié)點 宕機了,Swarm 可能已經(jīng)選出了一個新的 Leader。
但如果這個 舊的 Leader 重新加入,就可能出現(xiàn):
- 原來的 Leader 繼續(xù)認(rèn)為自己是主節(jié)點
- 新的 Leader 也在正常運行
- 這樣會導(dǎo)致 兩個 Leader(雙主),Swarm 無法正常工作,這種情況叫 腦裂(Split-Brain)。
腦裂可能導(dǎo)致:
- 數(shù)據(jù)不一致:兩個 Leader 可能有不同的 Swarm 狀態(tài),導(dǎo)致任務(wù)分配混亂。
- 集群崩潰:Swarm 依賴 Raft 共識算法,如果不同節(jié)點有不同的狀態(tài),可能導(dǎo)致整個集群無法工作。
2. 自動鎖(Autolock)機制的作用
為了防止這些問題,Docker 提供了 自動鎖(Autolock)機制:
作用 1:防止舊節(jié)點自動解密 Raft 日志
如果啟用了 --autolock
,管理節(jié)點重啟后會自動鎖定,需要手動輸入 解鎖密鑰:
docker swarm unlock
這樣,即使某個舊的 Swarm 備份被恢復(fù),也不會直接訪問 Raft 數(shù)據(jù)庫,避免了安全問題。
作用 2:防止腦裂
如果一個舊的 Leader 因為宕機重啟,它必須 先解鎖 才能重新加入集群:
docker swarm unlock
這樣可以確保 Swarm 現(xiàn)有的 Leader 仍然有效,不會因為舊 Leader 的加入導(dǎo)致腦裂。
3. 解決方案
為了避免 Swarm 因為管理節(jié)點重啟或備份恢復(fù)帶來的問題,建議:
- 啟用自動鎖,防止 Swarm 舊管理節(jié)點被自動解密:
docker swarm init --autolock
- 定期備份 Swarm 解鎖密鑰,防止無法恢復(fù) Swarm:
docker swarm unlock-key
- 如果需要恢復(fù)備份,確保你恢復(fù)的是最新的 Raft 數(shù)據(jù)庫,不要用過舊的備份。
4. 總結(jié)
問題 | 影響 | 解決方案 |
---|---|---|
舊管理節(jié)點重啟 | 可能訪問舊 Raft 數(shù)據(jù),帶來安全風(fēng)險 | 啟用 --autolock ,防止自動解密 |
恢復(fù) Swarm 備份 | 如果備份過舊,可能會抹掉最新 Swarm 配置 | 確?;謴?fù)的是最新的 Raft 數(shù)據(jù) |
腦裂(Split-Brain) | 舊 Leader 重新加入,可能導(dǎo)致多個 Leader | 通過 --autolock 機制,確保手動解鎖 |
結(jié)論
- Swarm 默認(rèn)不會自動鎖定管理節(jié)點,重啟后可以直接加入集群,但這可能會導(dǎo)致 安全問題和腦裂。
--autolock
機制可以防止 Swarm 舊節(jié)點自動解密 Raft 數(shù)據(jù),并避免腦裂問題。- 如果 Swarm 需要恢復(fù)備份,確保備份數(shù)據(jù)是最新的,以免影響 Swarm 配置。
所以,如果你的 Swarm 需要高可用性,建議啟用 --autolock
,并定期備份 Swarm 解鎖密鑰!
https://github.com/0voice