Google Compute Engine 無法連線Troubleshooting

作者:

MeshCloud脈時雲公有云架構師 陳滿

TroubleShoot 清單:

Google Compute Engine 無法連線Troubleshooting

引起 Compute Engine CentOS 7 無法正常SSH的情況

VM 防火牆規則未正常啟用SSH服務

GCP 防火牆規則未正常放行SSH 埠

系統啟動盤磁碟損壞或啟動磁碟空間已滿

系統檔案開啟數修改後無法正常SSH

解決辦法:

由於排查過程中,需要對虛擬機器進行重啟,因此, 如果虛擬機器掛載了 local SSD,會導Local SSD 中的資料丟失,請注意。下面的解決方法,更多適用於未掛載SSD的虛擬機器無法連線的問題。

VM防火牆未正常放行,或是透過Xshell 連線工具進行防火牆配置時,禁用了所有INPUT 流量,導致連線被拒絕。

Google Compute Engine 無法連線Troubleshooting

解決辦法:

在GCP上,啟用串列埠登入,新增特權使用者,然後修改VM 防火牆策略。

實現過程

1、在GCP 控制檯,啟用VM 的串列埠登入方式,編輯【metadata】,新增如下Key-Value

Google Compute Engine 無法連線Troubleshooting

2、透過VM start-script 自啟指令碼,新增使用者,然後透過串列埠方式登入VM,在自定義元資料【custom medata】,新增新的項,如上所示:

Google Compute Engine 無法連線Troubleshooting

點選【儲存】,然後透過reset【重置】實現VM 重啟,

連線【串列埠】進行VM 防火牆配置:

Google Compute Engine 無法連線Troubleshooting

## 允許ICMP 協議 $ iptables -I INPUT -p icmp -j ACCEPT ## 允許SSH 服務: # $iptables -I INPUT -p tcp ——dport 22 -j ACCEPT ## 清除所有防火牆策略 # iptables -F ### 儲存防火牆規則 # iptables-save

測試SSH 遠端連線:

Google Compute Engine 無法連線Troubleshooting

測試網路連通性:

Google Compute Engine 無法連線Troubleshooting

2、GCP 防火牆規則未正常放行SSH 埠

這種情況是由於GCP 的Global 防火牆導致SSH 請求流量無法正常進入到GCP 網路中導致請求被拒絕,如下錯誤提示:

Google Compute Engine 無法連線Troubleshooting

解決辦法:

登入GCP的控制檯新增對應埠的防火牆策略:

Google Compute Engine 無法連線Troubleshooting

3、系統啟動盤磁碟損壞或啟動磁碟空間已滿

如果虛擬機器啟動磁碟已滿,則您可能無法訪問虛擬機器。此情況可能很難進行問題排查,因為虛擬機器連線問題是由於啟動磁碟已滿導致時,這種情況並不總是顯而易見。

Google Compute Engine 無法連線Troubleshooting

確認虛擬機器的 SSH 故障是否因啟動磁碟已滿導致,在控制檯中找到VM 例項,點選【VM 名稱】,然後找到串列埠:

# 透過gcloud 檢視串列埠日誌輸出$ gcloud compute instances tail-serial-port-output VM_NAME

在串列埠日誌中查詢No space left on device ,如下所示,意味著啟動盤因為日誌資料的持續寫入或不斷產生資料檔案,已經將啟動盤空間佔用滿,導致無法正常的SSH 登入

Google Compute Engine 無法連線Troubleshooting

如果啟動磁碟已滿,則生成的輸出將包含訊息 No space left on device。

解決辦法:

1、建立磁碟的快照,用於將已滿的磁碟掛載到其他的VM上進行擴容

2、停止虛擬機器,並增加磁碟容量

停止虛擬機器

gcloud compute instances stop VM_NAME ——zone=VM_NAME:有問題的VM 例項名稱

增加啟動盤容量:重新調整虛擬機器啟動磁碟的大小後,大多數虛擬機器會自動調整根檔案系統的大小並重啟虛擬機器。

調整前的磁碟容量:

Google Compute Engine 無法連線Troubleshooting

gcloud compute disks resize BOOT_DISK_NAME ——size DISK_SIZEBOOT_DISK_NAME:虛擬機器的啟動磁碟的名稱DISK_SIZE:啟動磁碟新的更大大小(以 GB 為單位)

重新啟動虛擬機器

gcloud compute instances start VM_NAME

3、嘗試透過 SSH 連線到虛擬機器

可以正常連線,虛擬機器自動調整跟檔案系統,可以透過串列埠日誌檢視,如下所示:

Google Compute Engine 無法連線Troubleshooting

登入虛擬機器後 透過 df -Th 來檢查是否有可用的磁碟空間,即自動調整檔案系統大小成功。

Google Compute Engine 無法連線Troubleshooting

仍然無法訪問虛擬機器,檔案系統問題。該虛擬機器不支援自動調整根檔案系統大小,需要透過上面的快照重新建立新的更大容量的啟動盤,然後重新掛載,

a。 為已滿的啟動盤建立快照:

Google Compute Engine 無法連線Troubleshooting

b。 透過快照建立新的啟動盤增加磁碟容量,透過建立好的快照來建立更大容量已滿啟動盤的副本,然後將建立的磁碟掛載到虛擬機器上,

Google Compute Engine 無法連線Troubleshooting

c。 停止虛擬機器,移除已滿的啟動盤,掛載增加容量後新的啟動盤

Google Compute Engine 無法連線Troubleshooting

d。 重啟虛擬機器,登入虛擬機器透過 df -Th 檢查擴容後的容量。

Google Compute Engine 無法連線Troubleshooting

透過 gcloud 對VM 進行 troubleshot:

$ gcloud beta compute ssh cockpit-1 ——zone=us-central1-a ——troubleshoot Starting ssh troubleshooting for instance in zone us-central1-a‘Start time: 2021-12-23 10:10:43。350588—— Checking network connectivity ——The troubleshooting tool needs permission to check the VM’s network connectivity。Is it OK to run this test? (Y/n)? yEnabling service [networkmanagement。googleapis。com] on project [yunion-test-286209]。。。Your source IP address is 34。80。131。230Network Connectivity Test Result: REACHABLEEndpointInfo Initial state: packet originating from Internet。START_FROM_INTERNETForwarding state: arriving at a Compute Engine instance。ARRIVE_AT_INSTANCEConfig checking state: verify INGRESS firewall rule。APPLY_INGRESS_FIREWALL_RULEFinal state: packet delivered to instance。DELIVER—— Checking user permissions ——User permissions: 0 issue(s) found。—— Checking VPC settings ——VPC settings: 0 issue(s) found。—— Checking VM status ——VM status: 0 issue(s) found。—— Checking VM boot status ——VM boot: 0 issue(s) found。

參考:

[1] Troubleshooting SSH

[2] Troubleshooting full disks and disk resizing

[3] Troubleshooting using the serial console