Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion examples/simple/deploy/01_simple-csi-driver.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ spec:
allowPrivilegeEscalation: false
capabilities: { drop: [ "ALL" ] }
readOnlyRootFilesystem: true
image: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.13.0
image: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.14.0
args:
- --v=5
- --csi-address=/plugin/csi.sock
Expand Down Expand Up @@ -94,6 +94,10 @@ spec:
fieldPath: spec.nodeName
- name: CSI_ENDPOINT
value: unix://plugin/csi.sock
ports:
- containerPort: 9402
name: http-metrics
protocol: TCP
volumeMounts:
- name: plugin-dir
mountPath: /plugin
Expand Down
2 changes: 1 addition & 1 deletion examples/simple/deploy/02_example-app.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ spec:
runAsUser: 2000
containers:
- name: my-frontend
image: busybox:1.35.0
image: busybox:1.36.1
volumeMounts:
- mountPath: "/tls"
name: tls
Expand Down
5 changes: 3 additions & 2 deletions examples/simple/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ replace github.com/cert-manager/csi-lib => ../../
require (
github.com/cert-manager/cert-manager v1.19.0
github.com/cert-manager/csi-lib v0.0.0-00010101000000-000000000000
github.com/go-logr/logr v1.4.3
github.com/prometheus/client_golang v1.23.2
golang.org/x/sync v0.17.0
k8s.io/client-go v0.34.1
k8s.io/klog/v2 v2.130.1
k8s.io/utils v0.0.0-20250820121507-0af2bda4dd1d
Expand All @@ -23,7 +26,6 @@ require (
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect
github.com/go-ldap/ldap/v3 v3.4.12 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/zapr v1.3.0 // indirect
github.com/go-openapi/jsonpointer v0.22.1 // indirect
github.com/go-openapi/jsonreference v0.21.2 // indirect
Expand All @@ -43,7 +45,6 @@ require (
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.23.2 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.66.1 // indirect
github.com/prometheus/procfs v0.17.0 // indirect
Expand Down
2 changes: 2 additions & 0 deletions examples/simple/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,8 @@ golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwE
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand Down
74 changes: 72 additions & 2 deletions examples/simple/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,27 @@ import (
"flag"
"fmt"
"net"
"net/http"
"net/url"
"strings"
"time"

cmapi "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
cmmeta "github.com/cert-manager/cert-manager/pkg/apis/meta/v1"
cmclient "github.com/cert-manager/cert-manager/pkg/client/clientset/versioned"
"github.com/cert-manager/cert-manager/pkg/client/informers/externalversions"
"github.com/cert-manager/cert-manager/pkg/util/pki"
"github.com/go-logr/logr"
"github.com/prometheus/client_golang/prometheus"
"golang.org/x/sync/errgroup"
"k8s.io/client-go/rest"
"k8s.io/klog/v2/klogr"
"k8s.io/utils/clock"

"github.com/cert-manager/csi-lib/driver"
"github.com/cert-manager/csi-lib/manager"
"github.com/cert-manager/csi-lib/metadata"
"github.com/cert-manager/csi-lib/metrics"
"github.com/cert-manager/csi-lib/storage"
)

Expand Down Expand Up @@ -104,13 +110,29 @@ func main() {

store.FSGroupVolumeAttributeKey = FsGroupKey

d, err := driver.New(context.Background(), *endpoint, log, driver.Options{
cmClient := cmclient.NewForConfigOrDie(restConfig)

ctx, cancel := context.WithCancel(context.Background())
defer cancel()

certRequestInformerFactory := externalversions.NewSharedInformerFactory(cmClient, 5*time.Second)
certRequestInformer := certRequestInformerFactory.Certmanager().V1().CertificateRequests()
metricsHandler := metrics.New(*nodeID, &log, prometheus.NewRegistry(), store, certRequestInformer.Lister())

go func() {
err := startMetricsServer(ctx, log, metricsHandler, certRequestInformerFactory)
if err != nil {
panic("failed to setup metrics server: " + err.Error())
}
}()

d, err := driver.New(ctx, *endpoint, log, driver.Options{
DriverName: "csi.cert-manager.io",
DriverVersion: "v0.0.1",
NodeID: *nodeID,
Store: store,
Manager: manager.NewManagerOrDie(manager.Options{
Client: cmclient.NewForConfigOrDie(restConfig),
Client: cmClient,
MetadataReader: store,
Clock: clock.RealClock{},
Log: &log,
Expand All @@ -119,6 +141,7 @@ func main() {
GenerateRequest: generateRequest,
SignRequest: signRequest,
WriteKeypair: (&writer{store: store}).writeKeypair,
Metrics: metricsHandler,
}),
})
if err != nil {
Expand Down Expand Up @@ -351,3 +374,50 @@ func keyUsagesFromAttributes(usagesCSV string) []cmapi.KeyUsage {

return keyUsages
}

// startMetricsServer starts a server listening on port 9402, until the supplied context is cancelled,
// after which the server will gracefully shutdown (within 5 seconds).
func startMetricsServer(
rootCtx context.Context,
logger logr.Logger,
metricsHandler *metrics.Metrics,
certRequestInformerFactory externalversions.SharedInformerFactory,
) error {
g, ctx := errgroup.WithContext(rootCtx)

listenConfig := &net.ListenConfig{}
metricsLn, err := listenConfig.Listen(ctx, "tcp", ":9402")
if err != nil {
return err
}
metricsServer := &http.Server{
Addr: metricsLn.Addr().String(),
ReadTimeout: 8 * time.Second,
WriteTimeout: 8 * time.Second,
MaxHeaderBytes: 1 << 20, // 1 MiB
Handler: metricsHandler.DefaultHandler(),
}

g.Go(func() error {
certRequestInformerFactory.Start(ctx.Done())
certRequestInformerFactory.WaitForCacheSync(ctx.Done())
return nil
})
g.Go(func() error {
<-rootCtx.Done()
// allow a timeout for graceful shutdown
shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// nolint: contextcheck
return metricsServer.Shutdown(shutdownCtx)
})
g.Go(func() error {
logger.Info("starting metrics server", "address", metricsLn.Addr())
if err := metricsServer.Serve(metricsLn); err != http.ErrServerClosed {
return err
}
return nil
})
return g.Wait()
}
7 changes: 6 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ require (
github.com/container-storage-interface/spec v1.11.0
github.com/go-logr/logr v1.4.3
github.com/kubernetes-csi/csi-lib-utils v0.22.0
github.com/prometheus/client_golang v1.23.2
github.com/stretchr/testify v1.11.1
google.golang.org/grpc v1.76.0
k8s.io/apimachinery v0.34.1
Expand All @@ -17,12 +18,15 @@ require (
)

require (
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/blang/semver/v4 v4.0.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/emicklei/go-restful/v3 v3.13.0 // indirect
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect
github.com/go-ldap/ldap/v3 v3.4.12 // indirect
github.com/go-logr/zapr v1.3.0 // indirect
github.com/go-openapi/jsonpointer v0.22.1 // indirect
github.com/go-openapi/jsonreference v0.21.2 // indirect
Expand All @@ -35,13 +39,13 @@ require (
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
github.com/mailru/easyjson v0.9.0 // indirect
github.com/moby/sys/mountinfo v0.7.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.23.2 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.66.1 // indirect
github.com/prometheus/procfs v0.17.0 // indirect
Expand All @@ -54,6 +58,7 @@ require (
go.uber.org/zap v1.27.0 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/crypto v0.42.0 // indirect
golang.org/x/net v0.44.0 // indirect
golang.org/x/oauth2 v0.31.0 // indirect
golang.org/x/sys v0.36.0 // indirect
Expand Down
24 changes: 24 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e h1:4dAU9FXIyQktpoUAgOJK3OTFc/xug0PCXYCqU0FgDKI=
github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
Expand All @@ -17,6 +21,10 @@ github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bF
github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo=
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-ldap/ldap/v3 v3.4.12 h1:1b81mv7MagXZ7+1r7cLTWmyuTqVqdwbtJSjC0DAp9s4=
github.com/go-ldap/ldap/v3 v3.4.12/go.mod h1:+SPAGcTtOfmGsCb3h1RFiq4xpp4N636G75OEace8lNo=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
Expand Down Expand Up @@ -46,8 +54,22 @@ github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgY
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=
github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs=
github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=
github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM=
github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg=
github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo=
github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o=
github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg=
github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8=
github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs=
github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=
github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
Expand Down Expand Up @@ -134,6 +156,8 @@ go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
Expand Down
21 changes: 21 additions & 0 deletions manager/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import (
internalapi "github.com/cert-manager/csi-lib/internal/api"
internalapiutil "github.com/cert-manager/csi-lib/internal/api/util"
"github.com/cert-manager/csi-lib/metadata"
"github.com/cert-manager/csi-lib/metrics"
"github.com/cert-manager/csi-lib/storage"
)

Expand Down Expand Up @@ -89,6 +90,9 @@ type Options struct {

// RenewalBackoffConfig configures the exponential backoff applied to certificate renewal failures.
RenewalBackoffConfig *wait.Backoff

// Metrics is used for exposing Prometheus metrics
Metrics *metrics.Metrics
}

// NewManager constructs a new manager used to manage volumes containing
Expand Down Expand Up @@ -241,6 +245,7 @@ func NewManager(opts Options) (*Manager, error) {
metadataReader: opts.MetadataReader,
clock: opts.Clock,
log: *opts.Log,
metrics: opts.Metrics,

generatePrivateKey: opts.GeneratePrivateKey,
generateRequest: opts.GenerateRequest,
Expand Down Expand Up @@ -375,6 +380,9 @@ type Manager struct {
// No thread safety is added around this field, and it MUST NOT be used for any implementation logic.
// It should not be used full-stop :).
doNotUse_CallOnEachIssue func()

// metrics is used to expose Prometheus
metrics *metrics.Metrics
}

// issue will step through the entire issuance flow for a volume.
Expand All @@ -387,6 +395,11 @@ func (m *Manager) issue(ctx context.Context, volumeID string) error {
log := m.log.WithValues("volume_id", volumeID)
log.Info("Processing issuance")

// Increase issue count
if m.metrics != nil {
m.metrics.IncrementIssueCallCountTotal(m.nodeNameHash, volumeID)
}

if err := m.cleanupStaleRequests(ctx, log, volumeID); err != nil {
return fmt.Errorf("cleaning up stale requests: %w", err)
}
Expand Down Expand Up @@ -756,6 +769,10 @@ func (m *Manager) ManageVolumeImmediate(ctx context.Context, volumeID string) (m
// If issuance fails, immediately return without retrying so the caller can decide
// how to proceed depending on the context this method was called within.
if err := m.issue(ctx, volumeID); err != nil {
// Increase issue error count
if m.metrics != nil {
m.metrics.IncrementIssueErrorCountTotal(m.nodeNameHash, volumeID)
}
return true, err
}
}
Expand Down Expand Up @@ -835,6 +852,10 @@ func (m *Manager) startRenewalRoutine(volumeID string) (started bool) {
defer issueCancel()
if err := m.issue(issueCtx, volumeID); err != nil {
log.Error(err, "Failed to issue certificate, retrying after applying exponential backoff")
// Increase issue error count
if m.metrics != nil {
m.metrics.IncrementIssueErrorCountTotal(m.nodeNameHash, volumeID)
}
return false, nil
}
return true, nil
Expand Down
Loading