1.背景
在使用OpenStack云平臺(tái)時(shí)泣港,有時(shí)因業(yè)務(wù)架構(gòu)需要拆分不同的Availability Zone可用域,包括計(jì)算Nova和存儲(chǔ)Cinder鳖眼,并期望可以將兩個(gè)AZ對(duì)應(yīng)起來以便起到隔離的效果。目前多數(shù)OpenStack平臺(tái)或多或少采用了Ceph作為Cinder存儲(chǔ)后端(以及Glance、Swift)浴井,并在創(chuàng)建虛擬機(jī)時(shí)選擇從鏡像創(chuàng)建塊存儲(chǔ)。我們希望可以通過創(chuàng)建不同的Cinder AZ配置不同的Ceph pool霉撵,每個(gè)pool關(guān)聯(lián)不同的osd磺浙,已便達(dá)到不同用戶創(chuàng)建的虛擬機(jī)操作系統(tǒng)磁盤在Ceph集群中是完全隔離的。
2.問題
首先我們啟動(dòng)多個(gè)cinder-volume實(shí)例徒坡,配置不同的storage_availalibility_zone撕氧,期望效果是選擇虛擬機(jī)的AZ時(shí)可以匹配Cinder里的AZ,例如:
storage_availability_zone=AZ1
然而實(shí)際情況并不理想喇完,在創(chuàng)建虛擬機(jī)時(shí)伦泥,選擇了Nova的AZ(比如AZ1),創(chuàng)建出來的卷卻在Cinder的nova可用域里崇猫,因?yàn)镃inder的默認(rèn)域是nova午笛,最終結(jié)果并沒有匹配上。實(shí)際上位岔,nova在調(diào)用cinder的時(shí)候并未把虛擬機(jī)實(shí)例的availalibility_zone的值傳過去防楷。
3.解決
查看源碼/usr/lib/python2.7/site-packages/nova/conf/cinder.py中的設(shè)定牺丙,發(fā)現(xiàn)一個(gè)關(guān)鍵參數(shù)cross_az_attach,默認(rèn)值為True复局,這意味著虛擬機(jī)的磁盤可以跨域綁定冲簿。
cfg.BoolOpt('cross_az_attach',
default=True,
help="""
Allow attach between instance and volume in different availability zones.
If False, volumes attached to an instance must be in the same availability
zone in Cinder as the instance availability zone in Nova.
This also means care should be taken when booting an instance from a volume
where source is not "volume" because Nova will attempt to create a volume using
the same availability zone as what is assigned to the instance.
If that AZ is not in Cinder (or allow_availability_zone_fallback=False in
cinder.conf), the volume create request will fail and the instance will fail
the build request.
By default there is no availability zone restriction on volume attach.
"""),
]
順藤摸瓜,繼續(xù)查看/usr/lib/python2.7/site-packages/nova/virt/block_device.py亿昏,發(fā)現(xiàn)如果cross_az_attach為True峦剔,則傳給Cinder的availability_zone為空!A拧羊异!如果cross_az_attach為False,那么nova會(huì)給Cinder傳遞實(shí)例的availability_zone彤断。
def _get_volume_create_az_value(instance):
"""Determine az to use when creating a volume
Uses the cinder.cross_az_attach config option to determine the availability
zone value to use when creating a volume.
:param nova.objects.Instance instance: The instance for which the volume
will be created and attached.
:returns: The availability_zone value to pass to volume_api.create
"""
# If we're allowed to attach a volume in any AZ to an instance in any AZ,
# then we don't care what AZ the volume is in so don't specify anything.
if CONF.cinder.cross_az_attach:
return None
# Else the volume has to be in the same AZ as the instance otherwise we
# fail. If the AZ is not in Cinder the volume create will fail. But on the
# other hand if the volume AZ and instance AZ don't match and
# cross_az_attach is False, then volume_api.check_attach will fail too, so
# we can't really win. :)
# TODO(mriedem): It would be better from a UX perspective if we could do
# some validation in the API layer such that if we know we're going to
# specify the AZ when creating the volume and that AZ is not in Cinder, we
# could fail the boot from volume request early with a 400 rather than
# fail to build the instance on the compute node which results in a
# NoValidHost error.
return instance.availability_zone
一切都清楚了野舶,接下來配置nova.conf文件,在Cinder部分添加參數(shù)
cross_az_attach = False
再次創(chuàng)建虛擬機(jī)宰衙,發(fā)現(xiàn)Nova的AZ和Cinder的AZ對(duì)應(yīng)上啦平道,解決!
4.More..
在Cinder中還有個(gè)參數(shù)是allow_availability_zone_fallback供炼,目的是為了防止創(chuàng)建虛擬機(jī)時(shí)的Nova AZ在Cinder中不存在時(shí)不報(bào)錯(cuò)一屋,而是使用Cinder中default_availability_zone或者storage_availability_zone進(jìn)行創(chuàng)建。代碼在/usr/lib/python2.7/site-packages/cinder/volume/flows/api/create_volume.py中
if availability_zone not in self.availability_zones:
if CONF.allow_availability_zone_fallback:
original_az = availability_zone
availability_zone = (
CONF.default_availability_zone or
CONF.storage_availability_zone)
LOG.warning(_LW("Availability zone '%(s_az)s' "
"not found, falling back to "
"'%(s_fallback_az)s'."),
{'s_az': original_az,
's_fallback_az': availability_zone})
else:
msg = _("Availability zone '%(s_az)s' is invalid.")
msg = msg % {'s_az': availability_zone}
raise exception.InvalidInput(reason=msg)
但是目測這個(gè)參數(shù)和cross_az_attach有沖突袋哼,因?yàn)槭褂胏ross_az_attach的情況下選擇一個(gè)Cinder里沒有的但是Nova中含有的AZ冀墨,創(chuàng)建結(jié)果還是失敗的,最終會(huì)以cross_az_attach作為判斷涛贯。
5.參考文獻(xiàn):
【1】https://www.mirantis.com/blog/the-first-and-final-word-on-openstack-availability-zones/
【2】https://wenku.baidu.com/view/b221e07eb5daa58da0116c175f0e7cd184251802.html