2016-04-08 44 views
4

(我使用openstack4j交談通過REST API來的OpenStack)分配OpenStack的浮動IP,同時確保它不會從其他服務器中刪除

我想重用一些在我的房客分配未分配的浮動IP地址的(分配給新配置的服務器)。但是,似乎addFloatingIp操作在分配未使用的浮動IP並將其從服務器重新分配給服務器之間沒有區別。

我想讓這個過程自動化,但我恐怕會跟隨競爭條件:一個客戶端檢查特定的IP是免費的,在它設法將它與服務器A關聯之前,其他客戶端將它與服務器B關聯。第二個客戶端,關聯的浮動IP可以在成功關聯後的任何晚點被移除。

有沒有更好的方法?

+0

我現在也遇到這種情況的困難。 我想改變機制就像不使用預先分配的浮動IPS。 我認爲創建一個浮動並在設置時將其分配給服務器。 那麼何時刪除服務器?爲了避免分配浮動IP留在池中,我認爲也要刪除那個浮動IP。你也可以考慮嘗試這種替代方法。 – mehmetozi

+0

這是非常脆弱的,但它是我理解的首選方式。問題是自動刪除服務器可能無法清除IP(或任何其他相關資源),Horizo​​n中的終止按鈕也不會執行所需的清理,因此客戶端需要執行清理。如果不採取任何行動(清除擱淺的IP或重新使用它們),遲早你會耗盡配額/ IP。更不用說,有一些配置OpenStack實例的租戶沒有權限分配IP,但預計可以使用它們的預分配集合。 –

回答

1

此問題的可能解決方法是:

  • 只有刪除和創建浮動IP地址。正如你所說這是首選的方式。清理未被使用的浮動IP可以由小型虛擬機定期從內部清除。但是API客戶端從外部清理應該是首選。因此,每個客戶都應該集成這個功能,但必須注意,這是用戶打算的,至少他們失去了一些重要的東西。示例:用於刪除VM的Web UI可能會詢問是否也應刪除關聯的浮動虛擬機。 Openstack Heat(通過模板編排)自動執行此操作。刪除虛擬機後,CLI客戶端可以提供刪除釋放的資源。
  • 使用支持同步的東西來協調。例如:etcd,具有事務支持的數據庫(不論是否爲SQL),可以確保只執行一次傳遞的隊列(例如OpenStack Zaqar及其聲明功能)。
  • 使用時間段進行同步:讀取,更改,等待特定時間,最後再次讀取,以檢查是否有人覆蓋更改。如果此更改耗時過長,請在特定等待時間之前中止。如果更改被覆蓋,請使用不同的浮動IP重試。這很難得到正確的結果,因爲有很多角落案例,尤其是在正確地立即放棄的情況下,可能會導致失敗。例如,高負載可能會使更改在中止後很長時間,如果不是每次更改通過的地方都可以確保不會發生這種情況。

其他OpenStack API也有相同的問題,例如, updating security groups。一般來說,這可以通過向API添加修訂計數器來避免,例如kubernetes (resourceVersion from ObjectMeta)etcd (modifiedIndex in v2,v3中的mod_revision)執行此操作。

即使對於實現免競爭更改選項的API,人類的大多數UI也可能僅將此用於比賽檢測,但不能避免,因爲UI會告訴他們存在競爭,並且它重寫的內容優於一種要求他們在每次比賽發生時都重試自己的行爲。

相關問題