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
@@ -0,0 +1,298 @@
1
+ import { imageReference } from "../images.js";
2
+ import { claimSpec, componentName, NAMESPACE, replicasOf, restrictedContainer, script, selectorLabels, sha256, stackLabels, stackPodSpec } from "./common.js";
3
+ import { LOG_SEGMENT_BYTES, telemetryRetentionBytes } from "./config.js";
4
+ import { replicaBudget, spread } from "./disruption.js";
5
+ import { priority } from "./priorities.js";
6
+ import { verticalPodAutoscaler } from "./sizing.js";
7
+ /** The log's name: its StatefulSet's, its Service's, its ConfigMap's and its Secret's. */
8
+ export const LOG = componentName("log");
9
+ export const LOG_COMPONENT = "log";
10
+ /** The ports of its clients, of its controllers, and of its metrics. */
11
+ export const LOG_PORT = 9092;
12
+ export const LOG_CONTROLLER_PORT = 9093;
13
+ export const LOG_METRICS_PORT = 9464;
14
+ /** The port its access applier answers whether it has applied what it applies on. */
15
+ const ACCESS_PORT = 8080;
16
+ /** The telemetry topics, by signal, which the gateway writes and the intake reads. */
17
+ export const TELEMETRY_TOPICS = { traces: "otel.spans", logs: "otel.logs", metrics: "otel.metrics" };
18
+ /**
19
+ * The largest record the log takes, as large as a minute's scrape of the stack in one export
20
+ * may be: one the lake's intake writes a part at a time, whatever its size (test/lake.test.ts
21
+ * proves one this large within a bound of its memory).
22
+ */
23
+ export const LOG_RECORD_BYTES = 8 * 1024 * 1024;
24
+ /** The consumer group of the lake's intake. */
25
+ export const INTAKE_GROUP = "lake-intake";
26
+ /**
27
+ * How long an environment's Telegram updates are kept: a week, so an environment asleep
28
+ * for one still finds them, beyond the day Telegram itself keeps what it could not deliver.
29
+ */
30
+ export const TELEGRAM_RETENTION_MS = 7 * 86_400_000;
31
+ /** An environment's name, as its topic, group and principal are named: main's, or its branch's. */
32
+ export const environmentName = ({ branch }) => branch ?? "main";
33
+ /** The topic of the Telegram updates of the environment `name`, which the webhook intake writes and its alasio reads. */
34
+ export const telegramTopic = (name) => `telegram.${name}`;
35
+ /** The principal the environment `name`'s alasio reaches the log as. */
36
+ export const alasioPrincipal = (name) => `alasio-${name}`;
37
+ /** The consumer group the environment `name`'s alasio reads its Telegram topic in. */
38
+ export const alasioGroup = (name) => `alasio.${name}`;
39
+ /** How long an environment's wake records are kept: a day, long past its lake loader's waking at the first. */
40
+ export const WAKE_RETENTION_MS = 86_400_000;
41
+ /** The topic the environment `name`'s alasio writes as it commits transcripts, which wakes its lake loader. */
42
+ export const lakeWakeTopic = (name) => `lake.${name}`;
43
+ /** The principal the environment `name`'s lake loader reaches the log as. */
44
+ export const loaderPrincipal = (name) => `loader-${name}`;
45
+ /** The consumer group the environment `name`'s lake loader reads its wake topic in. */
46
+ export const loaderGroup = (name) => `lake-loader.${name}`;
47
+ /**
48
+ * What the log gives the environment `name`: a principal for each of its components that
49
+ * reaches the log, each with what it may do alone, and the topics they use, made and
50
+ * forgotten with the environment. Its alasio's, `alasio-<name>`, reading its Telegram
51
+ * topic in its group, `alasio.<name>`, and writing its wake topic, `lake.<name>`, as it
52
+ * commits transcripts; its lake loader's, `loader-<name>`, reading the wake topic in its
53
+ * group, `lake-loader.<name>`; those topics, of one partition each, as one alasio and one
54
+ * loader read them, a chat's updates in order, each keeping a segment beside the one it
55
+ * writes at most: a week of a bot's updates, and a day of wakes, is kilobytes. Each update
56
+ * is flushed to the volume as it is written; a wake, lost, costs nothing.
57
+ */
58
+ export function environmentAccess(name) {
59
+ const topic = telegramTopic(name);
60
+ const wake = lakeWakeTopic(name);
61
+ return {
62
+ principals: [
63
+ {
64
+ name: alasioPrincipal(name),
65
+ acls: [
66
+ { resource: "topic", name: topic, pattern: "literal", operations: ["read", "describe"] },
67
+ { resource: "group", name: alasioGroup(name), pattern: "literal", operations: ["read"] },
68
+ { resource: "topic", name: wake, pattern: "literal", operations: ["write", "describe"] },
69
+ ],
70
+ },
71
+ {
72
+ name: loaderPrincipal(name),
73
+ acls: [{ resource: "topic", name: wake, pattern: "literal", operations: ["read", "describe"] }, { resource: "group", name: loaderGroup(name), pattern: "literal", operations: ["read"] }],
74
+ },
75
+ ],
76
+ topics: [
77
+ // Each update flushed to the volume as it is written: Telegram, answered once the log has it, sends it no more.
78
+ { name: topic, partitions: 1, retentionMs: TELEGRAM_RETENTION_MS, retentionBytes: LOG_SEGMENT_BYTES, configs: { "flush.messages": "1" } },
79
+ { name: wake, partitions: 1, retentionMs: WAKE_RETENTION_MS, retentionBytes: LOG_SEGMENT_BYTES, configs: {} },
80
+ ],
81
+ };
82
+ }
83
+ /** The log's brokers, as a client anywhere in the cluster bootstraps from them. */
84
+ export const LOG_BROKERS = `${LOG}.${NAMESPACE}.svc:${LOG_PORT}`;
85
+ /** The Secret of the principal `principal`'s name and password, which the stack's setup writes. */
86
+ export const logPrincipalSecret = (principal) => componentName(`log-${principal}`);
87
+ /**
88
+ * The Secret of the principal the alasio of `environment` reads its topic as, in its
89
+ * namespace: main's, which the stack's setup writes; a branch environment's, which alasio's
90
+ * command line writes as it makes the branch's principal.
91
+ */
92
+ export const environmentLogSecret = ({ branch }) => (branch === null ? logPrincipalSecret("alasio-main") : componentName("log-alasio"));
93
+ /** 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. */
94
+ export const loaderLogSecret = ({ branch }) => (branch === null ? logPrincipalSecret("loader-main") : componentName("log-loader"));
95
+ /** A node's address, by its ordinal: its pod's name in the log's headless Service. */
96
+ const nodeAddress = (ordinal) => `${LOG}-${ordinal}.${LOG}.${NAMESPACE}.svc`;
97
+ /** The hours of a retention as log.retention says it. */
98
+ const retentionMs = (retention) => Number(retention.slice(0, -1)) * 3_600_000;
99
+ /**
100
+ * What the log's access is: the telemetry topics, of as many partitions as the intake
101
+ * runs replicas at most, so each has one to read, each partition keeping its share of the
102
+ * volume at most (telemetryRetentionBytes), each flushed to its volume within a second
103
+ * (flush.ms); the gateway's writing them, the intake's reading them in its group, and
104
+ * KEDA's reading how far the group is behind on them, and each environment's lake loader on
105
+ * its wake topic, which asks to describe both and to read neither; the webhook intake's
106
+ * writing every environment's Telegram topic, a branch's among them, and nothing else; and
107
+ * main's environment's principals and topics (environmentAccess).
108
+ *
109
+ * A write is acknowledged once a majority of the nodes have it in their page caches, not
110
+ * on their volumes. On one node, the volume outlives the pod, so a restart of the pod loses
111
+ * nothing acknowledged, but a crash of its host loses what the node had not flushed: up
112
+ * to a second of acknowledged telemetry, as its log flusher looks each second for what is
113
+ * older than flush.ms (log.flush.scheduler.interval.ms, serverProperties), and a flush a
114
+ * second costs next to nothing at the rate the stack writes it; and nothing of Telegram's
115
+ * updates, each flushed as it is written (flush.messages), as Telegram has had its answer.
116
+ * On three, each record is on two hosts before it is acknowledged, so a host's crash loses
117
+ * none.
118
+ */
119
+ export function logAccess(config) {
120
+ const partitions = Math.max(1, config.lake.intake.scaling.max);
121
+ const telemetry = { resource: "topic", name: "otel.", pattern: "prefixed" };
122
+ const group = { resource: "group", name: INTAKE_GROUP, pattern: "literal" };
123
+ const main = environmentAccess("main");
124
+ const services = {
125
+ gateway: [{ ...telemetry, operations: ["write", "describe"] }],
126
+ intake: [{ ...telemetry, operations: ["read", "describe"] }, { ...group, operations: ["read"] }],
127
+ // And every environment's wake topic and its loader's group, which it reads how far behind on too.
128
+ scaler: [
129
+ { ...telemetry, operations: ["describe"] },
130
+ { ...group, operations: ["describe"] },
131
+ { resource: "topic", name: "lake.", pattern: "prefixed", operations: ["describe"] },
132
+ { resource: "group", name: "lake-loader.", pattern: "prefixed", operations: ["describe"] },
133
+ ],
134
+ webhook: [{ resource: "topic", name: "telegram.", pattern: "prefixed", operations: ["write", "describe"] }],
135
+ };
136
+ const retention = { retentionMs: retentionMs(config.log.retention), retentionBytes: telemetryRetentionBytes(config) };
137
+ return {
138
+ topics: [...Object.values(TELEMETRY_TOPICS).map((name) => ({ name, partitions, ...retention, configs: { "flush.ms": "1000" } })), ...main.topics],
139
+ principals: [...Object.entries(services).map(([name, acls]) => ({ name, acls })), ...main.principals],
140
+ };
141
+ }
142
+ /**
143
+ * Its nodes' configuration, whole: combined nodes, KRaft's voters every one of them; clients
144
+ * on SCRAM-SHA-512 and the controllers on a listener of their own; nothing allowed without an
145
+ * ACL but to its admin, and to what reaches the controllers' listener, its nodes alone;
146
+ * topics made by its access applier alone, each partition on every node, a write
147
+ * acknowledged once a majority of them has it, and flushed to its volume within a second
148
+ * where its topic says so (flush.ms), its log flusher looking each second, where it would
149
+ * look never by default; a record of up to 8 MiB, as a minute's
150
+ * scrape of the stack in one export may be; its segments on its volume, each closed within
151
+ * the hour or at LOG_SEGMENT_BYTES, so its retention, which deletes closed ones alone,
152
+ * reaches them in time. What differs from node to node (its id, its address, its admin's
153
+ * password) its start script adds (START).
154
+ */
155
+ function serverProperties(config) {
156
+ const nodes = config.log.scaling.min;
157
+ const voters = Array.from({ length: nodes }, (_, ordinal) => `${ordinal}@${nodeAddress(ordinal)}:${LOG_CONTROLLER_PORT}`);
158
+ const majority = Math.floor(nodes / 2) + 1;
159
+ 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",
160
+ // ANONYMOUS is what reaches the controllers' listener, unauthenticated: the NetworkPolicy, admitting its port from the log's own pods alone, is its guard.
161
+ "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");
162
+ }
163
+ /** Its logging, to its output alone, rather than to files in its /tmp. */
164
+ 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");
165
+ /**
166
+ * What its JMX exporter serves, of the MBeans it reads alone: how long its Produce requests
167
+ * take (p50 and p99, in ms), how many bytes each partition holds on its volume, and its
168
+ * broker's state (3 while it runs); and the JVM's own metrics.
169
+ */
170
+ 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");
171
+ /**
172
+ * How a node starts, `format` or `serve`: its configuration written to /tmp, the log's,
173
+ * then its id (its pod's ordinal), its address, and the admin it reaches the other nodes
174
+ * as; then its volume formatted for the cluster's id, its admin made with KRaft's
175
+ * bootstrap, once (a formatted volume is left as it is); or it serves.
176
+ */
177
+ 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");
178
+ /** The log's objects: it always runs, Telegram's updates coming through it. */
179
+ export function logObjects(config) {
180
+ const { log } = config;
181
+ const metadata = { name: LOG, namespace: NAMESPACE, labels: stackLabels(LOG_COMPONENT) };
182
+ const access = logAccess(config);
183
+ const data = {
184
+ "server.properties": serverProperties(config),
185
+ "log4j2.properties": LOG4J2,
186
+ "metrics.yaml": METRICS,
187
+ "start.sh": START,
188
+ "access.json": `${JSON.stringify(access, null, 2)}\n`,
189
+ };
190
+ const configMap = { apiVersion: "v1", kind: "ConfigMap", metadata, data };
191
+ // Headless, each node's address its pod's, which the others reach it by before it is ready, as KRaft's quorum forms.
192
+ const service = {
193
+ apiVersion: "v1",
194
+ kind: "Service",
195
+ metadata,
196
+ spec: {
197
+ clusterIP: "None",
198
+ publishNotReadyAddresses: true,
199
+ selector: selectorLabels(LOG_COMPONENT),
200
+ ports: [
201
+ { name: "client", port: LOG_PORT },
202
+ { name: "controller", port: LOG_CONTROLLER_PORT },
203
+ { name: "metrics", port: LOG_METRICS_PORT },
204
+ ],
205
+ },
206
+ };
207
+ const secret = (key) => ({ name: key, valueFrom: { secretKeyRef: { name: LOG, key } } });
208
+ const node = (name, command) => ({
209
+ name,
210
+ image: imageReference(config.images.log),
211
+ imagePullPolicy: config.images.pullPolicy,
212
+ command: ["/bin/sh", "/etc/log/start.sh", command],
213
+ securityContext: { ...restrictedContainer(), readOnlyRootFilesystem: true },
214
+ });
215
+ const mounts = [{ name: "config", mountPath: "/etc/log", readOnly: true }, { name: "tmp", mountPath: "/tmp" }, { name: "data", mountPath: "/data" }];
216
+ const common = [
217
+ secret("KAFKA_CLUSTER_ID"),
218
+ secret("LOG_ADMIN_PASSWORD"),
219
+ { name: "LOG_DIR", value: "/tmp/logs" },
220
+ { name: "KAFKA_LOG4J_OPTS", value: "-Dlog4j2.configurationFile=/etc/log/log4j2.properties" },
221
+ ];
222
+ const statefulSet = {
223
+ apiVersion: "apps/v1",
224
+ kind: "StatefulSet",
225
+ metadata,
226
+ spec: {
227
+ serviceName: LOG,
228
+ ...replicasOf(log.scaling),
229
+ // Every voter at once: a quorum of three forms only once two of them run.
230
+ podManagementPolicy: "Parallel",
231
+ selector: { matchLabels: selectorLabels(LOG_COMPONENT) },
232
+ template: {
233
+ metadata: { labels: stackLabels(LOG_COMPONENT), annotations: { "checksum/config": sha256(JSON.stringify(data)) } },
234
+ spec: {
235
+ ...priority("bound"),
236
+ ...stackPodSpec(config),
237
+ ...spread(LOG_COMPONENT, log.scaling, true),
238
+ // Its partitions closed cleanly as it stops, so it starts again without recovering them.
239
+ terminationGracePeriodSeconds: 120,
240
+ initContainers: [{
241
+ ...node("format", "format"),
242
+ env: [...common, { name: "KAFKA_HEAP_OPTS", value: "-Xmx256m" }],
243
+ resources: { requests: { cpu: "50m", memory: "256Mi" }, limits: { memory: "512Mi" } },
244
+ volumeMounts: mounts,
245
+ }],
246
+ containers: [
247
+ {
248
+ ...node("log", "serve"),
249
+ env: [
250
+ ...common,
251
+ { name: "KAFKA_HEAP_OPTS", value: "-Xms512m -Xmx512m" },
252
+ { name: "KAFKA_OPTS", value: `-javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent.jar=${LOG_METRICS_PORT}:/etc/log/metrics.yaml` },
253
+ // Without -loggc: no GC log files in /tmp.
254
+ { name: "EXTRA_ARGS", value: "-name kafkaServer" },
255
+ ],
256
+ ports: [
257
+ { name: "client", containerPort: LOG_PORT },
258
+ { name: "controller", containerPort: LOG_CONTROLLER_PORT },
259
+ { name: "metrics", containerPort: LOG_METRICS_PORT },
260
+ ],
261
+ startupProbe: { tcpSocket: { port: "client" }, periodSeconds: 5, failureThreshold: 120 },
262
+ readinessProbe: { tcpSocket: { port: "client" }, periodSeconds: 10 },
263
+ livenessProbe: { tcpSocket: { port: "client" }, periodSeconds: 30, failureThreshold: 4 },
264
+ resources: log.resources,
265
+ volumeMounts: mounts,
266
+ },
267
+ {
268
+ name: "access",
269
+ image: imageReference(config.images.alasio),
270
+ imagePullPolicy: config.images.pullPolicy,
271
+ command: ["node", "/opt/alasio/src/log/access.ts"],
272
+ env: [
273
+ { name: "LOG_BROKERS", value: `127.0.0.1:${LOG_PORT}` },
274
+ secret("LOG_ADMIN_PASSWORD"),
275
+ { name: "LOG_ACCESS", value: "/etc/log/access.json" },
276
+ { name: "LOG_PASSWORDS", value: "/etc/log-passwords" },
277
+ { name: "LOG_ACCESS_PORT", value: String(ACCESS_PORT) },
278
+ ],
279
+ ports: [{ name: "access", containerPort: ACCESS_PORT }],
280
+ readinessProbe: { httpGet: { path: "/readyz", port: "access" }, periodSeconds: 5 },
281
+ securityContext: { ...restrictedContainer(), readOnlyRootFilesystem: true },
282
+ resources: { requests: { cpu: "10m", memory: "64Mi" }, limits: { memory: "192Mi" } },
283
+ volumeMounts: [{ name: "config", mountPath: "/etc/log", readOnly: true }, { name: "passwords", mountPath: "/etc/log-passwords", readOnly: true }],
284
+ },
285
+ ],
286
+ volumes: [
287
+ { name: "config", configMap: { name: LOG } },
288
+ { name: "passwords", secret: { secretName: componentName("log-access") } },
289
+ { name: "tmp", emptyDir: { sizeLimit: "1Gi" } },
290
+ ],
291
+ },
292
+ },
293
+ volumeClaimTemplates: [{ metadata: { name: "data", labels: stackLabels(LOG_COMPONENT) }, spec: claimSpec(log.storage) }],
294
+ },
295
+ };
296
+ return [configMap, service, statefulSet, ...replicaBudget(LOG_COMPONENT, NAMESPACE, log.scaling), verticalPodAutoscaler(statefulSet, "Recommended")];
297
+ }
298
+ //# 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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"}