@di-framework/tenant-cli (英语)
租户CLI的飞行员 从来不说Kubernetes。 它每个账户有一个证书,一个
身份服务证或房客 API 密钥,每个动作都是给房客控制器的呼叫
OpenAPI合约. Kubeconfigs只存在于控制器内. 削减标准和
命令集是平台问题#40;其原型始于 ../tenant-auth。 。 。 .
合同是共享的
api/v1/openapi.yaml 承诺和生成,从未编辑:
src/api/contracts/*-v1.codegen.ts manifests (operations, paths, schemas)
src/api/schemas.ts JSON schemas published under components.schemas
src/api/handlers.ts the server side; every operation answers 501 in the pilot
src/api/generated/** @di-framework/codegen output: typed routes and validators
api/v1/openapi.yaml emitted from the generated @Endpoint metadata
src/client/schema.d.ts openapi-typescript output
src/client/index.ts the typed client; its paths are checked against `paths`
src/client/sse.ts the one hand-written transport: text/event-stream framing
bun run generate # di-framework generate, then the document, then the client types
bun test # includes a drift check: the committed document must match the manifests
显示在文档和表格中 paths; 客户端路径
合同中不再提及的事项 tsc这就是整个漂移的故事.
流动业务logs)是SSE:每个 log 事件 data 是一个 LogEvent 作为JSON,和
end 关闭溪流。 操作描述中的 spec 名称; 框架本身为
src/client/sse.ts。 。 。 . logs 需求 env (单位:千美元)prod 或者说 staging如合同所述:
控制器回答400没有它,而流只有环境的行(平台#106).
使用客户端
@di-framework/tenant-cli/client 是已公布的条目: 键入 /v1 客户端
(单位:千美元)createClient, (中文(简体) ), ControllerError, (中文(简体) ), events,以及请求/答复类型。 舰船编成
(单位:千美元)dist,与 .d.ts因此消费者不需要 .ts 导入支持。 软件包还安装
di-tenant 命令,它需要 Bun(它的 shebang 是 bun) (中文(简体) ).
这个 ./src/api/* 导出是控制方合同(处理器、路线、计划、验证器和
生成的路径)。 它作为TypeScript源在下面 src/api,因此导入它需要运行时间
装入 .ts (本)与 experimentalDecorators 在消费者中启用 tsconfig.json· ; ../tenant-auth 在此寄存器内使用 。 测试固定装置发布
作为 ./testing,而不是从 tests/。 。 。 .
import { createClient } from '@di-framework/tenant-cli/client';
const info = await createClient({ baseUrl: 'https://controller.example' }).authInfo();
api/v1/openapi.yaml 船舶作为合同. bun run build 生产 dist。 。 。 .
测试固定装置
@di-framework/tenant-cli/testing 出口 deployBundle(overrides?): 完整、有效
DeployBundle 正如CLI所做的, 每一次通话都新鲜。 租户控制员的部署测试和
部署合同的其他消费者 进口它 所以双方同意形状。 把它绑起来
同版本为 ./client。这是一个单独的条目,所以测试代码不要 ./client,它已经
没有运行时间依赖.
import { deployBundle } from '@di-framework/tenant-cli/testing';
const bundle = deployBundle({ env: 'staging' });
书记官处
每个租户在其命名空间(平台#83,决定
平台#52. 没有任何内容是刻制的:您凭自己的身份登录到登记册。 用你们的
身份服务器访问符或一个 dik_ API 密钥作为 Basic 密码( 用户名被忽略) .
登记员问房客控制员 GET /v1/auth/whoami 呼叫者是谁:开发者可能
推和拉,一个取景器可能只能拉.
GET /v1/deploy/registry (查看器或开发器)返回 RegistryInfo: 登记册 url (单位:千美元)
来源: 方案 + 主机 [: port], 无路径, 可选 repositoryPrefix, (中文(简体) ), auth (单位:千美元)basic-identity(中文(简体) )
和一个固定的 username 提示( e)token) (中文(简体) ). 租户控制员从
TENANT_CONTROLLER_REGISTRY_URL (单位:千美元){tenant} 由租户取代),平台设置
时 tenantAuth.registry 配置存在; 否则端点会回答 503
no registry is configured for this tenant。虽然一个登记册已经配置,但没有服务(a)
它回答503 the tenant registry is not available; see the Tenant's TenantAuthReady condition。来源必须是: https://; 平面 http:// 实值
仅接受回回转( e)localhost, (中文(简体) ), 127.0.0.0/8, (中文(简体) ), [::1])和集群内主机(*.svc, (中文(简体) ),
*.svc.cluster.local) (中文(简体) ).
di-tenant registry 打印 URL 、 登录主机 和 推出 前缀 . di-tenant registry login 登录已登录的证书( 身份标志是)
首先被刷新,因此存储的复制品会获得其整个寿命;它从不打印出符号或密钥:
di-tenant registry # url, login host, push prefix
di-tenant registry login # checks GET <url>/v2/, then writes the Docker config
di-tenant registry login --with podman # or docker / oras: the password goes to its stdin
di-tenant registry logout # undoes the last registry login, no controller call
在发送任何证书之前,至少严格检查返回的控制器的 URL
作为控制器自己的规则: https: 来源(没有用户信息、路径、查询或碎片),或
http: 仅用于回转和 *.svc 编号 : *.svc.cluster.local 师曰. 除此之外,东道主必须
成为字母、数字和连字符标签的 DNS 名称( 无) _,没有后继点),IPv4地址,或
括号中的 IPv6 地址, 因此这里拒绝控制器接受的几个名称 。 这个 /v2/ 检查
不遵循重定向.
无 --with, (中文(简体) ), registry login 存储 token:<credential> 用于东道方的 auths 输入
Docker 配置( T)--config <file>,则 $DOCKER_CONFIG/config.json,则
~/.docker/config.json),保留所有其他条目,并带有模式 0600并读取
该文件; pockman 读取 --authfile 或者说 REGISTRY_AUTH_FILE。如果文件名称为
credsStore 或者说 credHelpers 输入主机, docker 咨询帮助者,所以使用
--with docker与 --with,工具运行
login --username=token --password-stdin [--plain-http | --tls-verify=false] -- <host> (单位:千美元)
plain-HTTP 开关,用于 Oras 或 pockman 上 http: 仅来自来源).
registry login 记录主机和它用账户存储登录的位置,加上
(原始内容存档于2019-09-21) (英语). Sha256 of the Docker config enter. 仅由主机和租户键入
共享一(127.0.0.1:<port>),所以只当该条目仍然匹配时,登录才会删除该条目
指纹; 如果另一个账户 registry login 或属于自己的 docker login 换了
条目带有警告.
registry logout在没有控制器调用的情况下删除已记录的登录, 因此它可在 登录已过期 。 对a--with登录它运行<tool> logout -- <host>,删除 不管那个工具对宿主有什么影响.registry logout --host <host> [--config <file> | --with <tool>]删除此条目 不论它持有什么,都保留.logout删除已记录的 Docker 配置条目( 相同的指纹规则),因为它持有 相同标志或密钥。 它从不运行<tool> logout(单位:千美元)--with登录, 因为不能是 选中; 它打印要运行的命令 .- 通过 Docker 证书助手存储的登录( S)
credsStore)为取取之助.
通过手,登录与东道主 url,而不是完整的 URL,然后推到
<host>/<repositoryPrefix>/<name>:<tag>数字 :
oras login <host>
docker login <host>
oras push <host>/<repositoryPrefix>/<name>:<tag> ...
一个 http: 源表示平原 HTTP( 仅潜回或集群内): 通过 oras --plain-http 或者说
wash --insecure该平台通过网关为HTTPS的登记册服务,因为
密码是身份证明 它的证书是房客控制器的,所以相信
租户的CA( ConfigMap) tenant-controller-ca就像你为控制器所做的. di-tenant 本身
使用与登录一起存储的 CA(参见 主计长 CA用于 /v2/ 检查;
推力工具需要他们自己的信任 比如说 oras --ca-file, (中文(简体) ),
/etc/docker/certs.d/<host>/ca.crt,或 ~/.config/containers/certs.d/<host>/ca.crt 给保镖的.
身份访问符过期,所以存储 docker login 停止工作; a dik_ API密钥 CI.
工作量的参考文献
推向登记处的公共来源(url 上表),但请在
在您所部署的工作量中, 组内牵引主机: 租户主机从
tenant-registry.di-runtime-<tenant>.svc (无端口),带有由平台管理的牵引证书,而非
从公共来源,这是主机无法使用的网关或端口前端地址。 两者
名称服务于同一寄存器 :
oras push registry.acme.localhost:28180/web:1.0.0 ... # push (your credential)
# workload component image:
tenant-registry.di-runtime-acme.svc/web@sha256:<digest> # pull (the tenant's hosts)
/v1/deploy 财务报告和审定财务报表 /v1/deploy/preview 拒绝 (422其组件或服务图像的捆绑
命名公共来源和问题 detail 提供组内引用来取而代之.
图标
login --controller <url> [--account <tenant>] [--api-key <key>] [--ca-file <pem> | --no-ca] [--no-browser]
logout | whoami
deploy preview|apply --env <prod|staging> --bundle <file>
logs --service <name> --env <env> [--deployment <id>] [--follow] [--since <dur>] [--tail <n>]
services create <keyvalue|messaging|blobstore|postgres|egress> --name <name> --env <env> [--class] [--storage] [--memory] [--cpu] [--deletion-policy] [--destination]
services delete --name <name> --env <env>
deployments list|stats --env <env> [--service <name>]
deployments rollback --service <name> --env <env> [--to <id>]
deployments remove --service <name> --env <env>
secrets|vars list|set|update|unset <name> --env <env> [--from-file <path|->]
registry [info] | registry login [--config <file> | --with <docker|podman|oras>]
registry logout [--host <host>] [--config <file> | --with <docker|podman|oras>]
proxy --service <name> --env <env> [--port <n>]
init [name] [--dir <path>] [--name <name>] [--force]
共享旗帜 : --env, (中文(简体) ), --json, (中文(简体) ), --account (或 DI_TENANT_ACCOUNT,或磁盘上唯一的登录).
没有象征性的辩论。 秘密和 var 值来自 --from-file 或 stdin( 单数) (-因此他们
远离空壳历史. secrets unset 在部署的工作量注入时失败
机密性; vars unset 成功但打印 warning: … 指定输入的已部署工作量
(原始内容存档于2018-10-21). the env's vars (platform#100). deployments remove 删除服务的工作量、约束和
在那个洞穴里部署历史; services delete 以 409 失败, 而任何部署都会绑定
服务,不管它是什么 --deletion-policy,仅决定平台是否保存数据
(平台#98). init 写入最小的 二框架种子, 并创建没有平台
资源.
登录
login --controller <url> 询问控制器的一次公开操作( o)GET /v1/auth/info用于
然后运行 RFC 8252 流量: a
自由端口的回回收听器是重定向URI,浏览器在发行者处的符号,以及
代码与 PKCE 验证器和 client_id 只是,没有秘密。 身份服务器必须
注册该客户端( e)AUTH_CLI_CLIENT_ID; 任何端口的回路方向匹配). 标志是
存储于 $DI_FRAMEWORK_HOME/credentials.json 与发行人和客户端 id; 在一个
在下一个命令之前刷新过期分钟 logout 撤销刷新符号 :
并告诉控制器. --api-key 跳过浏览器; --no-browser 打印 URL
而不是打开它.
主计长 CA
租户控制员向TLS提供租户自己CA(ConfigMap)的证明
tenant-controller-ca键 ca.crt) (中文(简体) ). login --ca-file <ca.crt> 相信它,在公众之上
根,用于每次呼叫控制器和登记册检查。 CA 和
证书为 controller.certificateAuthorityData (Base64 PEM,控制台写作),
所以以后的命令不需要旗帜, 和以后 login 到同一控制器 URL 保存它。 之后
CA 旋转, 重新登录新的 --ca-file,或与 --no-ca 将存储的 CA 和
依赖系统根或 NODE_EXTRA_CA_CERTS. 身份签发者的电话不使用.
NODE_EXTRA_CA_CERTS=<ca.crt> 仍在全过程工作。 不被信任的证书链
失败 tls: 错误指定两个选项; 过期或被撤销的证书没有
得到这个提示.
飞行员还没有做的
- 构建组件并制作捆绑:
deploy发送捆绑文件 。 CLI 边 生产它的建筑与cli-plugin-platform而这是下一步. - 控制器 :
../tenant-auth服务services create财务报告和审定财务报表services proxy; 操作它 尚未执行答复501。 控制器会增加合同背后的终点,从src/api/generated。 。 。 . - 这个
proxy会话 URL 是一个 HTTP 传递通过控制器在文档外服务( )/v1/services/<service>/proxy/<session>/...; WebSocket 尚未支持。 会话 URL 取自到的呼叫器主机( 控制器没有配置公共 URL ) ; 传递通道使用 60 s 闲置超时, 保持相对Location在会话 URL 下重定向,并将每个请求标为外部X-Forwarded-*因此,工作量控制路径保持关闭。 它发出Host: <service>-<env>(会话地洞),主机部署道设置为:config.host在捆绑上wasi:http主机接口; 捆绑必须离开config.host写出或设定到这个值.