openstack多region配置-单keystone

使用场景
openstack的region,通常对应地域或地区。例如,北京,上海,深圳的机房各自部署一套openstack系统。在没有region概念的时候,处于不同地理位置的openstack系统可以独立运行,也只能独立运行。从系统运行的角度,让系统保持独立有好处,例如每个系统的规模较小;各系统互不干扰,没有资源依赖;各种资源都在本地获取,使得代价低,性能最优,等等。所以独立运行是合理和自然的方式。不过,从系统管理的角度,管理员仍然希望有一个集中管理的位置,可以监控和操作所有的系统。例如,在一个管理界面上,创建位于不同地域的虚拟机实例。多region平衡了系统运行需求和管理需求。

基本原理
一个openstack系统由多个服务组成,服务之间相对独立又有一定依赖关系。基本的服务有认证服务keystone,镜像服务glance,存储服务cinder,网络服务neutron,计算服务nova等。keystone服务是一个基础服务,其他服务运行需要首先经过keystone认证。在keystone的概念体系中,除了用户,角色之外,还定义了endpoint,即端点。每个端点是一个服务URL引用。各种外部的客户端如何访问openstack服务?用户在经过keystone认证之后,根据服务端点信息,向服务发起REST API调用。openstack的每一种服务也需要在keystone中认证自己。服务通过在配置文件中定义keystone认证URL,用户名,密码,记录所需信息。在keystone支持region之后,允许每一个region定义自己的一套服务端点,包括keystone,glance,cinder,neutron,nova等。通过在一个keystone中定义不同的region,实现对不同区域openstack系统的管理。

多region方案
实现多region,基本思路是keystone服务共用一个,其他服务不变。不同region共用一个keystone服务,只要涉及到访问keystone,都指向同一个keystone端点。其他服务的端点不变,保证对存储,计算资源的访问仍然保留在region本地。


试验环境
两套独立的openstack系统。
第一个系统的控制节点 10.10.44.6 tnhost-44-6
第二个系统的控制节点 10.10.44.7 tnhost-44-7
keystone服务运行在控制节点上。
为了实现多region,这里的方案是,将第二个openstack系统的keystone认证端点,修改为指向第一个openstack系统的keystone服务。
除了两套系统共用一个keystone服务,其他的服务保持各自独立。
第二个系统放在一个新的region分区regionTwo。

注意:在packstack应答文件中有两类密码。
1. keystone用户密码。
packstack的CONFIG_KEYSTONE_IDENTITY_BACKEND参数设置keystone用户密码保存在mysql或ldap
例如neutron用户
# Password to use for OpenStack Networking (neutron) to authenticate with the Identity service.
CONFIG_NEUTRON_KS_PW=d462c5e7c5e74a18
用户有glance,neutron,nova,cinder,heat等。
2. mysql用户密码。
例如neutron用户访问mysql的neutron数据库。
# The password to use for OpenStack Networking to access the database.
CONFIG_NEUTRON_DB_PW=56be9c96255a4ddd
用户有glance,neutron,nova,cinder,heat等。


操作过程
1.  修改  /etc/openstack-dashboard/local_settings。第二个系统的控制节点执行。
OPENSTACK_KEYSTONE_URL = "http://10.10.44.6:5000/v2.0"
重启apache。
# systemctl restart httpd

2. 修改 auth_uri identity_uri  auth_url。第二个系统的控制节点执行。
# find /etc/ -type f -exec sed -i '/^auth_ur[il][[:space:]]*=/s/10.10.44.7/10.10.44.6/' {} \;
# find /etc/ -type f -exec sed -i '/^identity_uri[[:space:]]*=/s/10.10.44.7/10.10.44.6/' {} \;

3. 设置环境变量。 第一个系统的控制节点执行。
设置newregion为新的region名称。设置ansfile为第一个openstack系统生成的packstack应答文件。
# controller1="10.10.44.6"
# controller2="10.10.44.7"
# newregion="regionTwo"
# ansfile="/root/ans-file.txt"
# CONFIG_NEUTRON_KS_PW=$(crudini --get ${ansfile} general CONFIG_NEUTRON_KS_PW); \
 CONFIG_NOVA_KS_PW =$(crudini --get ${ansfile} general CONFIG_NOVA_KS_PW); \
 CONFIG_HEAT_KS_PW =$(crudini --get ${ansfile} general CONFIG_HEAT_KS_PW); \
 CONFIG_GLANCE_KS_PW =$(crudini --get ${ansfile} general CONFIG_GLANCE_KS_PW); \
 CONFIG_CINDER_KS_PW =$(crudini --get ${ansfile} general CONFIG_CINDER_KS_PW)

