kube_cluster 1.3.1 → 1.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 821079f616a7cafa9d2115b32cebda37de37601d9ac116827c7fbcead48de3eb
4
- data.tar.gz: bb33e6aec68bc2a83c67272d2a2fa73e38234095aefbb686e6b749bbd4add87c
3
+ metadata.gz: 1e6e0a31873f5a706d272e0ff37b06a8f3565b0e8d8629b92915f24c572825d1
4
+ data.tar.gz: '08b20a4bb972d5b52eddd66577c79462a59611c8f84e692d092720c09bced0da'
5
5
  SHA512:
6
- metadata.gz: 070b4bdf62bbf662bfa99eb55a464335d9666734ef3985f08949b072c78aa548cd51d0527c9cee62d26ca8839df8d2ddafa285b0fb44f0b346268174aab78ec8
7
- data.tar.gz: 28f9483b8a10994f19f485c9e55b33e464541742842eff8c5791218ff294435f6ce55f59921aa9eb5c8725bd456d8a63d74be2f39c25d88c46e8601295829f13
6
+ metadata.gz: 676e83947ff878d10e2ff3e46e9dd880120e856f480e5ed9b26d27046f7d901d07d5d044d0a3358fa99c927768f4c0c54e8af1e13fa5ef96b5806caeefa476d2
7
+ data.tar.gz: e8ade4344a74dd80bfaf8abec1bb43c5b0531b1130ab0c8584c4a0edb08e0a8d339dead8c35012cf517847d19cf066516717af9937890b70df744611f0809d5a
data/CHANGELOG.md CHANGED
@@ -5,6 +5,20 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.4.0] - 2026-07-13
9
+
10
+ ### Added
11
+ - `Standard::VictoriaMetrics::VMRule` — a wrapper for the VictoriaMetrics
12
+ operator's `VMRule` CRD (pinned to `operator.victoriametrics.com/v1beta1`).
13
+ Rules are built from `VMRule::Group` objects, each exposing `rule`/`alert`
14
+ helpers that construct `Rule`/`Alert` leaves; the rule expression is the
15
+ return value of a block, so multi-line PromQL reads as a heredoc.
16
+ - `Standard::VictoriaMetrics::VMAlert` — a wrapper for the VictoriaMetrics
17
+ operator's `VMAlert` CRD (pinned to `operator.victoriametrics.com/v1beta1`).
18
+ Wires `datasource`/`remoteWrite`/`remoteRead` and defaults `selectAllByDefault`
19
+ to true so it evaluates every `VMRule`; `notifier_url` is optional (recording
20
+ rules need no notifier).
21
+
8
22
  ## [1.3.1] - 2026-07-13
9
23
 
10
24
  ### Changed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kube_cluster (1.3.1)
4
+ kube_cluster (1.5.0)
5
5
  activesupport (~> 8.0)
6
6
  kube_kubectl (~> 2.0)
