Skip to content

Commit 1740d85

Browse files
authored
Merge pull request kubernetes#125866 from aroradaman/can-use-nfacct
nfacct: conditionally ensure counters and register metrics
2 parents c3c8a9c + 33bac68 commit 1740d85

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

pkg/proxy/iptables/proxier.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ func NewProxier(ctx context.Context,
280280
serviceHealthServer := healthcheck.NewServiceHealthServer(hostname, recorder, nodePortAddresses, healthzServer)
281281
nfacctRunner, err := nfacct.New()
282282
if err != nil {
283-
logger.Error(err, "Failed to create nfacct runner")
283+
logger.Error(err, "Failed to create nfacct runner, nfacct based metrics won't be available")
284284
}
285285

286286
proxier := &Proxier{

pkg/proxy/metrics/metrics.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,12 @@ func RegisterMetrics(mode kubeproxyconfig.ProxyMode) {
299299

300300
switch mode {
301301
case kubeproxyconfig.ProxyModeIPTables:
302-
legacyregistry.CustomMustRegister(iptablesCTStateInvalidDroppedMetricCollector)
303-
legacyregistry.CustomMustRegister(localhostNodePortsAcceptedMetricsCollector)
302+
if iptablesCTStateInvalidDroppedMetricCollector != nil {
303+
legacyregistry.CustomMustRegister(iptablesCTStateInvalidDroppedMetricCollector)
304+
}
305+
if localhostNodePortsAcceptedMetricsCollector != nil {
306+
legacyregistry.CustomMustRegister(localhostNodePortsAcceptedMetricsCollector)
307+
}
304308
legacyregistry.MustRegister(SyncFullProxyRulesLatency)
305309
legacyregistry.MustRegister(SyncPartialProxyRulesLatency)
306310
legacyregistry.MustRegister(IPTablesRestoreFailuresTotal)
@@ -332,6 +336,7 @@ func newNFAcctMetricCollector(counter string, description *metrics.Desc) *nfacct
332336
client, err := nfacct.New()
333337
if err != nil {
334338
klog.ErrorS(err, "failed to initialize nfacct client")
339+
return nil
335340
}
336341
return &nfacctMetricCollector{
337342
client: client,

pkg/proxy/util/nfacct/nfacct_linux.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,26 @@ type runner struct {
5959
handler handler
6060
}
6161

62-
// New returns a new Interface.
62+
// New returns a new Interface. If the netfilter_nfacct subsystem is
63+
// not available in the kernel it will return error.
6364
func New() (Interface, error) {
6465
hndlr, err := newNetlinkHandler()
6566
if err != nil {
6667
return nil, err
6768
}
68-
return newInternal(hndlr)
69+
70+
rnr, err := newInternal(hndlr)
71+
if err != nil {
72+
return nil, err
73+
}
74+
75+
// check if nfacct is supported on the current kernel by attempting to retrieve a counter.
76+
// the following GET call should either succeed or return ENOENT.
77+
_, err = rnr.Get("IMayExist")
78+
if err != nil && !errors.Is(err, ErrObjectNotFound) {
79+
return nil, ErrNotSupported
80+
}
81+
return rnr, nil
6982
}
7083

7184
// newInternal returns a new Interface with the given handler.
@@ -155,6 +168,7 @@ var ErrObjectAlreadyExists = errors.New("object already exists")
155168
var ErrNameExceedsMaxLength = fmt.Errorf("object name exceeds the maximum allowed length of %d characters", MaxLength)
156169
var ErrEmptyName = errors.New("object name cannot be empty")
157170
var ErrUnexpected = errors.New("unexpected error")
171+
var ErrNotSupported = errors.New("nfacct sub-system not available")
158172

159173
func handleError(err error) error {
160174
switch {

0 commit comments

Comments
 (0)