4. 远程修改第二个系统的配置文件。例如 admin_password等。第一个系统的控制节点执行。
# ssh ${controller2}  " \
 crudini --set /etc/neutron/neutron.conf keystone_authtoken admin_password ${CONFIG_NEUTRON_KS_PW}; \
 crudini --set /etc/nova/nova.conf keystone_authtoken admin_password ${CONFIG_NOVA_KS_PW}; \
 crudini --set /etc/heat/heat.conf keystone_authtoken admin_password ${CONFIG_HEAT_KS_PW}; \
 crudini --set /etc/glance/glance-registry.conf keystone_authtoken admin_password ${CONFIG_GLANCE_KS_PW}; \
 crudini --set /etc/glance/glance-api.conf keystone_authtoken admin_password ${CONFIG_GLANCE_KS_PW}; \
 crudini --set /etc/cinder/cinder.conf keystone_authtoken admin_password ${CONFIG_CINDER_KS_PW}; \
 crudini --set /etc/neutron/neutron.conf keystone_authtoken admin_password ${CONFIG_NEUTRON_KS_PW}; \
 crudini --set /etc/neutron/api-paste.ini filter:authtoken admin_password ${CONFIG_NEUTRON_KS_PW}; \
 crudini --set /etc/neutron/neutron.conf nova password ${CONFIG_NOVA_KS_PW}; \
 crudini --set /etc/neutron/neutron.conf nova region_name ${newregion}; \
 crudini --set /etc/nova/nova.conf neutron password ${CONFIG_NEUTRON_KS_PW}; \
 crudini --set /etc/nova/nova.conf neutron region_name ${newregion}; \
 crudini --set /etc/nova/nova.conf cinder os_region_name ${newregion}; \
 crudini --set /etc/nova/nova.conf cinder endpoint_template   http://${controller2}:8776/v2/%(project_id)s;  \
 "

5.  为新的region创建keystone endpoint。第一个系统的控制节点执行。
# keystone endpoint-create \
 --service-id $(keystone service-list | awk '/ identity / {print $2}') \
 --publicurl http://${controller1}:5000/v2.0 \
 --internalurl http://${controller1}:5000/v2.0 \
 --adminurl http://${controller1}:35357/v2.0 \
 --region ${newregion}

# keystone endpoint-create \
 --service-id $(keystone service-list | awk '/ image / {print $2}') \
 --publicurl http://${controller2}:9292 \
 --internalurl http://${controller2}:9292 \
 --adminurl http://${controller2}:9292 \
 --region ${newregion}

# keystone endpoint-create \
 --service-id $(keystone service-list | awk '/ compute / {print $2}') \
 --publicurl "http://${controller2}:8774/v2/%(tenant_id)s" \
 --internalurl "http://${controller2}:8774/v2/%(tenant_id)s" \
 --adminurl "http://${controller2}:8774/v2/%(tenant_id)s" \
 --region ${newregion}

# keystone endpoint-create \
 --service-id $(keystone service-list | awk '/  computev3 / {print $2}') \
 --publicurl "http://${controller2}:8774/v3" \
 --internalurl "http://${controller2}:8774/v3" \
 --adminurl "http://${controller2}:8774/v3" \
 --region ${newregion}


# keystone endpoint-create \
 --service-id $(keystone service-list | awk '/ network / {print $2}') \
 --publicurl http://${controller2}:9696 \
 --adminurl http://${controller2}:9696 \
 --internalurl http://${controller2}:9696 \
 --region ${newregion}

## 如果是nova network不需要开network endpoint

# keystone endpoint-create \
 --service-id $(keystone service-list | awk '/ volume / {print $2}') \
 --publicurl "http://${controller2}:8776/v1/%(tenant_id)s" \
 --internalurl "http://${controller2}:8776/v1/%(tenant_id)s" \
 --adminurl "http://${controller2}:8776/v1/%(tenant_id)s" \
 --region ${newregion}

# keystone endpoint-create \
 --service-id $(keystone service-list | awk '/ volumev2 / {print $2}') \
 --publicurl "http://${controller2}:8776/v2/%(tenant_id)s" \
 --internalurl "http://${controller2}:8776/v2/%(tenant_id)s" \
 --adminurl "http://${controller2}:8776/v2/%(tenant_id)s" \
 --region ${newregion}

# keystone endpoint-create \
 --service-id $(keystone service-list | awk '/ volumev3 / {print $2}') \
 --publicurl "http://${controller2}:8776/v3/%(tenant_id)s" \
 --internalurl "http://${controller2}:8776/v3/%(tenant_id)s" \
 --adminurl "http://${controller2}:8776/v3/%(tenant_id)s" \
 --region ${newregion}

