降低IT成本:OpenStack自動回收與鏡像最佳實踐
技術(shù)背景
本文所介紹的解決方案應(yīng)用于 OpenStack 云管理平臺,使用 Python 編程語言實現(xiàn)必要的功能,利用郵件服務(wù)器和 Web 服務(wù)器完成用戶自服務(wù),作為自動回收機(jī)制的補(bǔ)充。
自動回收的價值
提高 IT 資源的利用率
通過自動回收 OpenStack 中的實例和鏡像,避免存在和積累閑置的實例和鏡像,使得 IT 資源(CPU、內(nèi)存、存儲、網(wǎng)絡(luò)等)保持有效的使用狀態(tài),最大程度地提高 IT 資源利用率,保護(hù)用戶的 IT 投資。
提高 Cloud 上的系統(tǒng)性能
對于一個特定的 Cloud 平臺,它的最大負(fù)載性能是有限的,而閑置的實例和鏡像仍會占用部分這有限的性能,這在一定程度上會影響同一平臺上其它系統(tǒng)的性能。以存儲 I/O 性能為例,越是少量的系統(tǒng)的進(jìn)行并發(fā)讀寫,對其中單個系統(tǒng)而言所擁有的性能越是良好。
節(jié)省 IT 成本
啟用自動回收可以避免用戶在 IT 投資上的無謂的浪費,無須盲目地增加投資而一樣可以達(dá)到負(fù)載的需求。
如何實現(xiàn)自動回收
自動回收的條件和前提
- 使用 OpenStack 云管理平臺
- 可以利用一個現(xiàn)有的郵件服務(wù)器
- OpenStack 用戶需要有電子郵件地址信息
- OpenStack 數(shù)據(jù)庫中記錄有對實例和鏡像的最后修改時間,對此值的修改不應(yīng)影響其它任何功能。
自動回收機(jī)制的設(shè)計
自動回收通過 web service 實現(xiàn)檢測實例和鏡像的狀態(tài),完成與相關(guān)用戶的交互,最終達(dá)到回收的作用,工作原理如圖1所示。
圖 1. 自動回收工作原理圖
本解決方案中通過 Jenkins 每天觸發(fā)并完成一次回收工作,實際應(yīng)用中可根據(jù)需要采用不同的觸發(fā)方式和頻率。
在 OpenStack 的數(shù)據(jù)庫中記錄資源信息及所有者信息,因此可以準(zhǔn)確地與資源對應(yīng)的所有者通過電子郵件進(jìn)行交互。
通 過比較資源的最后修改日期和當(dāng)前日期,可以識別出將過期或已過期(周期可配置,詳見清單1)的資源:對于已過期的資源,將執(zhí)行自動清除并通知所有者;對于 將過期的資源,將提醒所有者進(jìn)行延期或主動清除操作。操作方式僅需點擊一次郵件中的鏈接。若直至最后一次通知,所有者仍未進(jìn)行任何操作響應(yīng),意味著該資源 將正式過期并被自動清除。
自動回收的具體實現(xiàn)
首先,對于自動回收服務(wù)是可以根據(jù)不同的環(huán)境和需求進(jìn)行配置的,如清單1所示。當(dāng)自動回收服務(wù)(見下文中 Python 實現(xiàn)的 web service)啟動時,將讀取該配置使得回收工作能正常進(jìn)行。
清單 1. 定義自動回收配置
- [SERVICE]
- port=set me
- [WHITELIST]
- users=set me or keep empty
- instances=set me or keep empty
- images=set me or keep empty
- [LIFETIME]
- keep_days=set me
- remind_days=set me
- [DATABASE]
- host=set me
- nova_user=set me
- nova_pwd=set me
- keystone_user=set me
- keystone_pwd=set me
- [CLOUD]
- OS_USERNAME=set me
- OS_PASSWORD=set me
- OS_TENANT_NAME=set me
- OS_AUTH_URL=set me
- [EMAIL]
- smtp_server=set me
- smtp_user=set me
- smtp_pwd=set me
[SERVICE]: 自動回收 web service 的相關(guān)配置
- Port: web service 的服務(wù)端口
[WHITELIST]: 白名單配置,用于避免某些資源被自動回收
- Users: 指定用戶清單,他們的資源將被視為永不過期
- Instances: 指定實例清單,視為永不過期
- Images: 指定鏡像清單,視為永不過期
[LIFETIME]: 資源的生命周期配置
- Keep_days: 資源可保持的時長,以天為單位
- Remind_days: 通知時間范圍,以天為單位,指在資源生命周期最后一段時間內(nèi)開始對所有者進(jìn)行通知提醒
[DATABASE]: OpenStack 數(shù)據(jù)庫的連接配置
- Host: 數(shù)據(jù)庫服務(wù)器地址
- Nova_user: nova 數(shù)據(jù)庫的用戶名
- Nova_pwd: nova 數(shù)據(jù)庫的用戶密碼
- Keystone_user: keystone 數(shù)據(jù)庫的用戶名
- Keystone_pwd: keystone 數(shù)據(jù)庫的用戶密碼
[CLOUD]: OpenStack 云的管理帳號信息
- Os_auth_url: OpenStack 的授權(quán)驗證服務(wù)地址
- Os_tenant_name: OpenStack 中需要進(jìn)行管理的 tenant 名稱
- Os_username: OpenStack 中用于管理以上 tenant 的用戶名
- Os_password: OpenStack 中上述用戶的密碼
其次,通過運(yùn)行簡單的 Python 程序(見清單 2),即可啟動一個 web server,也可以將該 web service 運(yùn)行為 linux 系統(tǒng)服務(wù)(見清單 3)。
清單 2. 啟動輕量 web 服務(wù)器
- if __name__ == '__main__':
- serveraddr = ('0.0.0.0', int(SERVICE_PORT))
- srvr = HTTPServer(serveraddr, RequestHandler)
- srvr.serve_forever()
清單 3. 創(chuàng)建 linux 系統(tǒng)服務(wù)
- function start()
- {
- echo "Starting OS_Recycle ..."
- daemon "python ${PY_FILE} ${CONFIG_FILE} >> ${LOG_FILE} 2>&1 &"
- sleep 2
- status
- }
在以上 web service 中,為所需要的功能實現(xiàn) REST API,本解決方案中為優(yōu)化用戶體驗,對資源的延期及回收操作同樣采用 GET 響應(yīng)。見清單 4。
清單 4. 定義 REST API 實現(xiàn)功能
- def do_GET(self):
- self._writeheaders()
- self.apiGET()
- def apiGET(self):
- path=self.path.split('/')
- if len(path) == 2 and path[1] == 'instances':
- self.wfile.write(json.dumps(self.getInstances()))
- ...
- def getInstances(self):
- #connect to nova database and keystone database to get data
- ...
- instJson=json.loads('[]')
- for inst in instances:
- for user in users:
- if user[0] == inst[1]:
- instJson.append(json.loads('{"created_at":"%s", "user_id":"%s",
- "hostname":"%s", "ip_address":"%s", "uuid":"%s",
- "user_name":"%s"}' %
- (inst[0], inst[1], inst[2], inst[4], inst[3], user[1])
- ))
- break
- return instJson
程序中對于資源及過期信息的查詢操作,勻直接通過連接數(shù)據(jù)庫查詢實現(xiàn),DB2 SQL 命令示例:
- novaSql = "SELECT char(a.created_at),a.user_id,a.hostname,a.uuid,cast(b.NETWORK_INFO as varchar(1000))
- from instances a left join INSTANCE_INFO_CACHES b on a.uuid=b.INSTANCE_UUID \
- where a.project_id = '%s' and a.deleted_at is null" % CLOUD_OS_TENANT_ID
對于資源的延期操作,即更新資源的最后修改時間為當(dāng)前時間,意味著重置生命周期,DB2 SQL 命令示例:
- novaSql = "update instances set created_at=current timestamp where uuid='%s'" % uuid
而對于資源的清除操作,則需要通過調(diào)用 OpenStack 相關(guān)的 REST API 實現(xiàn),見清單 5。
清單 5. 調(diào)用 OpenStack REST API 實現(xiàn)刪除操作
- def deleteInstance(self,uuid):
- req_url = '%s/tokens' % CLOUD_OS_AUTH_URL
- resp, resp_body = httplib2.Http().request(req_url, 'POST',
- headers={'Accept':'application/json', 'Content-Type':'application/json'},
- body='{"auth": {"tenantName": "%s", "passwordCredentials": {"username": "%s", "password": "%s"}}}' %
- (CLOUD_OS_TENANT_NAME, CLOUD_OS_USERNAME, CLOUD_OS_PASSWORD)
- )
- if resp['status'] != '200':
- return False
- resp_json = json.loads(resp_body)
- token_id = resp_json['access']['token']['id']
- for service in resp_json['access']['serviceCatalog']:
- if service['name'] == 'nova':
- nova_admin_url = service['endpoints'][0]['adminURL']
- break
- if not nova_admin_url:
- return False
- resp, resp_body = httplib2.Http().request('%s/servers/%s' % (nova_admin_url, uuid), 'DELETE',
- headers={'Accept':'application/json', 'X-Auth-Project-Id':'%s' % CLOUD_OS_TENANT_NAME,
- 'X-Auth-Token':'%s' % token_id }
- )
- if resp['status'] != '204':
- return False
- return True
在資源將要過期或已被自動回收時,需要對所有者進(jìn)行郵件通知,在郵件中提供必要的 link 供所有者進(jìn)行操作。示例見清單 6。注意本程序中使用的是 SMTP,并且要求應(yīng)用程序能夠正常連接到指定的郵件服務(wù)器,而該郵件服務(wù)器亦能正常發(fā)送郵件到達(dá)資源所有者。
清單 6. 郵件通知資源所有者
- import smtplib
- from email.MIMEMultipart import MIMEMultipart
- from email.MIMEText import MIMEText
- ...
- SMTP_SERVER='set me'
- SMTP_USER='set me'
- SMTP_PWD='set me'
- msg = MIMEMultipart()
- msg["From"] = SMTP_USER
- msg["To"] = 'set me'
- msg["Subject"] = "set me"
- msg.attach(MIMEText("set me"))
- mailServer = smtplib.SMTP(SMTP_SERVER, timeout=20)
- mailServer.ehlo()
- mailServer.starttls()
- mailServer.login(SMTP_USER, SMTP_PWD)
- mailServer.sendmail(SMTP_USER, msg["To"], msg.as_string())
- mailServer.quit()
至此,OpenStack 平臺上自動回收實例及鏡像的功能即可實現(xiàn)。
應(yīng)用的增強(qiáng)與擴(kuò)展
上述應(yīng)用的實現(xiàn)可滿足大部分場景的需求,同時也存在可增強(qiáng)的幾方面:
- 使用額外的數(shù)據(jù)庫,用以跟 OpenStack 數(shù)據(jù)庫同步資源信息,并記錄生命周期,避免直接修改 OpenStack 的數(shù)據(jù)。
- 實現(xiàn)專用的郵件服務(wù)器,用于本應(yīng)用與資源所有者的郵件交互,避免網(wǎng)絡(luò)受限與安全風(fēng)險。
- 包裝成為 OpenStack 的可選功能,使得用戶可以方便地啟用該功能,而無需過多的手工配置。
- 基于上述實現(xiàn)及可增強(qiáng)的部分,自動回收可擴(kuò)展到更多的應(yīng)用場景:
- 可用于回收 OpenStack 中的其它類型的資源和數(shù)據(jù),例如用戶,flavor,網(wǎng)絡(luò)等,而不僅限于實例與鏡像
- 以相同的思路在平它系統(tǒng)平臺中實現(xiàn)自動回收資源:即給資源配置生命周期,并跟蹤資源的狀態(tài),在與所有者有自動交互的基礎(chǔ)上實現(xiàn)自動回收。
原文鏈接:http://www.ibm.com/developerworks/cn/cloud/library/1509_hugq_openstackautocollect/