zoukankan      html  css  js  c++  java
  • 【OpenStack】OpenStack系列2之KeyStone详解

    1. 源码下载、依赖安装

      参考:http://www.oschina.net/question/565065_66271

      https://github.com/yongluo2013/osf-openstack-training/blob/master/installation/openstack-icehouse-for-centos65.md

      http://www.aboutyun.com/thread-11404-1-1.html

      1. 安装git、setuptools、pip、gcc等(yum install gcc python-devel -y)

        Mysql: yum -y install mysql-devel mysql zlib zlib-devel openssl

      Lxml: yum remove audit

      yum install gcc

      yum install libxslt-devel libxml2-devel

      1. Git下载keystone源码

        git clone -b stable/icehouse https://github.com/openstack/keystone.git

        git clone -b stable/icehouse https://github.com/openstack/python-keystoneclient.git

      2. 安装keystone依赖、安装keystone

        pip install -r requirements.txt

        python setup.py install

      3. 配置keystone数据库连接、日志级别

        mkdir -p /etc/keystone/

        cp -r etc/keystone.conf /etc/keystone/

        修改数据库连接:

        connection=mysql://keystone:openstack@controller0/keystone

        修改日志配置:

        debug=true

        verbose=true

        use_stderr=false

        log_dir=/opt/stack/keystone/log

        log_file=keystone.log

        修改ADMIN_TOKEN:

      ADMIN_TOKEN=$(openssl rand -hex 10)

      echo $ADMIN_TOKEN

      admin_token=38eb8c44ca677eec1d67

      export OS_SERVICE_TOKEN=`echo $ADMIN_TOKEN`

      export OS_SERVICE_ENDPOINT=http://controller0:35357/v2.0

      1. 安装配置mysql、建库、权限设置、数据库初始化

        安装mysql:

      yum install -y mysql mysql-server MySQL-python

       

      配置mysql:

      vi /etc/my.cnf

      [mysqld]

      bind-address = 0.0.0.0

      default-storage-engine = innodb

      innodb_file_per_table

      collation-server = utf8_general_ci

      init-connect = 'SET NAMES utf8'

      character-set-server = utf8

       

      启动mysql,设置开机自启:

      service mysqld start

      chkconfig mysqld on

       

      设置mysql密码:

      mysql_secure_installation root/openstack

       

      创建数据库,设置权限:

      mysql -uroot -popenstack -e "CREATE DATABASE keystone;"

      mysql -uroot -popenstack -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'openstack';"

      mysql -uroot -popenstack -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'controller0' IDENTIFIED BY 'openstack';"

      mysql -uroot -popenstack -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'openstack';"

       

      初始化keystone数据表:

      su -s /bin/sh -c "keystone-manage db_sync"

      1. 设置keystone开机自启

        keystone-all &

        监听端口分别是35357、5000,对应于admin、public的端口。

        vi /etc/init.d/keystone

      #!/bin/sh

      # chkconfig: 35 70 30

      # description: keystone

      /opt/stack/keystone/bin/keystone-all

      chmod +x /etc/init.d/keystone

      chkconfig --level 35 keystone on

      service keystone start

      1. Keystone测试

        创建租户/Project:

        keystone tenant-create --name=admin --description="Admin Tenant"

        keystone tenant-create --name=service --description="Service Tenant"

        创建管理员用户:

        keystone user-create --name=admin --pass=admin --email=admin@example.com

        创建管理员角色:

        keystone role-create --name=admin

        关联租户-用户-角色:

        keystone user-role-add --user=admin --tenant=admin --role=admin

        创建服务:

        keystone service-create --name=keystone --type=identity --description="Keystone Identity Service"

        创建服务的endpoints:

        keystone endpoint-create

        > --service-id=$(keystone service-list | awk '/ identity / {print $2}')

        > --publicurl=http://controller0:5000/v2.0

        > --internalurl=http://controller0:5000/v2.0

        > --adminurl=http://controller0:35357/v2.0

      2. 验证服务安装是否正确

        unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT

        设置PKI:

      keystone-manage pki_setup --keystone-user keystone --keystone-group keystone

      chown -R keystone:keystone /etc/keystone/ssl

      chmod -R o-rwx /etc/keystone/ssl

      unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT

      命令行方式获取token:

      keystone --os-username=admin --os-password=admin --os-auth-url=http://controller0:35357/v2.0 token-get

      keystone --os-username=admin --os-password=admin --os-tenant-name=admin --os-auth-url=http://controller0:35357/v2.0 token-get

      也可以使用接口方式获取token(curl –i选项可以打印返回消息头):

      curl -d '{"auth": {"tenantName": "admin", "passwordCredentials":{"username": "admin", "password": "admin"}}}' -H "Content-type: application/json" http://10.20.0.88:35357/v2.0/tokens | python -mjson.tool

      GET方法使用如下:

      curl -H "Content-type: application/json" http://10.20.0.88:35357/v2.0/ | python -mjson.tool

      命令行方式使用——指定用户名密码方式:

      keystone --os-tenant-name admin --os-username admin --os-password admin --os-auth-url http://controller0:35357/v2.0 role-list

    2. Keystone架构
      1. keystone设计

      2. 默认regionOne,select * from endpoint;可知。可使用多region共享keystone、dashboard方案,根据地理位置不同分别部署独立完整的openstack环境,包括控制节点、计算节点、网络节点等,但同时多个region共享一个keystone、dashboard,这样我们可以使用统一的账户信息与统一的管理平台。
    3. Keystone源码解读
      1. 基础知识
        1. eventlet:
          1. http://www.open-open.com/lib/view/open1382234530214.html

            http://gashero.iteye.com/blog/442177

            http://bingotree.cn/?p=281

            http://eventlet.net/doc/index.html

            http://blog.csdn.net/gaoxingnengjisuan/article/details/12913275

          2. python协程库,轻量级线程,多线程方式编写异步网络应用程序
        2. wsgi:
          1. http://blog.sina.com.cn/s/blog_8a18c33d01019xle.html

            http://gashero.iteye.com/blog/443885

          2. Web服务器与应用程序接口,是一个规范。让应用程序运行在任何兼容wsgi的web服务器上。注意eventlet与wsgi的集成。
        3. Wsgiref与webob:

          http://www.cnblogs.com/btchenguang/archive/2012/08/31/2664895.html

          http://www.verydemo.com/demo_c122_i18733.html

          http://blog.csdn.net/bluefire1991/article/details/13614243

          http://blog.csdn.net/bluefire1991/article/details/14065723

        4. 消息队列、消息队列框架、rpc、rpc回调:
          1. http://blog.csdn.net/hackerain/article/details/7880121

            http://blog.csdn.net/hackerain/article/details/7888672

        5. http://blog.csdn.net/hackerain/article/details/7908990

      2. 源码解读、调试
        1. keystone-paste.ini文件:该文件由application, filter, pipeline, composite等定义段落组成。composite是第一层调度者,它粗略地根据不同的url类型将请求分配到不同的pipeline上。每一个pipeline由若干filter和一个application组成。正如其名,filter按照其在pipeline中的先后顺序依次对http请求进行过滤,包括对参数进行格式化处理等操作。application位于pipeline的末尾,每一个pipeline只有一个application。最终通过所有filter的请求被application进一步调度到系统实现上每一个模块的路由层(routers),路由层根据HTTP请求方法和具体的请求路径,将HTTP请求分发给对应的控制层(controllers),controllers集中实现业务逻辑,并通过调用更低的驱动层完成底层的工作,如数据库的读写等等。这些构成了composite, pipeline, filter, application和keystone实现间的逻辑关系。keystone-paste.ini文件从一个高层次定义了keystone所需的composite会将哪些类型的url交由由哪些pipeline, 每一个pipeline由哪些filter和app组成,以及具体到每一个filter和app是由系统源码的哪一个部分实现的,事实上,从下文的分析可以看出,每一个filter在实现上都对应着一个特定的类,而每一个application在实现上则对应着一个具体的方法。
        2. 当用户以HTTP POST方式请求http://localhost:5000/v3/auth/tokens这个url时,意味着用户希望进行身份认证,同时获得keystone签发的Token。当然,用户需要在自己的HTTP请求中给出一些自己的身份信息,这样keystone才能据以判断该用户是否是系统合法的用户,并根据其拥有的角色和权限为其签发token。
        3. 该application将会实现第二层路由(第一层由keystone-paste.ini文件中的composite字段实现),此次路由将具体的请求处理工作进一步分发到系统的各个模块上,比如代码中的assignment,auth, catalog等等。由具体的模块根据请求的具体路径和内容完成具体功能。
        4. 配置库:

          http://www.cnblogs.com/xinyuyuanm/archive/2013/05/19/3087323.html

        5. 请求处理流程
          1. 讲的比较好:

            http://demo.netfoucs.com/napolunyishi/article/details/42501579

          2. POST- keystone-paste.ini- composite初步分发- pipeline处理流程- user_crud_extension-调用UserController-调用具体的Driver操作数据库
    4. Keystone高可靠性、高可用性设计
      1. HAProxy+Apache+Keystone+DBCluster/memcache
  • 相关阅读:
    代理模式
    适配器模式
    原型模式
    创建者模式
    装饰模式
    web总结
    4.14
    4.14
    POJ2385
    POJ2229
  • 原文地址:https://www.cnblogs.com/junneyang/p/5257212.html
Copyright © 2011-2022 走看看