問題描述
在連續使用阿里雲ECS執行個體超過一段時間後,且期間未重啟過ECS執行個體,出現執行個體斷網、網路癱瘓、無法Ping通公網IP地址和私網IP地址的情況。
問題原因
初次啟動ECS執行個體時,系統會使用DHCP(動態主機設定協議,Dynamic Host Configuration Protocol)方式為彈性網卡自動分配IP地址,並獲得IP地址租約到期時間。正常情況下,Linux系統的dhclient進程和Windows系統的DHCP Client服務會定期向DHCP伺服器更新租約到期時間,以確保執行個體IP地址的可用性。由於部分CentOS 7鏡像(詳見適用範圍章節)建立的執行個體會小機率清理dhclient進程,以及Windows Server作業系統的DHCP Client服務存在已知問題,導致您的執行個體無法自動更新IP地址的續租到期時間。當首次獲得續租時間的IP地址到期後,執行個體的私網IP地址會被釋放,導致執行個體網路不通。
適用範圍
符合以下條件的ECS執行個體,並且ECS執行個體通過DHCP方式為彈性網卡自動分配IP地址,需要根據本文描述修複問題。若ECS執行個體配置的靜態IP地址,則無需處理該問題。
-
基於以下CentOS 7公用鏡像建立的任何類型執行個體(在2018年5月31日之前建立,並在2018年11月15號之後沒有重啟的ECS執行個體)。
-
centos_7_04_64_20G_alibase_20180419.vhd
-
centos_7_04_64_20G_alibase_20180326.vhd
-
centos_7_04_64_20G_alibase_201701015.vhd
-
centos_7_03_64_20G_alibase_20170818.vhd
-
centos_7_02_64_20G_alibase_20170818.vhd
-
centos_7_03_64_40G_alibase_20170710.vhd
-
centos_7_03_64_40G_alibase_20170625.vhd
-
centos_7_03_64_40G_alibase_20170523.vhd
-
centos_7_03_64_40G_alibase_20170503.vhd
-
-
運行以下Windows Server作業系統的執行個體(在2018年11月15日之前建立,且之後沒有重啟過的ECS執行個體)。
-
Windows Server 2008 R2
-
Windows Server 2012 R2
-
Windows Server 2016
-
Windows Server Version 1709
-
解決方案
-
如果您對執行個體或資料有修改、變更等風險操作,務必注意執行個體的容災、容錯能力,確保資料安全。
-
如果您對執行個體(包括但不限於ECS、RDS)等進行配置與資料修改,建議提前建立快照或開啟RDS記錄備份等功能。
-
如果您在阿里雲平台授權或者提交過登入帳號、密碼等安全資訊,建議您及時修改。
您可以根據實際情況,從本文提供的四種解決方案中選擇其中一種。
-
方法1:雲助手批量修複。適用於多台執行個體的情境,可以在ECS控制台上完成,操作方式更簡便。
-
方法2:雲端式助手API編寫的Python SDK指令碼。以地區為修複單位,批量檢測您的執行個體狀態並完成自動修複。適用於熟悉指令碼化營運的使用者。
-
方法3:提供了Shell和PowerShell指令碼,需要您登入到ECS執行個體中手動修複,適用於在少量執行個體中輪詢或測試的情境。其中,指令碼內容和解決方案1一致。
-
方法4:逐一排查網卡,適用於少量執行個體的情境。
方法1:雲助手批量修複
本樣本採用雲助手為ECS執行個體執行檢查並自動修複的工作,請確保您的執行個體已經安裝了雲助手Agent。2017年12月01日之後建立的ECS執行個體,預設預裝雲助手Agent。更多詳情,請參見雲助手Agent安裝雲助手Agent。
-
下載以下Shell或PowerShell指令碼,並粘貼到雲助手命令內容中。
-
CentOS執行個體:linux_fix_dhclient.sh
-
Windows執行個體:win_fix_dhclient.ps1
-
-
選擇對應的ECS執行個體,執行已建立的雲助手命令,詳細的操作步驟請參見執行命令。
-
確認命令執行成功,詳細的操作步驟請參見查詢執行結果與狀態。以下為CentOS執行個體和Windows執行個體的命令返回結果。
[INFO] [2019-04-28 11:13:00] start check and fix [INFO] [2019-04-28 11:13:00] log file /tmp/dhcp_fix_20190428-11:13:00.log [INFO] [2019-04-28 11:13:00] start checking eth0 [INFO] [2019-04-28 11:13:00] eth0 state is up [INFO] [2019-04-28 11:13:00] ip a show dev eth0 [INFO] [2019-04-28 11:13:00] eth0 valid_lft 315359644 [INFO] [2019-04-28 11:13:00] no need fix, dhclient eth0 is running [1;32;40m[SUCCESS] [0m [2019-04-28 11:13:00] check and fix success [1;32;40m[SUCCESS] [0m [2019-04-28 11:13:00] return code: 0 [1;33;40m[WARN] [0m [2019-04-28 11:14:17] need fixing eth0 [INFO] [2019-04-28 11:14:17] start fixing eth0 [INFO] [2019-04-28 11:14:17] ip a show dev eth0 [INFO] [2019-04-28 11:14:17] ifup eth0 RTNETLINK answers: File exists [INFO] [2019-04-28 11:14:19] ip a show dev eth0 [INFO] [2019-04-28 11:14:19] ok, dhclient eth0 is running now [1;32;40m[SUCCESS] [0m [2019-04-28 11:14:19] check and fix success [1;32;40m[SUCCESS] [0m [2019-04-28 11:14:19] return code: 0 No ip will expire in recent 500 days. Then no need fix. Nic info: \\E2ETesthxxx...xxxterConfiguration.Index=3 Found one ip will expire in 500 days. We need fixing it!!! Fix it now... Nic info: \\E2ETesthxxx...xxxpterConfiguration.Index=3 fix success. ]]]]]]]]]]
方法2:Python SDK指令碼批量修複
本樣本雲端式助手API編寫Python指令碼,能檢查並自動修複一個阿里雲地區下所有受影響的執行個體。關於如何安裝ECS SDK,請查看阿里雲Github倉庫安裝文檔。
準備工作
參見以下命令,下載相關的Python SDK依賴到本機電腦或者ECS執行個體中。
pip install alibabacloud_ecs20140526
操作步驟
-
下載autofix_dhclient.py檔案到ECS執行個體中。
-
使用如下命令,運行下載的指令碼。
sudo python autofix_dhclient.py <AccessKeyID> <AccessKeySecret> <region-id>說明您需要將命令中的
<AccessKeyID>,<AccessKeySecret>和<region-id>進行替換。-
AccessKeyID:您阿里雲帳號或RAM使用者的AccessKey ID。
-
AccessKeySecret:您阿里雲帳號或RAM使用者的AccessKey Secret。
-
region-id:執行個體所在的地區ID,取值請參見地區與可用性區域。
-
執行結果
以下內容為指令碼運行結果示意圖。
Performing the scan and this will take some time, please wait...
Scan done.
Instance Status details:
+----------------------------+----------------+---------------+---------------+
| InstanceID | Cloud Assistant| NeedFix | FixResult |
+----------------------------+----------------+---------------+---------------+
| i-uf639pxxxye4ldb | Installed | No | NoChange |
+----------------------------+----------------+---------------+---------------+
| i-uf69mdxxxk6sahw | Installed | Yes | Success |
+----------------------------+----------------+---------------+---------------+
Summary:
================================
Total instances scanned: 2
Fixed: 1
Unknown: 0
Failed: 0
執行個體狀態檢查的詳細說明如下。
-
Cloud Assistant:該檢查項查看您的執行個體是否安裝了雲助手Agent。
-
Installed:表示執行個體已安裝了雲助手Agent。
-
Not Installed:表示雲助手Agent缺失,您可以安裝雲助手Agent後繼續修複工作。
-
-
NeedFix:該檢查項查看執行個體是否需要修複dhclient進程或DHCP Client服務。
-
Yes:表示需要繼續修複,指令碼會自動完成後續工作。
-
No:表示無需修複。
-
Unknown:表示指令碼無法判斷,需要您手動執行。
-
-
FixResult:該檢查項彙報指令碼修複結果。
-
Success:表示成功修複dhclient進程或DHCP Client服務。
-
Failed:表示修複失敗。
-
NoChange:表示無需修複。
-
Unknown:表示指令碼無法判斷,需要您手動執行。
-
方法3:Shell/PowerShell指令碼修複
該方法需要您登入到受影響的執行個體中,逐一排查問題,因此適用於少量執行個體的情境。
CentOS執行個體操作步驟
-
登入ECS執行個體,詳情請參見串連方式概述。
-
擷取指令碼linux_fix_dhclient.sh到任意目錄。
-
切換到指令碼所在的工作目錄,以root身份運行指令碼。
sudo bash linux_fix_dhclient.sh說明-
返回結果為“0”時,指令碼已完成檢查和修複工作。
-
返回其他狀態表明修複失敗。
-
Windows執行個體操作步驟
-
登入ECS執行個體,詳情請參見串連方式概述。
-
擷取修複win_fix_dhclient.ps1指令碼到任意目錄。
-
以管理員權限開啟PowerShell,執行以下命令。
powershell -executionpolicy bypass -file C:\win_fix_dhclient.ps1說明說明:
-
您需要將
C:\win_fix_dhclient.ps1替換成實際的檔案路徑。 -
當返回“No ip will expire in recent 500 days. Then no need fix.”時,表示執行個體的DHCP Client服務無異常情況,無需修複。
-
當返回“Found one ip will expire in 500 days. We need fixing it!!! Fix it now... Fix success.”時,表示執行個體的DHCP Client服務異常,指令碼已完成修複工作。
-
返回其他狀態表明修複失敗。
-
方法4:逐一排查網卡
該方法需要您自行檢查和修複檢查每張網卡對應的dhclient進程(CentOS執行個體)或IP地址租約到期時間(Windows執行個體)。
CentOS執行個體操作步驟
-
登入ECS執行個體,詳情請參見串連方式概述。
-
執行以下命令,檢查執行個體的所有網卡。
ls -al /sys/class/net/ -
執行以下命令,檢查eth0網卡是否使用DHCP分配IP地址。
cat /etc/sysconfig/network-scripts/ifcfg-eth0系統顯示類似如下,
BOOTPROTO=dhcp表示網卡使用DHCP分配IP地址,若不是使用DHCP分配IP地址,請前往步驟7。[root@xxx ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes [root@xxx ~]# grep 'BOOTPROTO=dhcp' /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO=dhcp -
執行以下命令,檢查eth0網卡對應的dhclient進程運行情況。
ps aux | grep dhclient | grep eth0-
返回空結果表示dhclient進程異常。
-
返回如下結果表示dhclient進程正常運行,請前往步驟7。
root 15340 0.0 0.3 113372 12788 ? Ss 14:16 0:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid -H izuf****************** eth0
-
-
執行以下命令,重新啟動dhclient進程。
ifup eth0說明本執行個體中eth0網卡為例,您需要將命令中的eth0替換成網卡實際的標識符。
-
再次檢查網卡對應的dhclient進程運行情況。
-
重複步驟3~6步驟,檢查並修複剩餘所有網卡的dhclient進程運行情況。
Windows執行個體操作步驟
-
登入ECS執行個體,詳情請參見串連方式概述。
-
以管理員身份開啟命令提示字元CMD。
-
運行以下命令,查看描述為Red Hat VirtIO Ethernet Adaptor的網卡的DHCP 已啟用項是否為是,及其租約到期的時間。
ipconfig /all說明Red Hat VirtIO Ethernet Adaptor為ECS執行個體的主網卡和輔助彈性網卡,您自訂配置的VPN或者LoopBack網卡等不在受影響範圍內。此外,未啟用DHCP服務的網卡不在受影響範圍內。
-
如果租約到期的時間顯示在一年之內,執行以下命令,更新租約到期的時間。
ipconfig /renew -
執行
ipconfig /all命令,確認返回的租約到期的時間為十年之內,表示完成修複。
適用於
-
Elastic Compute Service