Commit 87d4d3e9 authored by Hitoshi Mitake's avatar Hitoshi Mitake

storage, etcd3: add an option for configuring interval of compaction requests from apiserver

This commit adds an option for controlling request of compaction to etcd3 from apiserver. There is a situation that apiserver cannot fully own its etcd cluster (e.g. sharing it with canal). In such a case, apiserver should have limited access in terms of etcd's auth functionality so it don't have a priviledge to issue compaction requests. It means that the compaction requests should be issued by other component and apiserver's compaction requests are needless. For such use cases, this commit adds a new flag `storagebackend.Config.CompactionInterval`. If the flag is non 0, apiserver issues the compaction requests like current behaviour (the default is 5 minutes). If it is 0, apiserver doesn't issue the requests. It can be configured with a newly added option of apiserver `--etcd-compaction-interval`.
parent dc02dfe5
...@@ -110,11 +110,12 @@ func TestAddFlags(t *testing.T) { ...@@ -110,11 +110,12 @@ func TestAddFlags(t *testing.T) {
ServerList: nil, ServerList: nil,
Prefix: "/registry", Prefix: "/registry",
DeserializationCacheSize: 0, DeserializationCacheSize: 0,
Copier: kapi.Scheme, Copier: kapi.Scheme,
Quorum: false, Quorum: false,
KeyFile: "/var/run/kubernetes/etcd.key", KeyFile: "/var/run/kubernetes/etcd.key",
CAFile: "/var/run/kubernetes/etcdca.crt", CAFile: "/var/run/kubernetes/etcdca.crt",
CertFile: "/var/run/kubernetes/etcdce.crt", CertFile: "/var/run/kubernetes/etcdce.crt",
CompactionInterval: storagebackend.DefaultCompactInterval,
}, },
DefaultStorageMediaType: "application/vnd.kubernetes.protobuf", DefaultStorageMediaType: "application/vnd.kubernetes.protobuf",
DeleteCollectionWorkers: 1, DeleteCollectionWorkers: 1,
......
...@@ -148,6 +148,10 @@ func (s *EtcdOptions) AddFlags(fs *pflag.FlagSet) { ...@@ -148,6 +148,10 @@ func (s *EtcdOptions) AddFlags(fs *pflag.FlagSet) {
fs.StringVar(&s.EncryptionProviderConfigFilepath, "experimental-encryption-provider-config", s.EncryptionProviderConfigFilepath, fs.StringVar(&s.EncryptionProviderConfigFilepath, "experimental-encryption-provider-config", s.EncryptionProviderConfigFilepath,
"The file containing configuration for encryption providers to be used for storing secrets in etcd") "The file containing configuration for encryption providers to be used for storing secrets in etcd")
fs.DurationVar(&s.StorageConfig.CompactionInterval, "etcd-compaction-interval", s.StorageConfig.CompactionInterval,
"The interval of compaction requests. If 0, the compaction request from apiserver is disabled.")
} }
func (s *EtcdOptions) ApplyTo(c *server.Config) error { func (s *EtcdOptions) ApplyTo(c *server.Config) error {
......
...@@ -27,8 +27,7 @@ import ( ...@@ -27,8 +27,7 @@ import (
) )
const ( const (
compactInterval = 5 * time.Minute compactRevKey = "compact_rev_key"
compactRevKey = "compact_rev_key"
) )
var ( var (
...@@ -44,7 +43,7 @@ func init() { ...@@ -44,7 +43,7 @@ func init() {
// By default, we save the most recent 10 minutes data and compact versions > 10minutes ago. // By default, we save the most recent 10 minutes data and compact versions > 10minutes ago.
// It should be enough for slow watchers and to tolerate burst. // It should be enough for slow watchers and to tolerate burst.
// TODO: We might keep a longer history (12h) in the future once storage API can take advantage of past version of keys. // TODO: We might keep a longer history (12h) in the future once storage API can take advantage of past version of keys.
func StartCompactor(ctx context.Context, client *clientv3.Client) { func StartCompactor(ctx context.Context, client *clientv3.Client, compactInterval time.Duration) {
endpointsMapMu.Lock() endpointsMapMu.Lock()
defer endpointsMapMu.Unlock() defer endpointsMapMu.Unlock()
...@@ -60,7 +59,9 @@ func StartCompactor(ctx context.Context, client *clientv3.Client) { ...@@ -60,7 +59,9 @@ func StartCompactor(ctx context.Context, client *clientv3.Client) {
endpointsMap[ep] = struct{}{} endpointsMap[ep] = struct{}{}
} }
go compactor(ctx, client, compactInterval) if compactInterval != 0 {
go compactor(ctx, client, compactInterval)
}
} }
// compactor periodically compacts historical versions of keys in etcd. // compactor periodically compacts historical versions of keys in etcd.
......
...@@ -17,6 +17,8 @@ limitations under the License. ...@@ -17,6 +17,8 @@ limitations under the License.
package storagebackend package storagebackend
import ( import (
"time"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apiserver/pkg/storage/value" "k8s.io/apiserver/pkg/storage/value"
) )
...@@ -25,6 +27,8 @@ const ( ...@@ -25,6 +27,8 @@ const (
StorageTypeUnset = "" StorageTypeUnset = ""
StorageTypeETCD2 = "etcd2" StorageTypeETCD2 = "etcd2"
StorageTypeETCD3 = "etcd3" StorageTypeETCD3 = "etcd3"
DefaultCompactInterval = 5 * time.Minute
) )
// Config is configuration for creating a storage backend. // Config is configuration for creating a storage backend.
...@@ -55,6 +59,10 @@ type Config struct { ...@@ -55,6 +59,10 @@ type Config struct {
Copier runtime.ObjectCopier Copier runtime.ObjectCopier
// Transformer allows the value to be transformed prior to persisting into etcd. // Transformer allows the value to be transformed prior to persisting into etcd.
Transformer value.Transformer Transformer value.Transformer
// CompactionInterval is an interval of requesting compaction from apiserver.
// If the value is 0, no compaction will be issued.
CompactionInterval time.Duration
} }
func NewDefaultConfig(prefix string, copier runtime.ObjectCopier, codec runtime.Codec) *Config { func NewDefaultConfig(prefix string, copier runtime.ObjectCopier, codec runtime.Codec) *Config {
...@@ -63,7 +71,8 @@ func NewDefaultConfig(prefix string, copier runtime.ObjectCopier, codec runtime. ...@@ -63,7 +71,8 @@ func NewDefaultConfig(prefix string, copier runtime.ObjectCopier, codec runtime.
// Default cache size to 0 - if unset, its size will be set based on target // Default cache size to 0 - if unset, its size will be set based on target
// memory usage. // memory usage.
DeserializationCacheSize: 0, DeserializationCacheSize: 0,
Copier: copier, Copier: copier,
Codec: codec, Codec: codec,
CompactionInterval: DefaultCompactInterval,
} }
} }
...@@ -51,7 +51,7 @@ func newETCD3Storage(c storagebackend.Config) (storage.Interface, DestroyFunc, e ...@@ -51,7 +51,7 @@ func newETCD3Storage(c storagebackend.Config) (storage.Interface, DestroyFunc, e
return nil, nil, err return nil, nil, err
} }
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
etcd3.StartCompactor(ctx, client) etcd3.StartCompactor(ctx, client, c.CompactionInterval)
destroyFunc := func() { destroyFunc := func() {
cancel() cancel()
client.Close() client.Close()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment