Skip to content
This repository was archived by the owner on Jul 30, 2021. It is now read-only.

Commit 0942e1c

Browse files
committed
pkg/bootkube: Detect Etcd service IP from manifest
* Etcd Service IP may vary depending on the service CIDR, so bootkube start with self-hosted etcd should detect it from manifests
1 parent a2d3c8b commit 0942e1c

File tree

6 files changed

+79
-24
lines changed

6 files changed

+79
-24
lines changed

cmd/bootkube/render.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ import (
1717
)
1818

1919
const (
20-
apiOffset = 1
21-
dnsOffset = 10
22-
etcdOffset = 15
23-
defaultDNSServiceIP = "10.3.0.10"
20+
apiOffset = 1
21+
dnsOffset = 10
22+
etcdOffset = 15
23+
defaultServiceBaseIP = "10.3.0.0"
2424
)
2525

2626
var (
@@ -152,7 +152,8 @@ func flagsToAssetConfig() (c *asset.Config, err error) {
152152
return nil, err
153153
}
154154

155-
if dnsServiceIP.String() != defaultDNSServiceIP {
155+
// TODO: Find better option than asking users to make manual changes
156+
if serviceNet.IP.String() != defaultServiceBaseIP {
156157
fmt.Printf("You have selected a non-default service CIDR %s - be sure your kubelet service file uses --cluster-dns=%s\n", serviceNet.String(), dnsServiceIP.String())
157158
}
158159

cmd/bootkube/render_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package main
2+
3+
import (
4+
"net"
5+
"testing"
6+
)
7+
8+
func TestOffsetIP(t *testing.T) {
9+
cases := []struct {
10+
input string
11+
offset int
12+
expected string
13+
}{
14+
{"10.3.0.0/24", 1, "10.3.0.1"},
15+
{"10.3.0.0/24", 10, "10.3.0.10"},
16+
{"10.3.0.0/24", 15, "10.3.0.15"},
17+
{"10.3.0.0/16", 1, "10.3.0.1"},
18+
{"10.3.0.0/16", 10, "10.3.0.10"},
19+
{"10.3.0.0/16", 15, "10.3.0.15"},
20+
{"10.33.1.200/16", 1, "10.33.0.1"},
21+
{"10.33.1.200/16", 10, "10.33.0.10"},
22+
{"10.33.1.200/16", 15, "10.33.0.15"},
23+
{"192.168.1.0/24", 15, "192.168.1.15"},
24+
}
25+
26+
for _, c := range cases {
27+
_, cidr, err := net.ParseCIDR(c.input)
28+
if err != nil {
29+
t.Errorf("unexpected CIDR parse error: %v", err)
30+
}
31+
ip, err := offsetServiceIP(cidr, c.offset)
32+
if ip.String() != c.expected {
33+
t.Errorf("expected %s, got %s", c.expected, ip.String())
34+
}
35+
}
36+
}

pkg/bootkube/bootkube.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
scheduler "k8s.io/kubernetes/plugin/cmd/kube-scheduler/app/options"
1616

1717
"github.com/kubernetes-incubator/bootkube/pkg/asset"
18+
"github.com/kubernetes-incubator/bootkube/pkg/util/etcdutil"
1819
)
1920

2021
const (
@@ -129,11 +130,23 @@ func (b *bootkube) Run() error {
129130
errch <- err
130131
}
131132
}()
132-
if b.selfHostedEtcd {
133-
requiredPods = append(requiredPods, "etcd-operator")
134-
}
135-
go func() { errch <- WaitUntilPodsRunning(requiredPods, assetTimeout, b.selfHostedEtcd) }()
136-
133+
go func() {
134+
if b.selfHostedEtcd {
135+
requiredPods = append(requiredPods, "etcd-operator")
136+
etcdServiceIP, err := detectEtcdIP(b.assetDir)
137+
if err != nil {
138+
errch <- err
139+
return
140+
}
141+
if err := WaitUntilPodsRunning(requiredPods, assetTimeout); err != nil {
142+
errch <- err
143+
return
144+
}
145+
errch <- etcdutil.Migrate(etcdServiceIP)
146+
} else {
147+
errch <- WaitUntilPodsRunning(requiredPods, assetTimeout)
148+
}
149+
}()
137150
// If any of the bootkube services exit, it means it is unrecoverable and we should exit.
138151
err := <-errch
139152
if err != nil {

pkg/bootkube/parse.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,20 @@ func detectPodCIDR(config Config) (string, error) {
7474
return "", fmt.Errorf("can't detect --cluster-cidr flag in %s", asset.AssetPathControllerManager)
7575
}
7676

77+
// detectEtcdIP deserializes the etcd-service ClusterIP.
78+
func detectEtcdIP(assetDir string) (string, error) {
79+
b, err := ioutil.ReadFile(filepath.Join(assetDir, asset.AssetPathEtcdSvc))
80+
if err != nil {
81+
return "", fmt.Errorf("can't read file %s: %v", asset.AssetPathEtcdSvc, err)
82+
}
83+
var service v1.Service
84+
err = yaml.Unmarshal(b, &service)
85+
if err != nil {
86+
return "", fmt.Errorf("can't unmarshal %s: %v", asset.AssetPathEtcdSvc, err)
87+
}
88+
return service.Spec.ClusterIP, nil
89+
}
90+
7791
func findFlag(flagName string, args []string) string {
7892
for _, arg := range args {
7993
if strings.HasPrefix(arg, flagName+"=") {

pkg/bootkube/status.go

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"time"
99

1010
"github.com/golang/glog"
11-
"github.com/kubernetes-incubator/bootkube/pkg/util/etcdutil"
1211
"k8s.io/kubernetes/pkg/api"
1312
"k8s.io/kubernetes/pkg/api/v1"
1413
"k8s.io/kubernetes/pkg/client/cache"
@@ -25,7 +24,7 @@ const (
2524
doesNotExist = "DoesNotExist"
2625
)
2726

28-
func WaitUntilPodsRunning(pods []string, timeout time.Duration, selfHostedEtcd bool) error {
27+
func WaitUntilPodsRunning(pods []string, timeout time.Duration) error {
2928
sc, err := NewStatusController(pods)
3029
if err != nil {
3130
return err
@@ -36,12 +35,6 @@ func WaitUntilPodsRunning(pods []string, timeout time.Duration, selfHostedEtcd b
3635
return fmt.Errorf("error while checking pod status: %v", err)
3736
}
3837

39-
if selfHostedEtcd {
40-
if err := etcdutil.Migrate(); err != nil {
41-
return err
42-
}
43-
}
44-
4538
UserOutput("All self-hosted control plane components successfully started\n")
4639
return nil
4740
}

pkg/util/etcdutil/migrate.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ import (
2020
)
2121

2222
const (
23-
apiserverAddr = "http://127.0.0.1:8080"
24-
etcdServiceIP = "10.3.0.15"
25-
23+
apiserverAddr = "http://127.0.0.1:8080"
2624
etcdClusterName = "kube-etcd"
2725
)
2826

@@ -31,7 +29,7 @@ var (
3129
waitBootEtcdRemovedTime = 300 * time.Second
3230
)
3331

34-
func Migrate() error {
32+
func Migrate(etcdServiceIP string) error {
3533
kubecli, err := clientset.NewForConfig(&restclient.Config{
3634
Host: apiserverAddr,
3735
})
@@ -62,7 +60,7 @@ func Migrate() error {
6260
}
6361
glog.Info("etcd cluster for migration is now running")
6462

65-
if err := waitBootEtcdRemoved(); err != nil {
63+
if err := waitBootEtcdRemoved(etcdServiceIP); err != nil {
6664
return fmt.Errorf("wait boot etcd deleted failed: %v", err)
6765
}
6866
glog.Info("the boot etcd is removed from the migration cluster")
@@ -169,7 +167,7 @@ func waitEtcdClusterRunning(restclient restclient.Interface) error {
169167
return err
170168
}
171169

172-
func waitBootEtcdRemoved() error {
170+
func waitBootEtcdRemoved(etcdServiceIP string) error {
173171
err := wait.Poll(10*time.Second, waitBootEtcdRemovedTime, func() (bool, error) {
174172
cfg := clientv3.Config{
175173
Endpoints: []string{fmt.Sprintf("http://%s:2379", etcdServiceIP)},

0 commit comments

Comments
 (0)