@@ -20,6 +20,7 @@ import (
20
20
"encoding/json"
21
21
"fmt"
22
22
"net/http"
23
+ "net/url"
23
24
"os"
24
25
"path/filepath"
25
26
"regexp"
@@ -38,8 +39,10 @@ import (
38
39
"k8s.io/apimachinery/pkg/util/validation"
39
40
k8sclient "k8s.io/client-go/kubernetes"
40
41
"k8s.io/klog/v2"
42
+ kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1"
41
43
"k8s.io/utils/ptr"
42
44
klogutils "sigs.k8s.io/node-feature-discovery/pkg/utils/klog"
45
+ "sigs.k8s.io/node-feature-discovery/pkg/utils/kubeconf"
43
46
"sigs.k8s.io/yaml"
44
47
45
48
apiequality "k8s.io/apimachinery/pkg/api/equality"
@@ -56,7 +59,7 @@ import (
56
59
_ "sigs.k8s.io/node-feature-discovery/source/fake"
57
60
_ "sigs.k8s.io/node-feature-discovery/source/kernel"
58
61
_ "sigs.k8s.io/node-feature-discovery/source/local"
59
- _ "sigs.k8s.io/node-feature-discovery/source/memory"
62
+ memory "sigs.k8s.io/node-feature-discovery/source/memory"
60
63
_ "sigs.k8s.io/node-feature-discovery/source/network"
61
64
_ "sigs.k8s.io/node-feature-discovery/source/pci"
62
65
_ "sigs.k8s.io/node-feature-discovery/source/storage"
@@ -94,13 +97,16 @@ type Labels map[string]string
94
97
95
98
// Args are the command line arguments of NfdWorker.
96
99
type Args struct {
97
- ConfigFile string
98
- Klog map [string ]* utils.KlogFlagVal
99
- Kubeconfig string
100
- Oneshot bool
101
- Options string
102
- Port int
103
- NoOwnerRefs bool
100
+ ConfigFile string
101
+ Klog map [string ]* utils.KlogFlagVal
102
+ Kubeconfig string
103
+ Oneshot bool
104
+ Options string
105
+ Port int
106
+ NoOwnerRefs bool
107
+ KubeletConfigPath string
108
+ KubeletConfigURI string
109
+ APIAuthTokenFile string
104
110
105
111
Overrides ConfigOverrideArgs
106
112
}
@@ -124,6 +130,7 @@ type nfdWorker struct {
124
130
featureSources []source.FeatureSource
125
131
labelSources []source.LabelSource
126
132
ownerReference []metav1.OwnerReference
133
+ kubeletConfigFunc func () (* kubeletconfigv1beta1.KubeletConfiguration , error )
127
134
}
128
135
129
136
// This ticker can represent infinite and normal intervals.
@@ -169,12 +176,25 @@ func NewNfdWorker(opts ...NfdWorkerOption) (NfdWorker, error) {
169
176
stop : make (chan struct {}),
170
177
}
171
178
179
+ if nfd .args .ConfigFile != "" {
180
+ nfd .configFilePath = filepath .Clean (nfd .args .ConfigFile )
181
+ }
182
+
172
183
for _ , o := range opts {
173
184
o .apply (nfd )
174
185
}
175
186
176
- if nfd .args .ConfigFile != "" {
177
- nfd .configFilePath = filepath .Clean (nfd .args .ConfigFile )
187
+ kubeletConfigFunc , err := getKubeletConfigFunc (nfd .args .KubeletConfigURI , nfd .args .APIAuthTokenFile )
188
+ if err != nil {
189
+ return nil , err
190
+ }
191
+
192
+ nfd = & nfdWorker {
193
+ kubeletConfigFunc : kubeletConfigFunc ,
194
+ }
195
+
196
+ for _ , o := range opts {
197
+ o .apply (nfd )
178
198
}
179
199
180
200
// k8sClient might've been set via opts by tests
@@ -239,6 +259,8 @@ func (w *nfdWorker) runFeatureDiscovery() error {
239
259
}
240
260
// Get the set of feature labels.
241
261
labels := createFeatureLabels (w .labelSources , w .config .Core .LabelWhiteList .Regexp )
262
+ // Append a label with app=nfd
263
+ labels ["app" ] = "nfd"
242
264
243
265
// Update the node with the feature labels.
244
266
if ! w .config .Core .NoPublish {
@@ -255,9 +277,10 @@ func (w *nfdWorker) setOwnerReference() error {
255
277
if ! w .config .Core .NoOwnerRefs {
256
278
// Get pod owner reference
257
279
podName := os .Getenv ("POD_NAME" )
280
+ podNamespace := os .Getenv ("POD_NAMESPACE" )
258
281
// Add pod owner reference if it exists
259
282
if podName != "" {
260
- if selfPod , err := w .k8sClient .CoreV1 ().Pods (w . kubernetesNamespace ).Get (context .TODO (), podName , metav1.GetOptions {}); err != nil {
283
+ if selfPod , err := w .k8sClient .CoreV1 ().Pods (podNamespace ).Get (context .TODO (), podName , metav1.GetOptions {}); err != nil {
261
284
klog .ErrorS (err , "failed to get self pod, cannot inherit ownerReference for NodeFeature" )
262
285
return err
263
286
} else {
@@ -312,6 +335,12 @@ func (w *nfdWorker) Run() error {
312
335
httpMux .Handle ("/metrics" , promhttp .HandlerFor (promRegistry , promhttp.HandlerOpts {}))
313
336
registerVersion (version .Get ())
314
337
338
+ klConfig , err := w .kubeletConfigFunc ()
339
+ if err != nil {
340
+ return err
341
+ }
342
+ memory .SetSwapMode (klConfig .MemorySwap .SwapBehavior )
343
+
315
344
err = w .runFeatureDiscovery ()
316
345
if err != nil {
317
346
return err
@@ -624,7 +653,7 @@ func (m *nfdWorker) updateNodeFeatureObject(labels Labels) error {
624
653
return err
625
654
}
626
655
nodename := utils .NodeName ()
627
- namespace := m . kubernetesNamespace
656
+ namespace := os . Getenv ( "POD_NAMESPACE" )
628
657
629
658
features := source .GetAllFeatures ()
630
659
@@ -720,3 +749,38 @@ func (c *sourcesConfig) UnmarshalJSON(data []byte) error {
720
749
721
750
return nil
722
751
}
752
+
753
+ func getKubeletConfigFunc (uri , apiAuthTokenFile string ) (func () (* kubeletconfigv1beta1.KubeletConfiguration , error ), error ) {
754
+ u , err := url .ParseRequestURI (uri )
755
+ if err != nil {
756
+ return nil , fmt .Errorf ("failed to parse -kubelet-config-uri: %w" , err )
757
+ }
758
+
759
+ // init kubelet API client
760
+ var klConfig * kubeletconfigv1beta1.KubeletConfiguration
761
+ switch u .Scheme {
762
+ case "file" :
763
+ return func () (* kubeletconfigv1beta1.KubeletConfiguration , error ) {
764
+ klConfig , err = kubeconf .GetKubeletConfigFromLocalFile (u .Path )
765
+ if err != nil {
766
+ return nil , fmt .Errorf ("failed to read kubelet config: %w" , err )
767
+ }
768
+ return klConfig , err
769
+ }, nil
770
+ case "https" :
771
+ restConfig , err := kubeconf .InsecureConfig (u .String (), apiAuthTokenFile )
772
+ if err != nil {
773
+ return nil , fmt .Errorf ("failed to initialize rest config for kubelet config uri: %w" , err )
774
+ }
775
+
776
+ return func () (* kubeletconfigv1beta1.KubeletConfiguration , error ) {
777
+ klConfig , err = kubeconf .GetKubeletConfiguration (restConfig )
778
+ if err != nil {
779
+ return nil , fmt .Errorf ("failed to get kubelet config from configz endpoint: %w" , err )
780
+ }
781
+ return klConfig , nil
782
+ }, nil
783
+ }
784
+
785
+ return nil , fmt .Errorf ("unsupported URI scheme: %v" , u .Scheme )
786
+ }
0 commit comments