@@ -22,6 +22,7 @@ import (
22
22
"crypto/tls"
23
23
"errors"
24
24
"fmt"
25
+ "math"
25
26
"net"
26
27
"net/http"
27
28
"os"
@@ -63,6 +64,7 @@ import (
63
64
"k8s.io/component-base/configz"
64
65
"k8s.io/component-base/featuregate"
65
66
"k8s.io/component-base/metrics"
67
+ "k8s.io/component-base/metrics/legacyregistry"
66
68
"k8s.io/component-base/version"
67
69
"k8s.io/component-base/version/verflag"
68
70
kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1"
@@ -87,6 +89,7 @@ import (
87
89
evictionapi "k8s.io/kubernetes/pkg/kubelet/eviction/api"
88
90
dynamickubeletconfig "k8s.io/kubernetes/pkg/kubelet/kubeletconfig"
89
91
"k8s.io/kubernetes/pkg/kubelet/kubeletconfig/configfiles"
92
+ kubeletmetrics "k8s.io/kubernetes/pkg/kubelet/metrics"
90
93
"k8s.io/kubernetes/pkg/kubelet/server"
91
94
"k8s.io/kubernetes/pkg/kubelet/stats/pidlimit"
92
95
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
@@ -838,6 +841,23 @@ func buildKubeletClientConfig(s *options.KubeletServer, nodeName types.NodeName)
838
841
return nil , nil , err
839
842
}
840
843
844
+ legacyregistry .RawMustRegister (metrics .NewGaugeFunc (
845
+ metrics.GaugeOpts {
846
+ Subsystem : kubeletmetrics .KubeletSubsystem ,
847
+ Name : "certificate_manager_client_ttl_seconds" ,
848
+ Help : "Gauge of the TTL (time-to-live) of the Kubelet's client certificate. " +
849
+ "The value is in seconds until certificate expiry (negative if already expired). " +
850
+ "If client certificate is invalid or unused, the value will be +INF." ,
851
+ StabilityLevel : metrics .ALPHA ,
852
+ },
853
+ func () float64 {
854
+ if c := clientCertificateManager .Current (); c != nil && c .Leaf != nil {
855
+ return math .Trunc (c .Leaf .NotAfter .Sub (time .Now ()).Seconds ())
856
+ }
857
+ return math .Inf (1 )
858
+ },
859
+ ))
860
+
841
861
// the rotating transport will use the cert from the cert manager instead of these files
842
862
transportConfig := restclient .AnonymousClientConfig (clientConfig )
843
863
0 commit comments