就上下文而言 - 我正在尝试在隔离环境中部署 OKD,这需要镜像镜像注册表。然后在安装过程中,网络中的其他机器将从这个私有的安全注册表中提取数据。
描述一下环境 - 运行注册表容器的主机运行的是 Centos 7.6。其他机器都是使用 libvirt 运行 Fedora coreOS 的虚拟机。虚拟机和主机使用 libvirt 创建的虚拟网络连接,其中包括 DHCP 设置(通过 virsh net-edit 配置),以便虚拟机为其提供静态 IP。主机还托管 DNS 服务器(bind),据我所知,该服务器配置正确,因为我可以使用其完全限定域名从每台其他机器 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 返回 来访问{"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
但是如果我测试该端口是否可以从虚拟机访问,(nc -zvw5 192.168.x.x 5000
)我会收到类似的错误:Ncat: Connection refused.
如果我在主机上的任何其他监听端口上使用相同的测试,则表明与这些端口的连接成功。
请注意,我已经完全禁用防火墙,因此据我所知,所有端口都是开放的。
我不确定问题出在我的 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>
答案1
“连接被拒绝”是一个方便的提示。要么是 iptables 拒绝了连接,要么是软件配置为将某些 IP 范围列入白名单/黑名单。路径中的某些东西正在主动拒绝连接。如果您收到“请求超时”... 则可能是一系列问题。(路由、数据包被丢弃... 等等...)