Skip to content
marstone edited this page Mar 11, 2025 · 30 revisions

概述

  • 本文档描述科探云平台在 kubernetes 中安装的自展过程

Bootstrap API

  • 所有需要处理 Ketanyun CRD服务模块,均需实现此API
  • 需验证 scope: bootstrap,授权模式:client_credentials
  • API地址需为可以从该服务 QService 中定义的 service.backend 拼装,形如: $schema://$authority/$context-path/bootstrap

比如,service.backend = http://svc:8080/api/v3/,则BootstrapAPI地址为: http://svc:8080/api/bootstrap

  • BootstrapAPI 采用 REST风格,格式:
# 支持增删改查。查询操作目前尚无需支持。
// CRUD "bootstrap/{type}/{name}" @returns CustomResource
CRUD "bootstrap" @returns CustomResource
  • 参数表
Parameter Type Description
type enum QAppQResource 等自定义资源类型,参考 Ketanyun CRD。尚不支持,可从resource解析
name String 该资源名称。尚不支持,可从resource解析
resource json 自定义资源完整内容
context json 可选,上下文数据,视具体接口而定
  • 数据类型
// TYPE: CustomResource
{
  id: String,       // 仅 QApp 使用,client_id
  secret: String,   // 仅 QApp 使用,client_secret
  // 用于创建数据源 secret 
  datasources: [{
    url: String,            // 仅 QDataSource 使用,数据库连接字符串
    username: String,       // 仅 QDataSource 使用,数据库用户名称
    password: String,       // 仅 QDataSource 使用,数据库用户密码
    permission: Enum("data", "full", "readonly"), // 仅 QDataSource 使用,数据库用户类型
  }],
  // 根据 QDataSource 创建 QService,可能是0或1个
  services: [{
    name: ID,               // 服务名
    kind: String,           // 目前仅支持常量 'GraphQL'
    text: String,           // 显示服务名
    backend: String,            // 后端服务提供者的内网地址
    backendContextPath: String  // 后端服务提供者的ContextPath。常规1层的ContextPath可留空
  }],
  // 追加给资源的事件
  events: [{
    message: String,                 // 事件描述
    kind: Enum("error", "info")      // 事件类型,存在 error 表示执行失败,需重试 
  }],
}

// PARAM: context
{
  dependencies: [ JSON ]       // 该CR所依赖的其他资源列表
}
  • 报错:
    • 方式1: 通过非200的HTTP状态码返回
    • 方式2: 200情况下,通过返回值中的error类型的events表示,用于既返回事件、由需要重试的情况
    • 报错情况下,installer会不断重试,以保障最终一致性。

安装过程

1. kubernetes + helm

2. Chart: installer

  • 内容:
    • 所有CRD
    • QApp(installer):在后续sso服务启动后自展、并获取其密钥使用
    • QApp(dba):在后续sso服务启动后自展、通过资源方式弱依赖挂载到 deploy(dba)
    • secret(bootstrap-token) :用于sso服务启动前的验证。设计理念参考 Kubernetes Bootstrap Token
    • deploy(installer)、deploy(dba)
    • svc(installer)、svc(dba)
    • ingress:需通过 helm values 提供域名。
  • 环境变量:
    • BOOTSTRAP_TOKEN:随机字符串,通过 envFrom: bootstrap-token 配置。
    • KUBECONFIG:用于连接 kubernetes 集群的权限
    • NAMESPACE:当前installer所属的命名空间。后续所有操作限定在此命名空间内
    • SERVICE_ORIGIN_URL:服务发现所需的地址,需要完整的 $schema://$authority 部分
  • 处理逻辑:
    • 根据 SERVICE_ORIGIN_URL 生成 configmap(qservice-discovery)
    • 界面登录:使用 kubernetes 的 sa,或直接使用 BOOTSTRAP_TOKEN
    • 通过资源的 metadata.labels.service 获得该资源的 Bootstrap API。如未提供此 label 则无需调用
    • installer 仅对于 sso 服务,调用时使用 BOOTSTRAP_TOKEN,其他使用 QApp(installer) 产生的密钥
    • 对于 QService,调用成功后更新 configmap(qservice-discovery)
    • 对于 QApp,调用成功后生成 secret(qapp-secret-{{ .Release.name }})
    • 对于 QDataSource,调用成功后生成 secret(qdatasource-secret-{{ QDataSource.metadata.name }}-{index})

3. Chart: sso(处理QApp)

  • 内容:
    • QService(oauth sso iam)
    • deploy(sso apis) + svc(sso apis) :需配置 configmap(qservice-discovery)
  • 环境变量 BOOTSTRAP_TOKEN,通过 envFrom: bootstrap-token 配置。
  • 资源 QService(oauth),不指定 metadata.labels.service
  • 资源 QApp(apis),不指定 metadata.labels.service 或指定为 installer待议
  • sso模块的Bootstrap API 需支持通过 BOOTSTRAP_TOKEN 验证

4. Chart: bus

  • 内容:
    • QApp(bus)
    • QService(bus) :自展定义自身服务
    • deploy(bus) + svc(bus)
  • 环境变量:来自 configmap(qservice-discovery) 和 secret(qapp-secret-{{ .Release.name }})
  • 无特殊初始化逻辑

5. Chart: maker

  • 内容:
    • QApp(maker)
    • QService(maker)
    • QRole(maker):只定义 client_credentialsACL权限
    • QCanvas(maker):自展定义自身权限
    • 其他:deploy(maker) + svc(maker)

6. Chart: console

  • 内容:
    • QApp(console)
    • QCanvas(console)
    • QService(console):仅前端服务,用户身份选择器、数据目录选择器
    • 其他:deploy(console) + svc(console)

7. 其他应用(略)

租户创建过程

  1. 登录 installer -> 租户管理:选择创建租户
  2. 输入 租户编码租户名称管理员用户名管理员密码管理员岗位,创建租户
  3. installer 正常调用 sso 服务 的 初始化租户接口 POST /tenant
  4. sso通过 消息队列 发布 tenant.created 等消息
  5. 其他系统响应此消息,初始化内部数据。
Clone this wiki locally