OpenStack系统是由几个单独安装的关键服务组成。这些服务根据我们需求进行选择,包括计算,身份,网络,图像,块存储,对象存储,遥测,编排和数据库服务。
本文介绍如何在控制节点上安装和配置OpenStack的身份服务,也就是keystone。
keystone是非常重要的,在整个OpenStack中需要做验证的地方都是通过keystone完成的。
为了实现可伸缩性,我们还需要部署一个Fernet令牌,做验证还会开启一个Apache HTTP的api来处理请求,这个主要是方便其他程序来连接这个api进行验证
在OpenStack环境中,keystone服务用于管理身份验证,授权和服务目录。
keystone身份服务通常是OpenStack交互的时候第一个服务。
身份服务不是一个软件, Identity service是代表OpenStack中一类服务,想要实现身份服务可能有很多办法(例如LDAP),所以不要认为身份服务就是一个软件,他是OpenStack中的一类服务。
身份服务还会提供一个目录服务,在目录服务中查看有哪些计算节点?有哪些网络节点?有哪些存储节点?这些都会在目录服务中进行记录。
这个目录服务是OpenStack中所有服务的一个集合,就是说keystone是一个服务,image、network、compute等都是一个服务,每个服务都会有一个或多个端点,并且每个端点包括三种网络类型:admin,internal或public。
public,可以对外从互联网上进行访问,安全度比较低;admin,OpenStack中涉及到管理相关的组件,就可以用到admin网络;internal,OpenStack内部使用和通信的时候使用internal;身份服务包含的组件:
Server ,提供一个REST接口,说白了就是提供一个api端口让我们使用身份验证和授权服务。Drivers 驱动程序,当我们需要去访问外部存储库时使用的确定程序,比如访问mysql数据或者LDAP中存放数据的时候,就需要启动Drivers驱动程序帮我们进行连接了。Modules 模块,用来拦截一些服务的请求,并且提取里面的用户凭证,吧这些请求发送到服务器上去进行验证和授权,这些模块帮助我们实现验证求并发送到服务器上面去。在安装和配置身份服务之前,必须创建服务对应的数据库。
创建keystone对应的数据库;然后创建keystone用户设置本地访问和远程访问两种访问权限,为了方便远程访问就直接是%,所有IP地址都可以访问,如果是生产环境可以具体制定IP段或者范围,
PS:我这里创建用户设置的密码都是123,因为是自己部署的实验环境,还是简单点好不给自己找麻烦了!
mysql -uroot -pXylong_000 CREATE DATABASE keystone; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '123'; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '123'; show databases;这安装的软件一个keystone的软件,还有就是apache还有就是一个apache的模块wsgi了,他会提供一个对外的api接口用于接收请求,
yum install openstack-keystone httpd mod_wsgi配置数据库访问
[database]
connection = mysql+pymysql://keystone:123@controller/keystone配置Fernet令牌提供者:
[token]
provider = fernetPS:如果执行了初始数据库的命令之后,执行的很快或者是返回查看keystone库中没有对应的表,那么检查配置文件的【database】下面添加的那个connection连接,看看是否写错了。
如果报错了可以查看keystone日志:
cat /var/log/keystone/keystone.log这个报错是在keystone配置文件中将数据库的connection连接信息写错了的报错,
2021-01-06 16:10:20.561 31622 CRITICAL keystone [-] Unhandled error: ValueError: invalid literal for int() with base 10: '123controller'验证:
查看数据库验证
mysql -uroot -pXylong_000 use keystone show tables;初始化Fernet密钥存储库:
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone keystone-manage credential_setup --keystone-user keystone --keystone-group keystone引导身份服务: 这里的密码设置还是123,注意!
keystone-manage bootstrap --bootstrap-password 123 --bootstrap-admin-url http://controller:5000/v3/ --bootstrap-internal-url http://controller:5000/v3/ --bootstrap-public-url http://controller:5000/v3/ --bootstrap-region-id RegionOne配置 ServerName选项为控制器节点:
vim /etc/httpd/conf/httpd.conf创建文件链接: 这个文件是keystone给我们生成好的,里面内容是创建两个虚拟主机,
ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/我们可以查看下这个文件,他是现成的,直接使用就好——》不需要修改,
设置开机启动并启动http服务
systemctl enable httpd.service systemctl start httpd.service验证:
http服务正常启动,5000/35357端口已经打开
netstat -tunpl | grep httpd身份服务为每个OpenStack服务提供身份验证服务。身份验证服务使用域,项目,用户和角色的组合。
在OpenStack环境中创建账号之前我们需要去创建一些东西,
首先是一个domain域,接着在里面创建一个project项目,然后在项目中启动instance实例,
配置环境变量
export OS_USERNAME=admin export OS_PASSWORD=123 export OS_PROJECT_NAME=admin export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default export OS_AUTH_URL=http://controller:5000/v3 export OS_IDENTITY_API_VERSION=3首先创建domain域:
openstack domain create --description "An Example Domain" example接着创建项目,project这里我们创建两个:一个是service | 一个是demo,demo是创建给非特权用户来使用的,
创建service 项目:
openstack project create --domain default --description "Service Project" service创建demo项目:
openstack project create --domain default --description "Demo Project" demo现在我们已经有了一个admin用户了,我们在创建一个非特权用户,
创建demo用户:
openstack user create --domain default --password-prompt demoPS:这里用户的密码设置的还是123!!!
现在我们查看是有两个用户的,admin用户是默认创建的,
创建user角色并将user角色添加到demo项目和用户:
openstack role create user openstack role add --project demo --user demo user验证:
首先将url和password两个变量取消
unset OS_AUTH_URL OS_PASSWORD接着我们通过命令执行URL并手动输入密码来向keyston获取token令牌,如果能成功获取那么说明keyston服务就是没有问题的了。
下面两个命令一个是admin用户,一个是demo非特权用户的,
openstack --os-auth-url http://controller:35357/v3 --os-project-domain-name Default --os-user-domain-name Default --os-project-name admin --os-username admin token issue openstack --os-auth-url http://controller:5000/v3 --os-project-domain-name Default --os-user-domain-name Default --os-project-name demo --os-username demo token issue到现在我们的keyston服务就构建完成了,并且也能够手动的获取token,那么我们就可以查看下上面我们创建的domain域、project项目、user用户、role角色了,
openstack domain list openstack project list openstack user list openstack role list在OpenStack环境中执行命令的时候我们是需要输入一些必要的参数的,但是这些参数是非常多而且长的,这就很烦了,每次输入一次命令就要加上这些参数,
为了简化,我们可以将执行命令的时候所需要的参数以变量的方式进行指定,这样我们执行命令前先执行一个脚本将命令所需的参数都运行下,然后在执行命令就简短很多了。
如果将参数以变量的方式写入脚本,就可以将admin用户和非特权用户的参数写成两个脚本,使用的时候只需要执行不同的脚本就可以应用不同的参数了,方便!
为admin和demo 项目以及用户创建客户端环境脚本
cat admin-openrc export OS_PROJECT_DOMAIN_NAME=Default export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_NAME=admin export OS_USERNAME=admin export OS_PASSWORD=123 export OS_AUTH_URL=http://controller:5000/v3 export OS_IDENTITY_API_VERSION=3 export OS_IMAGE_API_VERSION=2 cat demo-openrc export OS_PROJECT_DOMAIN_NAME=Default export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_NAME=demo export OS_USERNAME=demo export OS_PASSWORD=123 export OS_AUTH_URL=http://controller:5000/v3 export OS_IDENTITY_API_VERSION=3 export OS_IMAGE_API_VERSION=2验证:
我们可以通过应用脚本来指定不同的变量,然后获取到admin用户和demo用户的token,这样就比上面执行命令简单很多了
source admin-openrc openstack token issue source demo-openrc openstack token issue总结:
到现在为止我们keystone服务就部署完成了,而且也已经验证通过了,如果你是在公司中进行OpenStack环境的搭建,你是只需要将硬件和网络准备好的,然后一键执行一个脚本就能将一整套环境拉起来的,但是这样不利于我们进行OpenStack的学习,所以我倾向于手动搭建,一个服务一个服务的部署,这样更有利于我们学习。
kystone服务可以说是OpenStack环境最重要的一个服务,他的主要功能就是负责发布token【令牌】,给用户发布令牌并且提供验证服务,因为OpenStack是由一组服务构成的,每个服务负责一个功能,当他们拼接在一起运行的时候,他们也是需要使用到keystone的,
比如nova启动实例,
首先,是用户给nova服务发送请求,并且将自己的【令牌】发给nova,接着nova就会到keystone进行验证,通过之后就会进行启动实例的操作;接着,nova启动实例找glance“要”镜像的时候,他也是需要将【令牌】先发送给glance组件的,接着glance组件拿到【令牌】之后也是需要到keystone组件来进行验证的,通过之后才会将镜像给nova服务;还有一点,当nova启动实例需要用到镜像的时候,我们知道他是要找glance服务要镜像的,但是nova服务是怎么知道glance服务在哪呢?他的api是多少?怎么去找他的啊?——》glance组件的URL和端口号等信息,他也是需要通过keystone服务来获取的;最后,keystone服务在部署OpenStack环境的时候应该是第一个部署的,并且也是非常重要的,
一般在工作中,他出问题的几率是比较小的,我维护了两年多的时间,也是没见过keystone服务出现问题导致环境不可用的。
接着我们部署第二个服务:
glance镜像服务