alasio 6.0.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/cli/src/branches.js +106 -31
  2. package/dist/cli/src/branches.js.map +1 -1
  3. package/dist/cli/src/cluster/docker-engine.js +6 -4
  4. package/dist/cli/src/cluster/docker-engine.js.map +1 -1
  5. package/dist/cli/src/cluster/docker.js +49 -10
  6. package/dist/cli/src/cluster/docker.js.map +1 -1
  7. package/dist/cli/src/cluster/host.js +45 -19
  8. package/dist/cli/src/cluster/host.js.map +1 -1
  9. package/dist/cli/src/cluster/k3s.js +104 -5
  10. package/dist/cli/src/cluster/k3s.js.map +1 -1
  11. package/dist/cli/src/cluster/node.js +102 -51
  12. package/dist/cli/src/cluster/node.js.map +1 -1
  13. package/dist/cli/src/cluster/tar.js +43 -1
  14. package/dist/cli/src/cluster/tar.js.map +1 -1
  15. package/dist/cli/src/commands/branch.js +7 -3
  16. package/dist/cli/src/commands/branch.js.map +1 -1
  17. package/dist/cli/src/commands/init.js +54 -4
  18. package/dist/cli/src/commands/init.js.map +1 -1
  19. package/dist/cli/src/commands/lake.js +40 -6
  20. package/dist/cli/src/commands/lake.js.map +1 -1
  21. package/dist/cli/src/commands/restore-filer-store.js +56 -13
  22. package/dist/cli/src/commands/restore-filer-store.js.map +1 -1
  23. package/dist/cli/src/commands/status.js +182 -10
  24. package/dist/cli/src/commands/status.js.map +1 -1
  25. package/dist/cli/src/commands/up.js +40 -3
  26. package/dist/cli/src/commands/up.js.map +1 -1
  27. package/dist/cli/src/commands/upgrade.js +22 -6
  28. package/dist/cli/src/commands/upgrade.js.map +1 -1
  29. package/dist/cli/src/config.js +20 -8
  30. package/dist/cli/src/config.js.map +1 -1
  31. package/dist/cli/src/cpu-baseline.js +97 -0
  32. package/dist/cli/src/cpu-baseline.js.map +1 -0
  33. package/dist/cli/src/install.js +94 -13
  34. package/dist/cli/src/install.js.map +1 -1
  35. package/dist/cli/src/kept-releases.js +59 -0
  36. package/dist/cli/src/kept-releases.js.map +1 -0
  37. package/dist/cli/src/kube/api.js +9 -2
  38. package/dist/cli/src/kube/api.js.map +1 -1
  39. package/dist/cli/src/kube/apply.js +1 -1
  40. package/dist/cli/src/kube/apply.js.map +1 -1
  41. package/dist/cli/src/kube/rollout.js +79 -12
  42. package/dist/cli/src/kube/rollout.js.map +1 -1
  43. package/dist/cli/src/lake.js +124 -0
  44. package/dist/cli/src/lake.js.map +1 -0
  45. package/dist/cli/src/manifests/admission.js +183 -24
  46. package/dist/cli/src/manifests/admission.js.map +1 -1
  47. package/dist/cli/src/manifests/alasio.js +198 -27
  48. package/dist/cli/src/manifests/alasio.js.map +1 -1
  49. package/dist/cli/src/manifests/branch.js +2 -1
  50. package/dist/cli/src/manifests/branch.js.map +1 -1
  51. package/dist/cli/src/manifests/collector.js +229 -122
  52. package/dist/cli/src/manifests/collector.js.map +1 -1
  53. package/dist/cli/src/manifests/common.js +23 -8
  54. package/dist/cli/src/manifests/common.js.map +1 -1
  55. package/dist/cli/src/manifests/config.js +254 -21
  56. package/dist/cli/src/manifests/config.js.map +1 -1
  57. package/dist/cli/src/manifests/grafana.js +18 -6
  58. package/dist/cli/src/manifests/grafana.js.map +1 -1
  59. package/dist/cli/src/manifests/index.js +15 -6
  60. package/dist/cli/src/manifests/index.js.map +1 -1
  61. package/dist/cli/src/manifests/juicefs-csi.js +7 -6
  62. package/dist/cli/src/manifests/juicefs-csi.js.map +1 -1
  63. package/dist/cli/src/manifests/keda.js +2 -1
  64. package/dist/cli/src/manifests/keda.js.map +1 -1
  65. package/dist/cli/src/manifests/lake.js +340 -73
  66. package/dist/cli/src/manifests/lake.js.map +1 -1
  67. package/dist/cli/src/manifests/log.js +298 -0
  68. package/dist/cli/src/manifests/log.js.map +1 -0
  69. package/dist/cli/src/manifests/neon.js +282 -66
  70. package/dist/cli/src/manifests/neon.js.map +1 -1
  71. package/dist/cli/src/manifests/network-policies.js +211 -45
  72. package/dist/cli/src/manifests/network-policies.js.map +1 -1
  73. package/dist/cli/src/manifests/node-agent.js +116 -0
  74. package/dist/cli/src/manifests/node-agent.js.map +1 -0
  75. package/dist/cli/src/manifests/object-store.js +42 -10
  76. package/dist/cli/src/manifests/object-store.js.map +1 -1
  77. package/dist/cli/src/manifests/priorities.js +1 -0
  78. package/dist/cli/src/manifests/priorities.js.map +1 -1
  79. package/dist/cli/src/manifests/scalers.js.map +1 -1
  80. package/dist/cli/src/manifests/valkey.js +1 -1
  81. package/dist/cli/src/manifests/webhook.js +102 -0
  82. package/dist/cli/src/manifests/webhook.js.map +1 -0
  83. package/dist/cli/src/neon-storage.js +115 -0
  84. package/dist/cli/src/neon-storage.js.map +1 -0
  85. package/dist/cli/src/release.js +9 -6
  86. package/dist/cli/src/release.js.map +1 -1
  87. package/dist/cli/src/secrets.js +45 -4
  88. package/dist/cli/src/secrets.js.map +1 -1
  89. package/dist/cli/src/target.js +1 -1
  90. package/dist/cli/src/target.js.map +1 -1
  91. package/dist/cli/src/telegram.js +56 -10
  92. package/dist/cli/src/telegram.js.map +1 -1
  93. package/dist/cli/src/webhook.js +182 -0
  94. package/dist/cli/src/webhook.js.map +1 -0
  95. package/dist/cluster/node/pins.json +11 -2
  96. package/dist/neon/control/branches.js +146 -22
  97. package/dist/neon/control/branches.js.map +1 -1
  98. package/dist/neon/control/endpoints.js +117 -0
  99. package/dist/neon/control/endpoints.js.map +1 -0
  100. package/dist/neon/control/jwt.js +16 -3
  101. package/dist/neon/control/jwt.js.map +1 -1
  102. package/dist/neon/control/scram.js +13 -1
  103. package/dist/neon/control/scram.js.map +1 -1
  104. package/dist/neon/control/secrets.js +88 -14
  105. package/dist/neon/control/secrets.js.map +1 -1
  106. package/dist/src/kube/config.js +27 -3
  107. package/dist/src/kube/config.js.map +1 -1
  108. package/dist/src/kube/sandbox-shape.js +49 -3
  109. package/dist/src/kube/sandbox-shape.js.map +1 -1
  110. package/dist/src/node-agent/names.js +140 -0
  111. package/dist/src/node-agent/names.js.map +1 -0
  112. package/dist/src/telegram/deliveries.js +40 -0
  113. package/dist/src/telegram/deliveries.js.map +1 -0
  114. package/package.json +2 -2
  115. package/dist/cluster/node/config-v3.toml.tmpl +0 -12
