diff --git a/CHANGELOG.md b/CHANGELOG.md index a1662170bba..d79bbb6bffc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.93.1 / 2026-08-10 + +* [BUGFIX] Fix duplicate kubelet targets for nodes reporting several addresses of the same IP family. #8739 +* [BUGFIX] Fix argument list for Thanos containers when custom TLS ciphers or curves are specified. #8749 + ## 0.93.0 / 2026-07-28 * [CHANGE] Switch from uint to int types in the Go definition of the CRDs and add API validations to reject negative values. #8662 #8666 diff --git a/Documentation/platform/operator.md b/Documentation/platform/operator.md index 3dd036976c2..c41778b0e3c 100644 --- a/Documentation/platform/operator.md +++ b/Documentation/platform/operator.md @@ -101,7 +101,7 @@ Arguments: -namespaces value Namespaces to scope the interaction of the Prometheus Operator and the apiserver (allow list). This is mutually exclusive with --deny-namespaces. -prometheus-config-reloader string - Prometheus config reloader image (default "quay.io/prometheus-operator/prometheus-config-reloader:v0.93.0") + Prometheus config reloader image (default "quay.io/prometheus-operator/prometheus-config-reloader:v0.93.1") -prometheus-default-base-image string Prometheus default base image (path without tag/version) (default "quay.io/prometheus/prometheus") -prometheus-instance-namespaces value diff --git a/Documentation/platform/prometheus-agent.md b/Documentation/platform/prometheus-agent.md index f08c9b4787f..264a709c918 100644 --- a/Documentation/platform/prometheus-agent.md +++ b/Documentation/platform/prometheus-agent.md @@ -26,7 +26,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator rules: - apiGroups: diff --git a/Documentation/platform/rbac.md b/Documentation/platform/rbac.md index 5528b1d56d1..cba87534787 100644 --- a/Documentation/platform/rbac.md +++ b/Documentation/platform/rbac.md @@ -26,7 +26,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator rules: - apiGroups: @@ -212,7 +212,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator namespace: default ``` @@ -228,7 +228,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator roleRef: apiGroup: rbac.authorization.k8s.io diff --git a/Documentation/platform/webhook.md b/Documentation/platform/webhook.md index 383c46468de..966d93ee080 100644 --- a/Documentation/platform/webhook.md +++ b/Documentation/platform/webhook.md @@ -86,7 +86,7 @@ kind: ServiceAccount metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator-admission-webhook namespace: default ``` @@ -97,7 +97,7 @@ kind: Deployment metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator-admission-webhook namespace: default spec: @@ -114,7 +114,7 @@ spec: kubectl.kubernetes.io/default-container: prometheus-operator-admission-webhook labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 spec: affinity: podAntiAffinity: @@ -131,7 +131,7 @@ spec: - --web.enable-tls=true - --web.cert-file=/etc/tls/private/tls.crt - --web.key-file=/etc/tls/private/tls.key - image: quay.io/prometheus-operator/admission-webhook:v0.93.0 + image: quay.io/prometheus-operator/admission-webhook:v0.93.1 name: prometheus-operator-admission-webhook ports: - containerPort: 8443 @@ -179,7 +179,7 @@ kind: Service metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator-admission-webhook namespace: default spec: diff --git a/VERSION b/VERSION index 9188543ea64..a16a6df5f80 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.93.0 +0.93.1 diff --git a/bundle.yaml b/bundle.yaml index fabb3f08b2f..0eb218dd983 100644 --- a/bundle.yaml +++ b/bundle.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: alertmanagerconfigs.monitoring.coreos.com spec: group: monitoring.coreos.com @@ -12386,7 +12386,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: alertmanagers.monitoring.coreos.com spec: group: monitoring.coreos.com @@ -22399,7 +22399,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: podmonitors.monitoring.coreos.com spec: group: monitoring.coreos.com @@ -23811,7 +23811,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: probes.monitoring.coreos.com spec: group: monitoring.coreos.com @@ -25237,7 +25237,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: prometheusagents.monitoring.coreos.com spec: group: monitoring.coreos.com @@ -36839,7 +36839,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: prometheuses.monitoring.coreos.com spec: group: monitoring.coreos.com @@ -50767,7 +50767,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: prometheusrules.monitoring.coreos.com spec: group: monitoring.coreos.com @@ -51034,7 +51034,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: scrapeconfigs.monitoring.coreos.com spec: group: monitoring.coreos.com @@ -63972,7 +63972,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: servicemonitors.monitoring.coreos.com spec: group: monitoring.coreos.com @@ -65401,7 +65401,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: thanosrulers.monitoring.coreos.com spec: group: monitoring.coreos.com @@ -75196,7 +75196,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator roleRef: apiGroup: rbac.authorization.k8s.io @@ -75213,7 +75213,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator rules: - apiGroups: @@ -75326,7 +75326,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator namespace: default spec: @@ -75342,13 +75342,13 @@ spec: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 spec: automountServiceAccountToken: true containers: - args: - --kubelet-service=kube-system/kubelet - - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.93.0 + - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.93.1 - --watch-referenced-objects-in-all-namespaces=true - --disable-unmanaged-prometheus-configuration=true - --kubelet-endpoints=true @@ -75356,7 +75356,7 @@ spec: env: - name: GOGC value: "30" - image: quay.io/prometheus-operator/prometheus-operator:v0.93.0 + image: quay.io/prometheus-operator/prometheus-operator:v0.93.1 name: prometheus-operator ports: - containerPort: 8080 @@ -75390,7 +75390,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator namespace: default --- @@ -75400,7 +75400,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator namespace: default spec: diff --git a/example/admission-webhook/deployment.yaml b/example/admission-webhook/deployment.yaml index bd81129ae2a..49fa8db8b3d 100644 --- a/example/admission-webhook/deployment.yaml +++ b/example/admission-webhook/deployment.yaml @@ -3,7 +3,7 @@ kind: Deployment metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator-admission-webhook namespace: default spec: @@ -20,7 +20,7 @@ spec: kubectl.kubernetes.io/default-container: prometheus-operator-admission-webhook labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 spec: affinity: podAntiAffinity: @@ -37,7 +37,7 @@ spec: - --web.enable-tls=true - --web.cert-file=/etc/tls/private/tls.crt - --web.key-file=/etc/tls/private/tls.key - image: quay.io/prometheus-operator/admission-webhook:v0.93.0 + image: quay.io/prometheus-operator/admission-webhook:v0.93.1 name: prometheus-operator-admission-webhook ports: - containerPort: 8443 diff --git a/example/admission-webhook/pod-disruption-budget.yaml b/example/admission-webhook/pod-disruption-budget.yaml index cf7e6f2a4e6..84eca0cd0d3 100644 --- a/example/admission-webhook/pod-disruption-budget.yaml +++ b/example/admission-webhook/pod-disruption-budget.yaml @@ -3,7 +3,7 @@ kind: PodDisruptionBudget metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator-admission-webhook namespace: default spec: diff --git a/example/admission-webhook/service-account.yaml b/example/admission-webhook/service-account.yaml index cbb0541cf2b..1ec4a01cece 100644 --- a/example/admission-webhook/service-account.yaml +++ b/example/admission-webhook/service-account.yaml @@ -4,6 +4,6 @@ kind: ServiceAccount metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator-admission-webhook namespace: default diff --git a/example/admission-webhook/service-monitor.yaml b/example/admission-webhook/service-monitor.yaml index cc1fda11538..6bd3ffed5ba 100644 --- a/example/admission-webhook/service-monitor.yaml +++ b/example/admission-webhook/service-monitor.yaml @@ -3,7 +3,7 @@ kind: ServiceMonitor metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator-admission-webhook namespace: default spec: @@ -13,4 +13,4 @@ spec: selector: matchLabels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 diff --git a/example/admission-webhook/service.yaml b/example/admission-webhook/service.yaml index a16b5d30e6e..8f4e36c4da1 100644 --- a/example/admission-webhook/service.yaml +++ b/example/admission-webhook/service.yaml @@ -3,7 +3,7 @@ kind: Service metadata: labels: app.kubernetes.io/name: prometheus-operator-admission-webhook - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator-admission-webhook namespace: default spec: diff --git a/example/alertmanager-crd-conversion/patch.json b/example/alertmanager-crd-conversion/patch.json index 84e2000593a..8ff66828c8d 100644 --- a/example/alertmanager-crd-conversion/patch.json +++ b/example/alertmanager-crd-conversion/patch.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "controller-gen.kubebuilder.io/version": "v0.21.0", - "operator.prometheus.io/version": "0.93.0" + "operator.prometheus.io/version": "0.93.1" }, "name": "alertmanagerconfigs.monitoring.coreos.com" }, diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml index 68fdeab1de7..a233562cfbe 100644 --- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml +++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagerconfigs.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: alertmanagerconfigs.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml index 0cb849ec754..a72312a6246 100644 --- a/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml +++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_alertmanagers.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: alertmanagers.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml index 5c1bde3d4a5..c394ae9ba40 100644 --- a/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml +++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_podmonitors.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: podmonitors.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml index a172e3125fb..285fcc1bd6a 100644 --- a/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml +++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_probes.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: probes.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml index 9738bd941be..4fece018af6 100644 --- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml +++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusagents.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: prometheusagents.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml index 05a2c7b38bf..ba67f3ca289 100644 --- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml +++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheuses.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: prometheuses.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml index b423c3225b1..1b186945547 100644 --- a/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml +++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_prometheusrules.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: prometheusrules.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml index d45cb52da3b..7cbc8255d21 100644 --- a/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml +++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_scrapeconfigs.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: scrapeconfigs.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml index f5736255990..075e7989ce6 100644 --- a/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml +++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_servicemonitors.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: servicemonitors.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml index b10255c2675..0029a431148 100644 --- a/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml +++ b/example/prometheus-operator-crd-full/monitoring.coreos.com_thanosrulers.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: thanosrulers.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml index 52a56f35b68..b4991d877a2 100644 --- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml +++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagerconfigs.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: alertmanagerconfigs.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml index 0cb849ec754..a72312a6246 100644 --- a/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml +++ b/example/prometheus-operator-crd/monitoring.coreos.com_alertmanagers.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: alertmanagers.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml index 5c1bde3d4a5..c394ae9ba40 100644 --- a/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml +++ b/example/prometheus-operator-crd/monitoring.coreos.com_podmonitors.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: podmonitors.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml index a172e3125fb..285fcc1bd6a 100644 --- a/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml +++ b/example/prometheus-operator-crd/monitoring.coreos.com_probes.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: probes.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml index 9738bd941be..4fece018af6 100644 --- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml +++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusagents.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: prometheusagents.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml index 05a2c7b38bf..ba67f3ca289 100644 --- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml +++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheuses.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: prometheuses.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml index b423c3225b1..1b186945547 100644 --- a/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml +++ b/example/prometheus-operator-crd/monitoring.coreos.com_prometheusrules.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: prometheusrules.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml index d45cb52da3b..7cbc8255d21 100644 --- a/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml +++ b/example/prometheus-operator-crd/monitoring.coreos.com_scrapeconfigs.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: scrapeconfigs.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml index f5736255990..075e7989ce6 100644 --- a/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml +++ b/example/prometheus-operator-crd/monitoring.coreos.com_servicemonitors.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: servicemonitors.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml index b10255c2675..0029a431148 100644 --- a/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml +++ b/example/prometheus-operator-crd/monitoring.coreos.com_thanosrulers.yaml @@ -4,7 +4,7 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.21.0 - operator.prometheus.io/version: 0.93.0 + operator.prometheus.io/version: 0.93.1 name: thanosrulers.monitoring.coreos.com spec: group: monitoring.coreos.com diff --git a/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml b/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml index 7d559cd5a42..85a1e023f3b 100644 --- a/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml +++ b/example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml @@ -4,7 +4,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator roleRef: apiGroup: rbac.authorization.k8s.io diff --git a/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml b/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml index 6f9ab95a329..f6961cfcc43 100644 --- a/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml +++ b/example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml @@ -4,7 +4,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator rules: - apiGroups: diff --git a/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml b/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml index 6bd4965b4e8..51861ef3853 100644 --- a/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml +++ b/example/rbac/prometheus-operator/prometheus-operator-deployment.yaml @@ -4,7 +4,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator namespace: default spec: @@ -20,13 +20,13 @@ spec: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 spec: automountServiceAccountToken: true containers: - args: - --kubelet-service=kube-system/kubelet - - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.93.0 + - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.93.1 - --watch-referenced-objects-in-all-namespaces=true - --disable-unmanaged-prometheus-configuration=true - --kubelet-endpoints=true @@ -34,7 +34,7 @@ spec: env: - name: GOGC value: "30" - image: quay.io/prometheus-operator/prometheus-operator:v0.93.0 + image: quay.io/prometheus-operator/prometheus-operator:v0.93.1 name: prometheus-operator ports: - containerPort: 8080 diff --git a/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml b/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml index 2cdc4d474ee..c37a4fab3c2 100644 --- a/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml +++ b/example/rbac/prometheus-operator/prometheus-operator-service-account.yaml @@ -5,6 +5,6 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator namespace: default diff --git a/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml b/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml index 2a422982b35..db57bdc32ac 100644 --- a/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml +++ b/example/rbac/prometheus-operator/prometheus-operator-service-monitor.yaml @@ -4,7 +4,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator namespace: default spec: @@ -15,4 +15,4 @@ spec: matchLabels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 diff --git a/example/rbac/prometheus-operator/prometheus-operator-service.yaml b/example/rbac/prometheus-operator/prometheus-operator-service.yaml index 82bdf70aa45..ac0685cef90 100644 --- a/example/rbac/prometheus-operator/prometheus-operator-service.yaml +++ b/example/rbac/prometheus-operator/prometheus-operator-service.yaml @@ -4,7 +4,7 @@ metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: prometheus-operator - app.kubernetes.io/version: 0.93.0 + app.kubernetes.io/version: 0.93.1 name: prometheus-operator namespace: default spec: diff --git a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json index 3142937136b..23b96ebedee 100644 --- a/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json +++ b/jsonnet/prometheus-operator/alertmanagerconfigs-crd.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "controller-gen.kubebuilder.io/version": "v0.21.0", - "operator.prometheus.io/version": "0.93.0" + "operator.prometheus.io/version": "0.93.1" }, "name": "alertmanagerconfigs.monitoring.coreos.com" }, diff --git a/jsonnet/prometheus-operator/alertmanagers-crd.json b/jsonnet/prometheus-operator/alertmanagers-crd.json index dc9f3abd1aa..3533e9de1a8 100644 --- a/jsonnet/prometheus-operator/alertmanagers-crd.json +++ b/jsonnet/prometheus-operator/alertmanagers-crd.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "controller-gen.kubebuilder.io/version": "v0.21.0", - "operator.prometheus.io/version": "0.93.0" + "operator.prometheus.io/version": "0.93.1" }, "name": "alertmanagers.monitoring.coreos.com" }, diff --git a/jsonnet/prometheus-operator/podmonitors-crd.json b/jsonnet/prometheus-operator/podmonitors-crd.json index 363f60914d3..81fd2060b15 100644 --- a/jsonnet/prometheus-operator/podmonitors-crd.json +++ b/jsonnet/prometheus-operator/podmonitors-crd.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "controller-gen.kubebuilder.io/version": "v0.21.0", - "operator.prometheus.io/version": "0.93.0" + "operator.prometheus.io/version": "0.93.1" }, "name": "podmonitors.monitoring.coreos.com" }, diff --git a/jsonnet/prometheus-operator/probes-crd.json b/jsonnet/prometheus-operator/probes-crd.json index 93bf385a021..b126fb04a3f 100644 --- a/jsonnet/prometheus-operator/probes-crd.json +++ b/jsonnet/prometheus-operator/probes-crd.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "controller-gen.kubebuilder.io/version": "v0.21.0", - "operator.prometheus.io/version": "0.93.0" + "operator.prometheus.io/version": "0.93.1" }, "name": "probes.monitoring.coreos.com" }, diff --git a/jsonnet/prometheus-operator/prometheusagents-crd.json b/jsonnet/prometheus-operator/prometheusagents-crd.json index 7e0489bbcbe..dd34adf6641 100644 --- a/jsonnet/prometheus-operator/prometheusagents-crd.json +++ b/jsonnet/prometheus-operator/prometheusagents-crd.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "controller-gen.kubebuilder.io/version": "v0.21.0", - "operator.prometheus.io/version": "0.93.0" + "operator.prometheus.io/version": "0.93.1" }, "name": "prometheusagents.monitoring.coreos.com" }, diff --git a/jsonnet/prometheus-operator/prometheuses-crd.json b/jsonnet/prometheus-operator/prometheuses-crd.json index 13cda1be693..4f86c5c7b8e 100644 --- a/jsonnet/prometheus-operator/prometheuses-crd.json +++ b/jsonnet/prometheus-operator/prometheuses-crd.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "controller-gen.kubebuilder.io/version": "v0.21.0", - "operator.prometheus.io/version": "0.93.0" + "operator.prometheus.io/version": "0.93.1" }, "name": "prometheuses.monitoring.coreos.com" }, diff --git a/jsonnet/prometheus-operator/prometheusrules-crd.json b/jsonnet/prometheus-operator/prometheusrules-crd.json index c1e90a0c3a1..4634090b1b3 100644 --- a/jsonnet/prometheus-operator/prometheusrules-crd.json +++ b/jsonnet/prometheus-operator/prometheusrules-crd.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "controller-gen.kubebuilder.io/version": "v0.21.0", - "operator.prometheus.io/version": "0.93.0" + "operator.prometheus.io/version": "0.93.1" }, "name": "prometheusrules.monitoring.coreos.com" }, diff --git a/jsonnet/prometheus-operator/scrapeconfigs-crd.json b/jsonnet/prometheus-operator/scrapeconfigs-crd.json index e3df9474520..5e8cbfe14d1 100644 --- a/jsonnet/prometheus-operator/scrapeconfigs-crd.json +++ b/jsonnet/prometheus-operator/scrapeconfigs-crd.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "controller-gen.kubebuilder.io/version": "v0.21.0", - "operator.prometheus.io/version": "0.93.0" + "operator.prometheus.io/version": "0.93.1" }, "name": "scrapeconfigs.monitoring.coreos.com" }, diff --git a/jsonnet/prometheus-operator/servicemonitors-crd.json b/jsonnet/prometheus-operator/servicemonitors-crd.json index dc1b23f6117..01d2158c211 100644 --- a/jsonnet/prometheus-operator/servicemonitors-crd.json +++ b/jsonnet/prometheus-operator/servicemonitors-crd.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "controller-gen.kubebuilder.io/version": "v0.21.0", - "operator.prometheus.io/version": "0.93.0" + "operator.prometheus.io/version": "0.93.1" }, "name": "servicemonitors.monitoring.coreos.com" }, diff --git a/jsonnet/prometheus-operator/thanosrulers-crd.json b/jsonnet/prometheus-operator/thanosrulers-crd.json index 9e7c4865c79..7484ec3f2ad 100644 --- a/jsonnet/prometheus-operator/thanosrulers-crd.json +++ b/jsonnet/prometheus-operator/thanosrulers-crd.json @@ -4,7 +4,7 @@ "metadata": { "annotations": { "controller-gen.kubebuilder.io/version": "v0.21.0", - "operator.prometheus.io/version": "0.93.0" + "operator.prometheus.io/version": "0.93.1" }, "name": "thanosrulers.monitoring.coreos.com" }, diff --git a/pkg/kubelet/controller.go b/pkg/kubelet/controller.go index f1d3db2599c..0ae1e940fd8 100644 --- a/pkg/kubelet/controller.go +++ b/pkg/kubelet/controller.go @@ -335,6 +335,10 @@ func (c *Controller) getNodeAddresses(nodes []corev1.Node) ([]nodeAddress, []err continue } + // A node with several interfaces reports several addresses per family, + // all reaching the same kubelet. + var seenIPv4, seenIPv6 bool + for _, address := range nodeIPs { ip := net.ParseIP(address) if ip == nil { @@ -342,12 +346,26 @@ func (c *Controller) getNodeAddresses(nodes []corev1.Node) ([]nodeAddress, []err continue } + ipv4 := ip.To4() != nil + if ipv4 && seenIPv4 { + continue + } + if !ipv4 && seenIPv6 { + continue + } + + if ipv4 { + seenIPv4 = true + } else { + seenIPv6 = true + } + na := nodeAddress{ ipAddress: address, name: n.Name, uid: n.UID, apiVersion: n.APIVersion, - ipv4: ip.To4() != nil, + ipv4: ipv4, ready: nodeReadyConditionKnown(n), } addresses = append(addresses, na) @@ -413,7 +431,7 @@ func (c *Controller) sync(ctx context.Context) { if c.manageEndpoints { c.nodeEndpointSyncs.WithLabelValues(endpointsLabel).Inc() - if err = c.syncEndpoints(ctx, addresses); err != nil { + if err = c.syncEndpoints(ctx, svc, addresses); err != nil { c.nodeEndpointSyncErrors.WithLabelValues(endpointsLabel).Inc() c.logger.Error("Failed to synchronize kubelet endpoints", "err", err) } @@ -428,9 +446,49 @@ func (c *Controller) sync(ctx context.Context) { } } -func (c *Controller) syncEndpoints(ctx context.Context, addresses []nodeAddress) error { +// singleAddressPerNode returns one address per node, preferring the service's +// primary IP family. The Endpoints API has no address family filter, unlike the +// endpointslice one, so keeping every address would make Prometheus scrape +// dual-stack nodes once per address. Nodes reporting no address of the primary +// family keep their first address rather than being dropped. +func singleAddressPerNode(svc *corev1.Service, addresses []nodeAddress) []nodeAddress { + var primaryIPv4, hasPrimary bool + if svc != nil && len(svc.Spec.IPFamilies) > 0 { + hasPrimary = true + primaryIPv4 = svc.Spec.IPFamilies[0] == corev1.IPv4Protocol + } + + indexes := make(map[string]int, len(addresses)) + + filtered := make([]nodeAddress, 0, len(addresses)) + for _, a := range addresses { + i, found := indexes[a.name] + if !found { + indexes[a.name] = len(filtered) + filtered = append(filtered, a) + + continue + } + + if !hasPrimary { + continue + } + + if a.ipv4 != primaryIPv4 { + continue + } + + filtered[i] = a + } + + return filtered +} + +func (c *Controller) syncEndpoints(ctx context.Context, svc *corev1.Service, addresses []nodeAddress) error { c.logger.Debug("Sync endpoints") + addresses = singleAddressPerNode(svc, addresses) + //nolint:staticcheck // Ignore SA1019 Endpoints is marked as deprecated. eps := &corev1.Endpoints{ ObjectMeta: metav1.ObjectMeta{ diff --git a/pkg/kubelet/controller_test.go b/pkg/kubelet/controller_test.go index df1a69352c8..9d8a66a7be8 100644 --- a/pkg/kubelet/controller_test.go +++ b/pkg/kubelet/controller_test.go @@ -16,6 +16,7 @@ package kubelet import ( "context" + "errors" "fmt" "log/slog" "slices" @@ -25,6 +26,7 @@ import ( "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" discoveryv1 "k8s.io/api/discovery/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" @@ -276,6 +278,44 @@ func TestGetNodeAddresses(t *testing.T) { expectedAddresses: []string{"10.0.0.1", "fd00::1"}, expectedErrors: 0, }, + { + name: "node with several addresses of the same family keeps the first of each", + nodes: []corev1.Node{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "node-0", + }, + Status: corev1.NodeStatus{ + Addresses: []corev1.NodeAddress{ + { + Address: "fd00::1", + Type: corev1.NodeInternalIP, + }, + { + Address: "fd01::1", + Type: corev1.NodeInternalIP, + }, + { + Address: "10.0.0.1", + Type: corev1.NodeInternalIP, + }, + { + Address: "10.0.1.1", + Type: corev1.NodeInternalIP, + }, + }, + Conditions: []corev1.NodeCondition{ + { + Type: corev1.NodeReady, + Status: corev1.ConditionTrue, + }, + }, + }, + }, + }, + expectedAddresses: []string{"fd00::1", "10.0.0.1"}, + expectedErrors: 0, + }, } { t.Run(c.name, func(t *testing.T) { controller := Controller{ @@ -568,6 +608,307 @@ func TestSync(t *testing.T) { }) } +func TestSyncDualStackNode(t *testing.T) { + for _, tc := range []struct { + name string + nodeAddresses []string + ipFamilies []corev1.IPFamily + expectedAddresses []string + }{ + { + name: "IPv4 primary service keeps the IPv4 address", + nodeAddresses: []string{"10.0.0.1", "fd00::1"}, + ipFamilies: []corev1.IPFamily{corev1.IPv4Protocol, corev1.IPv6Protocol}, + expectedAddresses: []string{"10.0.0.1"}, + }, + { + name: "IPv6 primary service keeps the IPv6 address", + nodeAddresses: []string{"10.0.0.1", "fd00::1"}, + ipFamilies: []corev1.IPFamily{corev1.IPv6Protocol, corev1.IPv4Protocol}, + expectedAddresses: []string{"fd00::1"}, + }, + { + name: "service without IP family keeps one address per node", + nodeAddresses: []string{"10.0.0.1", "fd00::1"}, + expectedAddresses: []string{"10.0.0.1"}, + }, + { + name: "node with several addresses of the same family keeps one", + nodeAddresses: []string{"10.0.0.1", "10.0.1.1", "fd00::1", "fd01::1"}, + ipFamilies: []corev1.IPFamily{corev1.IPv6Protocol, corev1.IPv4Protocol}, + expectedAddresses: []string{"fd00::1"}, + }, + } { + t.Run(tc.name, func(t *testing.T) { + var ( + ctx = context.Background() + id = int32(0) + fakeClient = fake.NewClientset() + ) + + fakeClient.PrependReactor( + "create", "*", + func(action ktesting.Action) (handled bool, ret runtime.Object, err error) { + ret = action.(ktesting.CreateAction).GetObject() + meta, ok := ret.(metav1.Object) + if !ok { + return + } + + if meta.GetName() == "" && meta.GetGenerateName() != "" { + meta.SetName(names.SimpleNameGenerator.GenerateName(meta.GetGenerateName())) + meta.SetUID(types.UID(string('A' + id))) + id++ + } + + return + }, + ) + + c, err := New( + newLogger(), + fakeClient, + nil, + "kubelet", + "test", + "", + nil, + nil, + WithEndpoints(), WithEndpointSlice(), WithMaxEndpointsPerSlice(2), WithNodeAddressPriority("internal"), + ) + require.NoError(t, err) + + _, err = c.kclient.CoreV1().Services(c.kubeletObjectNamespace).Create( + ctx, + &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: c.kubeletObjectName, + Namespace: c.kubeletObjectNamespace, + }, + Spec: corev1.ServiceSpec{ + Type: corev1.ServiceTypeClusterIP, + ClusterIP: corev1.ClusterIPNone, + IPFamilies: tc.ipFamilies, + }, + }, + metav1.CreateOptions{}, + ) + require.NoError(t, err) + + nodeAddresses := make([]corev1.NodeAddress, 0, len(tc.nodeAddresses)) + for _, a := range tc.nodeAddresses { + nodeAddresses = append(nodeAddresses, corev1.NodeAddress{ + Address: a, + Type: corev1.NodeInternalIP, + }) + } + + _, err = c.kclient.CoreV1().Nodes().Create( + ctx, + &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node-0", + UID: types.UID("node-0"), + }, + Status: corev1.NodeStatus{ + Addresses: nodeAddresses, + Conditions: []corev1.NodeCondition{ + { + Type: corev1.NodeReady, + Status: corev1.ConditionTrue, + }, + }, + }, + }, + metav1.CreateOptions{}, + ) + require.NoError(t, err) + + c.sync(ctx) + + ep, err := c.kclient.CoreV1().Endpoints(c.kubeletObjectNamespace).Get(ctx, c.kubeletObjectName, metav1.GetOptions{}) + require.NoError(t, err) + require.Len(t, ep.Subsets, 1) + + addresses := make([]string, 0, len(ep.Subsets[0].Addresses)) + for _, a := range ep.Subsets[0].Addresses { + addresses = append(addresses, a.IP) + } + require.Equal(t, tc.expectedAddresses, addresses) + + // The endpointslices keep both families whatever the primary one is. + eps := listEndpointSlices(t, c.kclient.DiscoveryV1().EndpointSlices(c.kubeletObjectNamespace), 2) + + byAddressType := map[discoveryv1.AddressType]string{} + for _, e := range eps { + require.Len(t, e.Endpoints, 1) + require.Len(t, e.Endpoints[0].Addresses, 1) + byAddressType[e.AddressType] = e.Endpoints[0].Addresses[0] + } + require.Equal( + t, + map[discoveryv1.AddressType]string{ + discoveryv1.AddressTypeIPv4: "10.0.0.1", + discoveryv1.AddressTypeIPv6: "fd00::1", + }, + byAddressType, + ) + }) + } +} + +func TestSyncEndpointsWhenServiceSyncFails(t *testing.T) { + var ( + ctx = context.Background() + fakeClient = fake.NewClientset() + ) + + fakeClient.PrependReactor( + "get", "services", + func(_ ktesting.Action) (bool, runtime.Object, error) { + return true, nil, apierrors.NewInternalError(errors.New("apiserver is down")) + }, + ) + + c, err := New( + newLogger(), + fakeClient, + nil, + "kubelet", + "test", + "", + nil, + nil, + WithEndpoints(), WithNodeAddressPriority("internal"), + ) + require.NoError(t, err) + + _, err = c.kclient.CoreV1().Nodes().Create( + ctx, + &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: "node-0", + UID: types.UID("node-0"), + }, + Status: corev1.NodeStatus{ + Addresses: []corev1.NodeAddress{ + { + Address: "10.0.0.1", + Type: corev1.NodeInternalIP, + }, + { + Address: "fd00::1", + Type: corev1.NodeInternalIP, + }, + }, + Conditions: []corev1.NodeCondition{ + { + Type: corev1.NodeReady, + Status: corev1.ConditionTrue, + }, + }, + }, + }, + metav1.CreateOptions{}, + ) + require.NoError(t, err) + + c.sync(ctx) + + ep, err := c.kclient.CoreV1().Endpoints(c.kubeletObjectNamespace).Get(ctx, c.kubeletObjectName, metav1.GetOptions{}) + require.NoError(t, err) + require.Len(t, ep.Subsets, 1) + + addresses := make([]string, 0, len(ep.Subsets[0].Addresses)) + for _, a := range ep.Subsets[0].Addresses { + addresses = append(addresses, a.IP) + } + require.Equal(t, []string{"10.0.0.1"}, addresses) +} + +func TestSyncEndpointsNodeWithoutPrimaryFamilyAddress(t *testing.T) { + var ( + ctx = context.Background() + fakeClient = fake.NewClientset() + ) + + c, err := New( + newLogger(), + fakeClient, + nil, + "kubelet", + "test", + "", + nil, + nil, + WithEndpoints(), WithNodeAddressPriority("internal"), + ) + require.NoError(t, err) + + _, err = c.kclient.CoreV1().Services(c.kubeletObjectNamespace).Create( + ctx, + &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: c.kubeletObjectName, + Namespace: c.kubeletObjectNamespace, + }, + Spec: corev1.ServiceSpec{ + Type: corev1.ServiceTypeClusterIP, + ClusterIP: corev1.ClusterIPNone, + IPFamilies: []corev1.IPFamily{corev1.IPv6Protocol, corev1.IPv4Protocol}, + }, + }, + metav1.CreateOptions{}, + ) + require.NoError(t, err) + + for _, n := range [][]string{ + {"node-0", "10.0.0.1", "fd00::1"}, + {"node-1", "10.0.0.2"}, + } { + nodeAddresses := make([]corev1.NodeAddress, 0, len(n)-1) + for _, a := range n[1:] { + nodeAddresses = append(nodeAddresses, corev1.NodeAddress{ + Address: a, + Type: corev1.NodeInternalIP, + }) + } + + _, err = c.kclient.CoreV1().Nodes().Create( + ctx, + &corev1.Node{ + ObjectMeta: metav1.ObjectMeta{ + Name: n[0], + UID: types.UID(n[0]), + }, + Status: corev1.NodeStatus{ + Addresses: nodeAddresses, + Conditions: []corev1.NodeCondition{ + { + Type: corev1.NodeReady, + Status: corev1.ConditionTrue, + }, + }, + }, + }, + metav1.CreateOptions{}, + ) + require.NoError(t, err) + } + + c.sync(ctx) + + ep, err := c.kclient.CoreV1().Endpoints(c.kubeletObjectNamespace).Get(ctx, c.kubeletObjectName, metav1.GetOptions{}) + require.NoError(t, err) + require.Len(t, ep.Subsets, 1) + + nodes := make([]string, 0, len(ep.Subsets[0].Addresses)) + for _, a := range ep.Subsets[0].Addresses { + nodes = append(nodes, *a.NodeName) + } + require.Equal(t, []string{"node-0", "node-1"}, nodes) +} + func newNode(name, address string) *corev1.Node { return &corev1.Node{ ObjectMeta: metav1.ObjectMeta{ diff --git a/pkg/prometheus/server/statefulset.go b/pkg/prometheus/server/statefulset.go index 57353416a5e..8cb4e653757 100644 --- a/pkg/prometheus/server/statefulset.go +++ b/pkg/prometheus/server/statefulset.go @@ -19,7 +19,6 @@ import ( "maps" "path" "path/filepath" - "strings" "github.com/blang/semver/v4" appsv1 "k8s.io/api/apps/v1" @@ -598,11 +597,15 @@ func createThanosContainer(p *monitoringv1.Prometheus, c prompkg.Config, compact } if len(tls.CipherSuites) > 0 && thanosVersion.GTE(semver.MustParse("0.42.0")) { - thanosArgs = append(thanosArgs, monitoringv1.Argument{Name: "grpc-server-tls-ciphers", Value: strings.Join(tls.CipherSuites, ",")}) + for _, cs := range tls.CipherSuites { + thanosArgs = append(thanosArgs, monitoringv1.Argument{Name: "grpc-server-tls-ciphers", Value: cs}) + } } if len(tls.Curves) > 0 && thanosVersion.GTE(semver.MustParse("0.42.0")) { - thanosArgs = append(thanosArgs, monitoringv1.Argument{Name: "grpc-server-tls-curves", Value: strings.Join(tls.Curves, ",")}) + for _, c := range tls.Curves { + thanosArgs = append(thanosArgs, monitoringv1.Argument{Name: "grpc-server-tls-curves", Value: c}) + } } } diff --git a/pkg/prometheus/server/statefulset_test.go b/pkg/prometheus/server/statefulset_test.go index 041a680174a..ed11c10500c 100644 --- a/pkg/prometheus/server/statefulset_test.go +++ b/pkg/prometheus/server/statefulset_test.go @@ -2769,8 +2769,13 @@ func TestGRPCServerTLSCipherSuites(t *testing.T) { require.NoError(t, err) thanosArgs := sset.Spec.Template.Spec.Containers[2].Args - expectedArg := "--grpc-server-tls-ciphers=TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384" - require.Equal(t, tc.shouldHaveArg, slices.Contains(thanosArgs, expectedArg)) + expectedArgs := []string{ + "--grpc-server-tls-ciphers=TLS_AES_128_GCM_SHA256", + "--grpc-server-tls-ciphers=TLS_AES_256_GCM_SHA384", + } + for _, expectedArg := range expectedArgs { + require.Equal(t, tc.shouldHaveArg, slices.Contains(thanosArgs, expectedArg), "expected %q presence to be %v", expectedArg, tc.shouldHaveArg) + } }) } } @@ -2817,8 +2822,13 @@ func TestGRPCServerTLSCurves(t *testing.T) { require.NoError(t, err) thanosArgs := sset.Spec.Template.Spec.Containers[2].Args - expectedArg := "--grpc-server-tls-curves=CurveP256,X25519" - require.Equal(t, tc.shouldHaveArg, slices.Contains(thanosArgs, expectedArg)) + expectedArgs := []string{ + "--grpc-server-tls-curves=CurveP256", + "--grpc-server-tls-curves=X25519", + } + for _, expectedArg := range expectedArgs { + require.Equal(t, tc.shouldHaveArg, slices.Contains(thanosArgs, expectedArg), "expected %q presence to be %v", expectedArg, tc.shouldHaveArg) + } }) } } diff --git a/pkg/thanos/statefulset.go b/pkg/thanos/statefulset.go index 66a651245f5..fe5093cde24 100644 --- a/pkg/thanos/statefulset.go +++ b/pkg/thanos/statefulset.go @@ -325,11 +325,15 @@ func makeStatefulSetSpec(tr *monitoringv1.ThanosRuler, config Config, ruleConfig } if len(tls.CipherSuites) > 0 && version.GTE(semver.MustParse("0.42.0")) { - trCLIArgs = append(trCLIArgs, monitoringv1.Argument{Name: "grpc-server-tls-ciphers", Value: strings.Join(tls.CipherSuites, ",")}) + for _, cs := range tls.CipherSuites { + trCLIArgs = append(trCLIArgs, monitoringv1.Argument{Name: "grpc-server-tls-ciphers", Value: cs}) + } } if len(tls.Curves) > 0 && version.GTE(semver.MustParse("0.42.0")) { - trCLIArgs = append(trCLIArgs, monitoringv1.Argument{Name: "grpc-server-tls-curves", Value: strings.Join(tls.Curves, ",")}) + for _, c := range tls.Curves { + trCLIArgs = append(trCLIArgs, monitoringv1.Argument{Name: "grpc-server-tls-curves", Value: c}) + } } } diff --git a/pkg/thanos/statefulset_test.go b/pkg/thanos/statefulset_test.go index a849cf78067..c942d389825 100644 --- a/pkg/thanos/statefulset_test.go +++ b/pkg/thanos/statefulset_test.go @@ -790,8 +790,13 @@ func TestGRPCServerTLSCipherSuites(t *testing.T) { require.NoError(t, err) trArgs := sset.Spec.Template.Spec.Containers[0].Args - expectedArg := "--grpc-server-tls-ciphers=TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384" - require.Equal(t, tc.shouldHaveArg, slices.Contains(trArgs, expectedArg)) + expectedArgs := []string{ + "--grpc-server-tls-ciphers=TLS_AES_128_GCM_SHA256", + "--grpc-server-tls-ciphers=TLS_AES_256_GCM_SHA384", + } + for _, expectedArg := range expectedArgs { + require.Equal(t, tc.shouldHaveArg, slices.Contains(trArgs, expectedArg), "expected %q presence to be %v", expectedArg, tc.shouldHaveArg) + } }) } } @@ -838,8 +843,13 @@ func TestGRPCServerTLSCurves(t *testing.T) { require.NoError(t, err) trArgs := sset.Spec.Template.Spec.Containers[0].Args - expectedArg := "--grpc-server-tls-curves=CurveP256,X25519" - require.Equal(t, tc.shouldHaveArg, slices.Contains(trArgs, expectedArg)) + expectedArgs := []string{ + "--grpc-server-tls-curves=CurveP256", + "--grpc-server-tls-curves=X25519", + } + for _, expectedArg := range expectedArgs { + require.Equal(t, tc.shouldHaveArg, slices.Contains(trArgs, expectedArg), "expected %q presence to be %v", expectedArg, tc.shouldHaveArg) + } }) } }