@ crossdelta/ 基础设施
对向 DigitalOcean Kubernetes (DOKS) (英语)。您将每项服务描述为一个打入的配置对象,软件包生成部署、服务、入侵、秘密、健康探测器和滚动更新策略.
为在DOKS上运行TypeScript微服务的团队所建,有NATS JetStream,GHCR和Pulumi. 如果这是你的堆栈, 这可以节省真正的锅炉板。 如果不是,你可能更好 与平地普鲁米或赫尔姆.
何时使用
- 您将多种类型脚本服务部署到一个 数字海洋 Kubernetes集群
- 你用这个 普鲁米 (不是Terraform,不是仅Helm)用于基础设施
- 您需要每个服务一个配置对象, 而不是 K8s 资源声明的 ~ 150行
- 你需要NATS JetStream,NGINX入侵,cert-manager, 或者凯迪作为反向代理
当不使用时
- AWS/GCP/祖尔:只有DOKS被执行. EKS/AKS/GKE不支持.
- 平地或平地螺旋桨:这是只用普鲁米.
- 非倾向设置:软件包为您作出选择(Helm图表版本,部署策略,DO特定说明). 需要完全控制时,直接使用普鲁米.
- 单一服务项目: 管理费对于一项服务不值得.
安装
npm install @crossdelta/infrastructure @pulumi/pulumi @pulumi/kubernetes
# For DOKS cluster creation:
npm install @pulumi/digitalocean
# For NATS stream deployment (optional):
npm install @crossdelta/cloudevents
包括什么
| 模块 | 它会做什么 |
|---|---|
| 组 | createDOKSCluster(), (中文(简体) ), createVPC(), (中文(简体) ), createK8sProviderFromKubeconfig() |
| 工作量 | deployK8sService(), (中文(简体) ), deployK8sServices(), (中文(简体) ), createNamespace(), (中文(简体) ), createImagePullSecret() |
| NGINX侵略 | deployNginxIngress() 通过Helm(图 v4.11.3) |
| 证书管理器 | deployCertManager() 通过Helm(图v1.16.2) |
| 海军 | deployNats() 通过Helm(图v1.2.6), buildNatsUrl() |
| 凯蒂 | deployCaddy(), (中文(简体) ), generateCaddyfile() 使用点播 TLS 的反向代理 |
| 流线 | collectStreamDefinitions(), (中文(简体) ), deployStreams(), (中文(简体) ), materializeStreams() (NATS喷气相机) |
| 服务发现 | discoverServiceConfigs() 自动发现配置 infra/services/*.ts |
| 本地开发 | generateComposeYaml(), k3d 集群脚本 |
| 国 际 | generate-env 生成 .env.local 从 Pulumi 配置 + 服务发现 |
快速启动
一个 index.ts 提供集群、运行时间组件和所有服务:
import {
createDOKSCluster,
createVPC,
createNamespace,
deployRuntime,
deployK8sServices,
discoverServiceConfigs,
} from '@crossdelta/infrastructure'
const vpc = createVPC({ name: 'my-vpc', region: 'fra1' })
const { provider } = createDOKSCluster({
name: 'my-cluster',
vpcUuid: vpc.id,
nodePool: { name: 'default', size: 's-4vcpu-8gb', nodeCount: 1 },
})
createNamespace(provider, 'my-namespace')
const runtime = deployRuntime(provider, 'my-namespace', {
nats: { enabled: true, config: { replicas: 1, jetstream: { enabled: true } } },
ingress: { enabled: true },
certManager: { enabled: true, config: { email: '[email protected]' } },
})
const configs = discoverServiceConfigs('services')
deployK8sServices(provider, 'my-namespace', configs)
服务配置
每个文件在 infra/services/ 导出一个配置对象。 软件包从中获取所有 K8s 资源 :
import { ports, type K8sServiceConfig } from '@crossdelta/infrastructure'
const config: K8sServiceConfig = {
name: 'my-service',
ports: ports().http(4000).public().build(),
healthCheck: { httpPath: '/health' },
ingress: { path: '/api', host: 'example.com' },
env: { DATABASE_URL: dbUrl },
secrets: { API_KEY: apiKey },
resources: {
requests: { cpu: '50m', memory: '64Mi' },
limits: { cpu: '200m', memory: '256Mi' },
},
}
export default config
见 K8sServiceConfig 所有字段:复制品、卷、策略、容器Env、标签、说明、服务Type等.
从 replicas: 2 向上服务还获得地形分布限制(每个节点一个吊舱, ScheduleAnyway)和一项可能中断的预算(maxUnavailable: 1) (中文(简体) ). 在两个复制品下面也没有创造出来,因为一个复制品上的 " PodDisruption " 预算会阻碍每个节点的排出。 设定 highAvailability: false 以选择一个多replica服务,例如当其吊舱共享ReadWriteOnce卷时.
共享集群( 多层)
Pin 数字海洋资源名称 clusterName编号 :vpcName 用于在 Pulumi 堆栈上共享一个集群:
// Stage stack owns the cluster
const { provider, kubeconfig } = createDOKSCluster({
name: 'my-cluster',
clusterName: 'my-cluster',
vpcUuid: vpc.id,
nodePool: { name: 'default', size: 's-4vcpu-8gb', nodeCount: 1 },
})
export const clusterKubeconfig = kubeconfig
// Production stack references stage
const stageStack = new StackReference('org/project/stage')
const provider = createK8sProviderFromKubeconfig(
'production',
stageStack.getOutput('clusterKubeconfig'),
)
生成- env CLI
生成 .env.local 从普鲁米的秘密和发现的服务配置:
npx generate-env # defaults to stage stack
npx generate-env --stack=production
npx generate-env --no-pulumi # skip Pulumi, only service discovery
限制
- 仅限DOKS. 没有实施其他云提供者.
- Helm图表版本被固定. NGINX v 4.11.3, cert-manager v 1.16.2, NATS v1.2.6. 尚未覆盖选项 .
- 服务发现假定一项公约:
infra/services/*.ts文件为export default config。 。 。 . @crossdelta/cloudevents是一个很难依赖的 即使你不使用NATS流 https://github.com/orderboss/platform/issues/TBD 互联网档案馆的存檔,存档日期2013-12-02。 。 。 .- Caddy 部署使用再创建策略 (RWO PVC与滚动更新不相容).
许可证
麻省理工学院 横跨德尔塔