@@ -1,108 +1,375 @@
1
+ import { computeId, MAIN, replicaId } from "../../../neon/control/branches.js";
2
+ import { memoryBytes } from "../capacity.js";
1
3
  import { imageReference } from "../images.js";
2
- import { componentName, lakeRuns, MAIN_ENVIRONMENT, neonName, ONE, otelEnv, replicasOf, restrictedContainer, s3Endpoint, selectorLabels, stackLabels, stackPodSpec, } from "./common.js";
4
+ import { environmentName, INTAKE_GROUP, lakeWakeTopic, LOG_BROKERS, loaderGroup, loaderLogSecret, logPrincipalSecret, TELEMETRY_TOPICS } from "./log.js";
5
+ import { componentName, lakeRuns, MAIN_ENVIRONMENT, NAMESPACE, neonName, otelEnv, replicasOf, restrictedContainer, s3Endpoint, selectorLabels, stackLabels, stackPodSpec, } from "./common.js";
6
+ import { replicaBudget, spread } from "./disruption.js";
7
+ import { PROXY_HOST, PROXY_PORT } from "./neon.js";
8
+ import { FILER, MASTER } from "./object-store.js";
3
9
  import { priority } from "./priorities.js";
10
+ import { scaledObject } from "./scalers.js";
4
11
  import { verticalPodAutoscaler } from "./sizing.js";