<think>好的,用户遇到了在OpenStack中创建镜像时出现的“public endpoint for image service not found”错误,需要解决这个问题。首先,我需要回顾之前提供的解决方案,并看看是否有遗漏或需要补充的地方。之前的回答提到了检查Glance服务状态、验证Endpoint、配置文件、数据库连接、权限和网络连通性等步骤。现在用户再次提问,可能需要更详细的指导或者之前的方法没有完全解决问题。 根据用户提供的引用,特别是引用[1],提到配置生产环境需要参考OpenStack的官方文档,可能需要调整网络和安全设置。引用[2]和[5]涉及Neutron和负载均衡器的配置,可能与网络相关的问题有关。引用[3]是一个安装指南,可能包含一些配置示例。引用[4]提到Heat服务,虽然和当前问题关联不大,但说明用户可能在复杂环境下使用OpenStack。 首先,用户的问题核心是Glance的public endpoint未找到。可能的原因包括: 1. **Glance服务未正确注册到Keystone**:需要确认是否创建了image服务以及对应的endpoint。 2. **Endpoint配置错误**:检查public URL是否正确,端口是否开放,是否有防火墙阻拦。 3. **认证问题**:Keystone的token失效或权限问题导致无法识别endpoint。 4. **网络配置问题**:DNS解析错误,主机名无法解析到正确的IP地址。 5. **服务未启动或崩溃**:Glance服务本身未运行或配置错误导致无法启动。 接下来,需要根据这些可能性逐步排查。首先检查服务列表和endpoint是否存在,如果不存在则需要手动创建。然后检查Glance的配置文件,确保数据库连接和Keystone认证信息正确。此外,权限问题如SELinux或目录权限也可能导致服务无法访问所需资源。网络方面,需要确认controller节点的9292端口是否可达,DNS或/etc/hosts配置是否正确。 用户可能已经按照之前的步骤操作,但仍然遇到问题,可能需要更深入的检查,比如查看Glance服务的详细日志,确认是否有更隐蔽的错误。另外,引用的资料中提到可能需要配置OVN或负载均衡器,如果用户的OpenStack环境涉及这些组件,可能需要额外的配置步骤。 最后,要确保用户在执行命令时具有正确的管理员权限,环境变量是否设置正确,例如通过source keystone-admin-pass.sh来加载admin权限的环境变量。如果之前的环境变量未正确加载,即使命令正确,也会导致认证失败,进而无法找到endpoint。 总结来说,需要系统地检查服务注册、endpoint配置、网络连通性、权限设置和日志信息,结合用户的具体环境和引用中的相关配置,提供更全面的解决方案。</think>### OpenStack "public endpoint for image service not found" 错误解决方案 --- #### 一、核心问题诊断 此错误表明Glance服务的Public Endpoint未正确注册到Keystone服务目录中,或通信路径存在故障。以下是关键排查流程: --- #### 二、系统性修复步骤 1. **验证Glance服务状态** ```bash openstack service list | grep image # 确认image服务存在[^1] ``` - **若服务不存在**,手动注册: ```bash openstack service create --name glance --description "OpenStack Image Service" image ``` 2. **检查Endpoint配置** ```bash openstack endpoint list --service image # 查看所有image服务的endpoint ``` - **缺失public endpoint时**,手动创建: ```bash openstack endpoint create --region RegionOne \ image public http://<controller-ip>:9292 # 确保IP与端口正确[^1] ``` 3. **Glance配置文件验证** 检查`/etc/glance/glance-api.conf`关键参数: ```ini [keystone_authtoken] auth_url = http://controller:5000 # Keystone地址必须可达 auth_type = password project_domain_name = Default user_domain_name = Default project_name = service username = glance password = <GLANCE_PASSWORD> # 需与Keystone中glance用户密码一致[^3] [glance_store] filesystem_store_datadir = /var/lib/glance/images # 路径权限必须为glance:glance ``` 4. **环境变量与权限** ```bash source keystone-admin-openrc.sh # 加载管理员凭据[^3] ls -ld /var/lib/glance/images # 权限应为drwxrwx--- glance glance ``` 5. **网络连通性测试** ```bash curl -v http://controller:9292 # 直接访问Glance API端口 nc -zv controller 9292 # 确认端口开放状态 ``` --- #### 三、高级场景解决方案 1. **防火墙规则配置** ```bash # 开放Glance API端口 firewall-cmd --permanent --add-port=9292/tcp firewall-cmd --reload ``` 2. **DNS解析修复** ```bash grep controller /etc/hosts # 确保包含类似记录:192.168.1.10 controller ``` 3. **服务重启与日志分析** ```bash systemctl restart openstack-glance-api journalctl -u openstack-glance-api -n 50 --no-pager # 检查关键错误 ``` --- #### 四、验证步骤 ```bash openstack image list # 成功返回镜像列表 openstack catalog show image # 确认public endpoint存在且状态正常 ``` --- ### 相关问题延伸 1. **如何诊断Keystone与Glance的SSL/TLS通信故障?** - 检查`/etc/glance/glance-api.conf`中`[keystone_authtoken]`的`cafile`路径 - 使用`openssl s_client -connect controller:5000`验证证书链 2. **节点部署时Glance镜像同步如何配置?** - 使用`rsync`或`glance-manage db sync`同步镜像存储目录 - 配置`/etc/glance/glance-api.conf`中的`filesystem_store_datadir`为共享存储路径 3. **为什么Glance服务启动后仍然返回503错误?** - 检查数据库连接:`mysql -u glance -p -h controller` - 验证消息队列服务状态:`rabbitmqctl list_queues`[^2] --- 通过以上步骤可彻底解决Public Endpoint缺失问题。若仍存在问题,需结合具体错误日志进行深度分析[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值