Skip to content

Commit 9008f34

Browse files
molegit9molegit9
authored andcommitted
Include nftables information in Agent supportbundle
Signed-off-by: molegit9 <[email protected]>
1 parent 3c81b27 commit 9008f34

File tree

11 files changed

+275
-48
lines changed

11 files changed

+275
-48
lines changed

cmd/antrea-agent/agent.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import (
7171
"antrea.io/antrea/pkg/agent/stats"
7272
support "antrea.io/antrea/pkg/agent/supportbundlecollection"
7373
agenttypes "antrea.io/antrea/pkg/agent/types"
74+
nftclient "antrea.io/antrea/pkg/agent/util/nftables"
7475
"antrea.io/antrea/pkg/apis"
7576
"antrea.io/antrea/pkg/apis/controlplane"
7677
crdinformers "antrea.io/antrea/pkg/client/informers/externalversions"
@@ -334,6 +335,15 @@ func run(o *Options) error {
334335
}
335336
nodeConfig := agentInitializer.GetNodeConfig()
336337

338+
var nftablesSupported bool
339+
if _, err := nftclient.New(networkConfig.IPv4Enabled, networkConfig.IPv6Enabled); err != nil {
340+
klog.InfoS("nftables is not supported on this Node, skipping nftables-related features", "err", err)
341+
nftablesSupported = false
342+
} else {
343+
klog.InfoS("nftables is supported on this Node")
344+
nftablesSupported = true
345+
}
346+
337347
var ipsecCertController *ipseccertificate.Controller
338348

339349
if networkConfig.TrafficEncryptionMode == config.TrafficEncryptionModeIPSec &&
@@ -1001,7 +1011,7 @@ func run(o *Options) error {
10011011
nodeType = controlplane.SupportBundleCollectionNodeTypeExternalNode
10021012
}
10031013
supportBundleController := support.NewSupportBundleController(nodeConfig.Name, nodeType, nodeNamespace, antreaClientProvider,
1004-
ovsctl.NewClient(o.config.OVSBridge), agentQuerier, networkPolicyController, v4Enabled, v6Enabled)
1014+
ovsctl.NewClient(o.config.OVSBridge), agentQuerier, networkPolicyController, v4Enabled, v6Enabled, nftablesSupported)
10051015
go supportBundleController.Run(stopCh)
10061016
}
10071017

@@ -1029,7 +1039,8 @@ func run(o *Options) error {
10291039
o.config.ClientConnection.Kubeconfig,
10301040
apis.APIServerLoopbackTokenPath,
10311041
v4Enabled,
1032-
v6Enabled)
1042+
v6Enabled,
1043+
nftablesSupported)
10331044
if err != nil {
10341045
return fmt.Errorf("error when creating agent API server: %v", err)
10351046
}

pkg/agent/apiserver/apiserver.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,10 @@ func installHandlers(aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolic
108108
s.Handler.NonGoRestfulMux.HandleFunc("/fqdncache", fqdncache.HandleFunc(npq))
109109
}
110110

