Skip to content

Commit e522573

Browse files
authored
Merge pull request #14 from cybozu-go/fix-202504
fix metrics name and not to list PodMetrics/NodeMetrics
2 parents cd9909d + 19865a5 commit e522573

File tree

11 files changed

+342
-70
lines changed

11 files changed

+342
-70
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ docker-build:
3939
.PHONY: maintenance
4040
maintenance: update-tools-versions update-actions
4141
$(MAKE) -C ./e2e update-tools-version
42+
$(MAKE) -C ./e2e/manifests/metrics-server update-manifests
4243

4344
.PHONY: update-tools-versions
4445
update-tools-versions: login-gh

cmd/root.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cmd
33
import (
44
"context"
55
"errors"
6+
"fmt"
67
"log"
78
"os"
89
"time"
@@ -53,6 +54,19 @@ type resourceMetadata struct {
5354
deletionTimestamp *metav1.Time
5455
}
5556

57+
var IgnoreResources = []schema.GroupVersionResource{
58+
{
59+
Group: "metrics.k8s.io",
60+
Version: "v1beta1",
61+
Resource: "pods",
62+
},
63+
{
64+
Group: "metrics.k8s.io",
65+
Version: "v1beta1",
66+
Resource: "nodes",
67+
},
68+
}
69+
5670
func getAllResources(ctx context.Context, config *rest.Config) ([]resourceMetadata, error) {
5771
o, err := discovery.NewDiscoveryClientForConfig(config)
5872
if err != nil {
@@ -74,6 +88,12 @@ func getAllResources(ctx context.Context, config *rest.Config) ([]resourceMetada
7488
}
7589
for _, resource := range resList.APIResources {
7690
groupResourceDef := schema.GroupVersionResource{Group: gv.Group, Version: gv.Version, Resource: resource.Name}
91+
for _, ir := range IgnoreResources {
92+
if ir == groupResourceDef {
93+
fmt.Printf("ignoring %s %s %s\n", groupResourceDef.Group, groupResourceDef.Version, groupResourceDef.Resource)
94+
continue
95+
}
96+
}
7797
listResponse, err := dynamicClient.Resource(groupResourceDef).Namespace(corev1.NamespaceAll).List(ctx, metav1.ListOptions{})
7898
statusErr := &apierrors.StatusError{}
7999
if err != nil && !errors.As(err, &statusErr) {
@@ -149,7 +169,7 @@ func postZombieResourcesMetrics(zombieResources []resourceMetadata, endpoint str
149169
gauges := make([]prometheus.Gauge, 0)
150170
for _, res := range zombieResources {
151171
gauge := prometheus.NewGauge(prometheus.GaugeOpts{
152-
Name: "zombie_duration_hours",
172+
Name: "zombie_duration_seconds",
153173
Help: "zombie detector zombie duration",
154174
ConstLabels: map[string]string{
155175
"apiVersion": res.version,

e2e/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ start:
4040
$(KUSTOMIZE) build ../config/namespace | $(KUBECTL) apply -f -
4141
$(KUSTOMIZE) build ../config/rbac | $(KUBECTL) apply -f -
4242
$(KUSTOMIZE) build ./manifests/pushgateway | $(KUBECTL) apply -f -
43+
$(KUSTOMIZE) build ./manifests/metrics-server | $(KUBECTL) apply -f -
4344

4445

4546

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.PHONY: update-manifests
2+
update-manifests:
3+
https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
apiVersion: v1
2+
kind: ServiceAccount
3+
metadata:
4+
labels:
5+
k8s-app: metrics-server
6+
name: metrics-server
7+
namespace: kube-system
8+
---
9+
apiVersion: rbac.authorization.k8s.io/v1
10+
kind: ClusterRole
11+
metadata:
12+
labels:
13+
k8s-app: metrics-server
14+
rbac.authorization.k8s.io/aggregate-to-admin: "true"
15+
rbac.authorization.k8s.io/aggregate-to-edit: "true"
16+
rbac.authorization.k8s.io/aggregate-to-view: "true"
17+
name: system:aggregated-metrics-reader
18+
rules:
19+
- apiGroups:
20+
- metrics.k8s.io
21+
resources:
22+
- pods
23+
- nodes
24+
verbs:
25+
- get
26+
- list
27+
- watch
28+
---
29+
apiVersion: rbac.authorization.k8s.io/v1
30+
kind: ClusterRole
31+
metadata:
32+
labels:
33+
k8s-app: metrics-server
34+
name: system:metrics-server
35+
rules:
36+
- apiGroups:
37+
- ""
38+
resources:
39+
- nodes/metrics
40+
verbs:
41+
- get
42+
- apiGroups:
43+
- ""
44+
resources:
45+
- pods
46+
- nodes
47+
verbs:
48+
- get
49+
- list
50+
- watch
51+
---
52+
apiVersion: rbac.authorization.k8s.io/v1
53+
kind: RoleBinding
54+
metadata:
55+
labels:
56+
k8s-app: metrics-server
57+
name: metrics-server-auth-reader
58+
namespace: kube-system
59+
roleRef:
60+
apiGroup: rbac.authorization.k8s.io
61+
kind: Role
62+
name: extension-apiserver-authentication-reader
63+
subjects:
64+
- kind: ServiceAccount
65+
name: metrics-server
66+
namespace: kube-system
67+
---
68+
apiVersion: rbac.authorization.k8s.io/v1
69+
kind: ClusterRoleBinding
70+
metadata:
71+
labels:
72+
k8s-app: metrics-server
73+
name: metrics-server:system:auth-delegator
74+
roleRef:
75+
apiGroup: rbac.authorization.k8s.io
76+
kind: ClusterRole
77+
name: system:auth-delegator
78+
subjects:
79+
- kind: ServiceAccount
80+
name: metrics-server
81+
namespace: kube-system
82+
---
83+
apiVersion: rbac.authorization.k8s.io/v1
84+
kind: ClusterRoleBinding
85+
metadata:
86+
labels:
87+
k8s-app: metrics-server
88+
name: system:metrics-server
89+
roleRef:
90+
apiGroup: rbac.authorization.k8s.io
91+
kind: ClusterRole
92+
name: system:metrics-server
93+
subjects:
94+
- kind: ServiceAccount
95+
name: metrics-server
96+
namespace: kube-system
97+
---
98+
apiVersion: v1
99+
kind: Service
100+
metadata:
101+
labels:
102+
k8s-app: metrics-server
103+
name: metrics-server
104+
namespace: kube-system
105+
spec:
106+
ports:
107+
- name: https
108+
port: 443
109+
protocol: TCP
110+
targetPort: https
111+
selector:
112+
k8s-app: metrics-server
113+
---
114+
apiVersion: apps/v1
115+
kind: Deployment
116+
metadata:
117+
labels:
118+
k8s-app: metrics-server
119+
name: metrics-server
120+
namespace: kube-system
121+
spec:
122+
selector:
123+
matchLabels:
124+
k8s-app: metrics-server
125+
strategy:
126+
rollingUpdate:
127+
maxUnavailable: 0
128+
template:
129+
metadata:
130+
labels:
131+
k8s-app: metrics-server
132+
spec:
133+
containers:
134+
- args:
135+
- --cert-dir=/tmp
136+
- --secure-port=10250
137+
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
138+
- --kubelet-use-node-status-port
139+
- --metric-resolution=15s
140+
image: registry.k8s.io/metrics-server/metrics-server:v0.7.2
141+
imagePullPolicy: IfNotPresent
142+
livenessProbe:
143+
failureThreshold: 3
144+
httpGet:
145+
path: /livez
146+
port: https
147+
scheme: HTTPS
148+
periodSeconds: 10
149+
name: metrics-server
150+
ports:
151+
- containerPort: 10250
152+
name: https
153+
protocol: TCP
154+
readinessProbe:
155+
failureThreshold: 3
156+
httpGet:
157+
path: /readyz
158+
port: https
159+
scheme: HTTPS
160+
initialDelaySeconds: 20
161+
periodSeconds: 10
162+
resources:
163+
requests:
164+
cpu: 100m
165+
memory: 200Mi
166+
securityContext:
167+
allowPrivilegeEscalation: false
168+
capabilities:
169+
drop:
170+
- ALL
171+
readOnlyRootFilesystem: true
172+
runAsNonRoot: true
173+
runAsUser: 1000
174+
seccompProfile:
175+
type: RuntimeDefault
176+
volumeMounts:
177+
- mountPath: /tmp
178+
name: tmp-dir
179+
nodeSelector:
180+
kubernetes.io/os: linux
181+
priorityClassName: system-cluster-critical
182+
serviceAccountName: metrics-server
183+
volumes:
184+
- emptyDir: {}
185+
name: tmp-dir
186+
---
187+
apiVersion: apiregistration.k8s.io/v1
188+
kind: APIService
189+
metadata:
190+
labels:
191+
k8s-app: metrics-server
192+
name: v1beta1.metrics.k8s.io
193+
spec:
194+
group: metrics.k8s.io
195+
groupPriorityMinimum: 100
196+
insecureSkipTLSVerify: true
197+
service:
198+
name: metrics-server
199+
namespace: kube-system
200+
version: v1beta1
201+
versionPriority: 100
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
resources:
2+
- components.yaml
3+
patches:
4+
- path: patch.yaml
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
labels:
5+
k8s-app: metrics-server
6+
name: metrics-server
7+
namespace: kube-system
8+
spec:
9+
template:
10+
spec:
11+
containers:
12+
- args:
13+
- --cert-dir=/tmp
14+
- --secure-port=10250
15+
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
16+
- --kubelet-use-node-status-port
17+
- --kubelet-insecure-tls
18+
- --metric-resolution=15s
19+
name: metrics-server
20+

e2e/manifests/podmetrics.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

e2e/zombie-detector_test.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package e2e
22

33
import (
44
"fmt"
5+
"strings"
56
"time"
67

78
. "github.com/onsi/ginkgo/v2"
@@ -26,6 +27,9 @@ var _ = Describe("zombie-detector e2e test", func() {
2627
By("waiting for job to be completed")
2728
Eventually(func() error {
2829
res, err := kubectl(nil, "get", "job", "zombie-detector-immediate-job", "-n", "zombie-detector", "-o", "json")
30+
if err != nil {
31+
return err
32+
}
2933
job := batchv1.Job{}
3034
err = json.Unmarshal(res, &job)
3135
if err != nil {
@@ -42,6 +46,26 @@ var _ = Describe("zombie-detector e2e test", func() {
4246
Expect(res.Data).To(BeEmpty())
4347
})
4448

49+
It("should skipping ignored resources", func() {
50+
By("creating job from cronjob")
51+
_, err := kubectl(nil, "create", "job", "zombie-detector-immediate-job", "-n", "zombie-detector", "--from=cronjob/zombie-detector-cronjob")
52+
Expect(err).NotTo(HaveOccurred())
53+
By("waiting for job to be completed")
54+
Eventually(func() error {
55+
res, err := kubectl(nil, "logs", "job/zombie-detector-immediate-job", "-n", "zombie-detector")
56+
if err != nil {
57+
return err
58+
}
59+
if !strings.Contains(string(res), "ignoring metrics.k8s.io v1beta1 pods") {
60+
return fmt.Errorf("metrics.k8s.io v1beta1 pods is not ignored")
61+
}
62+
if !strings.Contains(string(res), "ignoring metrics.k8s.io v1beta1 nodes") {
63+
return fmt.Errorf("metrics.k8s.io v1beta1 nodes is not ignored")
64+
}
65+
return nil
66+
}).Should(Succeed())
67+
})
68+
4569
It("should detect zombie resources", func() {
4670
By("adding deletionTimestamp to resources")
4771
_, err := kubectl(nil, "delete", "deployment", "test-deployment", "-n", "default", "--wait=false")
@@ -108,7 +132,7 @@ var _ = Describe("zombie-detector e2e test", func() {
108132
Expect(err).NotTo(HaveOccurred())
109133
index, err := returnZombieDetectorMetricsIndex(*res)
110134
Expect(err).NotTo(HaveOccurred())
111-
Expect(len(res.Data[index].ZombieDurationHours.Metrics)).To(Equal(3))
135+
Expect(len(res.Data[index].ZombieDurationSeconds.Metrics)).To(Equal(3))
112136
})
113137

114138
It("should not detect anything again", func() {
@@ -196,7 +220,7 @@ type Response struct {
196220
Labels struct {
197221
Job string `json:"job"`
198222
} `json:"labels"`
199-
ZombieDurationHours struct {
223+
ZombieDurationSeconds struct {
200224
Metrics []struct {
201225
Labels struct {
202226
APIVersion string `json:"apiVersion"`
@@ -209,6 +233,6 @@ type Response struct {
209233
} `json:"labels"`
210234
Value string `json:"value"`
211235
} `json:"metrics"`
212-
} `json:"zombie_duration_hours,omitempty"`
236+
} `json:"zombie_duration_seconds,omitempty"`
213237
} `json:"data"`
214238
}

0 commit comments

Comments
 (0)