我正在尋求幫助調試以下設定:
我有 3 個來自託管公司的 VP 雲端實例。 (我相信 VPS 是 VMWare,但我在主機公司網站上找不到任何文件。)
- 所有系統都運行 Ubuntu 18.04。
- 我已經在所有 3 個裝置上安裝了 docker。
所有 docker 版本都是相同的:
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea838
Built: Wed Nov 13 07:29:52 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.5
API version: 1.40 (minimum version 1.12)
Go version: go1.12.12
Git commit: 633a0ea838
Built: Wed Nov 13 07:28:22 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.4
GitCommit: e6b3f5632f50dbc4e9cb6288d911bf4f5e95b18e
runc:
Version: 1.0.0-rc6+dev
GitCommit: 6635b4f0c6af3810594d2770f662f34ddc15b40d
docker-init:
Version: 0.18.0
GitCommit: fec3683
我在一個節點 1 上執行了以下 init 指令:
docker swarm init --advertise-addr NODE_1_IP --data-path-port=7789
在節點 2 和 3 上我執行了以下連線命令
docker swarm join --token XXX -advertise-addr NODE_2/3_IP NODE_1_IP:2377
令牌取自節點 1 給我的值。我透過指定資料路徑連接埠解決了先前的問題。我認為這是因為VPS是VMWare,它與標準資料連接埠衝突
我的雲端提供者為我提供了一個使用者介面,用於將防火牆規則應用於單一 VPS。我已使用防火牆群組將以下規則套用至所有 3 台伺服器:
TCP ACCEPT to dest ports 80, 443, (and my SSH port)
ICMP ACCEPT any
TCP ACCEPT 2376
TCP, UDP ACCEPT 7789
UDP ACCEPT 7789
TCP ACCEPT 2377
ESP ACCEPT
為了測試這一點,我在節點 1 上執行了以下命令
docker network create --driver=overlay --attachable testnet
docker network create --opt encrypted --driver=overlay --attachable testnet_encrypted
docker service create --network=testnet --name web --publish 80 --replicas=5 nginx:latest
一旦服務在叢集中運行,我將執行以下操作:
docker run --rm --name alpine --net=testnet -ti alpine:latest sh
apk add --no-cache curl
然後我捲 5 次:
curl web
我總共 5 次都得到了回覆。如果我繼續下去,我就會不斷收到回覆。我認為這意味著所有貨櫃都在獲得流量。
然後我將伺服器切換到加密網路並重複相同的測試:
docker service rm web
docker service create --network=testnet_encrypted --name web --publish 80 --replicas=5 nginx:latest
docker run --rm --name alpine --net=testnet_encrypted -ti alpine:latest sh
apk add --no-cache curl
我再次運行curl 5次:
curl web
有時它會起作用,有時它會坐在那裡並掛起,直到我按 ctrl-c。
如果我運行它 5 倍,則工作和損壞的模式會重複。我認為這是因為某些容器正在 NODE_1 上運行,而這些容器可以工作,但與節點 2 和 3 的通訊不起作用。
經過對此問題的一些研究後,ESP ACCEPT 規則已新增至我的雲端提供者防火牆規則集中。
我嘗試過重新啟動集群,但沒有成功。
現在我被困住了。對於如何進行調試有什麼建議嗎?謝謝羅伯特
更新1
為了調試,我更改了測試,以便 Web 服務僅在 NODE_3 上的單一實例上運行。然後,我為節點 3 載入了兩個控制台並執行以下命令:
sudo tcpdump src NODE_1_IP and dst NODE_3_IP and port 7789
sudo tcpdump src NODE_3_IP and dst NODE_1_IP and port 7789
一個控制台將向我顯示流入 NODE_3 的流量以及流出 NODE_3 的其他流量。
然後我再次運行未加密的測試。我看到傳入控制台上出現了大約 7 行,傳出控制台上出現了 5 行。因此,有流量進入 NODE_3 並有流量流出 NODE_3,測試正在進行中
然後我運行了加密測試,這次我看到傳入控制台上出現一行,而傳出控制台上沒有任何內容。因此,單一資料包正在到達 NODE_3。我不確定它是否被解密並發送回容器。
更新2
我沒有提到的一個配置區域是我有以下 /etc/docker/daemon.json 設定:
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
"tlscacert": "/var/docker/ca.pem",
"tlscert": "/var/docker/server-cert.pem",
"tlskey": "/var/docker/server-key.pem",
"tlsverify": true
}
這是為了允許我使用 ssl 用戶端憑證進行遠端連線。在我建立 swarm 之前,該檔案已在所有節點上設定。
由於資料包解密看起來可能是一個原因,我已將 daemon.json 更改為以下內容:
{
"hosts": []
}
然後我重新啟動了每台機器。測試結果是一樣的——仍然不起作用。
然後我運行命令: docker swarm ca --rotate 並重新運行測試。這具有相同的結果。
我尚未使用新配置刪除並重新初始化叢集。 (如果有人認為這會有所幫助,我可以這樣做,但我有很多 docker 秘密和配置,我會在這個過程中丟失。)
更新3
我現在已經完全刪除並重新初始化了叢集。這沒有奏效。
一些消息來源說以下命令:
sudo tcpdump -p esp
在節點上運行時應顯示流量。我已在叢集中的所有節點上運行此命令並重複所有測試,但任何地方都沒有輸出。
ufw 它在所有節點上均處於非活動狀態:
robert@metcaac6:/var/log$ sudo ufw status
[sudo] password for robert:
Status: inactive
但是當我執行 iptables -LI 時,每個節點上都會得到相同的規則:
羅伯特@metcaac6:/var/log$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere policy match dir in pol ipsec udp dpt:7789 u32 "0x0>>0x16&0x3c@0xc&0xffffff00=0x100300"
DROP udp -- anywhere anywhere udp dpt:7789 u32 "0x0>>0x16&0x3c@0xc&0xffffff00=0x100300"
Chain FORWARD (policy DROP)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-INGRESS all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
DOCKER all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
DROP all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain DOCKER (2 references)
target prot opt source destination
Chain DOCKER-INGRESS (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED tcp spt:https
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED tcp spt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:30001
ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED tcp spt:30001
ACCEPT tcp -- anywhere anywhere tcp dpt:30000
ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED tcp spt:30000
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target prot opt source destination
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target prot opt source destination
DROP all -- anywhere anywhere
DROP all -- anywhere anywhere
RETURN all -- anywhere anywhere
Chain DOCKER-USER (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
我檢查了 dmesg 和 /var/log/syslog 尋找可能的問題,但我找不到任何問題。
我仍然不知道應該在哪裡尋找問題。