Keystone 是 OpenStack 的认证中心,挂了整个云就废了。本文是我在生产部署的 3 节点 HA 方案。

架构

        VIP (HAProxy keepalived)
         |
   +-----+-----+
   |     |     |
 Key1  Key2  Key3   (Apache + mod_wsgi)
   |     |     |
   +-----+-----+
         |
      Galera Cluster (MariaDB 3 节点)

要点:

  • Keystone 服务无状态,水平扩容
  • 数据库用 Galera 多主同步
  • 前面挂 HAProxy + VIP,单点故障不影响

关键配置 keystone.conf

[database]
connection = mysql+pymysql://keystone:password@<VIP>:3306/keystone
max_pool_size = 50
max_overflow = 100

[token]
provider = fernet
expiration = 3600

用 fernet token,不要用旧的 uuid token:

  • fernet 不存数据库,纯加密 token
  • 性能好 10 倍以上
  • token rotation 自动化

Fernet key 同步

3 个节点的 fernet key 必须一致:

# 主节点生成
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone

# rsync 到其他节点
rsync -av /etc/keystone/fernet-keys/ node2:/etc/keystone/fernet-keys/
rsync -av /etc/keystone/fernet-keys/ node3:/etc/keystone/fernet-keys/

# 定期 rotate(crontab,每 24h)
keystone-manage fernet_rotate --keystone-user keystone --keystone-group keystone

rotate 后必须同步到所有节点,否则部分节点 token 验证失败。

HAProxy 配置

listen keystone_api
    bind <VIP>:5000
    balance source           # 同一客户端固定到同一后端,防 session 漂
    option httpchk GET /v3
    server key1 <node1>:5000 check inter 2000 rise 2 fall 3
    server key2 <node2>:5000 check inter 2000 rise 2 fall 3
    server key3 <node3>:5000 check inter 2000 rise 2 fall 3

balance source 比 roundrobin 更稳,但流量分布略不均。

监控要看的指标

  • Keystone API 响应时间(>500ms 报警)
  • Token 创建 QPS
  • Galera 集群同步延迟(wsrep_local_recv_queue)
  • Fernet key 文件 mtime 一致性

一个真实事故

某次我们的 HAProxy 健康检查写成 option httpchk GET / ——返回 300 重定向。HAProxy 把所有节点判 down,Keystone 全部摘除,整个云挂 20 分钟。

教训:健康检查 URL 一定要返回 2xx,别用根路径。

标签: none

添加新评论