Skip to content

Commit b45913d

Browse files
Fix --nodeName= doesn't select unscheduable pods
pods
1 parent a3e9266 commit b45913d

File tree

6 files changed

+67
-15
lines changed

6 files changed

+67
-15
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ spec:
282282
fieldPath: spec.nodeName
283283
```
284284

285-
To track metrics for unassigned pods, you need to add an additional deployment and set `--node=""`, as shown in the following example:
285+
To track metrics for unassigned pods, you need to add an additional deployment and set `--node=`, as shown in the following example:
286286

287287
```
288288
apiVersion: apps/v1

README.md.tpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ spec:
283283
fieldPath: spec.nodeName
284284
```
285285

286-
To track metrics for unassigned pods, you need to add an additional deployment and set `--node=""`, as shown in the following example:
286+
To track metrics for unassigned pods, you need to add an additional deployment and set `--node=`, as shown in the following example:
287287

288288
```
289289
apiVersion: apps/v1
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
labels:
5+
app.kubernetes.io/component: exporter
6+
app.kubernetes.io/name: kube-state-metrics-no-node-pods
7+
app.kubernetes.io/version: 2.12.0
8+
name: kube-state-metrics-no-node-pods
9+
namespace: kube-system
10+
spec:
11+
clusterIP: None
12+
ports:
13+
- name: http-metrics
14+
port: 8080
15+
targetPort: http-metrics
16+
- name: telemetry
17+
port: 8081
18+
targetPort: telemetry
19+
selector:
20+
app.kubernetes.io/name: kube-state-metrics-no-node-pods

examples/daemonsetsharding/deployment-no-node-pods.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@ kind: Deployment
33
metadata:
44
labels:
55
app.kubernetes.io/component: exporter
6-
app.kubernetes.io/name: kube-state-metrics-pods
6+
app.kubernetes.io/name: kube-state-metrics-no-node-pods
77
app.kubernetes.io/version: 2.13.0
8-
name: kube-state-metrics-pods
8+
name: kube-state-metrics-no-node-pods
99
namespace: kube-system
1010
spec:
1111
replicas: 1
1212
selector:
1313
matchLabels:
14-
app.kubernetes.io/name: kube-state-metrics
14+
app.kubernetes.io/name: kube-state-metrics-no-node-pods
1515
template:
1616
metadata:
1717
labels:
1818
app.kubernetes.io/component: exporter
19-
app.kubernetes.io/name: kube-state-metrics
19+
app.kubernetes.io/name: kube-state-metrics-no-node-pods
2020
app.kubernetes.io/version: 2.13.0
2121
spec:
2222
automountServiceAccountToken: true
@@ -31,7 +31,7 @@ spec:
3131
port: http-metrics
3232
initialDelaySeconds: 5
3333
timeoutSeconds: 5
34-
name: kube-state-metrics
34+
name: kube-state-metrics-no-node-pods
3535
ports:
3636
- containerPort: 8080
3737
name: http-metrics

jsonnet/kube-state-metrics/kube-state-metrics.libsonnet

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,16 +379,25 @@
379379
'--resources=pods',
380380
'--node=""',
381381
],
382+
name: shardksmname,
382383
};
383-
local shardksmname = ksm.name + "-pods";
384+
local shardksmname = ksm.name + "-no-node-pods";
384385
std.mergePatch(ksm.deployment,
385386
{
386387
metadata: {
387388
name: shardksmname,
388389
labels: {'app.kubernetes.io/name': shardksmname}
389390
},
390391
spec: {
392+
selector{
393+
matchLabels: {app.kubernetes.io/name': shardksmname}
394+
}
391395
template: {
396+
metadata: {
397+
labels: {
398+
app.kubernetes.io/name': shardksmname
399+
}
400+
}
392401
spec: {
393402
containers: [c],
394403
},
@@ -397,6 +406,27 @@
397406
},
398407
),
399408

409+
deploymentNoNodePodsService:
410+
local c = ksm.deployment.spec.template.spec.containers[0] {
411+
args: [
412+
'--resources=pods',
413+
'--node=""',
414+
],
415+
};
416+
local shardksmname = ksm.name + "-no-node-pods";
417+
std.mergePatch(ksm.service,
418+
{
419+
metadata: {
420+
name: shardksmname,
421+
labels: {'app.kubernetes.io/name': shardksmname}
422+
},
423+
spec: {
424+
selector: {
425+
'app.kubernetes.io/name': shardksmname
426+
}
427+
}
428+
}
429+
),
400430
daemonset:
401431
// extending the default container from above
402432
local c0 = ksm.deployment.spec.template.spec.containers[0] {

pkg/options/types.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package options
1818

1919
import (
2020
"errors"
21-
"regexp"
2221
"sort"
2322
"strings"
2423

@@ -141,15 +140,18 @@ func (n *NodeType) Type() string {
141140

142141
// GetNodeFieldSelector returns a nodename field selector.
143142
func (n *NodeType) GetNodeFieldSelector() string {
144-
if nil == n || len(*n) == 0 {
143+
if nil == n {
145144
klog.InfoS("Using node type is nil")
146145
return EmptyFieldSelector()
147146
}
148-
pattern := "[^a-zA-Z0-9_,-]+"
149-
re := regexp.MustCompile(pattern)
150-
result := re.ReplaceAllString(n.String(), "")
151-
klog.InfoS("Using node type", "node", result)
152-
return fields.OneTermEqualSelector("spec.nodeName", result).String()
147+
nodeName := n.String()
148+
// `--node=""` find pods without node name assigned which uses fieldselector spec.nodeName=""
149+
klog.InfoS("Using node name", nodeName)
150+
if nodeName == "" {
151+
klog.InfoS("Using spec.nodeName= to select unscheduable pods without node")
152+
return "spec.nodeName="
153+
}
154+
return fields.OneTermEqualSelector("spec.nodeName", nodeName).String()
153155

154156
}
155157

0 commit comments

Comments
 (0)