1.8 定义服务端点
云环境中的每一个服务都运行在一个特定的URL和端口上,也就是这些服务的端点地址。当一个客户端程序连到云环境中时,Keystone身份认证服务负责向其返回云环境中的各个服务的端点地址,以便客户端程序使用这些服务。为启用该功能,必须先定义这些端点。在云环境中,可以定义多个区域,可以把不同的区域理解为不同的数据中心,它们各自有不同的URL和IP地址。在OpenStack身份认证服务里,还可以在每一个区域里定义分别定义URL端点。在这里,只有一个区域,标识为RegionOne。
准备工作
在开始之前,必须确认已经登录到安装了OpenStack身份认证服务的OpenStack控制节点上,或者有一个已经连接到安装了OpenStack身份认证服务的服务器上的Ubuntu客户端。
登录到使用Vagrant创建的OpenStack控制节点,执行以下命令:
vagrant ssh controller
如果keystone客户端工具尚未安装,则可以通过如下命令在Ubuntu客户端上安装以便管理OpenStack身份认证服务:
sudo apt-get update
sudo apt-get -y install python-keystoneclient
确保已经设置了正确的环境变量,能访问到OpenStack环境。
export ENDPOINT=172.16.0.200
export SERVICE_TOKEN=ADMIN
export SERVICE_ENDPOINT=http://${ENDPOINT}:35357/v2.0
操作步骤
通过运行keystone客户端命令在OpenStack身份认证服务中定义各个服务和服务端点,这些定义对应了云环境中运行的各个服务以及它们的URL。即使某些服务现在还没有在云环境中运行起来,也可以先在OpenStack身份认证服务中配置好,以便将来使用。通过如下步骤来在OpenStack环境中为各个服务定义端点。
1.现在来定义一些云环境中OpenStack身份认证服务需要知道的服务。
# OpenStack Compute Nova API Endpoint
keystone service-create \
--name nova \
--type compute \
--description 'OpenStack Compute Service'
# OpenStack Compute EC2 API Endpoint
keystone service-create \
--name ec2 \
--type ec2 \
--description 'EC2 Service'
# Glance Image Service Endpoint
keystone service-create \
--name glance \
--type image \
--description 'OpenStack Image Service'
# Keystone Identity Service Endpoint
keystone service-create \
--name keystone \
--type identity \
--description 'OpenStack Identity Service'
# Cinder Block Storage Endpoint
keystone service-create \
--name volume \
--type volume \
--description 'Volume Service'
2.逐个添加上述服务对应的服务端点。添加服务端点时需要用到各个服务的ID号,这些ID号在上一步命令操作之后会分别被返回输出。它们是配置服务端口URL的命令中的参数。
提示
OpenStack身份认证服务可以被配置成在三个URL上接受服务请求:一个面向公有的URL(被终端用户使用),一个面向管理员URL(被以管理员权限登录的用户使用,可以是一个不同的URL),以及一个面向内部的URL(当这些服务是在公有的URL的防火墙内提供服务时)。
对于下面的服务,我们根据自己的环境需求将公有的和内部的服务URL配置成相同的内容。
# OpenStack Compute Nova API
NOVA_SERVICE_ID=$(keystone service-list \
| awk '/\ nova\ / {print $2}')
PUBLIC="http://$ENDPOINT:8774/v2/\$(tenant_id)s"
ADMIN=$PUBLIC
INTERNAL=$PUBLIC
keystone endpoint-create \
--region RegionOne \
--service_id $NOVA_SERVICE_ID \
--publicurl $PUBLIC \
--adminurl $ADMIN \
--internalurl $INTERNAL
输出如图1-5所示。
https://yqfile.alicdn.com/5d1a4b8480c3f9df5a690f32ca5de33e81e57ef6.png" >
3.继续定义服务端点的剩余部分,具体步骤如下:
# OpenStack Compute EC2 API
EC2_SERVICE_ID=$(keystone service-list \
| awk '/\ ec2\ / {print $2}')
PUBLIC="http://$ENDPOINT:8773/services/Cloud"
ADMIN="http://$ENDPOINT:8773/services/Admin"
INTERNAL=$PUBLIC
keystone endpoint-create \
--region RegionOne \
--service_id $EC2_SERVICE_ID \
--publicurl $PUBLIC \
--adminurl $ADMIN \
--internalurl $INTERNAL
# Glance Image Service
GLANCE_SERVICE_ID=$(keystone service-list \
| awk '/\ glance\ / {print $2}')
PUBLIC="http://$ENDPOINT:9292/v1"
ADMIN=$PUBLIC
INTERNAL=$PUBLIC
keystone endpoint-create \
--region RegionOne \
--service_id $GLANCE_SERVICE_ID \
--publicurl $PUBLIC \
--adminurl $ADMIN \
--internalurl $INTERNAL
# Keystone OpenStack Identity Service
KEYSTONE_SERVICE_ID=$(keystone service-list \
| awk '/\ keystone\ / {print $2}')
PUBLIC="http://$ENDPOINT:5000/v2.0"
ADMIN="http://$ENDPOINT:35357/v2.0"
INTERNAL=$PUBLIC
keystone endpoint-create \
--region RegionOne \
--service_id $KEYSTONE_SERVER_ID \
--publicurl $PUBLIC \
--adminurl $ADMIN \
--internalurl $INTERNAL
# Cinder Block Storage Service
CINDER_SERVICE_ID=$(keystone service-list \
| awk '/\ volume\ / {print $2}')
PUBLIC="http://$ENDPOINT:8776/v1/%(tenant_id)s"
ADMIN=$PUBLIC
INTERNAL=$PUBLIC
keystone endpoint-create \
--region RegionOne \
--service_id $CINDER_SERVER_ID \
--publicurl $PUBLIC \
--adminurl $ADMIN \
--internalurl $INTERNAL
工作原理
在OpenStack身份认证服务中配置服务和端点是通过keystone客户端命令来完成的。首先通过keystone客户端的service-create选项来添加服务,语法如下所示:
keystone service-create \
--name service_name \
--type service_type \
--description 'description'
service_name可以是任意的名字和标签用以标识服务的类型。在定义端点的时候,可以通过这个名字来取得它对应的ID号。
type选项可以是下列几个选项中的一个:compute、object-store、image-service和identity-
service。注意,在这一步没有配置OpenStacke的对象存储服务(type是object-store)或Cinder。
description字段同样是一个任意字段,用于描述该服务。
添加好各个服务之后,通过keystone客户端的endpoint-create选项来定义各个服务对应的端点。只有这样,OpenStack身份认证服务才能知道如何访问它们。语法如下所示:
keystone endpoint-create \
--region region_name \
--service_id service_id \
--publicurl public_url \
--adminurl admin_url \
--internalurl internal_url
service_id是在第一步里创建的服务的ID号。可以通过如下命令来列出所有服务和它们对应的ID号:
keystone service-list
OpenStack被设计为一个适合全球部署的系统,一个区域(region)可以表示一个实际的数据中心或者一个包含多个互相连通的数据中心的地域范围。在这里,仅定义一个区域——RegionOne。region字段可以是任意的名字,用于标识数据中心/地域,可以通过这个字段来告知客户端使用哪些区域。所有的服务都可以被配置成运行在三个不同URL之上,如下所述,这取决于人们希望如何来配置OpenStack云环境。
- public_url是供终端用户连接的URL。在一个公有云环境中,公有的URL会被解析成公有的IP地址。
- admin_url只用于管理员访问。在公有部署中,通常会配置一个和public_url不同的
- admin_url。有些模块的管理服务有不同的URI,这就需要配置这个属性。
- internal_url只用与本地私有网络。通过internal_url,你可以从云环境内部连接到各个服务,而不需要外部地址空间,因此避免了交换数据的传输过程暴露在因特网上。这也带来了更好的安全性和更少的复杂性。
提示
首先创建好初始化的keystone数据库,然后在OpenStack身份认证服务器上运行keystone-manage
db_sync命令,最后就可以使用keystone客户端来实现远程管理了。