alasio 7.0.0 → 9.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 (161) hide show
  1. package/dist/cli/src/api-server.js +18 -0
  2. package/dist/cli/src/api-server.js.map +1 -0
  3. package/dist/cli/src/branches.js +123 -46
  4. package/dist/cli/src/branches.js.map +1 -1
  5. package/dist/cli/src/cluster/docker.js +25 -10
  6. package/dist/cli/src/cluster/docker.js.map +1 -1
  7. package/dist/cli/src/cluster/host.js +33 -7
  8. package/dist/cli/src/cluster/host.js.map +1 -1
  9. package/dist/cli/src/cluster/k3s.js +51 -12
  10. package/dist/cli/src/cluster/k3s.js.map +1 -1
  11. package/dist/cli/src/cluster/node.js +115 -33
  12. package/dist/cli/src/cluster/node.js.map +1 -1
  13. package/dist/cli/src/cluster/stargz.js +55 -0
  14. package/dist/cli/src/cluster/stargz.js.map +1 -0
  15. package/dist/cli/src/commands/branch.js +5 -4
  16. package/dist/cli/src/commands/branch.js.map +1 -1
  17. package/dist/cli/src/commands/common.js +9 -3
  18. package/dist/cli/src/commands/common.js.map +1 -1
  19. package/dist/cli/src/commands/folder.js +14 -0
  20. package/dist/cli/src/commands/folder.js.map +1 -0
  21. package/dist/cli/src/commands/init.js +54 -4
  22. package/dist/cli/src/commands/init.js.map +1 -1
  23. package/dist/cli/src/commands/lake.js +40 -6
  24. package/dist/cli/src/commands/lake.js.map +1 -1
  25. package/dist/cli/src/commands/restore-filer-store.js +40 -8
  26. package/dist/cli/src/commands/restore-filer-store.js.map +1 -1
  27. package/dist/cli/src/commands/status.js +216 -20
  28. package/dist/cli/src/commands/status.js.map +1 -1
  29. package/dist/cli/src/commands/uninstall.js +8 -9
  30. package/dist/cli/src/commands/uninstall.js.map +1 -1
  31. package/dist/cli/src/commands/up.js +11 -3
  32. package/dist/cli/src/commands/up.js.map +1 -1
  33. package/dist/cli/src/commands/upgrade.js +1 -1
  34. package/dist/cli/src/commands/upgrade.js.map +1 -1
  35. package/dist/cli/src/commands.js +2 -1
  36. package/dist/cli/src/commands.js.map +1 -1
  37. package/dist/cli/src/config.js +24 -9
  38. package/dist/cli/src/config.js.map +1 -1
  39. package/dist/cli/src/cpu-baseline.js +8 -4
  40. package/dist/cli/src/cpu-baseline.js.map +1 -1
  41. package/dist/cli/src/folders.js +67 -0
  42. package/dist/cli/src/folders.js.map +1 -0
  43. package/dist/cli/src/gateway-calls.js +58 -0
  44. package/dist/cli/src/gateway-calls.js.map +1 -0
  45. package/dist/cli/src/install.js +119 -17
  46. package/dist/cli/src/install.js.map +1 -1
  47. package/dist/cli/src/kept-releases.js +27 -20
  48. package/dist/cli/src/kept-releases.js.map +1 -1
  49. package/dist/cli/src/kube/api.js +11 -5
  50. package/dist/cli/src/kube/api.js.map +1 -1
  51. package/dist/cli/src/kube/apply.js +16 -73
  52. package/dist/cli/src/kube/apply.js.map +1 -1
  53. package/dist/cli/src/kube/rollout.js +84 -26
  54. package/dist/cli/src/kube/rollout.js.map +1 -1
  55. package/dist/cli/src/lake.js +124 -0
  56. package/dist/cli/src/lake.js.map +1 -0
  57. package/dist/cli/src/manifests/admission.js +381 -223
  58. package/dist/cli/src/manifests/admission.js.map +1 -1
  59. package/dist/cli/src/manifests/alasio.js +79 -362
  60. package/dist/cli/src/manifests/alasio.js.map +1 -1
  61. package/dist/cli/src/manifests/branch.js +10 -26
  62. package/dist/cli/src/manifests/branch.js.map +1 -1
  63. package/dist/cli/src/manifests/collector.js +250 -135
  64. package/dist/cli/src/manifests/collector.js.map +1 -1
  65. package/dist/cli/src/manifests/common.js +32 -2
  66. package/dist/cli/src/manifests/common.js.map +1 -1
  67. package/dist/cli/src/manifests/config.js +256 -92
  68. package/dist/cli/src/manifests/config.js.map +1 -1
  69. package/dist/cli/src/manifests/disruption.js +10 -0
  70. package/dist/cli/src/manifests/disruption.js.map +1 -1
  71. package/dist/cli/src/manifests/folders.js +128 -0
  72. package/dist/cli/src/manifests/folders.js.map +1 -0
  73. package/dist/cli/src/manifests/grafana.js +4 -2
  74. package/dist/cli/src/manifests/grafana.js.map +1 -1
  75. package/dist/cli/src/manifests/index.js +15 -8
  76. package/dist/cli/src/manifests/index.js.map +1 -1
  77. package/dist/cli/src/manifests/keda.js +2 -1
  78. package/dist/cli/src/manifests/keda.js.map +1 -1
  79. package/dist/cli/src/manifests/lake.js +350 -73
  80. package/dist/cli/src/manifests/lake.js.map +1 -1
  81. package/dist/cli/src/manifests/log.js +316 -0
  82. package/dist/cli/src/manifests/log.js.map +1 -0
  83. package/dist/cli/src/manifests/neon.js +128 -49
  84. package/dist/cli/src/manifests/neon.js.map +1 -1
  85. package/dist/cli/src/manifests/network-policies.js +263 -100
  86. package/dist/cli/src/manifests/network-policies.js.map +1 -1
  87. package/dist/cli/src/manifests/node-agent.js +24 -8
  88. package/dist/cli/src/manifests/node-agent.js.map +1 -1
  89. package/dist/cli/src/manifests/object-store.js +4 -2
  90. package/dist/cli/src/manifests/object-store.js.map +1 -1
  91. package/dist/cli/src/manifests/sandbox-gateway.js +663 -0
  92. package/dist/cli/src/manifests/sandbox-gateway.js.map +1 -0
  93. package/dist/cli/src/manifests/scalers.js +16 -5
  94. package/dist/cli/src/manifests/scalers.js.map +1 -1
  95. package/dist/cli/src/manifests/sizing.js +16 -8
  96. package/dist/cli/src/manifests/sizing.js.map +1 -1
  97. package/dist/cli/src/manifests/valkey.js +11 -5
  98. package/dist/cli/src/manifests/valkey.js.map +1 -1
  99. package/dist/cli/src/manifests/vpa.js +3 -1
  100. package/dist/cli/src/manifests/vpa.js.map +1 -1
  101. package/dist/cli/src/manifests/webhook.js +102 -0
  102. package/dist/cli/src/manifests/webhook.js.map +1 -0
  103. package/dist/cli/src/manifests/workspace-storage.js +174 -89
  104. package/dist/cli/src/manifests/workspace-storage.js.map +1 -1
  105. package/dist/cli/src/neon-storage.js +155 -0
  106. package/dist/cli/src/neon-storage.js.map +1 -0
  107. package/dist/cli/src/release.js +9 -6
  108. package/dist/cli/src/release.js.map +1 -1
  109. package/dist/cli/src/secrets.js +45 -4
  110. package/dist/cli/src/secrets.js.map +1 -1
  111. package/dist/cli/src/target.js +1 -1
  112. package/dist/cli/src/target.js.map +1 -1
  113. package/dist/cli/src/telegram.js +56 -10
  114. package/dist/cli/src/telegram.js.map +1 -1
  115. package/dist/cli/src/webhook.js +182 -0
  116. package/dist/cli/src/webhook.js.map +1 -0
  117. package/dist/cluster/node/pins.json +12 -2
  118. package/dist/neon/control/branches.js +126 -21
  119. package/dist/neon/control/branches.js.map +1 -1
  120. package/dist/neon/control/endpoints.js +9 -0
  121. package/dist/neon/control/endpoints.js.map +1 -1
  122. package/dist/neon/control/jwt.js +16 -3
  123. package/dist/neon/control/jwt.js.map +1 -1
  124. package/dist/neon/control/secrets.js +51 -7
  125. package/dist/neon/control/secrets.js.map +1 -1
  126. package/dist/src/binder/names.js +33 -0
  127. package/dist/src/binder/names.js.map +1 -0
  128. package/dist/src/binder/tokens.js +58 -0
  129. package/dist/src/binder/tokens.js.map +1 -0
  130. package/dist/src/branch/names.js +12 -2
  131. package/dist/src/branch/names.js.map +1 -1
  132. package/dist/src/events/names.js +7 -0
  133. package/dist/src/events/names.js.map +1 -0
  134. package/dist/src/gateway/names.js +201 -0
  135. package/dist/src/gateway/names.js.map +1 -0
  136. package/dist/src/harness/names.js +49 -0
  137. package/dist/src/harness/names.js.map +1 -0
  138. package/dist/src/kube/sandbox-shape.js +19 -69
  139. package/dist/src/kube/sandbox-shape.js.map +1 -1
  140. package/dist/src/node-agent/names.js +118 -2
  141. package/dist/src/node-agent/names.js.map +1 -1
  142. package/dist/src/sandbox/names.js +12 -20
  143. package/dist/src/sandbox/names.js.map +1 -1
  144. package/dist/src/sandbox/otlp-resource.js +173 -0
  145. package/dist/src/sandbox/otlp-resource.js.map +1 -0
  146. package/dist/src/sandbox/telemetry.js +43 -0
  147. package/dist/src/sandbox/telemetry.js.map +1 -0
  148. package/dist/src/telegram/deliveries.js +40 -0
  149. package/dist/src/telegram/deliveries.js.map +1 -0
  150. package/dist/src/telemetry/config.js +131 -0
  151. package/dist/src/telemetry/config.js.map +1 -0
  152. package/dist/src/telemetry/forward.js +154 -0
  153. package/dist/src/telemetry/forward.js.map +1 -0
  154. package/package.json +1 -1
  155. package/dist/cli/src/manifests/agent-sandbox.js +0 -92
  156. package/dist/cli/src/manifests/agent-sandbox.js.map +0 -1
  157. package/dist/cli/src/manifests/juicefs-csi.js +0 -319
  158. package/dist/cli/src/manifests/juicefs-csi.js.map +0 -1
  159. package/dist/cli/src/manifests/sandboxes.agents.x-k8s.io.json +0 -6295
  160. package/dist/src/kube/config.js +0 -143
  161. package/dist/src/kube/config.js.map +0 -1
