Skip to content

Commit 9ab7a71

Browse files
Merge pull request #18274 from deads2k/server-02-kill-etcd2
Automatic merge from submit-queue (batch tested with PRs 17114, 18274). remove etcd2 client from server We stopped supporting etcd2 in 3.7. This remove the related code.
2 parents 0939650 + db9fe5d commit 9ab7a71

File tree

14 files changed

+177
-946
lines changed

14 files changed

+177
-946
lines changed

pkg/cmd/server/etcd/etcd.go

-79
Original file line numberDiff line numberDiff line change
@@ -2,96 +2,17 @@ package etcd
22

33
import (
44
"fmt"
5-
"net"
6-
"net/http"
75
"time"
86

9-
etcdclient "github.com/coreos/etcd/client"
107
"github.com/coreos/etcd/clientv3"
118
"golang.org/x/net/context"
129

13-
knet "k8s.io/apimachinery/pkg/util/net"
1410
etcdutil "k8s.io/apiserver/pkg/storage/etcd/util"
1511
restclient "k8s.io/client-go/rest"
1612

1713
configapi "github.com/openshift/origin/pkg/cmd/server/api"
1814
)
1915

20-
// TestEtcdConnectionInfo creates an etcd client based on the provided config and attempts to
21-
// connect to the etcd server and block until the server responds at least once, or return an
22-
// error if the server never responded.
23-
func TestEtcdConnectionInfo(etcdClientInfo configapi.EtcdConnectionInfo) error {
24-
tlsConfig, err := restclient.TLSConfigFor(&restclient.Config{
25-
TLSClientConfig: restclient.TLSClientConfig{
26-
CertFile: etcdClientInfo.ClientCert.CertFile,
27-
KeyFile: etcdClientInfo.ClientCert.KeyFile,
28-
CAFile: etcdClientInfo.CA,
29-
},
30-
})
31-
if err != nil {
32-
return err
33-
}
34-
client, err := clientv3.New(clientv3.Config{
35-
Endpoints: etcdClientInfo.URLs,
36-
TLS: tlsConfig,
37-
})
38-
if err != nil {
39-
return err
40-
}
41-
ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
42-
return client.Sync(ctx)
43-
}
44-
45-
// MakeEtcdClient creates an etcd client based on the provided config.
46-
func MakeEtcdClient(etcdClientInfo configapi.EtcdConnectionInfo) (etcdclient.Client, error) {
47-
tlsConfig, err := restclient.TLSConfigFor(&restclient.Config{
48-
TLSClientConfig: restclient.TLSClientConfig{
49-
CertFile: etcdClientInfo.ClientCert.CertFile,
50-
KeyFile: etcdClientInfo.ClientCert.KeyFile,
51-
CAFile: etcdClientInfo.CA,
52-
},
53-
})
54-
if err != nil {
55-
return nil, err
56-
}
57-
58-
transport := knet.SetTransportDefaults(&http.Transport{
59-
TLSClientConfig: tlsConfig,
60-
Dial: (&net.Dialer{
61-
// default from http.DefaultTransport
62-
Timeout: 30 * time.Second,
63-
// Lower the keep alive for connections.
64-
KeepAlive: 1 * time.Second,
65-
}).Dial,
66-
// Because watches are very bursty, defends against long delays in watch reconnections.
67-
MaxIdleConnsPerHost: 500,
68-
})
69-
70-
cfg := etcdclient.Config{
71-
Endpoints: etcdClientInfo.URLs,
72-
// TODO: Determine if transport needs optimization
73-
Transport: transport,
74-
}
75-
return etcdclient.New(cfg)
76-
}
77-
78-
// TestEtcdClient verifies a client is functional. It will attempt to
79-
// connect to the etcd server and block until the server responds at least once, or return an
80-
// error if the server never responded.
81-
func TestEtcdClient(etcdClient etcdclient.Client) error {
82-
for i := 0; ; i++ {
83-
_, err := etcdclient.NewKeysAPI(etcdClient).Get(context.Background(), "/", nil)
84-
if err == nil || etcdutil.IsEtcdNotFound(err) {
85-
break
86-
}
87-
if i > 100 {
88-
return fmt.Errorf("could not reach etcd(v2): %v", err)
89-
}
90-
time.Sleep(50 * time.Millisecond)
91-
}
92-
return nil
93-
}
94-
9516
// MakeEtcdClientV3Config creates client configuration based on the configapi.
9617
func MakeEtcdClientV3Config(etcdClientInfo configapi.EtcdConnectionInfo) (*clientv3.Config, error) {
9718
tlsConfig, err := restclient.TLSConfigFor(&restclient.Config{

pkg/cmd/server/kubernetes/master/master_config.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ func BuildKubeAPIserverOptions(masterConfig configapi.MasterConfig) (*kapiserver
148148
}
149149

150150
server.Etcd.EnableGarbageCollection = true
151-
server.Etcd.StorageConfig.Type = "etcd2" // TODO(post-1.6.1-rebase): enable etcd3 as upstream
151+
server.Etcd.StorageConfig.Type = "etcd3"
152152
server.Etcd.DefaultStorageMediaType = "application/json" // TODO(post-1.6.1-rebase): enable protobuf with etcd3 as upstream
153153
server.Etcd.StorageConfig.Quorum = true
154154
server.Etcd.StorageConfig.Prefix = masterConfig.EtcdStorageConfig.KubernetesStoragePrefix

pkg/cmd/server/start/start_master.go

+5-15
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
3535
kcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
3636
kubelettypes "k8s.io/kubernetes/pkg/kubelet/types"
37-
kutilerrors "k8s.io/kubernetes/staging/src/k8s.io/apimachinery/pkg/util/errors"
3837

3938
"github.com/openshift/origin/pkg/cmd/server/admin"
4039
configapi "github.com/openshift/origin/pkg/cmd/server/api"
@@ -583,22 +582,13 @@ func StartAPI(oc *origin.MasterConfig) error {
583582
}
584583

585584
func testEtcdConnectivity(etcdClientInfo configapi.EtcdConnectionInfo) error {
586-
// first try etcd2
587-
etcdClient2, etcd2Err := etcd.MakeEtcdClient(etcdClientInfo)
588-
if etcd2Err == nil {
589-
etcd2Err = etcd.TestEtcdClient(etcdClient2)
590-
if etcd2Err == nil {
591-
return nil
592-
}
593-
}
594-
595585
// try etcd3 otherwise
596-
etcdClient3, etcd3Err := etcd.MakeEtcdClientV3(etcdClientInfo)
597-
if etcd3Err != nil {
598-
return kutilerrors.NewAggregate([]error{etcd2Err, etcd3Err})
586+
etcdClient3, err := etcd.MakeEtcdClientV3(etcdClientInfo)
587+
if err != nil {
588+
return err
599589
}
600-
if etcd3Err := etcd.TestEtcdClientV3(etcdClient3); etcd3Err != nil {
601-
return kutilerrors.NewAggregate([]error{etcd2Err, etcd3Err})
590+
if err := etcd.TestEtcdClientV3(etcdClient3); err != nil {
591+
return err
602592
}
603593

604594
return nil

pkg/oc/admin/diagnostics/diagnostics/host/etcd.go

+15-56
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"text/tabwriter"
1111
"time"
1212

13-
etcdclient "github.com/coreos/etcd/client"
1413
"github.com/coreos/etcd/clientv3"
1514

1615
"bytes"
@@ -24,7 +23,6 @@ import (
2423
// and organize them by volume.
2524
type EtcdWriteVolume struct {
2625
MasterConfigLocation string
27-
V2Client etcdclient.Client
2826
V3Client *clientv3.Client
2927
durationSpec string
3028
duration time.Duration
@@ -55,11 +53,11 @@ func (d *EtcdWriteVolume) AvailableParameters() []types.Parameter {
5553
}
5654

5755
func (d *EtcdWriteVolume) Complete(logger *log.Logger) error {
58-
v2Client, v3Client, found, err := findEtcdClients(d.MasterConfigLocation, logger)
56+
v3Client, found, err := findEtcdClients(d.MasterConfigLocation, logger)
5957
if err != nil || !found {
6058
return err
6159
}
62-
d.V2Client, d.V3Client = v2Client, v3Client
60+
d.V3Client = v3Client
6361

6462
// determine the duration to run the check from either the deprecated env var, the flag, or the default
6563
s := os.Getenv("ETCD_WRITE_VOLUME_DURATION") // deprecated way
@@ -78,9 +76,6 @@ func (d *EtcdWriteVolume) Complete(logger *log.Logger) error {
7876
}
7977

8078
func (d *EtcdWriteVolume) CanRun() (bool, error) {
81-
if d.V2Client == nil {
82-
return false, fmt.Errorf("must have a V2 etcd client")
83-
}
8479
if d.V3Client == nil {
8580
return false, fmt.Errorf("must have a V3 etcd client")
8681
}
@@ -90,53 +85,23 @@ func (d *EtcdWriteVolume) CanRun() (bool, error) {
9085
func (d *EtcdWriteVolume) Check() types.DiagnosticResult {
9186
r := types.NewDiagnosticResult(EtcdWriteName)
9287

93-
var wg sync.WaitGroup
94-
9588
ctx := context.Background()
9689
ctx, cancel := context.WithDeadline(ctx, time.Now().Add(d.duration))
9790
defer cancel()
9891

9992
keyStats := &keyCounter{}
10093
stats := &lockedKeyCounter{KeyCounter: keyStats}
10194

102-
wg.Add(2)
103-
go func() {
104-
defer wg.Done()
105-
keys := etcdclient.NewKeysAPI(d.V2Client)
106-
w := keys.Watcher("/", &etcdclient.WatcherOptions{Recursive: true})
107-
for {
108-
evt, err := w.Next(ctx)
109-
if err != nil {
110-
if err != context.DeadlineExceeded {
111-
r.Error("DEw2001", err, fmt.Sprintf("Unable to get a v2 watch event, stopping early: %v", err))
112-
}
113-
return
114-
}
115-
node := evt.Node
116-
if node == nil {
117-
node = evt.PrevNode
118-
}
119-
if node == nil {
95+
ch := d.V3Client.Watch(ctx, "/", clientv3.WithKeysOnly(), clientv3.WithPrefix())
96+
for resource := range ch {
97+
for _, evt := range resource.Events {
98+
if evt.Kv == nil {
12099
continue
121100
}
122-
action := fmt.Sprintf("v2:%s", evt.Action)
123-
stats.Inc(strings.Split(action+"/"+strings.TrimPrefix(evt.Node.Key, "/"), "/"))
101+
action := fmt.Sprintf("v3:%s", evt.Type)
102+
stats.Inc(strings.Split(action+"/"+strings.TrimPrefix(string(evt.Kv.Key), "/"), "/"))
124103
}
125-
}()
126-
go func() {
127-
defer wg.Done()
128-
ch := d.V3Client.Watch(ctx, "/", clientv3.WithKeysOnly(), clientv3.WithPrefix())
129-
for resource := range ch {
130-
for _, evt := range resource.Events {
131-
if evt.Kv == nil {
132-
continue
133-
}
134-
action := fmt.Sprintf("v3:%s", evt.Type)
135-
stats.Inc(strings.Split(action+"/"+strings.TrimPrefix(string(evt.Kv.Key), "/"), "/"))
136-
}
137-
}
138-
}()
139-
wg.Wait()
104+
}
140105

141106
bins := keyStats.Bins("", "/")
142107
sort.Sort(DescendingBins(bins))
@@ -154,38 +119,32 @@ func (d *EtcdWriteVolume) Check() types.DiagnosticResult {
154119
}
155120

156121
// findEtcdClients finds and loads etcd clients
157-
func findEtcdClients(configFile string, logger *log.Logger) (etcdclient.Client, *clientv3.Client, bool, error) {
122+
func findEtcdClients(configFile string, logger *log.Logger) (*clientv3.Client, bool, error) {
158123
masterConfig, err := GetMasterConfig(configFile, logger)
159124
if err != nil {
160125
configErr := fmt.Errorf("Unreadable master config; skipping this diagnostic.")
161126
logger.Error("DE2001", configErr.Error())
162-
return nil, nil, false, configErr
127+
return nil, false, configErr
163128
}
164129
if len(masterConfig.EtcdClientInfo.URLs) == 0 {
165130
configErr := fmt.Errorf("No etcdClientInfo.urls defined; can't contact etcd")
166131
logger.Error("DE2002", configErr.Error())
167-
return nil, nil, false, configErr
168-
}
169-
v2Client, err := etcd.MakeEtcdClient(masterConfig.EtcdClientInfo)
170-
if err != nil {
171-
configErr := fmt.Errorf("Unable to create an etcd v2 client: %v", err)
172-
logger.Error("DE2003", configErr.Error())
173-
return nil, nil, false, configErr
132+
return nil, false, configErr
174133
}
175134
config, err := etcd.MakeEtcdClientV3Config(masterConfig.EtcdClientInfo)
176135
if err != nil {
177136
configErr := fmt.Errorf("Unable to create an etcd v3 client config: %v", err)
178137
logger.Error("DE2004", configErr.Error())
179-
return nil, nil, false, configErr
138+
return nil, false, configErr
180139
}
181140
config.DialTimeout = 5 * time.Second
182141
v3Client, err := clientv3.New(*config)
183142
if err != nil {
184143
configErr := fmt.Errorf("Unable to create an etcd v3 client: %v", err)
185144
logger.Error("DE2005", configErr.Error())
186-
return nil, nil, false, configErr
145+
return nil, false, configErr
187146
}
188-
return v2Client, v3Client, true, nil
147+
return v3Client, true, nil
189148
}
190149

191150
type KeyCounter interface {

0 commit comments

Comments
 (0)