5
- /** The port its telemetry intake takes OTLP over HTTP on. */
6
- export const LAKE_INTAKE_PORT = 4318;
7
- /** The port its query endpoint takes queries on. */
12
+ /** The port its readers take queries on. */
8
13
  export const LAKE_QUERY_PORT = 8090;
14
+ /** The port the loader and the intake serve their health and metrics on. */
15
+ export const LAKE_METRICS_PORT = 9464;
16
+ /** Its components: the loader's, the readers', maintenance's and the intake's, each its Deployment's or CronJobs' name's end. */
17
+ export const LOADER_COMPONENT = "lake-loader";
18
+ export const QUERY_COMPONENT = "lake-query";
19
+ export const MAINTENANCE_COMPONENT = "lake-maintenance";
20
+ /** The reconciliation's, apart from maintenance's, as the bundled object store's filer, masters and volume servers admit it alone of the lake (./network-policies.ts). */
21
+ export const RECONCILE_COMPONENT = "lake-reconcile";
22
+ export const INTAKE_COMPONENT = "lake-intake";
23
+ /** When the telemetry's files are merged: hourly, away from the hour's other passes. */
24
+ const MERGE_SCHEDULE = "47 * * * *";
9
25
  /**
10
- * The lake's objects, when it runs, which is beside Neon. A branch environment's is the
11
- * branch's copy of the catalog on main's files, which it reads where they are and writes
12
- * beside them, and maintains none of: main's maintenance keeps every file while Neon has
13
- * branches, which it asks neon-control about (neon/lake/src/sync.ts). A branch's has no
14
- * query endpoint, as it has no Grafana: what it sends is read in main's lake, tagged.
26
+ * How many queries each reader may have taken and not answered before KEDA gives the pool
27
+ * another: one running and one waiting, as a dashboard opened asks a few at once.
15
28
  */
