From b45913db5963958c0008cb5f8a608402f3b74c1c Mon Sep 17 00:00:00 2001 From: Catherine Fang Date: Fri, 17 May 2024 07:37:19 -0400 Subject: [PATCH] Fix --nodeName= doesn't select unscheduable pods pods --- README.md | 2 +- README.md.tpl | 2 +- .../deployment-no-node-pods-service.yaml | 20 ++++++++++++ .../deployment-no-node-pods.yaml | 10 +++--- .../kube-state-metrics.libsonnet | 32 ++++++++++++++++++- pkg/options/types.go | 16 ++++++---- 6 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 examples/daemonsetsharding/deployment-no-node-pods-service.yaml diff --git a/README.md b/README.md index d6a486c2c4..5ee7da90ff 100644 --- a/README.md +++ b/README.md @@ -282,7 +282,7 @@ spec: fieldPath: spec.nodeName ``` -To track metrics for unassigned pods, you need to add an additional deployment and set `--node=""`, as shown in the following example: +To track metrics for unassigned pods, you need to add an additional deployment and set `--node=`, as shown in the following example: ``` apiVersion: apps/v1 diff --git a/README.md.tpl b/README.md.tpl index 5548b022f5..59c7d4ed57 100644 --- a/README.md.tpl +++ b/README.md.tpl @@ -283,7 +283,7 @@ spec: fieldPath: spec.nodeName ``` -To track metrics for unassigned pods, you need to add an additional deployment and set `--node=""`, as shown in the following example: +To track metrics for unassigned pods, you need to add an additional deployment and set `--node=`, as shown in the following example: ``` apiVersion: apps/v1 diff --git a/examples/daemonsetsharding/deployment-no-node-pods-service.yaml b/examples/daemonsetsharding/deployment-no-node-pods-service.yaml new file mode 100644 index 0000000000..5f287b7aa1 --- /dev/null +++ b/examples/daemonsetsharding/deployment-no-node-pods-service.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: exporter + app.kubernetes.io/name: kube-state-metrics-no-node-pods + app.kubernetes.io/version: 2.12.0 + name: kube-state-metrics-no-node-pods + namespace: kube-system +spec: + clusterIP: None + ports: + - name: http-metrics + port: 8080 + targetPort: http-metrics + - name: telemetry + port: 8081 + targetPort: telemetry + selector: + app.kubernetes.io/name: kube-state-metrics-no-node-pods diff --git a/examples/daemonsetsharding/deployment-no-node-pods.yaml b/examples/daemonsetsharding/deployment-no-node-pods.yaml index 6bea075af7..31a24bbef5 100644 --- a/examples/daemonsetsharding/deployment-no-node-pods.yaml +++ b/examples/daemonsetsharding/deployment-no-node-pods.yaml @@ -3,20 +3,20 @@ kind: Deployment metadata: labels: app.kubernetes.io/component: exporter - app.kubernetes.io/name: kube-state-metrics-pods + app.kubernetes.io/name: kube-state-metrics-no-node-pods app.kubernetes.io/version: 2.13.0 - name: kube-state-metrics-pods + name: kube-state-metrics-no-node-pods namespace: kube-system spec: replicas: 1 selector: matchLabels: - app.kubernetes.io/name: kube-state-metrics + app.kubernetes.io/name: kube-state-metrics-no-node-pods template: metadata: labels: app.kubernetes.io/component: exporter - app.kubernetes.io/name: kube-state-metrics + app.kubernetes.io/name: kube-state-metrics-no-node-pods app.kubernetes.io/version: 2.13.0 spec: automountServiceAccountToken: true @@ -31,7 +31,7 @@ spec: port: http-metrics initialDelaySeconds: 5 timeoutSeconds: 5 - name: kube-state-metrics + name: kube-state-metrics-no-node-pods ports: - containerPort: 8080 name: http-metrics diff --git a/jsonnet/kube-state-metrics/kube-state-metrics.libsonnet b/jsonnet/kube-state-metrics/kube-state-metrics.libsonnet index 1b2a157dca..db61449c7f 100644 --- a/jsonnet/kube-state-metrics/kube-state-metrics.libsonnet +++ b/jsonnet/kube-state-metrics/kube-state-metrics.libsonnet @@ -379,8 +379,9 @@ '--resources=pods', '--node=""', ], + name: shardksmname, }; - local shardksmname = ksm.name + "-pods"; + local shardksmname = ksm.name + "-no-node-pods"; std.mergePatch(ksm.deployment, { metadata: { @@ -388,7 +389,15 @@ labels: {'app.kubernetes.io/name': shardksmname} }, spec: { + selector{ + matchLabels: {app.kubernetes.io/name': shardksmname} + } template: { + metadata: { + labels: { + app.kubernetes.io/name': shardksmname + } + } spec: { containers: [c], }, @@ -397,6 +406,27 @@ }, ), + deploymentNoNodePodsService: + local c = ksm.deployment.spec.template.spec.containers[0] { + args: [ + '--resources=pods', + '--node=""', + ], + }; + local shardksmname = ksm.name + "-no-node-pods"; + std.mergePatch(ksm.service, + { + metadata: { + name: shardksmname, + labels: {'app.kubernetes.io/name': shardksmname} + }, + spec: { + selector: { + 'app.kubernetes.io/name': shardksmname + } + } + } + ), daemonset: // extending the default container from above local c0 = ksm.deployment.spec.template.spec.containers[0] { diff --git a/pkg/options/types.go b/pkg/options/types.go index 9f03ec863b..91d7d778d4 100644 --- a/pkg/options/types.go +++ b/pkg/options/types.go @@ -18,7 +18,6 @@ package options import ( "errors" - "regexp" "sort" "strings" @@ -141,15 +140,18 @@ func (n *NodeType) Type() string { // GetNodeFieldSelector returns a nodename field selector. func (n *NodeType) GetNodeFieldSelector() string { - if nil == n || len(*n) == 0 { + if nil == n { klog.InfoS("Using node type is nil") return EmptyFieldSelector() } - pattern := "[^a-zA-Z0-9_,-]+" - re := regexp.MustCompile(pattern) - result := re.ReplaceAllString(n.String(), "") - klog.InfoS("Using node type", "node", result) - return fields.OneTermEqualSelector("spec.nodeName", result).String() + nodeName := n.String() + // `--node=""` find pods without node name assigned which uses fieldselector spec.nodeName="" + klog.InfoS("Using node name", nodeName) + if nodeName == "" { + klog.InfoS("Using spec.nodeName= to select unscheduable pods without node") + return "spec.nodeName=" + } + return fields.OneTermEqualSelector("spec.nodeName", nodeName).String() }