Merge pull request #125866 from aroradaman/can-use-nfacct

nfacct: conditionally ensure counters and register metrics
This commit is contained in:
Kubernetes Prow Robot 2024-07-10 19:26:36 -07:00 committed by GitHub
commit 1740d85aff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 24 additions and 5 deletions

View File

@ -280,7 +280,7 @@ func NewProxier(ctx context.Context,
serviceHealthServer := healthcheck.NewServiceHealthServer(hostname, recorder, nodePortAddresses, healthzServer) serviceHealthServer := healthcheck.NewServiceHealthServer(hostname, recorder, nodePortAddresses, healthzServer)
nfacctRunner, err := nfacct.New() nfacctRunner, err := nfacct.New()
if err != nil { if err != nil {
logger.Error(err, "Failed to create nfacct runner") logger.Error(err, "Failed to create nfacct runner, nfacct based metrics won't be available")
} }
proxier := &Proxier{ proxier := &Proxier{

View File

@ -299,8 +299,12 @@ func RegisterMetrics(mode kubeproxyconfig.ProxyMode) {
switch mode { switch mode {
case kubeproxyconfig.ProxyModeIPTables: case kubeproxyconfig.ProxyModeIPTables:
if iptablesCTStateInvalidDroppedMetricCollector != nil {
legacyregistry.CustomMustRegister(iptablesCTStateInvalidDroppedMetricCollector) legacyregistry.CustomMustRegister(iptablesCTStateInvalidDroppedMetricCollector)
}
if localhostNodePortsAcceptedMetricsCollector != nil {
legacyregistry.CustomMustRegister(localhostNodePortsAcceptedMetricsCollector) legacyregistry.CustomMustRegister(localhostNodePortsAcceptedMetricsCollector)
}
legacyregistry.MustRegister(SyncFullProxyRulesLatency) legacyregistry.MustRegister(SyncFullProxyRulesLatency)
legacyregistry.MustRegister(SyncPartialProxyRulesLatency) legacyregistry.MustRegister(SyncPartialProxyRulesLatency)
legacyregistry.MustRegister(IPTablesRestoreFailuresTotal) legacyregistry.MustRegister(IPTablesRestoreFailuresTotal)
@ -332,6 +336,7 @@ func newNFAcctMetricCollector(counter string, description *metrics.Desc) *nfacct
client, err := nfacct.New() client, err := nfacct.New()
if err != nil { if err != nil {
klog.ErrorS(err, "failed to initialize nfacct client") klog.ErrorS(err, "failed to initialize nfacct client")
return nil
} }
return &nfacctMetricCollector{ return &nfacctMetricCollector{
client: client, client: client,

View File

@ -59,13 +59,26 @@ type runner struct {
handler handler handler handler
} }
// New returns a new Interface. // New returns a new Interface. If the netfilter_nfacct subsystem is
// not available in the kernel it will return error.
func New() (Interface, error) { func New() (Interface, error) {
hndlr, err := newNetlinkHandler() hndlr, err := newNetlinkHandler()
if err != nil { if err != nil {
return nil, err return nil, err
} }
return newInternal(hndlr)
rnr, err := newInternal(hndlr)
if err != nil {
return nil, err
}
// check if nfacct is supported on the current kernel by attempting to retrieve a counter.
// the following GET call should either succeed or return ENOENT.
_, err = rnr.Get("IMayExist")
if err != nil && !errors.Is(err, ErrObjectNotFound) {
return nil, ErrNotSupported
}
return rnr, nil
} }
// newInternal returns a new Interface with the given handler. // newInternal returns a new Interface with the given handler.
@ -155,6 +168,7 @@ var ErrObjectAlreadyExists = errors.New("object already exists")
var ErrNameExceedsMaxLength = fmt.Errorf("object name exceeds the maximum allowed length of %d characters", MaxLength) var ErrNameExceedsMaxLength = fmt.Errorf("object name exceeds the maximum allowed length of %d characters", MaxLength)
var ErrEmptyName = errors.New("object name cannot be empty") var ErrEmptyName = errors.New("object name cannot be empty")
var ErrUnexpected = errors.New("unexpected error") var ErrUnexpected = errors.New("unexpected error")
var ErrNotSupported = errors.New("nfacct sub-system not available")
func handleError(err error) error { func handleError(err error) error {
switch { switch {