111-
func installAPIGroup(s *genericapiserver.GenericAPIServer, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, v4Enabled, v6Enabled bool) error {
111+
func installAPIGroup(s *genericapiserver.GenericAPIServer, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, v4Enabled, v6Enabled bool, nftablesSupported bool) error {
112112
systemGroup := genericapiserver.NewDefaultAPIGroupInfo(systemv1beta1.GroupName, scheme, metav1.ParameterCodec, codecs)
113113
systemStorage := map[string]rest.Storage{}
114-
supportBundleStorage := supportbundle.NewAgentStorage(ovsctl.NewClient(aq.GetNodeConfig().OVSBridge), aq, npq, v4Enabled, v6Enabled)
114+
supportBundleStorage := supportbundle.NewAgentStorage(ovsctl.NewClient(aq.GetNodeConfig().OVSBridge), aq, npq, v4Enabled, v6Enabled, nftablesSupported)
115115
systemStorage["supportbundles"] = supportBundleStorage.SupportBundle
116116
systemStorage["supportbundles/download"] = supportBundleStorage.Download
117117
systemGroup.VersionedResourcesStorageMap["v1beta1"] = systemStorage
@@ -132,6 +132,7 @@ func New(aq agentquerier.AgentQuerier,
132132
loopbackClientTokenPath string,
133133
v4Enabled,
134134
v6Enabled bool,
135+
nftablesSupported bool,
135136
) (*agentAPIServer, error) {
136137
cfg, err := newConfig(aq, npq, secureServing, authentication, authorization, enableMetrics, kubeconfig, loopbackClientTokenPath)
137138
if err != nil {
@@ -141,7 +142,7 @@ func New(aq agentquerier.AgentQuerier,
141142
if err != nil {
142143
return nil, err
143144
}
144-
if err := installAPIGroup(s, aq, npq, v4Enabled, v6Enabled); err != nil {
145+
if err := installAPIGroup(s, aq, npq, v4Enabled, v6Enabled, nftablesSupported); err != nil {
145146
return nil, err
146147
}
147148
installHandlers(aq, npq, mq, seipq, s, bgpq)

pkg/agent/apiserver/apiserver_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ current-context: cluster
8080
// InClusterLookup is skipped when testing, otherwise it would always fail as there is no real cluster.
8181
authentication.SkipInClusterLookup = true
8282
authorization := options.NewDelegatingAuthorizationOptions().WithAlwaysAllowPaths("/healthz", "/livez", "/readyz")
83-
apiServer, err := New(agentQuerier, npQuerier, nil, nil, nil, secureServing, authentication, authorization, true, kubeConfigPath, tokenPath, true, true)
83+
apiServer, err := New(agentQuerier, npQuerier, nil, nil, nil, secureServing, authentication, authorization, true, kubeConfigPath, tokenPath, true, true, false)
8484
require.NoError(t, err)
8585
fakeAPIServer := &fakeAgentAPIServer{
8686
agentAPIServer: apiServer,

pkg/agent/supportbundlecollection/support_bundle_controller.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ type SupportBundleController struct {
7272
v4Enabled bool
7373
v6Enabled bool
7474
sftpUploader sftp.Uploader
75+
nftablesSupported bool
7576
}
7677

7778
func NewSupportBundleController(nodeName string,
@@ -82,7 +83,8 @@ func NewSupportBundleController(nodeName string,
8283
aq agentquerier.AgentQuerier,
8384
npq querier.AgentNetworkPolicyInfoQuerier,
8485
v4Enabled,
85-
v6Enabled bool) *SupportBundleController {
86+
v6Enabled bool,
87+
nftablesSupported bool) *SupportBundleController {
8688
c := &SupportBundleController{
8789
nodeName: nodeName,
8890
supportBundleNodeType: supportBundleNodeType,
@@ -91,12 +93,13 @@ func NewSupportBundleController(nodeName string,
9193
queue: workqueue.NewTypedWithConfig(workqueue.TypedQueueConfig[string]{
9294
Name: "supportbundle",
9395
}),
94-
ovsCtlClient: ovsCtlClient,
95-
aq: aq,
96-
npq: npq,
97-
v4Enabled: v4Enabled,
98-
v6Enabled: v6Enabled,
99-
sftpUploader: sftp.NewUploader(),
96+
ovsCtlClient: ovsCtlClient,
97+
aq: aq,
98+
npq: npq,
99+
v4Enabled: v4Enabled,
100+
v6Enabled: v6Enabled,
101+
sftpUploader: sftp.NewUploader(),
102+
nftablesSupported: nftablesSupported,
100103
}
101104
return c
102105
}
@@ -236,7 +239,7 @@ func (c *SupportBundleController) generateSupportBundle(supportBundle *cpv1b2.Su
236239
}
237240
defer defaultFS.RemoveAll(basedir)
238241

239-
agentDumper := newAgentDumper(defaultFS, defaultExecutor, c.ovsCtlClient, c.aq, c.npq, supportBundle.SinceTime, c.v4Enabled, c.v6Enabled)
242+
agentDumper := newAgentDumper(defaultFS, defaultExecutor, c.ovsCtlClient, c.aq, c.npq, supportBundle.SinceTime, c.v4Enabled, c.v6Enabled, c.nftablesSupported)
240243
if err = agentDumper.DumpLog(basedir); err != nil {
241244
return err
242245
}

pkg/agent/supportbundlecollection/support_bundle_controller_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func newFakeController(t *testing.T) (*fakeController, *fakeversioned.Clientset)
6060
controller := gomock.NewController(t)
6161
clientset := &fakeversioned.Clientset{}
6262
supportBundleController := NewSupportBundleController("vm1", controlplane.SupportBundleCollectionNodeTypeExternalNode, "vm-ns", &antreaClientGetter{clientset}, nil,
63-
nil, nil, true, true)
63+
nil, nil, true, true, false)
6464
return &fakeController{
6565
SupportBundleController: supportBundleController,
6666
mockController: controller,
@@ -207,7 +207,7 @@ func TestSupportBundleCollectionAdd(t *testing.T) {
207207

208208
for _, tt := range testcases {
209209
t.Run(tt.name, func(t *testing.T) {
210-
newAgentDumper = func(fs afero.Fs, executor exec.Interface, ovsCtlClient ovsctl.OVSCtlClient, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, since string, v4Enabled, v6Enabled bool) support.AgentDumper {
210+
newAgentDumper = func(fs afero.Fs, executor exec.Interface, ovsCtlClient ovsctl.OVSCtlClient, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, since string, v4Enabled, v6Enabled bool, nftablesSupported bool) support.AgentDumper {
211211
return tt.agentDumper
212212
}
213213
defer func() {

pkg/apiserver/registry/system/supportbundle/rest.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func NewControllerStorage() Storage {
7171
}
7272

7373
// NewAgentStorage creates a support bundle storage for working on antrea agent.
74-
func NewAgentStorage(client ovsctl.OVSCtlClient, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, v4Enabled, v6Enabled bool) Storage {
74+
func NewAgentStorage(client ovsctl.OVSCtlClient, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, v4Enabled, v6Enabled bool, nftablesSupported bool) Storage {
7575
bundle := &supportBundleREST{
7676
mode: modeAgent,
7777
ovsCtlClient: client,
@@ -81,8 +81,9 @@ func NewAgentStorage(client ovsctl.OVSCtlClient, aq agentquerier.AgentQuerier, n
8181
ObjectMeta: metav1.ObjectMeta{Name: modeAgent},
8282
Status: systemv1beta1.SupportBundleStatusNone,
8383
},
84-
v4Enabled: v4Enabled,
85-
v6Enabled: v6Enabled,
84+
v4Enabled: v4Enabled,
85+
v6Enabled: v6Enabled,
86+
nftablesSupported: nftablesSupported,
8687
}
8788
return Storage{
8889
Mode: modeAgent,
@@ -117,11 +118,12 @@ type supportBundleREST struct {
117118
// ensure thread-safety. Otherwise, we would have a race with Get callers.
118119
cache *systemv1beta1.SupportBundle
119120

120-
ovsCtlClient ovsctl.OVSCtlClient
121-
aq agentquerier.AgentQuerier
122-
npq querier.AgentNetworkPolicyInfoQuerier
123-
v4Enabled bool
124-
v6Enabled bool
121+
ovsCtlClient ovsctl.OVSCtlClient
122+
aq agentquerier.AgentQuerier
123+
npq querier.AgentNetworkPolicyInfoQuerier
124+
v4Enabled bool
125+
v6Enabled bool
126+
nftablesSupported bool
125127
}
126128

127129
// Create triggers a bundle generation. It only allows resource creation when
@@ -268,7 +270,7 @@ func (r *supportBundleREST) collect(ctx context.Context, dumpers ...func(string)
268270
}
269271

270272
func (r *supportBundleREST) collectAgent(ctx context.Context, since string) (*systemv1beta1.SupportBundle, error) {
271-
dumper := newAgentDumper(defaultFS, defaultExecutor, r.ovsCtlClient, r.aq, r.npq, since, r.v4Enabled, r.v6Enabled)
273+
dumper := newAgentDumper(defaultFS, defaultExecutor, r.ovsCtlClient, r.aq, r.npq, since, r.v4Enabled, r.v6Enabled, r.nftablesSupported)
272274
return r.collect(
273275
ctx,
274276
dumper.DumpLog,

pkg/apiserver/registry/system/supportbundle/rest_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ func (f *fakeAgentDumper) DumpMemberlist(basedir string) error {
252252
func TestAgentStorage(t *testing.T) {
253253
defaultFS = afero.NewMemMapFs()
254254
defaultExecutor = new(testExec)
255-
newAgentDumper = func(fs afero.Fs, executor exec.Interface, ovsCtlClient ovsctl.OVSCtlClient, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, since string, v4Enabled, v6Enabled bool) support.AgentDumper {
255+
newAgentDumper = func(fs afero.Fs, executor exec.Interface, ovsCtlClient ovsctl.OVSCtlClient, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, since string, v4Enabled, v6Enabled bool, nftablesSupported bool) support.AgentDumper {
256256
return &fakeAgentDumper{}
257257
}
258258
defer func() {
@@ -266,7 +266,7 @@ func TestAgentStorage(t *testing.T) {
266266
fakeOVSCtl := ovsctltest.NewMockOVSCtlClient(ctrl)
267267
fakeAgentQuerier := agentqueriertest.NewMockAgentQuerier(ctrl)
268268
fakeNetworkPolicyQuerier := queriertest.NewMockAgentNetworkPolicyInfoQuerier(ctrl)
269-
storage := NewAgentStorage(fakeOVSCtl, fakeAgentQuerier, fakeNetworkPolicyQuerier, true, true)
269+
storage := NewAgentStorage(fakeOVSCtl, fakeAgentQuerier, fakeNetworkPolicyQuerier, true, true, false)
270270
_, err := storage.SupportBundle.Create(ctx, &system.SupportBundle{
271271
ObjectMeta: metav1.ObjectMeta{
272272
Name: modeAgent,
@@ -311,7 +311,7 @@ func TestAgentStorage(t *testing.T) {
311311
func TestAgentStorageFailure(t *testing.T) {
312312
defaultFS = afero.NewMemMapFs()
313313
defaultExecutor = new(testExec)
314-
newAgentDumper = func(fs afero.Fs, executor exec.Interface, ovsCtlClient ovsctl.OVSCtlClient, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, since string, v4Enabled, v6Enabled bool) support.AgentDumper {
314+
newAgentDumper = func(fs afero.Fs, executor exec.Interface, ovsCtlClient ovsctl.OVSCtlClient, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, since string, v4Enabled, v6Enabled bool, nftablesSupported bool) support.AgentDumper {
315315
return &fakeAgentDumper{returnErr: fmt.Errorf("iptables not found")}
316316
}
317317
defer func() {
@@ -326,7 +326,7 @@ func TestAgentStorageFailure(t *testing.T) {
326326
fakeAgentQuerier := agentqueriertest.NewMockAgentQuerier(ctrl)
327327
fakeNetworkPolicyQuerier := queriertest.NewMockAgentNetworkPolicyInfoQuerier(ctrl)
328328

329-
storage := NewAgentStorage(fakeOVSCtl, fakeAgentQuerier, fakeNetworkPolicyQuerier, true, true)
329+
storage := NewAgentStorage(fakeOVSCtl, fakeAgentQuerier, fakeNetworkPolicyQuerier, true, true, false)
330330
_, err := storage.SupportBundle.Create(ctx, &system.SupportBundle{
331331
ObjectMeta: metav1.ObjectMeta{
332332
Name: modeAgent,

pkg/support/dump.go

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -295,14 +295,15 @@ func NewControllerDumper(fs afero.Fs, executor exec.Interface, since string) Con
295295
}
296296

297297
type agentDumper struct {
298-
fs afero.Fs
299-
executor exec.Interface
300-
ovsCtlClient ovsctl.OVSCtlClient
301-
aq agentquerier.AgentQuerier
302-
npq querier.AgentNetworkPolicyInfoQuerier
303-
since string
304-
v4Enabled bool
305-
v6Enabled bool
298+
fs afero.Fs
299+
executor exec.Interface
300+
ovsCtlClient ovsctl.OVSCtlClient
301+
aq agentquerier.AgentQuerier
302+
npq querier.AgentNetworkPolicyInfoQuerier
303+
since string
304+
v4Enabled bool
305+
v6Enabled bool
306+
nftablesSupported bool
306307
}
307308

308309
func (d *agentDumper) DumpAgentInfo(basedir string) error {
@@ -360,15 +361,16 @@ func (d *agentDumper) DumpOVSPorts(basedir string) error {
360361
return writeFile(d.fs, filepath.Join(basedir, "ovsports"), "ports", []byte(strings.Join(portData, "\n")))
361362
}
362363

363-
func NewAgentDumper(fs afero.Fs, executor exec.Interface, ovsCtlClient ovsctl.OVSCtlClient, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, since string, v4Enabled, v6Enabled bool) AgentDumper {
364+
func NewAgentDumper(fs afero.Fs, executor exec.Interface, ovsCtlClient ovsctl.OVSCtlClient, aq agentquerier.AgentQuerier, npq querier.AgentNetworkPolicyInfoQuerier, since string, v4Enabled, v6Enabled bool, nftablesSupported bool) AgentDumper {
364365
return &agentDumper{
365-
fs: fs,
366-
executor: executor,
367-
ovsCtlClient: ovsCtlClient,
368-
aq: aq,
369-
npq: npq,
370-
since: since,
371-
v4Enabled: v4Enabled,
372-
v6Enabled: v6Enabled,
366+
fs: fs,
367+
executor: executor,
368+
ovsCtlClient: ovsCtlClient,
369+
aq: aq,
370+
npq: npq,
371+
since: since,
372+
v4Enabled: v4Enabled,
373+
v6Enabled: v6Enabled,
374+
nftablesSupported: nftablesSupported,
373375
}
374376
}

pkg/support/dump_others.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package support
1919

2020
import (
21+
"bytes"
2122
"fmt"
2223
"path"
2324
"path/filepath"
@@ -41,6 +42,9 @@ func (d *agentDumper) DumpHostNetworkInfo(basedir string) error {
4142
if err := d.dumpIPTables(basedir); err != nil {
4243
return err
4344
}
45+
if err := d.dumpNFTables(basedir); err != nil {
46+
return err
47+
}
4448
if err := d.dumpIPToolInfo(basedir); err != nil {
4549
return err
4650
}
@@ -59,6 +63,48 @@ func (d *agentDumper) dumpIPTables(basedir string) error {
5963
return writeFile(d.fs, filepath.Join(basedir, "iptables"), "iptables", data)
6064
}
6165

66+
func (d *agentDumper) dumpNFTables(basedir string) error {
67+
68+
if !d.nftablesSupported {
69+
return nil
70+
}
71+
72+
var data bytes.Buffer
73+
74+
if d.v4Enabled {
75+
output, err := d.executor.Command("nft", "list", "table", "ip", "antrea").CombinedOutput()
76+
if err != nil {
77+
return fmt.Errorf("failed to dump nftables table 'ip antrea': %w", err)
78+
}
79+
if len(output) > 0 {
80+
data.Write(output)
81+
data.WriteString("\n")
82+
}
83+
}
84+
85+
if d.v6Enabled {
86+
output, err := d.executor.Command("nft", "list", "table", "ip6", "antrea").CombinedOutput()
87+
if err != nil {
88+
return fmt.Errorf("failed to dump nftables table 'ip6 antrea': %w", err)
89+
}
90+
if len(output) > 0 {
91+
data.Write(output)
92+
data.WriteString("\n")
93+
}
94+
}
95+
96+
if data.Len() == 0 {
97+
return nil
98+
}
99+
100+
fileName := "nftables"
101+
if err := writeFile(d.fs, filepath.Join(basedir, fileName), fileName, data.Bytes()); err != nil {
102+
return fmt.Errorf("failed to write nftables file: %w", err)
103+
}
104+
105+
return nil
106+
}
107+
62108
func (d *agentDumper) dumpIPToolInfo(basedir string) error {
63109
dump := func(name string) error {
64110
output, err := d.executor.Command("ip", name).CombinedOutput()

0 commit comments

Comments
 (0)