Kubernetes
在 Kubernetes 上运行 ObjectOS 镜像 —— 一个参考 Deployment、在正确端点上的正确探针、来自 Secret 的密钥,以及在各副本之间必须保持一致的内容。
没有 Helm chart,也没有官方清单集。镜像在 Kubernetes 上无需修改即可运行, 所以本页给出一个最小参考,以及你的清单必须保持的属性 —— 每一项都是运行时所依赖 或强制执行的东西。Docker 上的一切都同样适用:同一个镜像、 同样的变量、同样的升级规则。
参考 Deployment
Community 镜像的一个副本,密钥来自一个 Secret,每个探针各有自己的端点:
apiVersion: apps/v1
kind: Deployment
metadata:
name: objectos
spec:
replicas: 1
selector:
matchLabels: { app: objectos }
template:
metadata:
labels: { app: objectos }
spec:
containers:
- name: objectos
image: registry.example.com/crm:2.2.2 # your image FROM ghcr.io/objectstack-ai/objectstack:X.Y.Z
ports:
- containerPort: 8080
envFrom:
- secretRef:
name: objectos-secrets # OS_DATABASE_URL, OS_AUTH_SECRET, OS_SECRET_KEY
livenessProbe:
httpGet: { path: /api/v1/health, port: 8080 }
periodSeconds: 30
readinessProbe:
httpGet: { path: /api/v1/ready, port: 8080 }
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: objectos
spec:
selector: { app: objectos }
ports:
- port: 80
targetPort: 8080需要保持的属性
镜像被精确固定
按 @sha256: 摘要引用镜像,并在旁边写上读取它时对应的确切版本,绝不使用滚动标签。
在编排器上,这比在单台主机上更重要:拉取策略加上会移动的标签,意味着"同一个"
Deployment 的两个 Pod 可能运行不同的构建。滚动标签随每次发布而移动,确切的版本
标签在该版本被重新构建时也会移动;参见Docker → 固定镜像。
探针指向正确的端点
/api/v1/health 是存活探针。/api/v1/ready 是就绪探针。在运行时启动期间、关闭
期间,以及任何数据驱动停止响应时,就绪端点都会返回 503 —— 这样滚动重启可以
干净地排空,而失去数据库的 Pod 会离开 Service 的端点,而不是返回错误。
不要把就绪检查放到存活探针上。否则一次数据库故障会同时重启所有 Pod,而这并不能
让数据库恢复,配置故障也会表现为 CrashLoopBackOff,而不是故障本身。数据库恢复
后,Pod 会自行恢复:就绪探针在数据库不可用时把它们排空,之后再重新接纳它们。
密钥来自 Secret
OS_AUTH_SECRET 和 OS_SECRET_KEY 应放在一个 Secret 中,只生成一次,并由每个
Pod 挂载 —— 绝不按 Pod 生成,绝不烘焙进镜像。一个自己生成加密密钥的 Pod 会在下次
重新调度时丢失它,用它加密的所有密钥也随之丢失。
业务数据存放在集群之外
把部署指向一个托管的 PostgreSQL。集群内的持久卷并不是业务数据该待的地方。
Community 上只用一个副本
Community 上的协调是进程内的,所以保持 replicas: 1。声明更多副本
(OS_CLUSTER_REPLICAS 大于 1)在没有许可证时会拒绝启动。多节点是一项企业版
许可证能力,而 Enterprise 套件目前只运行一个副本 —— 见下文。
入口
在边缘终止 TLS,并把 OS_AUTH_URL 和 OS_TRUSTED_ORIGINS 设为公网地址。在
OS_CORS_ORIGIN 中显式列出跨源前端;绝不把通配符源与携带凭据的请求一起使用。当
运行时位于代理之后时,确保代理用它自己的 forwarded-for 头替换客户端提供的任何同类
头 —— 速率限制和审计轨迹都依赖于调用者身份是可信的。
企业版额外提供
我们提供的是 Compose 技术栈,而不是 Helm chart 或 Kubernetes 清单。你的版本中 附带的部署包才是受支持、经过测试的配置。在 Kubernetes 上,清单要你自己组装,所以 也要重现该技术栈的这些属性。编排器不会改变部署有权获得的任何东西。
镜像按摘要固定
在 Pod spec 中按 @sha256: 摘要引用企业版镜像。拉取镜像需要一个保存你的许可证
镜像仓库凭据的拉取密钥。
迁移在副本提供服务之前运行一次,并运行到完成
Compose 技术栈运行一个一次性的迁移容器,它必须在任何应用副本启动之前完成。在 Kubernetes 上,这是一个 Job(或等效的服务前钩子),而不是每个副本上的 init 容器 —— 关键在于模式变更只运行一次,而不是每个副本并行各运行一次。镜像正是为此 支持一种"迁移后退出"的模式;部署包中点名了对应的变量。
每个副本都使用完全相同的密钥
目前请让 Enterprise 套件保持一个副本。 它没有接入集群驱动,声明多于一个副本
(OS_CLUSTER_REPLICAS 大于 1)会按设计拒绝启动:进程内协调器不会在副本之间共享
锁、计数器或发布 / 订阅。多节点通过许可证合同(maxNodes)激活,并不是高可用
承诺;如果你需要,请联系销售。无论副本数是多少:
- 使用一个共享的加密密钥(
OS_SECRET_KEY)。没有它,每个副本会自己生成一个, 而这些密钥会互不相同。 - 认证密钥同样必须在运行时所在的每个地方都完全相同。
许可证和云端姿态作用于整个部署
许可证密钥、许可证模式和云端姿态设置都是部署身份的一部分。它们在每个副本中都 必须相同,其受支持的组合会在启动时检查 —— 不匹配的 Pod 不会降级运行,而是 直接退出。组合参见物理隔离。
滚动升级就是更换摘要
升级就是更换镜像摘要,并让迁移 Job 在新副本提供服务之前运行到完成。模式迁移只能 向前:回滚镜像并不会回滚模式,所以先做备份,并保留上一个摘要以便回滚。应用本身 如果以已发布产物的形式交付,则独立于镜像进行版本管理 —— 参见 部署中的运行形态。