16
- export function lakeObjects(config, environment = MAIN_ENVIRONMENT) {
17
- if (!lakeRuns(config))
18
- return [];
19
- const name = componentName("lake");
20
- const main = environment.branch === null;
21
- const service = {
22
- apiVersion: "v1",
23
- kind: "Service",
24
- metadata: { name, namespace: environment.namespace, labels: stackLabels("lake") },
25
- spec: {
26
- selector: selectorLabels("lake"),
27
- ports: [{ name: "metrics", port: 9464 }, { name: "otlp-http", port: LAKE_INTAKE_PORT }, ...(main ? [{ name: "query", port: LAKE_QUERY_PORT }] : [])],
28
- },
29
- };
30
- // Where the lake is, which both containers open it at.
31
- const lakeEnv = [
32
- { name: "LAKE_DATABASE_HOST", value: neonName("compute") },
33
- { name: "LAKE_DATABASE_PORT", value: "55433" },
29
+ const QUERIES_PER_READER = 2;
30
+ /**
31
+ * How far behind the intake's group may be on each partition, in records, before KEDA
32
+ * gives it another replica: half of what a replica writes in a batch at most
33
+ * (neon/lake/src/intake.ts's BATCH), a backlog, as after an outage, rather than
34
+ * the stack's ordinary minutes, which are some tens of records.
35
+ */
36
+ const LAG_THRESHOLD = 1_000;
37
+ /** Where the lake is, which each of its components opens it at: its environment's compute, through Neon's proxy, which wakes it if it sleeps. */
38
+ function lakeEnv(config, environment = MAIN_ENVIRONMENT) {
39
+ return [
40
+ { name: "LAKE_DATABASE_HOST", value: PROXY_HOST },
41
+ { name: "LAKE_DATABASE_PORT", value: String(PROXY_PORT) },
42
+ { name: "LAKE_DATABASE_ENDPOINT", value: computeId(environment.branch ?? MAIN) },
34
43
  { name: "LAKE_DATA_PATH", value: `s3://${config.objectStore.buckets.lake}/` },
35
44
  { name: "LAKE_S3_ENDPOINT", value: s3Endpoint(config) },
36
45
  { name: "HOME", value: "/tmp" },
37
46
  ];
38
- const secret = (variable) => ({ name: variable, valueFrom: { secretKeyRef: { name, key: variable } } });
39
- const image = imageReference(config.images.lake);
40
- // Its query endpoint, which Grafana and alasio lake read main's lake through; a branch environment has neither.
41
- const query = {
42
- name: "query",
43
- image,
44
- imagePullPolicy: config.images.pullPolicy,
45
- command: ["node", "src/endpoint.ts"],
46
- env: [
47
- ...lakeEnv,
48
- ...["LAKE_READER_PASSWORD", "LAKE_READER_S3_KEY", "LAKE_READER_S3_SECRET", "LAKE_QUERY_TOKEN"].map(secret),
49
- { name: "LAKE_QUERY_PORT", value: String(LAKE_QUERY_PORT) },
50
- ...otelEnv(config, environment),
51
- { name: "OTEL_SERVICE_NAME", value: "alasio-lake-query" },
52
- ],
53
- ports: [{ name: "query", containerPort: LAKE_QUERY_PORT }],
54
- // It serves whether or not the lake can be read, so the intake beside it is not held back.
55
- readinessProbe: { httpGet: { path: "/healthz", port: "query" }, periodSeconds: 10 },
56
- livenessProbe: { httpGet: { path: "/healthz", port: "query" }, periodSeconds: 30, failureThreshold: 3 },
57
- securityContext: { ...restrictedContainer(), readOnlyRootFilesystem: true },
58
- resources: config.lake.query.resources,
59
- volumeMounts: [{ name: "query-tmp", mountPath: "/tmp" }],
47
+ }
48
+ /** `variable` of the Secret `secret`'s key `key`. */
49
+ const fromSecret = (variable, secret, key) => ({ name: variable, valueFrom: { secretKeyRef: { name: secret, key } } });
50
+ /** The lake's writers' credentials, from its Secret: its role's password, and the object store's identity of the lake's. */
51
+ const writerSecrets = () => ["LAKE_DATABASE_PASSWORD", "LAKE_S3_KEY", "LAKE_S3_SECRET"].map((variable) => fromSecret(variable, componentName("lake"), variable));
52
+ /** A probe of `path` on the metrics port. */
53
+ const probe = (path) => ({ httpGet: { path, port: "metrics" } });
54
+ /** KEDA's reading of the log as the `scaler` principal, which may describe the groups and topics it scales on and read none, in `namespace`, the Secret's copy there. */
55
+ function logAuthentication(name, namespace, component) {
56
+ const scaler = logPrincipalSecret("scaler");
57
+ return {
58
+ apiVersion: "keda.sh/v1alpha1",
59
+ kind: "TriggerAuthentication",
60
+ metadata: { name, namespace, labels: stackLabels(component) },
61
+ spec: { secretTargetRef: ["sasl", "username", "password"].map((parameter) => ({ parameter, name: scaler, key: parameter })) },
60
62
  };
61
- // Live while its loads are not failing for long; ready once its intake has the lake open.
62
- const probe = (path) => ({ httpGet: { path, port: "metrics" } });
63
+ }
64
+ /** A trigger of how far `group` is behind on `topic`, past `threshold` records a partition, authenticated as `authentication` says. */
65
+ const lagTrigger = (group, topic, threshold, authentication) => ({
66
+ type: "kafka",
67
+ metadata: { bootstrapServers: LOG_BROKERS, consumerGroup: group, topic, lagThreshold: String(threshold), activationLagThreshold: "0", offsetResetPolicy: "earliest" },
68
+ authenticationRef: { name: authentication },
69
+ });
70
+ /**
71
+ * The loader of `environment`: woken by KEDA once its group is behind on the environment's
72
+ * wake topic at all, and back to none once it has caught up. A group that never committed
73
+ * is as far behind as the topic is long, so the first record wakes it.
74
+ */
75
+ function loaderObjects(config, environment) {
76
+ const name = componentName(LOADER_COMPONENT);
77
+ const { namespace } = environment;
78
+ const topic = lakeWakeTopic(environmentName(environment));
79
+ const group = loaderGroup(environmentName(environment));
80
+ const log = loaderLogSecret(environment);
81
+ const { scaling, resources } = config.lake.loader;
63
82
  const deployment = {
64
83
  apiVersion: "apps/v1",
65
84
  kind: "Deployment",
66
- metadata: { name, namespace: environment.namespace, labels: stackLabels("lake") },
85
+ metadata: { name, namespace, labels: stackLabels(LOADER_COMPONENT) },
67
86
  spec: {
68
- ...replicasOf(ONE),
87
+ ...replicasOf(scaling),
69
88
  // One loader: two would race each other's loads.
70
89
  strategy: { type: "Recreate" },
71
- selector: { matchLabels: selectorLabels("lake") },
90
+ selector: { matchLabels: selectorLabels(LOADER_COMPONENT) },
72
91
  template: {
73
- metadata: { labels: stackLabels("lake") },
92
+ metadata: { labels: stackLabels(LOADER_COMPONENT) },
74
93
  spec: {
75
- // Main's serves Grafana's alerts, which never sleep; a branch's nothing.
76
- ...priority(main ? "floor" : "component"),
94
+ ...priority("component"),
77
95
  ...stackPodSpec(config),
96
+ // A load under way finishes; its records, untold, are read again.
78
97
  terminationGracePeriodSeconds: 60,
79
- containers: [
80
- {
81
- name: "lake",
82
- image,
98
+ containers: [{
99
+ name: "loader",
100
+ image: imageReference(config.images.lake),
83
101
  imagePullPolicy: config.images.pullPolicy,
84
102
  env: [
85
- ...lakeEnv,
86
- { name: "LAKE_RETENTION_DAYS", value: String(config.telemetry.retentionDays) },
87
- // Main's keeps its files while Neon has branches, whose lakes read them; a branch's is never maintained.
88
- ...(main ? [{ name: "LAKE_BRANCHES_URL", value: `http://${neonName("control")}:8080/branches` }] : [{ name: "LAKE_MAINTENANCE_HOURS", value: "0" }]),
103
+ ...lakeEnv(config, environment),
104
+ ...writerSecrets(),
105
+ sourceEnv(environment),
106
+ { name: "LOG_BROKERS", value: LOG_BROKERS },
107
+ fromSecret("LOG_USERNAME", log, "username"),
108
+ fromSecret("LOG_PASSWORD", log, "password"),
109
+ { name: "LAKE_WAKE_TOPIC", value: topic },
110
+ { name: "LAKE_WAKE_GROUP", value: group },
89
111
  ...otelEnv(config, environment),
112
+ { name: "OTEL_SERVICE_NAME", value: "alasio-lake-loader" },
90
113
  ],
91
- envFrom: [{ secretRef: { name } }],
92
- ports: [{ name: "metrics", containerPort: 9464 }, { name: "otlp-http", containerPort: LAKE_INTAKE_PORT }],
114
+ ports: [{ name: "metrics", containerPort: LAKE_METRICS_PORT }],
115
+ // Live while its loads are not failing for long; ready once it has the lake open, under its lock, and its member of the group.
93
116
  readinessProbe: { ...probe("/readyz"), periodSeconds: 10 },
94
117
  livenessProbe: { ...probe("/healthz"), initialDelaySeconds: 60, periodSeconds: 30, failureThreshold: 3 },
95
118
  securityContext: { ...restrictedContainer(), readOnlyRootFilesystem: true },
96
- resources: config.lake.resources,
119
+ resources,
120
+ volumeMounts: [{ name: "tmp", mountPath: "/tmp" }],
121
+ }],
122
+ volumes: [{ name: "tmp", emptyDir: { sizeLimit: "4Gi" } }],
123
+ },
124
+ },
125
+ },
126
+ };
127
+ const scaledObjects = scaledObject(deployment, scaling, [lagTrigger(group, topic, 1, name)]);
128
+ return [deployment, ...(scaledObjects.length > 0 ? [logAuthentication(name, namespace, LOADER_COMPONENT), ...scaledObjects] : []), verticalPodAutoscaler(deployment, "InPlace")];
129
+ }
130
+ /**
131
+ * Where `environment`'s alasio's database is read from, which its loader and its
132
+ * reconciliation load from: its read replica, which takes nothing of what alasio's own
133
+ * compute serves alasio.
134
+ */
135
+ const sourceEnv = (environment) => ({ name: "LAKE_SOURCE_ENDPOINT", value: replicaId(environment.branch ?? MAIN) });
136
+ /**
137
+ * What DuckDB is let hold in a container whose memory limit is `limit`: three fifths of it,
138
+ * the rest Node's and the Parquet reader's, which DuckDB's own limit does not count; its
139
+ * own default, where the container has none.
140
+ */
141
+ const duckdbMemory = (limit) => limit ? [{ name: "LAKE_MEMORY_LIMIT", value: `${Math.floor((memoryBytes(limit) * 3) / 5 / 2 ** 20)}MiB` }] : [];
142
+ /**
143
+ * A pass of maintenance's (neon/lake/src/maintain.ts) on `environment`'s lake: its
144
+ * container, given `env` beside where the lake is and its writer's credentials, and its pod
145
+ * template, as a Job of the pass runs it.
146
+ */
147
+ function passTemplate(config, environment, pass, env) {
148
+ return {
149
+ backoffLimit: 2,
150
+ activeDeadlineSeconds: 3600,
151
+ template: {
152
+ metadata: { labels: stackLabels(pass === "reconcile" ? RECONCILE_COMPONENT : MAINTENANCE_COMPONENT) },
153
+ spec: {
154
+ restartPolicy: "Never",
155
+ ...priority("component"),
156
+ ...stackPodSpec(config),
157
+ containers: [{
158
+ name: "maintenance",
159
+ image: imageReference(config.images.lake),
160
+ imagePullPolicy: config.images.pullPolicy,
161
+ command: ["node", "src/maintain.ts", pass],
162
+ env: [
163
+ ...lakeEnv(config, environment),
164
+ ...writerSecrets(),
165
+ ...duckdbMemory(config.lake.maintenance.resources.limits?.["memory"]),
166
+ ...env,
167
+ ...otelEnv(config, environment),
168
+ { name: "OTEL_SERVICE_NAME", value: "alasio-lake-maintenance" },
169
+ ],
170
+ securityContext: { ...restrictedContainer(), readOnlyRootFilesystem: true },
171
+ resources: config.lake.maintenance.resources,
172
+ volumeMounts: [{ name: "tmp", mountPath: "/tmp" }],
173
+ }],
174
+ volumes: [{ name: "tmp", emptyDir: { sizeLimit: "4Gi" } }],
175
+ },
176
+ },
177
+ };
178
+ }
179
+ /** Main's maintenance: a CronJob of each of its passes, its daily one on `schedule`, the merge hourly. */
180
+ function maintenanceObjects(config) {
181
+ const cronJob = (pass, schedule) => ({
182
+ apiVersion: "batch/v1",
183
+ kind: "CronJob",
184
+ metadata: { name: componentName(pass === "merge" ? "lake-merge" : MAINTENANCE_COMPONENT), namespace: NAMESPACE, labels: stackLabels(MAINTENANCE_COMPONENT) },
185
+ spec: {
186
+ schedule,
187
+ // A pass waits for the one before it; one missed by more than an hour waits for the next.
188
+ concurrencyPolicy: "Forbid",
189
+ startingDeadlineSeconds: 3600,
190
+ successfulJobsHistoryLimit: 1,
191
+ failedJobsHistoryLimit: 3,
192
+ jobTemplate: {
193
+ spec: passTemplate(config, MAIN_ENVIRONMENT, pass, [
194
+ { name: "LAKE_RETENTION_DAYS", value: String(config.telemetry.retentionDays) },
195
+ // It keeps its files while Neon has branches, whose lakes read them.
196
+ { name: "LAKE_BRANCHES_URL", value: `http://${neonName("control")}:8080/branches` },
197
+ fromSecret("LAKE_BRANCHES_TOKEN", componentName("lake"), "LAKE_BRANCHES_TOKEN"),
198
+ ]),
199
+ },
200
+ },
201
+ });
202
+ return [cronJob("maintain", config.lake.maintenance.schedule), cronJob("merge", MERGE_SCHEDULE)];
203
+ }
204
+ /** The Job of a lake's reconciliation, in its environment's namespace. */
205
+ export const LAKE_RECONCILE = componentName("lake-reconcile");
206
+ /**
207
+ * The reconciliation of `environment`'s lake, main's or a branch environment's, each with a
208
+ * catalog of its own: a Job of maintenance's reconcile pass, which sets its catalog right with
209
+ * the object store where files it names are gone, and loads again from its alasio's database
210
+ * what its transcripts lost (neon/lake/src/reconcile.ts). It is run on demand alone, by alasio
211
+ * lake reconcile and by alasio restore-filer-store, as a pass that changes the catalog
212
+ * on its own would hide a loss a person is to look into.
213
+ */
214
+ export function lakeReconcile(config, environment = MAIN_ENVIRONMENT) {
215
+ return {
216
+ apiVersion: "batch/v1",
217
+ kind: "Job",
218
+ metadata: { name: LAKE_RECONCILE, namespace: environment.namespace, labels: stackLabels(RECONCILE_COMPONENT) },
219
+ spec: {
220
+ ...passTemplate(config, environment, "reconcile", [
221
+ sourceEnv(environment),
222
+ // A branch environment's lake's telemetry is main's as of its branch point, which main's reads again.
223
+ ...(environment.branch === null ? [] : [{ name: "LAKE_BRANCH", value: environment.branch }]),
224
+ // The bundled store's parts, which say whether a file the store fails a read of is gone.
225
+ ...(config.objectStore.bundled.enabled
226
+ ? [
227
+ { name: "LAKE_STORE_FILER_URL", value: `http://${FILER}.${NAMESPACE}.svc:8888` },
228
+ { name: "LAKE_STORE_MASTER_URL", value: `http://${MASTER}.${NAMESPACE}.svc:9333` },
229
+ // Every one of which the masters are to know before their not knowing a volume says it is gone.
230
+ { name: "LAKE_STORE_VOLUME_SERVERS", value: String(config.objectStore.bundled.volumeServers.scaling.min) },
231
+ ]
232
+ : []),
233
+ ]),
234
+ backoffLimit: 0,
235
+ },
236
+ };
237
+ }
238
+ /** Main's readers, their Service, which keeps the lake's name, and the headless one each finds the others by. */
239
+ function queryObjects(config) {
240
+ const name = componentName(QUERY_COMPONENT);
241
+ const { scaling, resources } = config.lake.query;
242
+ const peers = `${name}-peers`;
243
+ const service = {
244
+ apiVersion: "v1",
245
+ kind: "Service",
246
+ metadata: { name: componentName("lake"), namespace: NAMESPACE, labels: stackLabels(QUERY_COMPONENT) },
247
+ spec: { selector: selectorLabels(QUERY_COMPONENT), ports: [{ name: "query", port: LAKE_QUERY_PORT }] },
248
+ };
249
+ // Ready readers alone, each by its address: the pool /pool sums the queues of.
250
+ const headless = {
251
+ apiVersion: "v1",
252
+ kind: "Service",
253
+ metadata: { name: peers, namespace: NAMESPACE, labels: stackLabels(QUERY_COMPONENT) },
254
+ spec: { clusterIP: "None", selector: selectorLabels(QUERY_COMPONENT), ports: [{ name: "query", port: LAKE_QUERY_PORT }] },
255
+ };
256
+ const deployment = {
257
+ apiVersion: "apps/v1",
258
+ kind: "Deployment",
259
+ metadata: { name, namespace: NAMESPACE, labels: stackLabels(QUERY_COMPONENT) },
260
+ spec: {
261
+ ...replicasOf(scaling),
262
+ selector: { matchLabels: selectorLabels(QUERY_COMPONENT) },
263
+ template: {
264
+ metadata: { labels: stackLabels(QUERY_COMPONENT) },
265
+ spec: {
266
+ // They serve Grafana's alerts, which never sleep.
267
+ ...priority("floor"),
268
+ ...stackPodSpec(config),
269
+ ...spread(QUERY_COMPONENT, scaling),
270
+ containers: [{
271
+ name: "query",
272
+ image: imageReference(config.images.lake),
273
+ imagePullPolicy: config.images.pullPolicy,
274
+ command: ["node", "src/endpoint.ts"],
275
+ env: [
276
+ ...lakeEnv(config),
277
+ ...["LAKE_READER_PASSWORD", "LAKE_READER_S3_KEY", "LAKE_READER_S3_SECRET", "LAKE_QUERY_TOKEN"].map((variable) => fromSecret(variable, componentName("lake"), variable)),
278
+ { name: "LAKE_QUERY_PORT", value: String(LAKE_QUERY_PORT) },
279
+ { name: "LAKE_QUERY_PEERS", value: `${peers}.${NAMESPACE}.svc.cluster.local` },
280
+ ...otelEnv(config),
281
+ { name: "OTEL_SERVICE_NAME", value: "alasio-lake-query" },
282
+ ],
283
+ ports: [{ name: "query", containerPort: LAKE_QUERY_PORT }],
284
+ // Ready once it has the lake open, so its Service sends no query to one that cannot read it.
285
+ readinessProbe: { httpGet: { path: "/readyz", port: "query" }, periodSeconds: 10 },
286
+ livenessProbe: { httpGet: { path: "/healthz", port: "query" }, periodSeconds: 30, failureThreshold: 3 },
287
+ securityContext: { ...restrictedContainer(), readOnlyRootFilesystem: true },
288
+ resources,
289
+ volumeMounts: [{ name: "tmp", mountPath: "/tmp" }],
290
+ }],
291
+ volumes: [{ name: "tmp", emptyDir: { sizeLimit: "2Gi" } }],
292
+ },
293
+ },
294
+ },
295
+ };
296
+ // The queries the pool has not answered, as any reader sums them, so many to a reader.
297
+ const queue = {
298
+ type: "metrics-api",
299
+ metadata: { url: `http://${componentName("lake")}.${NAMESPACE}.svc.cluster.local:${LAKE_QUERY_PORT}/pool`, valueLocation: "queries", targetValue: String(QUERIES_PER_READER) },
300
+ };
301
+ return [service, headless, deployment, ...scaledObject(deployment, scaling, [queue]), ...replicaBudget(QUERY_COMPONENT, NAMESPACE, scaling), verticalPodAutoscaler(deployment, "InPlace")];
302
+ }
303
+ /**
304
+ * The intake's objects: its Deployment, the ScaledObject that scales it, a trigger of
305
+ * each topic's lag, and what KEDA reads that as.
306
+ */
307
+ function intakeObjects(config) {
308
+ const name = componentName(INTAKE_COMPONENT);
309
+ const { scaling, resources } = config.lake.intake;
310
+ const metadata = { name, namespace: NAMESPACE, labels: stackLabels(INTAKE_COMPONENT) };
311
+ const intake = logPrincipalSecret("intake");
312
+ const deployment = {
313
+ apiVersion: "apps/v1",
314
+ kind: "Deployment",
315
+ metadata,
316
+ spec: {
317
+ ...replicasOf(scaling),
318
+ selector: { matchLabels: selectorLabels(INTAKE_COMPONENT) },
319
+ template: {
320
+ metadata: { labels: stackLabels(INTAKE_COMPONENT) },
321
+ spec: {
322
+ ...priority("component"),
323
+ ...stackPodSpec(config),
324
+ ...spread(INTAKE_COMPONENT, scaling),
325
+ // A batch being written is finished; one being gathered is read again by another.
326
+ terminationGracePeriodSeconds: 60,
327
+ containers: [{
328
+ name: "intake",
329
+ image: imageReference(config.images.lake),
330
+ imagePullPolicy: config.images.pullPolicy,
331
+ command: ["node", "src/intake-service.ts"],
332
+ env: [
333
+ ...lakeEnv(config),
334
+ ...writerSecrets(),
335
+ { name: "LOG_BROKERS", value: LOG_BROKERS },
336
+ fromSecret("LOG_USERNAME", intake, "username"),
337
+ fromSecret("LOG_PASSWORD", intake, "password"),
338
+ ...otelEnv(config),
339
+ { name: "OTEL_SERVICE_NAME", value: "alasio-lake-intake" },
340
+ ],
341
+ ports: [{ name: "metrics", containerPort: LAKE_METRICS_PORT }],
342
+ readinessProbe: { ...probe("/readyz"), periodSeconds: 10 },
343
+ // A batch being decoded holds its event loop a while: given time to answer.
344
+ livenessProbe: { ...probe("/healthz"), initialDelaySeconds: 60, periodSeconds: 30, timeoutSeconds: 10, failureThreshold: 3 },
345
+ securityContext: { ...restrictedContainer(), readOnlyRootFilesystem: true },
346
+ resources,
97
347
  volumeMounts: [{ name: "tmp", mountPath: "/tmp" }],
98
- },
99
- ...(main ? [query] : []),
100
- ],
101
- volumes: [{ name: "tmp", emptyDir: { sizeLimit: "4Gi" } }, ...(main ? [{ name: "query-tmp", emptyDir: { sizeLimit: "2Gi" } }] : [])],
348
+ }],
349
+ volumes: [{ name: "tmp", emptyDir: { sizeLimit: "2Gi" } }],
102
350
  },
103
351
  },
104
352
  },
105
353
  };
106
- return [service, deployment, verticalPodAutoscaler(deployment, "InPlace")];
354
+ const scaledObjects = scaledObject(deployment, scaling, Object.values(TELEMETRY_TOPICS).map((topic) => lagTrigger(INTAKE_GROUP, topic, LAG_THRESHOLD, name)));
355
+ return [
356
+ deployment,
357
+ ...(scaledObjects.length > 0 ? [logAuthentication(name, NAMESPACE, INTAKE_COMPONENT), ...scaledObjects] : []),
358
+ ...replicaBudget(INTAKE_COMPONENT, NAMESPACE, scaling),
359
+ verticalPodAutoscaler(deployment, "InPlace"),
360
+ ];
361
+ }
362
+ /**
363
+ * The lake's objects, when it runs, which is beside Neon. A branch environment's is its
364
+ * loader alone, of the branch's copy of the catalog on main's files, which it reads where
365
+ * they are and writes beside them, and maintains none of: main's maintenance keeps every
366
+ * file while Neon has branches, which it asks neon-control about (neon/lake/src/sync.ts).
367
+ */
368
+ export function lakeObjects(config, environment = MAIN_ENVIRONMENT) {
369
+ if (!lakeRuns(config))
370
+ return [];
371
+ if (environment.branch !== null)
372
+ return loaderObjects(config, environment);
373
+ return [...loaderObjects(config, environment), ...maintenanceObjects(config), ...queryObjects(config), ...intakeObjects(config)];
107
374
  }
108
375
  //# sourceMappingURL=lake.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lake.js","sourceRoot":"","sources":["../../../../src/manifests/lake.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lake.js","sourceRoot":"","sources":["../../../../src/manifests/lake.ts"],"names":[],"mappings":"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"}