Problem 1: elasticmq-native does not support H2 JDBC persistence
- GraalVM native build excludes H2 driver
- Fix: switch to softwaremill/elasticmq:1.7.1 (JVM image)
Problem 2: OOMKilled — JVM requires >150MB, spec.MemoryMB=64 too low
- Fix: enforce minimum 256Mi for JVM; add -Xmx (75% of limit)
Problem 3: AccessDeniedException on /data — PVC mounted as root:root
- JVM image runs as uid=999 (elasticmq)
- Fix: add fsGroup=999 to PodSecurityContext
Problem 4: 404 through HTTPS — nginx rewrite stripped context-path
- ElasticMQ JVM listens at context-path (/sqs/{tenantId})
- Native image tolerated /, JVM does not
- Fix: remove rewrite-target annotation, use plain Prefix path
Result: S6 PASS — 8 queues + messages survived graceful pod kill
57 lines
2.0 KiB
Go
57 lines
2.0 KiB
Go
// Изменён: 2026-04-07
|
|
// elasticmq_config.go — генератор HOCON конфигурации для ElasticMQ.
|
|
// Каждый тенант получает уникальный конфиг: свой context-path, accountId, persistence.
|
|
// Конфиг монтируется в pod как ConfigMap → /opt/elasticmq.conf (путь из ENTRYPOINT JVM-образа).
|
|
|
|
package elasticmq
|
|
|
|
import "fmt"
|
|
|
|
// GenerateConfig генерирует HOCON конфигурацию для ElasticMQ инстанса тенанта.
|
|
// tenantID — ID тенанта (используется в context-path и accountId).
|
|
// externalHost — публичный хост (SQS_EXTERNAL_HOST env var, например sqs.kube5s.ru).
|
|
// persistence — если true, сообщения сохраняются в H2 на PVC /data.
|
|
func GenerateConfig(tenantID, externalHost string, persistence bool) string {
|
|
persistenceBlock := ""
|
|
if persistence {
|
|
// H2 база данных хранит очереди и сообщения между рестартами pod.
|
|
// Файл /data/elasticmq.db — на PVC тенанта.
|
|
persistenceBlock = `
|
|
messages-storage {
|
|
enabled = true
|
|
uri = "jdbc:h2:/data/elasticmq"
|
|
}`
|
|
} else {
|
|
persistenceBlock = `
|
|
messages-storage {
|
|
enabled = false
|
|
}`
|
|
}
|
|
|
|
return fmt.Sprintf(`include classpath("application.conf")
|
|
|
|
# Внешний адрес ноды — как будут формироваться queue URL в ответах SQS API.
|
|
# context-path должен совпадать с путём в Ingress: /sqs/%s
|
|
node-address {
|
|
protocol = https
|
|
host = %s
|
|
port = 443
|
|
context-path = "/sqs/%s"
|
|
}
|
|
|
|
rest-sqs {
|
|
enabled = true
|
|
bind-port = 9324
|
|
bind-hostname = "0.0.0.0"
|
|
# strict — соответствие AWS SQS валидации параметров
|
|
sqs-limits = strict
|
|
}
|
|
%s
|
|
# accountId = tenantID — используется в ARN очередей
|
|
aws {
|
|
region = ru-msk-1
|
|
accountId = "%s"
|
|
}
|
|
`, tenantID, externalHost, tenantID, persistenceBlock, tenantID)
|
|
}
|