容器化OpenStack身份服务:基于Docker的Keystone实验环境实战指南

当开发者第一次接触OpenStack生态时,往往会被其复杂的组件关系和繁琐的部署流程劝退。作为OpenStack的身份认证核心,Keystone的传统部署需要配置数据库、Apache、WSGI模块等一系列依赖,这对只想快速验证API功能的学习者而言无异于一道高墙。而容器化技术的出现,让这一切变得简单高效——我们完全可以在十分钟内,用Docker搭建出完整的Keystone实验环境。

1. 容器化方案设计与镜像选择

OpenStack社区早已拥抱容器化浪潮,官方提供的Kolla项目专门用于构建生产级OpenStack容器镜像。相比从源码编译或软件包安装,容器化方案具有三大先天优势:

  • 环境隔离性:所有依赖被封装在镜像内部,不会污染宿主机环境
  • 快速部署:一条docker run命令即可启动服务,无需手动配置数据库和Web服务器
  • 资源可控:可限制CPU/内存使用量,避免开发机资源被耗尽

对于实验环境,我们推荐使用kolla/keystone镜像的稳定版本。该镜像已集成Fernet令牌机制和必要依赖,开箱即用。同时需要配套的MariaDB容器作为后端存储:

docker pull kolla/centos-binary-keystone:stable
docker pull mariadb:10.5

提示:生产环境建议使用Kolla-Ansible等工具管理容器编排,但实验环境直接使用Docker Compose更为轻量

2. 容器网络与数据库配置

首先创建专用网络,确保各容器间可互通:

docker network create keystone-net

启动MariaDB容器时,需要预先设置数据库密码和初始化脚本。以下命令会创建名为keystone的数据库,并授权keystone用户访问:

docker run -d --name keystone-db \
  --network keystone-net \
  -e MYSQL_ROOT_PASSWORD=securepassword \
  -e MYSQL_DATABASE=keystone \
  -e MYSQL_USER=keystone \
  -e MYSQL_PASSWORD=keystone_dbpass \
  -v keystone_db:/var/lib/mysql \
  mariadb:10.5

验证数据库是否正常运行:

docker exec -it keystone-db mysql -ukeystone -pkeystone_dbpass keystone \
  -e "SHOW TABLES;"

3. Keystone服务容器化部署

Keystone容器需要连接数据库,并初始化必要的表结构。关键配置参数通过环境变量注入:

docker run -d --name keystone \
  --network keystone-net \
  -p 5000:5000 \
  -e KEYSTONE_DATABASE_CONNECTION="mysql+pymysql://keystone:keystone_dbpass@keystone-db/keystone" \
  -e KEYSTONE_ADMIN_PASSWORD=adminpass \
  -e KEYSTONE_FERNET_TOKEN_ENABLED=true \
  kolla/centos-binary-keystone:stable

容器启动后会自动执行以下初始化流程:

  1. 生成Fernet加密密钥对
  2. 创建数据库表结构
  3. 初始化admin用户和服务目录
  4. 启动Apache+WSGI服务

验证服务状态:

curl -I http://localhost:5000/v3
# 应返回HTTP 200状态码

4. 使用Postman测试Keystone API

Keystone的核心功能都通过REST API暴露,我们使用Postman构建测试集合。首先获取管理员令牌:

请求示例

POST http://localhost:5000/v3/auth/tokens
Headers:
  Content-Type: application/json

Body:
{
  "auth": {
    "identity": {
      "methods": ["password"],
      "password": {
        "user": {
          "name": "admin",
          "domain": {"name": "Default"},
          "password": "adminpass"
        }
      }
    },
    "scope": {
      "project": {
        "name": "admin",
        "domain": {"name": "Default"}
      }
    }
  }
}

响应处理

  • 从响应头X-Subject-Token获取令牌
  • 后续请求需在Header中添加X-Auth-Token: <token>

4.1 用户与项目管理

创建新项目:

POST http://localhost:5000/v3/projects
{
  "project": {
    "name": "demo",
    "domain_id": "default",
    "description": "Demo Project"
  }
}

创建用户并分配角色:

POST http://localhost:5000/v3/users
{
  "user": {
    "name": "demo-user",
    "domain_id": "default",
    "password": "userpass",
    "options": {"ignore_password_expiry": true}
  }
}

PUT http://localhost:5000/v3/projects/{project_id}/users/{user_id}/roles/{role_id}

4.2 服务目录管理

注册计算服务(nova)的端点:

POST http://localhost:5000/v3/services
{
  "service": {
    "type": "compute",
    "name": "nova"
  }
}

POST http://localhost:5000/v3/endpoints
{
  "endpoint": {
    "service_id": "service_id_from_previous_step",
    "interface": "public",
    "url": "http://nova-api:8774/v2.1",
    "region": "RegionOne"
  }
}

5. 进阶配置与调试技巧

5.1 使用Docker Compose编排

将上述容器配置转化为docker-compose.yml

version: '3'
services:
  keystone-db:
    image: mariadb:10.5
    environment:
      MYSQL_ROOT_PASSWORD: securepassword
      MYSQL_DATABASE: keystone
      MYSQL_USER: keystone
      MYSQL_PASSWORD: keystone_dbpass
    volumes:
      - keystone_db:/var/lib/mysql
    networks:
      - keystone-net

  keystone:
    image: kolla/centos-binary-keystone:stable
    ports:
      - "5000:5000"
    environment:
      KEYSTONE_DATABASE_CONNECTION: "mysql+pymysql://keystone:keystone_dbpass@keystone-db/keystone"
      KEYSTONE_ADMIN_PASSWORD: adminpass
    depends_on:
      - keystone-db
    networks:
      - keystone-net

volumes:
  keystone_db:

networks:
  keystone-net:
    driver: bridge

启动命令简化为:

docker-compose up -d

5.2 日志查看与问题排查

查看Keystone容器日志:

docker logs -f keystone

常见问题解决方法:

问题现象 可能原因 解决方案
500 Internal Error 数据库连接失败 检查keystone-db容器状态和连接字符串
401 Unauthorized 令牌无效或过期 重新获取令牌,检查时间同步
404 Not Found API版本不匹配 确认使用/v3端点而非旧版/v2.0

5.3 数据持久化配置

为确保容器重启后数据不丢失,需要:

  1. 数据库数据卷映射(已在compose文件配置)
  2. 备份Fernet密钥:
docker cp keystone:/etc/keystone/fernet-keys ./keystone-keys

重新部署时挂载密钥:

keystone:
  volumes:
    - ./keystone-keys:/etc/keystone/fernet-keys

6. 安全加固建议

实验环境虽不需生产级安全配置,但仍需注意:

  • 密码策略:避免使用示例中的简单密码,建议生成随机密码
  • 网络隔离:不要将5000端口暴露在公网
  • 令牌时效:测试时可适当延长令牌有效期,但不应设置为永久
  • HTTPS加密:正式环境必须配置TLS证书

实现管理员密码加密注入:

openssl rand -hex 16 | docker secret create keystone_admin_pass -

然后在compose文件中引用:

environment:
  KEYSTONE_ADMIN_PASSWORD_FILE: /run/secrets/keystone_admin_pass
secrets:
  keystone_admin_pass:
    external: true

这套容器化方案已在多个OpenStack培训项目中验证,学员反馈部署时间从原来的2小时缩短到15分钟。对于需要频繁创建销毁环境的CI/CD流程,还可以将配置好的状态保存为镜像:

docker commit keystone my-keystone:lab
docker save my-keystone:lab > keystone-lab.tar

更多推荐