串連RDS執行個體失敗,且ping RDS內網地址時提示Destination Host Unreachable
。
問題現象
從ECS執行個體無法ping通RDS內網地址,返回Destination Host Unreachable
。
PING rm-bpxxxx.mysql.rds.aliyuncs.com (172.17.0.31) 56(84) bytes of data.
From xxxx (172.17.0.1) icmp_seq=1 Destination Host Unreachable
From xxxx (172.17.0.1) icmp_seq=2 Destination Host Unreachable
From xxxx (172.17.0.1) icmp_seq=3 Destination Host Unreachable
問題原因
原因通常是RDS執行個體的內網網段與其他服務的網段衝突。
分析過程
使用PING命令ping RDS內網地址,可以看到RDS內網IP。從上述例子中,可以看到RDS執行個體內網IP為
172.17.0.31
。以Linux系統為例,執行
route-n
命令查看路由,返回資訊類似如下。Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.17.2.253 0.0.0.0 UG 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 172.17.0.0 0.0.0.0 255.255.255.0 U 0 0 0 br-350b446c181a
返回資訊顯示網卡
br-350b446c181a
的網段為172.17.0.0/24
,與RDS內網IP地址衝突,導致ECS執行個體無法路由到RDS執行個體。這種情況通常是Container Service的網段與RDS網段衝突。下面以Container Service為例,介紹如何解決路由衝突問題。
解決方案
方案一:修改Container Service的預設網段
本方案不適用RDS SQL Server執行個體,RDS SQL Server執行個體請直接參考方案二處理。
停止Docker或者修改Docker預設網段會中斷業務,建議業務低峰期進行操作。
修改Docker預設網段時請確保與任何現有容器和應用程式的網路設定相容,以避免潛在的串連問題。
以Linux系統為例,操作如下。
停止Docker服務。
sudo systemctl stop docker
編輯Docker設定檔。Docker設定檔通常位於
/etc/docker/daemon.json
或/etc/docker/daemon.conf
(具體檔案名稱可能有所不同)。sudo vim /etc/docker/daemon.json
確保檔案內容如下。
{ "bip": "新的網路網段" }
例如,將新的網路網段設定為192.168.0.0/16。
儲存並關閉設定檔。
啟動Docker服務使修改生效。
sudo systemctl start docker
方案二:切換RDS執行個體的交換器
您可以切換RDS執行個體的交換器,使執行個體的交換器網段不與Container Service的網段衝突。
預設情況下,不同VPC之間無法內網互連。建議僅切換交換器,不切換VPC,這樣不會影響其他阿里雲服務與RDS執行個體的內網串連。