diff --git a/api/kyverno/v1/image_verification_types.go b/api/kyverno/v1/image_verification_types.go index 9bf000aa81..7f30312881 100644 --- a/api/kyverno/v1/image_verification_types.go +++ b/api/kyverno/v1/image_verification_types.go @@ -109,6 +109,11 @@ type ImageVerification struct { // ImageRegistryCredentials provides credentials that will be used for authentication with registry // +kubebuilder:validation:Optional ImageRegistryCredentials *ImageRegistryCredentials `json:"imageRegistryCredentials,omitempty" yaml:"imageRegistryCredentials,omitempty"` + + // UseCache enables caching of image verify responses for this rule + // +kubebuilder:default=true + // +kubebuilder:validation:Optional + UseCache bool `json:"useCache" yaml:"useCache"` } type AttestorSet struct { diff --git a/api/kyverno/v2beta1/image_verification_types.go b/api/kyverno/v2beta1/image_verification_types.go index a735e4a4d5..04efac4a3b 100644 --- a/api/kyverno/v2beta1/image_verification_types.go +++ b/api/kyverno/v2beta1/image_verification_types.go @@ -54,6 +54,11 @@ type ImageVerification struct { // ImageRegistryCredentials provides credentials that will be used for authentication with registry // +kubebuilder:validation:Optional ImageRegistryCredentials *kyvernov1.ImageRegistryCredentials `json:"imageRegistryCredentials,omitempty" yaml:"imageRegistryCredentials,omitempty"` + + // UseCache enables caching of image verify responses for this rule + // +kubebuilder:default=true + // +kubebuilder:validation:Optional + UseCache bool `json:"useCache" yaml:"useCache"` } // Validate implements programmatic validation diff --git a/charts/kyverno/templates/crds/crds.yaml b/charts/kyverno/templates/crds/crds.yaml index c0b7ac3247..3a18bc01b0 100644 --- a/charts/kyverno/templates/crds/crds.yaml +++ b/charts/kyverno/templates/crds/crds.yaml @@ -7748,6 +7748,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -11851,6 +11856,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have @@ -15596,6 +15606,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -19699,6 +19714,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have @@ -23755,6 +23775,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -27859,6 +27884,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have @@ -31605,6 +31635,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -35708,6 +35743,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have diff --git a/cmd/background-controller/main.go b/cmd/background-controller/main.go index 3e0ec0f138..e4f482244f 100644 --- a/cmd/background-controller/main.go +++ b/cmd/background-controller/main.go @@ -157,6 +157,7 @@ func main() { setup.Jp, setup.KyvernoDynamicClient, setup.RegistryClient, + setup.ImageVerifyCacheClient, setup.KubeClient, setup.KyvernoClient, setup.RegistrySecretLister, diff --git a/cmd/cleanup-controller/handlers/cleanup/handlers.go b/cmd/cleanup-controller/handlers/cleanup/handlers.go index 87d77ae18b..c6a895f49d 100644 --- a/cmd/cleanup-controller/handlers/cleanup/handlers.go +++ b/cmd/cleanup-controller/handlers/cleanup/handlers.go @@ -16,6 +16,7 @@ import ( "github.com/kyverno/kyverno/pkg/engine/factories" "github.com/kyverno/kyverno/pkg/engine/jmespath" "github.com/kyverno/kyverno/pkg/event" + "github.com/kyverno/kyverno/pkg/imageverifycache" "github.com/kyverno/kyverno/pkg/metrics" controllerutils "github.com/kyverno/kyverno/pkg/utils/controller" "github.com/kyverno/kyverno/pkg/utils/match" @@ -130,6 +131,7 @@ func (h *handlers) executePolicy( h.jp, h.client, nil, + imageverifycache.DisabledImageVerifyCache(), spec.Context, enginectx, ); err != nil { diff --git a/cmd/cli/kubectl-kyverno/utils/common/common.go b/cmd/cli/kubectl-kyverno/utils/common/common.go index c7b83725ca..817cdc144b 100644 --- a/cmd/cli/kubectl-kyverno/utils/common/common.go +++ b/cmd/cli/kubectl-kyverno/utils/common/common.go @@ -27,6 +27,7 @@ import ( engineapi "github.com/kyverno/kyverno/pkg/engine/api" "github.com/kyverno/kyverno/pkg/engine/jmespath" "github.com/kyverno/kyverno/pkg/engine/variables/regex" + "github.com/kyverno/kyverno/pkg/imageverifycache" "github.com/kyverno/kyverno/pkg/logging" datautils "github.com/kyverno/kyverno/pkg/utils/data" kubeutils "github.com/kyverno/kyverno/pkg/utils/kube" @@ -790,6 +791,7 @@ func initializeMockController(objects []runtime.Object) (*generate.GenerateContr jmespath.New(cfg), adapters.Client(client), nil, + imageverifycache.DisabledImageVerifyCache(), store.ContextLoaderFactory(nil), nil, "", diff --git a/cmd/cli/kubectl-kyverno/utils/common/kyverno_policies_types.go b/cmd/cli/kubectl-kyverno/utils/common/kyverno_policies_types.go index 9b21d0c654..ebeabb6e97 100644 --- a/cmd/cli/kubectl-kyverno/utils/common/kyverno_policies_types.go +++ b/cmd/cli/kubectl-kyverno/utils/common/kyverno_policies_types.go @@ -15,6 +15,7 @@ import ( engineapi "github.com/kyverno/kyverno/pkg/engine/api" "github.com/kyverno/kyverno/pkg/engine/factories" "github.com/kyverno/kyverno/pkg/engine/jmespath" + "github.com/kyverno/kyverno/pkg/imageverifycache" "github.com/kyverno/kyverno/pkg/registryclient" kubeutils "github.com/kyverno/kyverno/pkg/utils/kube" "k8s.io/apimachinery/pkg/runtime/schema" @@ -119,6 +120,7 @@ OuterLoop: jmespath.New(cfg), adapters.Client(c.Client), factories.DefaultRegistryClientFactory(adapters.RegistryClient(rclient), nil), + imageverifycache.DisabledImageVerifyCache(), store.ContextLoaderFactory(nil), nil, "", diff --git a/cmd/cli/kubectl-kyverno/utils/store/contextloader.go b/cmd/cli/kubectl-kyverno/utils/store/contextloader.go index ace392914e..0145f630ba 100644 --- a/cmd/cli/kubectl-kyverno/utils/store/contextloader.go +++ b/cmd/cli/kubectl-kyverno/utils/store/contextloader.go @@ -8,6 +8,7 @@ import ( enginecontext "github.com/kyverno/kyverno/pkg/engine/context" "github.com/kyverno/kyverno/pkg/engine/factories" "github.com/kyverno/kyverno/pkg/engine/jmespath" + "github.com/kyverno/kyverno/pkg/imageverifycache" ) func ContextLoaderFactory(cmResolver engineapi.ConfigmapResolver) engineapi.ContextLoaderFactory { @@ -48,6 +49,7 @@ func (w wrapper) Load( jp jmespath.Interface, client engineapi.RawClient, rclientFactory engineapi.RegistryClientFactory, + ivCache imageverifycache.Client, contextEntries []kyvernov1.ContextEntry, jsonContext enginecontext.Interface, ) error { @@ -57,5 +59,5 @@ func (w wrapper) Load( if !GetRegistryAccess() { rclientFactory = nil } - return w.inner.Load(ctx, jp, client, rclientFactory, contextEntries, jsonContext) + return w.inner.Load(ctx, jp, client, rclientFactory, ivCache, contextEntries, jsonContext) } diff --git a/cmd/internal/config.go b/cmd/internal/config.go index 80b6337800..f32a165a3b 100644 --- a/cmd/internal/config.go +++ b/cmd/internal/config.go @@ -14,6 +14,7 @@ type Configuration interface { UsesDeferredLoading() bool UsesCosign() bool UsesRegistryClient() bool + UsesImageVerifyCache() bool UsesLeaderElection() bool UsesKyvernoClient() bool UsesDynamicClient() bool @@ -87,6 +88,12 @@ func WithRegistryClient() ConfigurationOption { } } +func WithImageVerifyCache() ConfigurationOption { + return func(c *configuration) { + c.usesImageVerifyCache = true + } +} + func WithLeaderElection() ConfigurationOption { return func(c *configuration) { c.usesLeaderElection = true @@ -141,6 +148,7 @@ type configuration struct { usesDeferredLoading bool usesCosign bool usesRegistryClient bool + usesImageVerifyCache bool usesLeaderElection bool usesKyvernoClient bool usesDynamicClient bool @@ -186,6 +194,10 @@ func (c *configuration) UsesRegistryClient() bool { return c.usesRegistryClient } +func (c *configuration) UsesImageVerifyCache() bool { + return c.usesImageVerifyCache +} + func (c *configuration) UsesLeaderElection() bool { return c.usesLeaderElection } diff --git a/cmd/internal/engine.go b/cmd/internal/engine.go index cdcabfdc40..a484d90ff8 100644 --- a/cmd/internal/engine.go +++ b/cmd/internal/engine.go @@ -16,6 +16,7 @@ import ( "github.com/kyverno/kyverno/pkg/engine/context/resolvers" "github.com/kyverno/kyverno/pkg/engine/factories" "github.com/kyverno/kyverno/pkg/engine/jmespath" + "github.com/kyverno/kyverno/pkg/imageverifycache" "github.com/kyverno/kyverno/pkg/registryclient" "k8s.io/client-go/kubernetes" corev1listers "k8s.io/client-go/listers/core/v1" @@ -29,6 +30,7 @@ func NewEngine( jp jmespath.Interface, client dclient.Interface, rclient registryclient.Client, + ivCache imageverifycache.Client, kubeClient kubernetes.Interface, kyvernoClient versioned.Interface, secretLister corev1listers.SecretNamespaceLister, @@ -43,6 +45,7 @@ func NewEngine( jp, adapters.Client(client), factories.DefaultRegistryClientFactory(adapters.RegistryClient(rclient), secretLister), + ivCache, factories.DefaultContextLoaderFactory(configMapResolver), exceptionsSelector, imageSignatureRepository, diff --git a/cmd/internal/flag.go b/cmd/internal/flag.go index c7bd87ba32..f0b3e4296f 100644 --- a/cmd/internal/flag.go +++ b/cmd/internal/flag.go @@ -44,6 +44,10 @@ var ( registryCredentialHelpers string // leader election leaderElectionRetryPeriod time.Duration + // image verify cache + imageVerifyCacheEnabled bool + imageVerifyCacheTTLDuration int64 + imageVerifyCacheMaxSize int64 ) func initLoggingFlags() { @@ -102,6 +106,12 @@ func initRegistryClientFlags() { flag.StringVar(®istryCredentialHelpers, "registryCredentialHelpers", "", "Credential helpers to enable (default,google,amazon,azure,github). No helpers are added when this flag is empty.") } +func initImageVerifyCacheFlags() { + flag.BoolVar(&imageVerifyCacheEnabled, "imageVerifyCacheEnabled", true, "Whether to use a TTL cache for storing verified images.") + flag.Int64Var(&imageVerifyCacheMaxSize, "imageVerifyCacheMaxSize", 0, "Max size limit for the TTL cache, 0 means no size limit.") + flag.Int64Var(&imageVerifyCacheTTLDuration, "imageVerifyCacheTTLDuration", 0, "Max TTL value for a cache, 0 means no TTL.") +} + func initLeaderElectionFlags() { flag.DurationVar(&leaderElectionRetryPeriod, "leaderElectionRetryPeriod", leaderelection.DefaultRetryPeriod, "Configure leader election retry period.") } @@ -177,6 +187,10 @@ func initFlags(config Configuration, opts ...Option) { if config.UsesRegistryClient() { initRegistryClientFlags() } + // image verify cache + if config.UsesImageVerifyCache() { + initImageVerifyCacheFlags() + } // leader election if config.UsesLeaderElection() { initLeaderElectionFlags() diff --git a/cmd/internal/imageverifycache.go b/cmd/internal/imageverifycache.go new file mode 100644 index 0000000000..648097056e --- /dev/null +++ b/cmd/internal/imageverifycache.go @@ -0,0 +1,23 @@ +package internal + +import ( + "context" + "time" + + "github.com/go-logr/logr" + "github.com/kyverno/kyverno/pkg/imageverifycache" +) + +func setupImageVerifyCache(ctx context.Context, logger logr.Logger) imageverifycache.Client { + logger = logger.WithName("image-verify-cache").WithValues("enabled", imageVerifyCacheEnabled, "maxsize", imageVerifyCacheMaxSize, "ttl", imageVerifyCacheTTLDuration) + logger.Info("setup image verify cache...") + opts := []imageverifycache.Option{ + imageverifycache.WithLogger(logger), + imageverifycache.WithCacheEnableFlag(imageVerifyCacheEnabled), + imageverifycache.WithMaxSize(imageVerifyCacheMaxSize), + imageverifycache.WithTTLDuration(time.Duration(imageVerifyCacheTTLDuration)), + } + imageVerifyCache, err := imageverifycache.New(opts...) + checkError(logger, err, "failed to create image verify cache client") + return imageVerifyCache +} diff --git a/cmd/internal/setup.go b/cmd/internal/setup.go index cccde36ff1..f9f89cb9bf 100644 --- a/cmd/internal/setup.go +++ b/cmd/internal/setup.go @@ -13,6 +13,7 @@ import ( metadataclient "github.com/kyverno/kyverno/pkg/clients/metadata" "github.com/kyverno/kyverno/pkg/config" "github.com/kyverno/kyverno/pkg/engine/jmespath" + "github.com/kyverno/kyverno/pkg/imageverifycache" "github.com/kyverno/kyverno/pkg/metrics" "github.com/kyverno/kyverno/pkg/registryclient" corev1listers "k8s.io/client-go/listers/core/v1" @@ -30,20 +31,21 @@ func shutdown(logger logr.Logger, sdowns ...context.CancelFunc) context.CancelFu } type SetupResult struct { - Logger logr.Logger - Configuration config.Configuration - MetricsConfiguration config.MetricsConfiguration - MetricsManager metrics.MetricsConfigManager - Jp jmespath.Interface - KubeClient kubeclient.UpstreamInterface - LeaderElectionClient kubeclient.UpstreamInterface - RegistryClient registryclient.Client - RegistrySecretLister corev1listers.SecretNamespaceLister - KyvernoClient kyvernoclient.UpstreamInterface - DynamicClient dynamicclient.UpstreamInterface - ApiServerClient apiserverclient.UpstreamInterface - MetadataClient metadataclient.UpstreamInterface - KyvernoDynamicClient dclient.Interface + Logger logr.Logger + Configuration config.Configuration + MetricsConfiguration config.MetricsConfiguration + MetricsManager metrics.MetricsConfigManager + Jp jmespath.Interface + KubeClient kubeclient.UpstreamInterface + LeaderElectionClient kubeclient.UpstreamInterface + RegistryClient registryclient.Client + ImageVerifyCacheClient imageverifycache.Client + RegistrySecretLister corev1listers.SecretNamespaceLister + KyvernoClient kyvernoclient.UpstreamInterface + DynamicClient dynamicclient.UpstreamInterface + ApiServerClient apiserverclient.UpstreamInterface + MetadataClient metadataclient.UpstreamInterface + KyvernoDynamicClient dclient.Interface } func Setup(config Configuration, name string, skipResourceFilters bool) (context.Context, SetupResult, context.CancelFunc) { @@ -66,6 +68,10 @@ func Setup(config Configuration, name string, skipResourceFilters bool) (context if config.UsesRegistryClient() { registryClient, registrySecretLister = setupRegistryClient(ctx, logger, client) } + var imageVerifyCache imageverifycache.Client + if config.UsesImageVerifyCache() { + imageVerifyCache = setupImageVerifyCache(ctx, logger) + } var leaderElectionClient kubeclient.UpstreamInterface if config.UsesLeaderElection() { leaderElectionClient = createKubernetesClient(logger, kubeclient.WithMetrics(metricsManager, metrics.KubeClient), kubeclient.WithTracing()) @@ -92,20 +98,21 @@ func Setup(config Configuration, name string, skipResourceFilters bool) (context } return ctx, SetupResult{ - Logger: logger, - Configuration: configuration, - MetricsConfiguration: metricsConfiguration, - MetricsManager: metricsManager, - Jp: jmespath.New(configuration), - KubeClient: client, - LeaderElectionClient: leaderElectionClient, - RegistryClient: registryClient, - RegistrySecretLister: registrySecretLister, - KyvernoClient: kyvernoClient, - DynamicClient: dynamicClient, - ApiServerClient: apiServerClient, - MetadataClient: metadataClient, - KyvernoDynamicClient: dClient, + Logger: logger, + Configuration: configuration, + MetricsConfiguration: metricsConfiguration, + MetricsManager: metricsManager, + Jp: jmespath.New(configuration), + KubeClient: client, + LeaderElectionClient: leaderElectionClient, + RegistryClient: registryClient, + ImageVerifyCacheClient: imageVerifyCache, + RegistrySecretLister: registrySecretLister, + KyvernoClient: kyvernoClient, + DynamicClient: dynamicClient, + ApiServerClient: apiServerClient, + MetadataClient: metadataClient, + KyvernoDynamicClient: dClient, }, shutdown(logger.WithName("shutdown"), sdownMaxProcs, sdownMetrics, sdownTracing, sdownSignals) } diff --git a/cmd/kyverno/main.go b/cmd/kyverno/main.go index f810bd3d23..0fa9fed509 100644 --- a/cmd/kyverno/main.go +++ b/cmd/kyverno/main.go @@ -216,6 +216,7 @@ func main() { internal.WithDeferredLoading(), internal.WithCosign(), internal.WithRegistryClient(), + internal.WithImageVerifyCache(), internal.WithLeaderElection(), internal.WithKyvernoClient(), internal.WithDynamicClient(), @@ -309,6 +310,7 @@ func main() { setup.Jp, setup.KyvernoDynamicClient, setup.RegistryClient, + setup.ImageVerifyCacheClient, setup.KubeClient, setup.KyvernoClient, setup.RegistrySecretLister, diff --git a/cmd/reports-controller/main.go b/cmd/reports-controller/main.go index aebd042026..30ebfc6952 100644 --- a/cmd/reports-controller/main.go +++ b/cmd/reports-controller/main.go @@ -198,6 +198,7 @@ func main() { internal.WithDeferredLoading(), internal.WithCosign(), internal.WithRegistryClient(), + internal.WithImageVerifyCache(), internal.WithLeaderElection(), internal.WithKyvernoClient(), internal.WithDynamicClient(), @@ -241,6 +242,7 @@ func main() { setup.Jp, setup.KyvernoDynamicClient, setup.RegistryClient, + setup.ImageVerifyCacheClient, setup.KubeClient, setup.KyvernoClient, setup.RegistrySecretLister, diff --git a/config/crds/kyverno.io_clusterpolicies.yaml b/config/crds/kyverno.io_clusterpolicies.yaml index 638a993e7f..1950826e1f 100644 --- a/config/crds/kyverno.io_clusterpolicies.yaml +++ b/config/crds/kyverno.io_clusterpolicies.yaml @@ -3931,6 +3931,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -8034,6 +8039,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have @@ -11779,6 +11789,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -15882,6 +15897,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have diff --git a/config/crds/kyverno.io_policies.yaml b/config/crds/kyverno.io_policies.yaml index fb9642fef2..301883152c 100644 --- a/config/crds/kyverno.io_policies.yaml +++ b/config/crds/kyverno.io_policies.yaml @@ -3932,6 +3932,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -8036,6 +8041,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have @@ -11782,6 +11792,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -15885,6 +15900,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have diff --git a/config/install-latest-testing.yaml b/config/install-latest-testing.yaml index 446cdf3669..41dc039c35 100644 --- a/config/install-latest-testing.yaml +++ b/config/install-latest-testing.yaml @@ -7951,6 +7951,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -12054,6 +12059,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have @@ -15799,6 +15809,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -19902,6 +19917,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have @@ -23958,6 +23978,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -28062,6 +28087,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have @@ -31808,6 +31838,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have a @@ -35911,6 +35946,11 @@ spec: - Cosign - Notary type: string + useCache: + default: true + description: UseCache enables caching of image verify + responses for this rule + type: boolean verifyDigest: default: true description: VerifyDigest validates that images have diff --git a/docs/user/crd/index.html b/docs/user/crd/index.html index 871580b995..5ed81fbc6d 100644 --- a/docs/user/crd/index.html +++ b/docs/user/crd/index.html @@ -2310,6 +2310,17 @@ ImageRegistryCredentials
ImageRegistryCredentials provides credentials that will be used for authentication with registry
+useCache
UseCache enables caching of image verify responses for this rule
+ImageRegistryCredentials provides credentials that will be used for authentication with registry
+useCache
UseCache enables caching of image verify responses for this rule
+