為什麼我的 docker 系統資料庫拒絕來自本地網路中的虛擬機而不是主機的連接?
對於上下文 - 我正在嘗試在氣隙環境中部署 OKD,這需要鏡像鏡像系統資料庫。然後,在安裝過程中,網路中的其他機器會從這個私有、安全的系統資料庫中提取。
描述環境 - 執行系統資料庫容器的主機正在執行 Centos 7.6。其他機器都是使用 libvirt 執行 Fedora coreOS 的虛擬機。虛擬機和主機使用使用 libvirt 創建的虛擬網路連接,其中包括虛擬機的 DHCP 設置(通過 virsh net-edit 配置),為它們提供靜態 IP。主機還託管 DNS 伺服器(綁定),據我所知,它配置正確,因為我可以使用其完全限定的域名從其他機器 ping 每台機器並訪問特定埠(例如埠主機上的 apache 伺服器監聽)。使用 Podman 代替 Docker 進行 OKD 的容器管理,但據我所知,命令完全相同。
我使用以下命令在氣隙環境中執行系統資料庫:
sudo podman run --name mirror-registry -p 5000:5000 -v /opt/registry/data:/var/lib/registry:z \ -v /opt/registry/auth:/auth:z -v /opt/registry/certs:/certs:z -e REGISTRY_AUTH=htpasswd \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.pem -e REGISTRY_HTTP_TLS_KEY=/certs/registry-key.pem \ -d docker.io/library/registry:latest
可以使用
curl -u username:password https://host-machine.example.local:5000/v2/_catalog
which returns訪問它{"repositories":[]}
。我相信這證實了我的 TLS 和授權配置是正確的。但是,如果我將 ca.pem 文件(用於簽署系統資料庫使用的 SSL 證書)傳輸到虛擬網路上的 VM 之一,並嘗試使用相同的curl
命令,則會收到錯誤消息:connect to 192.168.x.x port 5000 failed: Connection refused Failed to connect to host-machine.example.local port 5000: Connection refused Closing connection 0
這對我來說很奇怪,因為過去我已經能夠使用這種方法從虛擬機與系統資料庫進行通信,但我不確定發生了什麼變化。
經過進一步探勘,似乎埠本身存在某種問題,但我無法確定問題出在哪裡。例如,如果我
sudo netstat -tulpn | grep LISTEN
在主機上執行,我會收到一條指示 podman (conmon) 正在偵聽正確埠的行:
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 48337/conmon
但是,如果我測試該埠是否可以從 VM 訪問,(
nc -zvw5 192.168.x.x 5000
) 我會收到類似的錯誤:Ncat: Connection refused.
如果我在主機上的任何其他偵聽埠上使用相同的測試,則表明與這些埠的連接成功。請注意,我已經完全禁用了 firewalld,據我所知,所有埠都是開放的。
我不確定問題出在我的 DNS 設置、虛擬網路還是系統資料庫本身,我不太確定如何進一步診斷問題。任何見解將不勝感激。
網路定義:
<network connections='6'> <name>okd</name> <uuid>2ce10cce-9bb6-4d5d-950f-15427172b196</uuid> <bridge name='virbr1' stp='on' delay='0'/> <mac address='52:54:00:d9:d6:95'/> <domain name='okd'/> <ip address='192.168.2.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.2.200' end='192.168.2.254'/> <host mac='52:54:00:45:93:07' name='okd-bootstrap' ip='192.168.2.200'/> <host mac='52:54:00:f0:0a:1c' name='okd-master1' ip='192.168.2.201'/> <host mac='52:54:00:d1:29:9e' name='okd-master2' ip='192.168.2.202'/> <host mac='52:54:00:c9:a4:bb' name='okd-master3' ip='192.168.2.203'/> <host mac='52:54:00:25:5d:48' name='okd-worker1' ip='192.168.2.204'/> <host mac='52:54:00:1e:90:3c' name='okd-worker2' ip='192.168.2.205'/> </dhcp> </ip> </network>
“連接被拒絕”是一個方便的提示。iptables 拒絕連接,或者軟體配置為將某些 IP 範圍列入白名單/黑名單。路徑中的某些東西正在積極拒絕連接。如果您收到“請求超時”……這可能是一個更大的問題列表。(路由,數據包被丟棄……等等……)