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.
- package/dist/cli/src/branches.js +106 -31
- package/dist/cli/src/branches.js.map +1 -1
- package/dist/cli/src/cluster/docker-engine.js +6 -4
- package/dist/cli/src/cluster/docker-engine.js.map +1 -1
- package/dist/cli/src/cluster/docker.js +49 -10
- package/dist/cli/src/cluster/docker.js.map +1 -1
- package/dist/cli/src/cluster/host.js +45 -19
- package/dist/cli/src/cluster/host.js.map +1 -1
- package/dist/cli/src/cluster/k3s.js +104 -5
- package/dist/cli/src/cluster/k3s.js.map +1 -1
- package/dist/cli/src/cluster/node.js +102 -51
- package/dist/cli/src/cluster/node.js.map +1 -1
- package/dist/cli/src/cluster/tar.js +43 -1
- package/dist/cli/src/cluster/tar.js.map +1 -1
- package/dist/cli/src/commands/branch.js +7 -3
- package/dist/cli/src/commands/branch.js.map +1 -1
- package/dist/cli/src/commands/init.js +54 -4
- package/dist/cli/src/commands/init.js.map +1 -1
- package/dist/cli/src/commands/lake.js +40 -6
- package/dist/cli/src/commands/lake.js.map +1 -1
- package/dist/cli/src/commands/restore-filer-store.js +56 -13
- package/dist/cli/src/commands/restore-filer-store.js.map +1 -1
- package/dist/cli/src/commands/status.js +182 -10
- package/dist/cli/src/commands/status.js.map +1 -1
- package/dist/cli/src/commands/up.js +40 -3
- package/dist/cli/src/commands/up.js.map +1 -1
- package/dist/cli/src/commands/upgrade.js +22 -6
- package/dist/cli/src/commands/upgrade.js.map +1 -1
- package/dist/cli/src/config.js +20 -8
- package/dist/cli/src/config.js.map +1 -1
- package/dist/cli/src/cpu-baseline.js +97 -0
- package/dist/cli/src/cpu-baseline.js.map +1 -0
- package/dist/cli/src/install.js +94 -13
- package/dist/cli/src/install.js.map +1 -1
- package/dist/cli/src/kept-releases.js +59 -0
- package/dist/cli/src/kept-releases.js.map +1 -0
- package/dist/cli/src/kube/api.js +9 -2
- package/dist/cli/src/kube/api.js.map +1 -1
- package/dist/cli/src/kube/apply.js +1 -1
- package/dist/cli/src/kube/apply.js.map +1 -1
- package/dist/cli/src/kube/rollout.js +79 -12
- package/dist/cli/src/kube/rollout.js.map +1 -1
- package/dist/cli/src/lake.js +124 -0
- package/dist/cli/src/lake.js.map +1 -0
- package/dist/cli/src/manifests/admission.js +183 -24
- package/dist/cli/src/manifests/admission.js.map +1 -1
- package/dist/cli/src/manifests/alasio.js +198 -27
- package/dist/cli/src/manifests/alasio.js.map +1 -1
- package/dist/cli/src/manifests/branch.js +2 -1
- package/dist/cli/src/manifests/branch.js.map +1 -1
- package/dist/cli/src/manifests/collector.js +229 -122
- package/dist/cli/src/manifests/collector.js.map +1 -1
- package/dist/cli/src/manifests/common.js +23 -8
- package/dist/cli/src/manifests/common.js.map +1 -1
- package/dist/cli/src/manifests/config.js +254 -21
- package/dist/cli/src/manifests/config.js.map +1 -1
- package/dist/cli/src/manifests/grafana.js +18 -6
- package/dist/cli/src/manifests/grafana.js.map +1 -1
- package/dist/cli/src/manifests/index.js +15 -6
- package/dist/cli/src/manifests/index.js.map +1 -1
- package/dist/cli/src/manifests/juicefs-csi.js +7 -6
- package/dist/cli/src/manifests/juicefs-csi.js.map +1 -1
- package/dist/cli/src/manifests/keda.js +2 -1
- package/dist/cli/src/manifests/keda.js.map +1 -1
- package/dist/cli/src/manifests/lake.js +340 -73
- package/dist/cli/src/manifests/lake.js.map +1 -1
- package/dist/cli/src/manifests/log.js +298 -0
- package/dist/cli/src/manifests/log.js.map +1 -0
- package/dist/cli/src/manifests/neon.js +282 -66
- package/dist/cli/src/manifests/neon.js.map +1 -1
- package/dist/cli/src/manifests/network-policies.js +211 -45
- package/dist/cli/src/manifests/network-policies.js.map +1 -1
- package/dist/cli/src/manifests/node-agent.js +116 -0
- package/dist/cli/src/manifests/node-agent.js.map +1 -0
- package/dist/cli/src/manifests/object-store.js +42 -10
- package/dist/cli/src/manifests/object-store.js.map +1 -1
- package/dist/cli/src/manifests/priorities.js +1 -0
- package/dist/cli/src/manifests/priorities.js.map +1 -1
- package/dist/cli/src/manifests/scalers.js.map +1 -1
- package/dist/cli/src/manifests/valkey.js +1 -1
- package/dist/cli/src/manifests/webhook.js +102 -0
- package/dist/cli/src/manifests/webhook.js.map +1 -0
- package/dist/cli/src/neon-storage.js +115 -0
- package/dist/cli/src/neon-storage.js.map +1 -0
- package/dist/cli/src/release.js +9 -6
- package/dist/cli/src/release.js.map +1 -1
- package/dist/cli/src/secrets.js +45 -4
- package/dist/cli/src/secrets.js.map +1 -1
- package/dist/cli/src/target.js +1 -1
- package/dist/cli/src/target.js.map +1 -1
- package/dist/cli/src/telegram.js +56 -10
- package/dist/cli/src/telegram.js.map +1 -1
- package/dist/cli/src/webhook.js +182 -0
- package/dist/cli/src/webhook.js.map +1 -0
- package/dist/cluster/node/pins.json +11 -2
- package/dist/neon/control/branches.js +146 -22
- package/dist/neon/control/branches.js.map +1 -1
- package/dist/neon/control/endpoints.js +117 -0
- package/dist/neon/control/endpoints.js.map +1 -0
- package/dist/neon/control/jwt.js +16 -3
- package/dist/neon/control/jwt.js.map +1 -1
- package/dist/neon/control/scram.js +13 -1
- package/dist/neon/control/scram.js.map +1 -1
- package/dist/neon/control/secrets.js +88 -14
- package/dist/neon/control/secrets.js.map +1 -1
- package/dist/src/kube/config.js +27 -3
- package/dist/src/kube/config.js.map +1 -1
- package/dist/src/kube/sandbox-shape.js +49 -3
- package/dist/src/kube/sandbox-shape.js.map +1 -1
- package/dist/src/node-agent/names.js +140 -0
- package/dist/src/node-agent/names.js.map +1 -0
- package/dist/src/telegram/deliveries.js +40 -0
- package/dist/src/telegram/deliveries.js.map +1 -0
- package/package.json +2 -2
- 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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"}
|