@@ -0,0 +1,316 @@
1
+ import { eventsTopic } from "../../../src/events/names.js";
2
+ import { imageReference } from "../images.js";
3
+ import { claimLabels, claimSpec, componentName, NAMESPACE, replicasOf, restrictedContainer, script, selectorLabels, sha256, stackLabels, stackPodSpec } from "./common.js";
4
+ import { LOG_SEGMENT_BYTES, telemetryRetentionBytes } from "./config.js";
5
+ import { replicaBudget, spread } from "./disruption.js";
6
+ import { priority } from "./priorities.js";
7
+ import { verticalPodAutoscaler } from "./sizing.js";
8
+ /** The log's name: its StatefulSet's, its Service's, its ConfigMap's and its Secret's. */
9
+ export const LOG = componentName("log");
10
+ export const LOG_COMPONENT = "log";
11
+ /** The ports of its clients, of its controllers, and of its metrics. */
12
+ export const LOG_PORT = 9092;
13
+ export const LOG_CONTROLLER_PORT = 9093;
14
+ export const LOG_METRICS_PORT = 9464;
15
+ /** The port its access applier answers whether it has applied what it applies on. */
16
+ const ACCESS_PORT = 8080;
17
+ /** The telemetry topics, by signal, which the gateway writes and the intake reads. */
18
+ export const TELEMETRY_TOPICS = { traces: "otel.spans", logs: "otel.logs", metrics: "otel.metrics" };
19
+ /**
20
+ * The largest record the log takes, as large as a minute's scrape of the stack in one export
21
+ * may be: one the lake's intake writes a part at a time, whatever its size (test/lake.test.ts
22
+ * proves one this large within a bound of its memory).
23
+ */
24
+ export const LOG_RECORD_BYTES = 8 * 1024 * 1024;
25
+ /** The consumer group of the lake's intake. */
26
+ export const INTAKE_GROUP = "lake-intake";
27
+ /**
28
+ * How long an environment's Telegram updates are kept: a week, so an environment asleep
29
+ * for one still finds them, beyond the day Telegram itself keeps what it could not deliver.
30
+ */
31
+ export const TELEGRAM_RETENTION_MS = 7 * 86_400_000;
32
+ /** An environment's name, as its topic, group and principal are named: main's, or its branch's. */
33
+ export const environmentName = ({ branch }) => branch ?? "main";
34
+ /** The topic of the Telegram updates of the environment `name`, which the webhook intake writes and its alasio reads. */
35
+ export const telegramTopic = (name) => `telegram.${name}`;
36
+ /** The principal the environment `name`'s alasio reaches the log as. */
37
+ export const alasioPrincipal = (name) => `alasio-${name}`;
38
+ /** The consumer group the environment `name`'s alasio reads its Telegram topic in. */
39
+ export const alasioGroup = (name) => `alasio.${name}`;
40
+ /** How long an environment's wake records are kept: a day, long past its lake loader's waking at the first. */
41
+ export const WAKE_RETENTION_MS = 86_400_000;
42
+ /** How long an environment's events are kept: as long as its Telegram updates, past any wait of its alasio's to read them. */
43
+ export const EVENTS_RETENTION_MS = TELEGRAM_RETENTION_MS;
44
+ /** The topic the environment `name`'s alasio writes as it commits transcripts, which wakes its lake loader. */
45
+ export const lakeWakeTopic = (name) => `lake.${name}`;
46
+ /** The principal the environment `name`'s lake loader reaches the log as. */
47
+ export const loaderPrincipal = (name) => `loader-${name}`;
48
+ /** The consumer group the environment `name`'s lake loader reads its wake topic in. */
49
+ export const loaderGroup = (name) => `lake-loader.${name}`;
50
+ /**
51
+ * What the log gives the environment `name`: a principal for each of its components that
52
+ * reaches the log, each with what it may do alone, and the topics they use, made and
53
+ * forgotten with the environment. Its alasio's, `alasio-<name>`, reading its Telegram
54
+ * topic in its group, `alasio.<name>`, and writing its wake topic, `lake.<name>`, as it
55
+ * commits transcripts; its lake loader's, `loader-<name>`, reading the wake topic in its
56
+ * group, `lake-loader.<name>`; and its events topic, `events.<name>` (src/events/), which the
57
+ * gateways write and its alasio reads in its group; those topics, of one partition each, as
58
+ * one alasio and one loader read them, a chat's updates in order, each keeping a segment
59
+ * beside the one it writes at most: a week of a bot's updates, or of events, and a day of
60
+ * wakes, is kilobytes. Each update, and each event, is flushed to the volume as it is
61
+ * written, as what told of it does not tell again; a wake, lost, costs nothing.
62
+ */
63
+ export function environmentAccess(name) {
64
+ const topic = telegramTopic(name);
65
+ const wake = lakeWakeTopic(name);
66
+ const events = eventsTopic(name);
67
+ return {
68
+ principals: [
69
+ {
70
+ name: alasioPrincipal(name),
71
+ acls: [
72
+ { resource: "topic", name: topic, pattern: "literal", operations: ["read", "describe"] },
73
+ { resource: "group", name: alasioGroup(name), pattern: "literal", operations: ["read"] },
74
+ { resource: "topic", name: wake, pattern: "literal", operations: ["write", "describe"] },
75
+ { resource: "topic", name: events, pattern: "literal", operations: ["read", "describe"] },
76
+ ],
77
+ },
78
+ {
79
+ name: loaderPrincipal(name),
80
+ acls: [{ resource: "topic", name: wake, pattern: "literal", operations: ["read", "describe"] }, { resource: "group", name: loaderGroup(name), pattern: "literal", operations: ["read"] }],
81
+ },
82
+ ],
83
+ topics: [
84
+ // Each update flushed to the volume as it is written: Telegram, answered once the log has it, sends it no more.
85
+ { name: topic, partitions: 1, retentionMs: TELEGRAM_RETENTION_MS, retentionBytes: LOG_SEGMENT_BYTES, configs: { "flush.messages": "1" } },
86
+ { name: wake, partitions: 1, retentionMs: WAKE_RETENTION_MS, retentionBytes: LOG_SEGMENT_BYTES, configs: {} },
87
+ { name: events, partitions: 1, retentionMs: EVENTS_RETENTION_MS, retentionBytes: LOG_SEGMENT_BYTES, configs: { "flush.messages": "1" } },
88
+ ],
89
+ };
90
+ }
91
+ /** The log's brokers, as a client anywhere in the cluster bootstraps from them. */
92
+ export const LOG_BROKERS = `${LOG}.${NAMESPACE}.svc:${LOG_PORT}`;
93
+ /** The Secret of the principal `principal`'s name and password, which the stack's setup writes. */
94
+ export const logPrincipalSecret = (principal) => componentName(`log-${principal}`);
95
+ /**
96
+ * The Secret of the principal the alasio of `environment` reads its topic as, in its
97
+ * namespace: main's, which the stack's setup writes; a branch environment's, which alasio's
98
+ * command line writes as it makes the branch's principal.
99
+ */
100
+ export const environmentLogSecret = ({ branch }) => (branch === null ? logPrincipalSecret("alasio-main") : componentName("log-alasio"));
101
+ /** The Secret of the principal the lake loader of `environment` reads its wake topic as, in its namespace: main's, which the stack's setup writes; a branch environment's, which alasio's command line writes. */
102
+ export const loaderLogSecret = ({ branch }) => (branch === null ? logPrincipalSecret("loader-main") : componentName("log-loader"));
103
+ /** A node's address, by its ordinal: its pod's name in the log's headless Service. */
104
+ const nodeAddress = (ordinal) => `${LOG}-${ordinal}.${LOG}.${NAMESPACE}.svc`;
105
+ /** The hours of a retention as log.retention says it. */
106
+ export const retentionMs = (retention) => Number(retention.slice(0, -1)) * 3_600_000;
107
+ /**
108
+ * What the log's access is: the telemetry topics, of as many partitions as the intake
109
+ * runs replicas at most, so each has one to read, each partition keeping its share of the
110
+ * volume at most (telemetryRetentionBytes), each flushed to its volume within a second
111
+ * (flush.ms), and each kept compressed with zstd (compression.type), as the gateway
112
+ * produces it, whatever produces it: an export of OTLP's protobuf repeats its resources'
113
+ * and attributes' text, which compresses to a fraction of it, so a partition's share
114
+ * holds the retention's hours of what the stack sends; the gateway's writing them, the intake's reading them in its group, and
115
+ * KEDA's reading how far the group is behind on them, and each environment's lake loader on
116
+ * its wake topic, which asks to describe both and to read neither; the webhook intake's
117
+ * writing every environment's Telegram topic, a branch's among them, and nothing else; the
118
+ * sandbox gateway's writing every environment's events topic, and nothing else; and main's
119
+ * environment's principals and topics (environmentAccess).
120
+ *
121
+ * A write is acknowledged once a majority of the nodes have it in their page caches, not
122
+ * on their volumes. On one node, the volume outlives the pod, so a restart of the pod loses
123
+ * nothing acknowledged, but a crash of its host loses what the node had not flushed: up
124
+ * to a second of acknowledged telemetry, as its log flusher looks each second for what is
125
+ * older than flush.ms (log.flush.scheduler.interval.ms, serverProperties), and a flush a
126
+ * second costs next to nothing at the rate the stack writes it; and nothing of Telegram's
127
+ * updates, each flushed as it is written (flush.messages), as Telegram has had its answer.
128
+ * On three, each record is on two hosts before it is acknowledged, so a host's crash loses
129
+ * none.
130
+ */
131
+ export function logAccess(config) {
132
+ const partitions = Math.max(1, config.lake.intake.scaling.max);
133
+ const telemetry = { resource: "topic", name: "otel.", pattern: "prefixed" };
134
+ const group = { resource: "group", name: INTAKE_GROUP, pattern: "literal" };
135
+ const main = environmentAccess("main");
136
+ const services = {
137
+ gateway: [{ ...telemetry, operations: ["write", "describe"] }],
138
+ intake: [{ ...telemetry, operations: ["read", "describe"] }, { ...group, operations: ["read"] }],
139
+ // And every environment's wake topic and its loader's group, which it reads how far behind on too.
140
+ scaler: [
141
+ { ...telemetry, operations: ["describe"] },
142
+ { ...group, operations: ["describe"] },
143
+ { resource: "topic", name: "lake.", pattern: "prefixed", operations: ["describe"] },
144
+ { resource: "group", name: "lake-loader.", pattern: "prefixed", operations: ["describe"] },
145
+ ],
146
+ webhook: [{ resource: "topic", name: "telegram.", pattern: "prefixed", operations: ["write", "describe"] }],
147
+ // Every environment's events, a branch's among them, and nothing else.
148
+ "sandbox-gateway": [{ resource: "topic", name: "events.", pattern: "prefixed", operations: ["write", "describe"] }],
149
+ };
150
+ const retention = { retentionMs: retentionMs(config.log.retention), retentionBytes: telemetryRetentionBytes(config) };
151
+ return {
152
+ topics: [...Object.values(TELEMETRY_TOPICS).map((name) => ({ name, partitions, ...retention, configs: { "flush.ms": "1000", "compression.type": "zstd" } })), ...main.topics],
153
+ principals: [...Object.entries(services).map(([name, acls]) => ({ name, acls })), ...main.principals],
154
+ };
155
+ }
156
+ /**
157
+ * Its nodes' configuration, whole: combined nodes, KRaft's voters every one of them; clients
158
+ * on SCRAM-SHA-512 and the controllers on a listener of their own; nothing allowed without an
159
+ * ACL but to its admin, and to what reaches the controllers' listener, its nodes alone;
160
+ * topics made by its access applier alone, each partition on every node, a write
161
+ * acknowledged once a majority of them has it, and flushed to its volume within a second
162
+ * where its topic says so (flush.ms), its log flusher looking each second, where it would
163
+ * look never by default; a record of up to 8 MiB, as a minute's
164
+ * scrape of the stack in one export may be; its segments on its volume, each closed within
165
+ * the hour or at LOG_SEGMENT_BYTES, so its retention, which deletes closed ones alone,
166
+ * reaches them in time; and a snapshot of its metadata every ten minutes where it changed,
167
+ * rather than every hour, so that a start replays little of it (src/log/access.ts says
168
+ * what a replay may lose). What differs from node to node (its id, its address, its
169
+ * admin's password) its start script adds (START).
170
+ */
171
+ function serverProperties(config) {
172
+ const nodes = config.log.scaling.min;
173
+ const voters = Array.from({ length: nodes }, (_, ordinal) => `${ordinal}@${nodeAddress(ordinal)}:${LOG_CONTROLLER_PORT}`);
174
+ const majority = Math.floor(nodes / 2) + 1;
175
+ return script("process.roles=broker,controller", `controller.quorum.voters=${voters.join(",")}`, `listeners=CLIENT://:${LOG_PORT},CONTROLLER://:${LOG_CONTROLLER_PORT}`, "listener.security.protocol.map=CLIENT:SASL_PLAINTEXT,CONTROLLER:PLAINTEXT", "inter.broker.listener.name=CLIENT", "controller.listener.names=CONTROLLER", "sasl.enabled.mechanisms=SCRAM-SHA-512", "sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512", "authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer",
176
+ // ANONYMOUS is what reaches the controllers' listener, unauthenticated: the NetworkPolicy, admitting its port from the log's own pods alone, is its guard.
177
+ "super.users=User:admin;User:ANONYMOUS", "allow.everyone.if.no.acl.found=false", "auto.create.topics.enable=false", `default.replication.factor=${nodes}`, `offsets.topic.replication.factor=${nodes}`, `transaction.state.log.replication.factor=${nodes}`, `min.insync.replicas=${majority}`, `transaction.state.log.min.isr=${majority}`, "log.dirs=/data/log", `log.retention.ms=${retentionMs(config.log.retention)}`, `log.segment.bytes=${LOG_SEGMENT_BYTES}`, "log.roll.ms=3600000", `message.max.bytes=${LOG_RECORD_BYTES}`, "log.flush.scheduler.interval.ms=1000", "metadata.log.max.snapshot.interval.ms=600000");
178
+ }
179
+ /** Its logging, to its output alone, rather than to files in its /tmp. */
180
+ const LOG4J2 = script("rootLogger.level=INFO", "rootLogger.appenderRef.stdout.ref=STDOUT", "appender.stdout.type=Console", "appender.stdout.name=STDOUT", "appender.stdout.layout.type=PatternLayout", "appender.stdout.layout.pattern=[%d] %p %m (%c)%n");
181
+ /**
182
+ * What its JMX exporter serves, of the MBeans it reads alone: how long its Produce requests
183
+ * take (p50 and p99, in ms), how many bytes each partition holds on its volume, and its
184
+ * broker's state (3 while it runs); and the JVM's own metrics.
185
+ */
186
+ const METRICS = script("lowercaseOutputName: true", "includeObjectNames:", ' - "kafka.network:type=RequestMetrics,name=TotalTimeMs,request=Produce"', ' - "kafka.log:type=Log,name=Size,*"', ' - "kafka.server:type=KafkaServer,name=BrokerState"', "rules:", " - pattern: 'kafka.network<type=RequestMetrics, name=TotalTimeMs, request=(.+)><>(50|99)thPercentile'", " name: kafka_request_total_time_ms", " type: GAUGE", ' labels: { request: "$1", percentile: "$2" }', " - pattern: 'kafka.log<type=Log, name=Size, topic=(.+), partition=(.+)><>Value'", " name: kafka_log_size_bytes", " type: GAUGE", ' labels: { topic: "$1", partition: "$2" }', " - pattern: 'kafka.server<type=KafkaServer, name=BrokerState><>Value'", " name: kafka_server_broker_state", " type: GAUGE");
187
+ /**
188
+ * How a node starts, `format` or `serve`: its configuration written to /tmp, the log's,
189
+ * then its id (its pod's ordinal), its address, and the admin it reaches the other nodes
190
+ * as; then its volume formatted for the cluster's id, its admin made with KRaft's
191
+ * bootstrap, once (a formatted volume is left as it is); or it serves.
192
+ */
193
+ const START = script("set -eu", 'ordinal="${HOSTNAME##*-}"', "{", " cat /etc/log/server.properties", ' echo "node.id=$ordinal"', ` echo "advertised.listeners=CLIENT://$HOSTNAME.${LOG}.${NAMESPACE}.svc:${LOG_PORT}"`, ' echo "listener.name.client.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username=\\"admin\\" password=\\"$LOG_ADMIN_PASSWORD\\";"', "} >/tmp/server.properties", 'case "$1" in', ' format) exec /opt/kafka/bin/kafka-storage.sh format --ignore-formatted -t "$KAFKA_CLUSTER_ID" -c /tmp/server.properties --add-scram "SCRAM-SHA-512=[name=admin,password=$LOG_ADMIN_PASSWORD]" ;;', " serve) exec /opt/kafka/bin/kafka-server-start.sh /tmp/server.properties ;;", "esac");
194
+ /** The log's objects: it always runs, Telegram's updates coming through it. */
195
+ export function logObjects(config) {
196
+ const { log } = config;
197
+ const metadata = { name: LOG, namespace: NAMESPACE, labels: stackLabels(LOG_COMPONENT) };
198
+ const access = logAccess(config);
199
+ const data = {
200
+ "server.properties": serverProperties(config),
201
+ "log4j2.properties": LOG4J2,
202
+ "metrics.yaml": METRICS,
203
+ "start.sh": START,
204
+ "access.json": `${JSON.stringify(access, null, 2)}\n`,
205
+ };
206
+ const configMap = { apiVersion: "v1", kind: "ConfigMap", metadata, data };
207
+ // Headless, each node's address its pod's, which the others reach it by before it is ready, as KRaft's quorum forms.
208
+ const service = {
209
+ apiVersion: "v1",
210
+ kind: "Service",
211
+ metadata,
212
+ spec: {
213
+ clusterIP: "None",
214
+ publishNotReadyAddresses: true,
215
+ selector: selectorLabels(LOG_COMPONENT),
216
+ ports: [
217
+ { name: "client", port: LOG_PORT },
218
+ { name: "controller", port: LOG_CONTROLLER_PORT },
219
+ { name: "metrics", port: LOG_METRICS_PORT },
220
+ ],
221
+ },
222
+ };
223
+ const secret = (key) => ({ name: key, valueFrom: { secretKeyRef: { name: LOG, key } } });
224
+ const node = (name, command) => ({
225
+ name,
226
+ image: imageReference(config.images.log),
227
+ imagePullPolicy: config.images.pullPolicy,
228
+ command: ["/bin/sh", "/etc/log/start.sh", command],
229
+ securityContext: { ...restrictedContainer(), readOnlyRootFilesystem: true },
230
+ });
231
+ const mounts = [{ name: "config", mountPath: "/etc/log", readOnly: true }, { name: "tmp", mountPath: "/tmp" }, { name: "data", mountPath: "/data" }];
232
+ const common = [
233
+ secret("KAFKA_CLUSTER_ID"),
234
+ secret("LOG_ADMIN_PASSWORD"),
235
+ { name: "LOG_DIR", value: "/tmp/logs" },
236
+ { name: "KAFKA_LOG4J_OPTS", value: "-Dlog4j2.configurationFile=/etc/log/log4j2.properties" },
237
+ ];
238
+ const statefulSet = {
239
+ apiVersion: "apps/v1",
240
+ kind: "StatefulSet",
241
+ metadata,
242
+ spec: {
243
+ serviceName: LOG,
244
+ ...replicasOf(log.scaling),
245
+ // Every voter at once: a quorum of three forms only once two of them run.
246
+ podManagementPolicy: "Parallel",
247
+ selector: { matchLabels: selectorLabels(LOG_COMPONENT) },
248
+ template: {
249
+ metadata: { labels: stackLabels(LOG_COMPONENT), annotations: { "checksum/config": sha256(JSON.stringify(data)) } },
250
+ spec: {
251
+ ...priority("bound"),
252
+ ...stackPodSpec(config),
253
+ ...spread(LOG_COMPONENT, log.scaling, true),
254
+ // Its partitions closed cleanly as it stops, so it starts again without recovering them.
255
+ terminationGracePeriodSeconds: 120,
256
+ initContainers: [{
257
+ ...node("format", "format"),
258
+ env: [...common, { name: "KAFKA_HEAP_OPTS", value: "-Xmx256m" }],
259
+ resources: { requests: { cpu: "50m", memory: "256Mi" }, limits: { memory: "512Mi" } },
260
+ volumeMounts: mounts,
261
+ }],
262
+ containers: [
263
+ {
264
+ ...node("log", "serve"),
265
+ env: [
266
+ ...common,
267
+ { name: "KAFKA_HEAP_OPTS", value: "-Xms512m -Xmx512m" },
268
+ { name: "KAFKA_OPTS", value: `-javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent.jar=${LOG_METRICS_PORT}:/etc/log/metrics.yaml` },
269
+ // Without -loggc: no GC log files in /tmp.
270
+ { name: "EXTRA_ARGS", value: "-name kafkaServer" },
271
+ ],
272
+ ports: [
273
+ { name: "client", containerPort: LOG_PORT },
274
+ { name: "controller", containerPort: LOG_CONTROLLER_PORT },
275
+ { name: "metrics", containerPort: LOG_METRICS_PORT },
276
+ ],
277
+ startupProbe: { tcpSocket: { port: "client" }, periodSeconds: 5, failureThreshold: 120 },
278
+ readinessProbe: { tcpSocket: { port: "client" }, periodSeconds: 10 },
279
+ livenessProbe: { tcpSocket: { port: "client" }, periodSeconds: 30, failureThreshold: 4 },
280
+ resources: log.resources,
281
+ volumeMounts: mounts,
282
+ },
283
+ {
284
+ name: "access",
285
+ image: imageReference(config.images.alasio),
286
+ imagePullPolicy: config.images.pullPolicy,
287
+ command: ["node", "/opt/alasio/src/log/access.ts"],
288
+ env: [
289
+ { name: "LOG_BROKERS", value: `127.0.0.1:${LOG_PORT}` },
290
+ // Every voter's, as KRaft's active controller alone writes a credential.
291
+ { name: "LOG_CONTROLLERS", value: Array.from({ length: log.scaling.min }, (_, ordinal) => `${nodeAddress(ordinal)}:${LOG_CONTROLLER_PORT}`).join(",") },
292
+ secret("LOG_ADMIN_PASSWORD"),
293
+ { name: "LOG_ACCESS", value: "/etc/log/access.json" },
294
+ { name: "LOG_PASSWORDS", value: "/etc/log-passwords" },
295
+ { name: "LOG_ACCESS_PORT", value: String(ACCESS_PORT) },
296
+ ],
297
+ ports: [{ name: "access", containerPort: ACCESS_PORT }],
298
+ readinessProbe: { httpGet: { path: "/readyz", port: "access" }, periodSeconds: 5 },
299
+ securityContext: { ...restrictedContainer(), readOnlyRootFilesystem: true },
300
+ resources: { requests: { cpu: "10m", memory: "64Mi" }, limits: { memory: "192Mi" } },
301
+ volumeMounts: [{ name: "config", mountPath: "/etc/log", readOnly: true }, { name: "passwords", mountPath: "/etc/log-passwords", readOnly: true }],
302
+ },
303
+ ],
304
+ volumes: [
305
+ { name: "config", configMap: { name: LOG } },
306
+ { name: "passwords", secret: { secretName: componentName("log-access") } },
307
+ { name: "tmp", emptyDir: { sizeLimit: "1Gi" } },
308
+ ],
309
+ },
310
+ },
311
+ volumeClaimTemplates: [{ metadata: { name: "data", labels: claimLabels(stackLabels(LOG_COMPONENT)) }, spec: claimSpec(log.storage) }],
312
+ },
313
+ };
314
+ return [configMap, service, statefulSet, ...replicaBudget(LOG_COMPONENT, NAMESPACE, log.scaling), verticalPodAutoscaler(statefulSet, "Recommended")];
315
+ }
316
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../../../src/manifests/log.ts"],"names":[],"mappings":"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"}