問題描述
在連續使用阿里雲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執行個體執行檢查並自動修複的工作,請確保您的執行個體已經安裝了雲助手用戶端。2017年12月01日之後建立的ECS執行個體,預設預裝雲助手用戶端。更多詳情,請參見雲助手用戶端。
- 下載以下Shell或PowerShell指令碼,並粘貼到雲助手命令內容中。
- CentOS執行個體:linux_fix_dhclient.sh
- Windows執行個體:win_fix_dhclient.ps1
- 選擇對應的ECS執行個體,執行已建立的雲助手命令,詳細的操作步驟請參見執行命令。
- 確認命令執行成功,詳細的操作步驟請參見查詢執行結果與狀態。下圖為CentOS執行個體和Windows執行個體的命令返回結果。
方法2:Python SDK指令碼批量修複
本樣本雲端式助手API編寫Python指令碼,能檢查並自動修複一個阿里雲地區下所有受影響的執行個體。關於如何安裝ECS SDK,請查看阿里雲Github倉庫安裝文檔。
準備工作
參見以下命令,下載相關的Python SDK依賴到本機電腦或者ECS執行個體中。
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-ecs
操作步驟
- 下載autofix_dhclient.py檔案到ECS執行個體中。
- 執行以下命令,查看指令碼的使用說明。
說明:此為可選步驟。
python autofix_dhclient.py
系統返回類似如下。Usage: autofix_dhclient.py <AccessKeyID> <AccessKeySecret> <region-id>
說明:參數說明如下:
- AccessKeyID:您的AccessKeyId,取值範圍請參見建立AccessKey。
- AccessKeySecret:您的AccessKeySecret。
- region-id:執行個體所在的地區ID,取值範圍請參見地區與可用性區域。
- 請參見參數說明填寫
AccessKeyID
,AccessKeySecret
和region-id
等參數,使用root或者管理員身份運行指令碼。python autofix_dhclient.py LTAIn*******Py6J kXXIOEoPXXvsYRUd**********TRyU cn-hangzhou
執行結果
以下內容為指令碼運行結果示意圖。
執行個體狀態檢查的詳細說明如下。
- Cloud Assistant:該檢查項查看您的執行個體是否安裝了雲助手用戶端。
- Installed:表示執行個體已安裝了雲助手用戶端。
- Not Installed:表示雲助手用戶端缺失,您可以安裝雲助手用戶端後繼續修複工作。
- 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。 - 執行以下命令,檢查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 izuf695ygwh32u2i******z 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