Skip to content

Commit c3e3f9e

Browse files
authored
Merge pull request #2273 from vyncint/fix/fluentbit-metrics-ipv6
fix: enable dual-stack for Fluent Bit metrics services
2 parents ec6fa1d + 2777a11 commit c3e3f9e

2 files changed

Lines changed: 100 additions & 4 deletions

File tree

pkg/resources/fluentbit/service.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"k8s.io/apimachinery/pkg/util/intstr"
2727

2828
"github.com/kube-logging/logging-operator/pkg/resources/model"
29+
"github.com/kube-logging/logging-operator/pkg/sdk/logging/api/v1beta1"
2930
)
3031

3132
func (r *Reconciler) serviceMetrics() (runtime.Object, reconciler.DesiredState, error) {
@@ -49,15 +50,21 @@ func (r *Reconciler) serviceMetrics() (runtime.Object, reconciler.DesiredState,
4950
TargetPort: intstr.IntOrString{IntVal: model.ConfigReloaderMetricsPort},
5051
})
5152
}
52-
return &corev1.Service{
53+
desired := &corev1.Service{
5354
ObjectMeta: objectMetadata,
5455
Spec: corev1.ServiceSpec{
5556
Ports: ports,
5657
Selector: r.getFluentBitLabels(),
5758
Type: corev1.ServiceTypeClusterIP,
5859
ClusterIP: corev1.ClusterIPNone,
5960
},
60-
}, reconciler.StatePresent, nil
61+
}
62+
63+
if r.fluentbitSpec.EnabledIPv6 {
64+
v1beta1.EnableIPv6Options(&desired.Spec)
65+
}
66+
67+
return desired, reconciler.StatePresent, nil
6168
}
6269
return &corev1.Service{
6370
ObjectMeta: objectMetadata,
@@ -143,7 +150,7 @@ func (r *Reconciler) serviceBufferMetrics() (runtime.Object, reconciler.DesiredS
143150
port = r.fluentbitSpec.BufferVolumeMetrics.Port
144151
}
145152

146-
return &corev1.Service{
153+
desired := &corev1.Service{
147154
ObjectMeta: objectMetadata,
148155
Spec: corev1.ServiceSpec{
149156
Ports: []corev1.ServicePort{
@@ -158,7 +165,13 @@ func (r *Reconciler) serviceBufferMetrics() (runtime.Object, reconciler.DesiredS
158165
Type: corev1.ServiceTypeClusterIP,
159166
ClusterIP: corev1.ClusterIPNone,
160167
},
161-
}, reconciler.StatePresent, nil
168+
}
169+
170+
if r.fluentbitSpec.EnabledIPv6 {
171+
v1beta1.EnableIPv6Options(&desired.Spec)
172+
}
173+
174+
return desired, reconciler.StatePresent, nil
162175
}
163176
return &corev1.Service{
164177
ObjectMeta: objectMetadata,
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Copyright © 2026 Kube logging authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package fluentbit
16+
17+
import (
18+
"testing"
19+
20+
"github.com/stretchr/testify/require"
21+
corev1 "k8s.io/api/core/v1"
22+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23+
"k8s.io/apimachinery/pkg/runtime"
24+
25+
"github.com/kube-logging/logging-operator/pkg/sdk/logging/api/v1beta1"
26+
)
27+
28+
func TestMetricsServicesIPFamilies(t *testing.T) {
29+
metricsEnabled := true
30+
tests := []struct {
31+
name string
32+
enabledIPv6 bool
33+
}{
34+
{name: "single-stack"},
35+
{name: "dual-stack", enabledIPv6: true},
36+
}
37+
38+
for _, test := range tests {
39+
t.Run(test.name, func(t *testing.T) {
40+
logging := &v1beta1.Logging{ObjectMeta: metav1.ObjectMeta{Name: "test"}}
41+
r := &Reconciler{
42+
Logging: logging,
43+
fluentbitSpec: &v1beta1.FluentbitSpec{
44+
EnabledIPv6: test.enabledIPv6,
45+
Metrics: &v1beta1.Metrics{
46+
Enabled: &metricsEnabled,
47+
Port: 2020,
48+
},
49+
BufferVolumeMetrics: &v1beta1.Metrics{
50+
Enabled: &metricsEnabled,
51+
Port: 9200,
52+
},
53+
},
54+
nameProvider: NewLegacyFluentbitNameProvider(logging),
55+
}
56+
57+
metricsService, _, err := r.serviceMetrics()
58+
require.NoError(t, err)
59+
bufferMetricsService, _, err := r.serviceBufferMetrics()
60+
require.NoError(t, err)
61+
62+
assertIPFamilies(t, metricsService, test.enabledIPv6)
63+
assertIPFamilies(t, bufferMetricsService, test.enabledIPv6)
64+
})
65+
}
66+
}
67+
68+
func assertIPFamilies(t *testing.T, object runtime.Object, enabledIPv6 bool) {
69+
t.Helper()
70+
71+
service, ok := object.(*corev1.Service)
72+
require.True(t, ok)
73+
74+
if !enabledIPv6 {
75+
require.Nil(t, service.Spec.IPFamilyPolicy)
76+
require.Nil(t, service.Spec.IPFamilies)
77+
return
78+
}
79+
80+
require.NotNil(t, service.Spec.IPFamilyPolicy)
81+
require.Equal(t, corev1.IPFamilyPolicyPreferDualStack, *service.Spec.IPFamilyPolicy)
82+
require.Equal(t, []corev1.IPFamily{corev1.IPv4Protocol, corev1.IPv6Protocol}, service.Spec.IPFamilies)
83+
}

0 commit comments

Comments
 (0)