CORD in a Box 2.0 test-vsg Fail Fixed

CORD in a Box 2.0 test-vsg Fail Fixed

這一篇文章將記錄我在 Debug 整個 CiaB 2.0 無法正常 provision VM 問題的過程,
以及最後找到問題原因跟 fix 的方法。

問題發現

這一段暗示著 vSG 這個 Virtual Machine 無法被啟動,如果你透過 nova 指令去檢查 VM 的 Provision 狀態:

從這邊就發現這個 vSG VM 的 Status 是 Error,進一步使用 nova show 可以看到更多內容:

這裡告訴我們:Build of instance 077c1419-4025-4066-bcc3-9357d81122af was re-scheduled: u'glance+https'
但你也可能看到 No valid host was found. There are not enough hosts available.

這兩個錯誤訊息的發生原因都是相同的,因為 Instance 因為某些原因無法被啟動。

到 Compute Node 尋找問題

我們必須要先確認到底是哪一個環節出了問題,而在 debug 的過程我看到了:

  • Neutron 說無法從 Database SELECT 資訊
  • Neutron 說無法和 AMQP Server 建立連線
  • Compute Node 說 Instance Fail to spawn

仔細觀察了 Neutron 的 Log,前兩者在一段時間後就沒有再出現,所以判定只是因為 OpenStack 還沒完整 Build 起來。

至於最後的 Compute Node 無法建立 Instance 就是我們這次碰到的問題。

進入 Compute Node 之後先檢查 /var/log/nova/nova-compute.log

這邊告訴我們,這項操作是在 nova/compute/manager.py#2473 的 _build_resources 出問題,而 Stack 也顯示出使用到:

  1. nova
  2. glance-client
  3. requests
  4. urllib3

OpenStack Official Bug Report

我後來有根據錯誤訊息找到這一個 Bug: In compute node, KeyError: u’glance+https’ is encountered

且官方已經送 PR 至 requests 了,怎麼可能還會有問題?

讀完 Bug 與 Pull Request 的訊息我們可以得知:

glance-client 在 requests 的 poolmanager(一個管理連線的物件)當中註冊了 glance+https 這個 prefix,
但是因為 requests 與 urllib3 都有 poolmanager,而這邊卻使用了 urllib3 的 poolmanager,因此找不到 glance+https 這個 prefix 因此報錯

所以我試著去 hardcode 想要修掉這個 Bug,但經過 Trace 發現並沒有這麼複雜。

Bug Fixed

回頭一看錯誤訊息發現一件很重要的事情:

  • /usr/lib/python2.7/dist-packages/nova/
  • /usr/lib/python2.7/dist-packages/oslo_concurrency/
  • /usr/lib/python2.7/dist-packages/glanceclient/
  • /usr/lib/python2.7/dist-packages/requests/
  • /usr/local/lib/python2.7/dist-packages/urllib3/

在 Python 當中,會根據幾個方式去尋找套件庫:

  1. 程式所在的 Path
  2. System Path
  3. export PYTHONPATH

這幾個環境變數去找到我們所使用的套件。

看起來很正常阿?沒錯,看起來十分正常。

但是,Compute Node 上面有兩個 urllib3,而且版本還不一樣!

一個版本是 1.21.1,一個版本是 1.7.1,而因為 sys.path 有 priority 之分,所以 /usr/local/lib/python2.7/dist-packagesurllib3 被優先引用進來。

而在 urllib3 1.7.1 版本當中並沒有 key_fn_by_scheme 這個 dictionary,實作方式與版本不同導致問題的發生。

所以我們只需要把 urllib3 1.21.1 拔掉就可以了:

再次測看看是否已經使用到正確的版本:

然後重啟 nova-compute service:

Check by provision node

這邊我就使用第一次解掉 Bug 使用的圖片了:

透過 nova boot 建立 Instance

透過 Compute Node 對 Instance ping 確定 Connectivity

Leave a Reply

Your email address will not be published. Required fields are marked *