7
7
  kube_schema (~> 1.9.2)
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # HA/clustered VictoriaLogs: vlstorage + vlselect + vlinsert components
11
+ # (the horizontally-scalable alternative to VLSingle). Retention lives on
12
+ # the vlstorage component, so configure the components in the block.
13
+ class VLCluster < Kube::Cluster["VLCluster"]
14
+ def initialize(name:, &block)
15
+ super() {
16
+ metadata.name = name
17
+ instance_exec(&block) if block
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ __END__
27
+
28
+ describe "VictoriaMetrics::VLCluster" do
29
+ it "initializes without error" do
30
+ Kube::Cluster::Standard::VictoriaMetrics::VLCluster
31
+ .new(name: "vlcluster")
32
+ .to_yaml
33
+ .is_a?(String)
34
+ .should == true
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Legacy VictoriaLogs kind (operator.victoriametrics.com/v1beta1). New
11
+ # deployments should prefer VLSingle (v1); this wrapper exists for
12
+ # completeness / migrating existing objects. Spec is configured in block.
13
+ class VLogs < Kube::Cluster["VLogs"]
14
+ def initialize(name:, &block)
15
+ super() {
16
+ metadata.name = name
17
+ instance_exec(&block) if block
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ __END__
27
+
28
+ describe "VictoriaMetrics::VLogs" do
29
+ it "initializes without error" do
30
+ Kube::Cluster::Standard::VictoriaMetrics::VLogs
31
+ .new(name: "vlogs")
32
+ .to_yaml
33
+ .is_a?(String)
34
+ .should == true
35
+ end
36
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Evaluates VMRule recording/alerting rules (selecting all by default).
11
+ # Recording-rule output is written back via remote_write_url; a notifier
12
+ # is only needed for alerting rules, so it is optional.
13
+ class VMAlert < Kube::Cluster["VMAlert"]
14
+ def initialize(name:, datasource_url:, remote_write_url:, remote_read_url: nil,
15
+ notifier_url: nil, evaluation_interval: nil, select_all: true, &block)
16
+ super() {
17
+ metadata.name = name
18
+ spec.selectAllByDefault = select_all
19
+ spec.datasource = { url: datasource_url }
20
+ spec.remoteWrite = { url: remote_write_url }
21
+ spec.remoteRead = { url: remote_read_url } if remote_read_url
22
+ spec.notifiers = [{ url: notifier_url }] if notifier_url
23
+ spec.evaluationInterval = evaluation_interval if evaluation_interval
24
+ instance_exec(&block) if block
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ __END__
34
+
35
+ describe "VictoriaMetrics::VMAlert" do
36
+ it "wires datasource and remote-write for recording rules" do
37
+ yaml = Kube::Cluster::Standard::VictoriaMetrics::VMAlert.new(
38
+ name: "vmalert",
39
+ datasource_url: "http://vmsingle-vmsingle.metrics.svc:8429/prometheus",
40
+ remote_write_url: "http://vmsingle-vmsingle.metrics.svc:8429/api/v1/write"
41
+ ).to_yaml
42
+
43
+ yaml.include?("operator.victoriametrics.com/v1beta1").should == true
44
+ yaml.include?("selectAllByDefault").should == true
45
+ yaml.include?("/api/v1/write").should == true
46
+ end
47
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Managed Alertmanager instance. Notification routing/receivers can be
11
+ # supplied inline via spec.configRawYaml or selected from
12
+ # VMAlertmanagerConfig objects; configure that in the block.
13
+ class VMAlertmanager < Kube::Cluster["VMAlertmanager"]
14
+ def initialize(name:, replica_count: 1, &block)
15
+ super() {
16
+ metadata.name = name
17
+ spec.replicaCount = replica_count
18
+ instance_exec(&block) if block
19
+ }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ __END__
28
+
29
+ describe "VictoriaMetrics::VMAlertmanager" do
30
+ it "initializes without error" do
31
+ Kube::Cluster::Standard::VictoriaMetrics::VMAlertmanager
32
+ .new(name: "vmalertmanager")
33
+ .to_yaml
34
+ .is_a?(String)
35
+ .should == true
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Alertmanager routing tree and receivers, selected by a VMAlertmanager.
11
+ # Define spec.route and spec.receivers in the block.
12
+ class VMAlertmanagerConfig < Kube::Cluster["VMAlertmanagerConfig"]
13
+ def initialize(name:, &block)
14
+ super() {
15
+ metadata.name = name
16
+ instance_exec(&block) if block
17
+ }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ __END__
26
+
27
+ describe "VictoriaMetrics::VMAlertmanagerConfig" do
28
+ it "initializes without error" do
29
+ Kube::Cluster::Standard::VictoriaMetrics::VMAlertmanagerConfig
30
+ .new(name: "vmalertmanagerconfig")
31
+ .to_yaml
32
+ .is_a?(String)
33
+ .should == true
34
+ end
35
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # VictoriaMetrics Anomaly Detection service (vmanomaly). Reads metrics,
11
+ # fits models, and writes anomaly scores back. Provide the model/reader/
12
+ # writer configuration via spec.configRawYaml in the block.
13
+ class VMAnomaly < Kube::Cluster["VMAnomaly"]
14
+ def initialize(name:, &block)
15
+ super() {
16
+ metadata.name = name
17
+ instance_exec(&block) if block
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ __END__
27
+
28
+ describe "VictoriaMetrics::VMAnomaly" do
29
+ it "initializes without error" do
30
+ Kube::Cluster::Standard::VictoriaMetrics::VMAnomaly
31
+ .new(name: "vmanomaly")
32
+ .to_yaml
33
+ .is_a?(String)
34
+ .should == true
35
+ end
36
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Reusable configuration object referenced by a VMAnomaly instance.
11
+ # Define the models/schedulers in the block.
12
+ class VMAnomalyConfig < Kube::Cluster["VMAnomalyConfig"]
13
+ def initialize(name:, &block)
14
+ super() {
15
+ metadata.name = name
16
+ instance_exec(&block) if block
17
+ }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ __END__
26
+
27
+ describe "VictoriaMetrics::VMAnomalyConfig" do
28
+ it "initializes without error" do
29
+ Kube::Cluster::Standard::VictoriaMetrics::VMAnomalyConfig
30
+ .new(name: "vmanomalyconfig") { spec.schedulers = {} }
31
+ .to_yaml
32
+ .is_a?(String)
33
+ .should == true
34
+ end
35
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Auth proxy / router that sits in front of VictoriaMetrics components and
11
+ # dispatches requests according to the VMUser objects it selects. Configure
12
+ # user selection and unauthorized-access rules in the block.
13
+ class VMAuth < Kube::Cluster["VMAuth"]
14
+ def initialize(name:, &block)
15
+ super() {
16
+ metadata.name = name
17
+ instance_exec(&block) if block
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ __END__
27
+
28
+ describe "VictoriaMetrics::VMAuth" do
29
+ it "initializes without error" do
30
+ Kube::Cluster::Standard::VictoriaMetrics::VMAuth
31
+ .new(name: "vmauth")
32
+ .to_yaml
33
+ .is_a?(String)
34
+ .should == true
35
+ end
36
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # HA/clustered VictoriaMetrics: vmstorage + vmselect + vminsert
11
+ # components (the horizontally-scalable alternative to VMSingle).
12
+ # Configure the three components in the block.
13
+ class VMCluster < Kube::Cluster["VMCluster"]
14
+ def initialize(name:, retention_period: "30d", &block)
15
+ super() {
16
+ metadata.name = name
17
+ spec.retentionPeriod = retention_period
18
+ instance_exec(&block) if block
19
+ }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ __END__
28
+
29
+ describe "VictoriaMetrics::VMCluster" do
30
+ it "initializes without error" do
31
+ Kube::Cluster::Standard::VictoriaMetrics::VMCluster
32
+ .new(name: "vmcluster")
33
+ .to_yaml
34
+ .is_a?(String)
35
+ .should == true
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Multi-zone/distributed VictoriaMetrics topology. The full shape (zones,
11
+ # common settings) is configured in the block.
12
+ class VMDistributed < Kube::Cluster["VMDistributed"]
13
+ def initialize(name:, &block)
14
+ super() {
15
+ metadata.name = name
16
+ instance_exec(&block) if block
17
+ }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ __END__
26
+
27
+ describe "VictoriaMetrics::VMDistributed" do
28
+ it "initializes without error" do
29
+ Kube::Cluster::Standard::VictoriaMetrics::VMDistributed
30
+ .new(name: "vmdistributed") { spec.retain = true }
31
+ .to_yaml
32
+ .is_a?(String)
33
+ .should == true
34
+ end
35
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Declares how to scrape the pods selected by the app.kubernetes.io/name
11
+ # label (the pod-selector analogue of VMServiceScrape), relabelling the
12
+ # metrics onto a job.
13
+ class VMPodScrape < Kube::Cluster["VMPodScrape"]
14
+ def initialize(name:, job:, match_name:, port:, &block)
15
+ super() {
16
+ metadata.name = name
17
+ spec.selector = { matchLabels: { "app.kubernetes.io/name" => match_name } }
18
+ spec.podMetricsEndpoints = [{ port: port, relabelConfigs: [{ targetLabel: "job", replacement: job }] }]
19
+ instance_exec(&block) if block
20
+ }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ __END__
29
+
30
+ describe "VictoriaMetrics::VMPodScrape" do
31
+ it "initializes without error" do
32
+ Kube::Cluster::Standard::VictoriaMetrics::VMPodScrape
33
+ .new(name: "opencost", job: "opencost", match_name: "opencost", port: "http")
34
+ .to_yaml
35
+ .is_a?(String)
36
+ .should == true
37
+ end
38
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Blackbox/probe scraping: points a prober (e.g. blackbox_exporter) at a
11
+ # set of targets. Pass the prober URL here and the targets/module in the
12
+ # block via spec.targets and spec.module.
13
+ class VMProbe < Kube::Cluster["VMProbe"]
14
+ def initialize(name:, prober_url:, &block)
15
+ super() {
16
+ metadata.name = name
17
+ spec.vmProberSpec = { url: prober_url }
18
+ instance_exec(&block) if block
19
+ }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ __END__
28
+
29
+ describe "VictoriaMetrics::VMProbe" do
30
+ it "initializes without error" do
31
+ Kube::Cluster::Standard::VictoriaMetrics::VMProbe
32
+ .new(name: "blackbox", prober_url: "http://blackbox-exporter.metrics.svc:9115")
33
+ .to_yaml
34
+ .is_a?(String)
35
+ .should == true
36
+ end
37
+ end
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # A recording rule. The block returns the PromQL expression, so
11
+ # multi-line queries read as a heredoc at the call site.
12
+ class Rule
13
+ def initialize(name, labels: nil, &block)
14
+ @name = name
15
+ @labels = labels
16
+ @expr = block.call.to_s if block
17
+ end
18
+
19
+ def to_h
20
+ h = { record: @name, expr: @expr }
21
+ h[:labels] = @labels if @labels
22
+ h
23
+ end
24
+ end
25
+
26
+ # An alerting rule. The block returns the PromQL expression.
27
+ class Alert
28
+ def initialize(name, for_: nil, keep_firing_for: nil, labels: nil, annotations: nil, &block)
29
+ @name = name
30
+ @for = for_
31
+ @keep_firing_for = keep_firing_for
32
+ @labels = labels
33
+ @annotations = annotations
34
+ @expr = block.call.to_s if block
35
+ end
36
+
37
+ def to_h
38
+ h = { alert: @name, expr: @expr }
39
+ h[:for] = @for if @for
40
+ h[:keep_firing_for] = @keep_firing_for if @keep_firing_for
41
+ h[:labels] = @labels if @labels
42
+ h[:annotations] = @annotations if @annotations
43
+ h
44
+ end
45
+ end
46
+
47
+ # A named group of rules. `rule`/`alert` build and collect the leaves;
48
+ # the block is instance_eval'd so those helpers read like keywords.
49
+ #
50
+ # Group.new("node.rules") {
51
+ # rule "node:node_num_cpu:sum" do
52
+ # <<~PROMQL
53
+ # count by (cluster, node) (...)
54
+ # PROMQL
55
+ # end
56
+ # }
57
+ class Group
58
+ def initialize(name, &block)
59
+ @name = name
60
+ @rules = []
61
+ instance_eval(&block) if block
62
+ end
63
+
64
+ def rule(name, **opts, &block) = @rules << Rule.new(name, **opts, &block)
65
+ def alert(name, **opts, &block) = @rules << Alert.new(name, **opts, &block)
66
+
67
+ def to_h = { name: @name, rules: @rules.map(&:to_h) }
68
+ end
69
+
70
+ # A VMRule CR: a set of rule Groups evaluated by VictoriaMetrics.
71
+ #
72
+ # VMRule.new(name: "node", groups: [
73
+ # Group.new("node.rules") { ... },
74
+ # ])
75
+ class VMRule < Kube::Cluster["VMRule"]
76
+ def initialize(name:, groups:, &block)
77
+ super() {
78
+ metadata.name = name
79
+ spec.groups = groups.map(&:to_h)
80
+ instance_exec(&block) if block
81
+ }
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ __END__
90
+
91
+ describe "VictoriaMetrics::VMRule" do
92
+ vmrule = Kube::Cluster::Standard::VictoriaMetrics::VMRule
93
+ group = Kube::Cluster::Standard::VictoriaMetrics::Group
94
+
95
+ it "emits a recording rule with the resolved v1beta1 apiVersion" do
96
+ yaml = vmrule.new(
97
+ name: "node",
98
+ groups: [
99
+ group.new("node.rules") {
100
+ rule "node:node_num_cpu:sum" do
101
+ "count by (cluster, node) (node_cpu_seconds_total)"
102
+ end
103
+ },
104
+ ]
105
+ ).to_yaml
106
+
107
+ yaml.include?("operator.victoriametrics.com/v1beta1").should == true
108
+ yaml.include?("record: node:node_num_cpu:sum").should == true
109
+ end
110
+
111
+ it "carries labels on records" do
112
+ group.new("g") {
113
+ rule "r", labels: { quantile: "0.99" } do
114
+ "histogram_quantile(0.99, x)"
115
+ end
116
+ }.to_h.should == {
117
+ name: "g",
118
+ rules: [{ record: "r", expr: "histogram_quantile(0.99, x)", labels: { quantile: "0.99" } }],
119
+ }
120
+ end
121
+
122
+ it "builds alerts with for/labels/annotations" do
123
+ group.new("g") {
124
+ alert "Down", for_: "5m", labels: { severity: "warning" }, annotations: { summary: "down" } do
125
+ "up == 0"
126
+ end
127
+ }.to_h.should == {
128
+ name: "g",
129
+ rules: [{
130
+ alert: "Down",
131
+ expr: "up == 0",
132
+ for: "5m",
133
+ labels: { severity: "warning" },
134
+ annotations: { summary: "down" },
135
+ }],
136
+ }
137
+ end
138
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Generic scrape configuration supporting the full range of service-
11
+ # discovery mechanisms (static, kubernetes, http, ec2, consul, …). Declare
12
+ # the discovery configs and relabelling in the block.
13
+ class VMScrapeConfig < Kube::Cluster["VMScrapeConfig"]
14
+ def initialize(name:, &block)
15
+ super() {
16
+ metadata.name = name
17
+ instance_exec(&block) if block
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ __END__
27
+
28
+ describe "VictoriaMetrics::VMScrapeConfig" do
29
+ it "initializes without error" do
30
+ Kube::Cluster::Standard::VictoriaMetrics::VMScrapeConfig
31
+ .new(name: "vmscrapeconfig")
32
+ .to_yaml
33
+ .is_a?(String)
34
+ .should == true
35
+ end
36
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Scrapes a fixed set of static targets (host:port) under a named job —
11
+ # for endpoints that have no Service/Pod to select. Extra per-endpoint
12
+ # settings (path, scheme, labels) can be added in the block.
13
+ class VMStaticScrape < Kube::Cluster["VMStaticScrape"]
14
+ def initialize(name:, job:, targets:, &block)
15
+ super() {
16
+ metadata.name = name
17
+ spec.jobName = job
18
+ spec.targetEndpoints = [{ targets: Array(targets) }]
19
+ instance_exec(&block) if block
20
+ }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ __END__
29
+
30
+ describe "VictoriaMetrics::VMStaticScrape" do
31
+ it "initializes without error" do
32
+ Kube::Cluster::Standard::VictoriaMetrics::VMStaticScrape
33
+ .new(name: "external", job: "external", targets: ["10.0.0.1:9100"])
34
+ .to_yaml
35
+ .is_a?(String)
36
+ .should == true
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # A user/route definition consumed by VMAuth: maps credentials to a set of
11
+ # upstream target refs. Pass the routing in the block via spec.targetRefs.
12
+ class VMUser < Kube::Cluster["VMUser"]
13
+ def initialize(name:, username: nil, &block)
14
+ super() {
15
+ metadata.name = name
16
+ spec.username = username if username
17
+ instance_exec(&block) if block
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ __END__
27
+
28
+ describe "VictoriaMetrics::VMUser" do
29
+ it "initializes without error" do
30
+ Kube::Cluster::Standard::VictoriaMetrics::VMUser
31
+ .new(name: "vmuser", username: "reader") {
32
+ spec.targetRefs = [{ crd: { kind: "VMSingle", name: "vmsingle", namespace: "metrics" }, paths: ["/"] }]
33
+ }
34
+ .to_yaml
35
+ .is_a?(String)
36
+ .should == true
37
+ end
38
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # HA/clustered VictoriaTraces: storage + select + insert components
11
+ # (the horizontally-scalable alternative to VTSingle). Retention lives on
12
+ # the storage component, so configure the components in the block.
13
+ class VTCluster < Kube::Cluster["VTCluster"]
14
+ def initialize(name:, &block)
15
+ super() {
16
+ metadata.name = name
17
+ instance_exec(&block) if block
18
+ }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ __END__
27
+
28
+ describe "VictoriaMetrics::VTCluster" do
29
+ it "initializes without error" do
30
+ Kube::Cluster::Standard::VictoriaMetrics::VTCluster
31
+ .new(name: "vtcluster")
32
+ .to_yaml
33
+ .is_a?(String)
34
+ .should == true
35
+ end
36
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
4
+ require "kube/cluster"
5
+
6
+ module Kube
7
+ module Cluster
8
+ module Standard
9
+ module VictoriaMetrics
10
+ # Single-node VictoriaTraces store.
11
+ class VTSingle < Kube::Cluster["VTSingle"]
12
+ def initialize(name:, retention_period: "30d", &block)
13
+ super() {
14
+ metadata.name = name
15
+ spec.retentionPeriod = retention_period
16
+ instance_exec(&block) if block
17
+ }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ __END__
26
+
27
+ describe "VictoriaMetrics::VTSingle" do
28
+ it "initializes without error" do
29
+ Kube::Cluster::Standard::VictoriaMetrics::VTSingle
30
+ .new(name: "vtsingle")
31
+ .to_yaml
32
+ .is_a?(String)
33
+ .should == true
34
+ end
35
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Kube
4
4
  module Cluster
5
- VERSION = "1.3.1"
5
+ VERSION = "1.5.0"
6
6
  end
7
7
  end
data/lib/kube/cluster.rb CHANGED
@@ -126,11 +126,29 @@ Kube::Cluster.config do
126
126
 
127
127
  # VictoriaMetrics operator.
128
128
  resolve "VLAgent", to: "operator.victoriametrics.com/v1/VLAgent"
129
+ resolve "VLCluster", to: "operator.victoriametrics.com/v1/VLCluster"
130
+ resolve "VLogs", to: "operator.victoriametrics.com/v1beta1/VLogs"
129
131
  resolve "VLSingle", to: "operator.victoriametrics.com/v1/VLSingle"
130
132
  resolve "VMAgent", to: "operator.victoriametrics.com/v1beta1/VMAgent"
133
+ resolve "VMAlert", to: "operator.victoriametrics.com/v1beta1/VMAlert"
134
+ resolve "VMAlertmanager", to: "operator.victoriametrics.com/v1beta1/VMAlertmanager"
135
+ resolve "VMAlertmanagerConfig", to: "operator.victoriametrics.com/v1beta1/VMAlertmanagerConfig"
136
+ resolve "VMAnomaly", to: "operator.victoriametrics.com/v1/VMAnomaly"
137
+ resolve "VMAnomalyConfig", to: "operator.victoriametrics.com/v1/VMAnomalyConfig"
138
+ resolve "VMAuth", to: "operator.victoriametrics.com/v1beta1/VMAuth"
139
+ resolve "VMCluster", to: "operator.victoriametrics.com/v1beta1/VMCluster"
140
+ resolve "VMDistributed", to: "operator.victoriametrics.com/v1alpha1/VMDistributed"
131
141
  resolve "VMNodeScrape", to: "operator.victoriametrics.com/v1beta1/VMNodeScrape"
142
+ resolve "VMPodScrape", to: "operator.victoriametrics.com/v1beta1/VMPodScrape"
143
+ resolve "VMProbe", to: "operator.victoriametrics.com/v1beta1/VMProbe"
144
+ resolve "VMRule", to: "operator.victoriametrics.com/v1beta1/VMRule"
145
+ resolve "VMScrapeConfig", to: "operator.victoriametrics.com/v1beta1/VMScrapeConfig"
132
146
  resolve "VMServiceScrape", to: "operator.victoriametrics.com/v1beta1/VMServiceScrape"
133
147
  resolve "VMSingle", to: "operator.victoriametrics.com/v1beta1/VMSingle"
148
+ resolve "VMStaticScrape", to: "operator.victoriametrics.com/v1beta1/VMStaticScrape"
149
+ resolve "VMUser", to: "operator.victoriametrics.com/v1beta1/VMUser"
150
+ resolve "VTCluster", to: "operator.victoriametrics.com/v1/VTCluster"
151
+ resolve "VTSingle", to: "operator.victoriametrics.com/v1/VTSingle"
134
152
 
135
153
  # Gateway API — pin to the stable v1 group/version.
136
154
  resolve "GatewayClass", to: "gateway.networking.k8s.io/v1/GatewayClass"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kube_cluster
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan K
@@ -244,11 +244,29 @@ files:
244
244
  - lib/kube/cluster/standard/service_account.rb
245
245
  - lib/kube/cluster/standard/service_account_with_role.rb
246
246
  - lib/kube/cluster/standard/victoria_metrics/vl_agent.rb
247
+ - lib/kube/cluster/standard/victoria_metrics/vl_cluster.rb
247
248
  - lib/kube/cluster/standard/victoria_metrics/vl_single.rb
249
+ - lib/kube/cluster/standard/victoria_metrics/vlogs.rb
248
250
  - lib/kube/cluster/standard/victoria_metrics/vm_agent.rb
251
+ - lib/kube/cluster/standard/victoria_metrics/vm_alert.rb
252
+ - lib/kube/cluster/standard/victoria_metrics/vm_alertmanager.rb
253
+ - lib/kube/cluster/standard/victoria_metrics/vm_alertmanager_config.rb
254
+ - lib/kube/cluster/standard/victoria_metrics/vm_anomaly.rb
255
+ - lib/kube/cluster/standard/victoria_metrics/vm_anomaly_config.rb
256
+ - lib/kube/cluster/standard/victoria_metrics/vm_auth.rb
257
+ - lib/kube/cluster/standard/victoria_metrics/vm_cluster.rb
258
+ - lib/kube/cluster/standard/victoria_metrics/vm_distributed.rb
249
259
  - lib/kube/cluster/standard/victoria_metrics/vm_node_scrape.rb
260
+ - lib/kube/cluster/standard/victoria_metrics/vm_pod_scrape.rb
261
+ - lib/kube/cluster/standard/victoria_metrics/vm_probe.rb
262
+ - lib/kube/cluster/standard/victoria_metrics/vm_rule.rb
263
+ - lib/kube/cluster/standard/victoria_metrics/vm_scrape_config.rb
250
264
  - lib/kube/cluster/standard/victoria_metrics/vm_service_scrape.rb
251
265
  - lib/kube/cluster/standard/victoria_metrics/vm_single.rb
266
+ - lib/kube/cluster/standard/victoria_metrics/vm_static_scrape.rb
267
+ - lib/kube/cluster/standard/victoria_metrics/vm_user.rb
268
+ - lib/kube/cluster/standard/victoria_metrics/vt_cluster.rb
269
+ - lib/kube/cluster/standard/victoria_metrics/vt_single.rb
252
270
  - lib/kube/cluster/standard/volume_processing.rb
253
271
  - lib/kube/cluster/version.rb
254
272
  - lib/kube/cluster/version.rb.erb