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

Commit b754f32

Browse files
authored
Merge pull request #307 from dghubble/master
Detect pod and service CIDR from manifests
2 parents b776d22 + 4c23004 commit b754f32

File tree

3 files changed

+159
-16
lines changed

3 files changed

+159
-16
lines changed

pkg/bootkube/bootkube.go

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,20 @@ func NewBootkube(config Config) (*bootkube, error) {
4747
apiServer := apiserver.NewServerRunOptions()
4848
fs := pflag.NewFlagSet("apiserver", pflag.ExitOnError)
4949
apiServer.AddFlags(fs)
50-
fs.Parse(makeAPIServerFlags(config))
50+
flags, err := makeAPIServerFlags(config)
51+
if err != nil {
52+
return nil, err
53+
}
54+
fs.Parse(flags)
5155

5256
cmServer := controller.NewCMServer()
5357
fs = pflag.NewFlagSet("controllermanager", pflag.ExitOnError)
5458
cmServer.AddFlags(fs)
55-
fs.Parse([]string{
56-
"--master=" + insecureAPIAddr,
57-
"--service-account-private-key-file=" + filepath.Join(config.AssetDir, asset.AssetPathServiceAccountPrivKey),
58-
"--root-ca-file=" + filepath.Join(config.AssetDir, asset.AssetPathCACert),
59-
"--cluster-signing-cert-file=" + filepath.Join(config.AssetDir, asset.AssetPathCACert),
60-
"--cluster-signing-key-file=" + filepath.Join(config.AssetDir, asset.AssetPathCAKey),
61-
"--allocate-node-cidrs=true",
62-
"--cluster-cidr=10.2.0.0/16",
63-
"--configure-cloud-routes=false",
64-
"--leader-elect=true",
65-
})
59+
flags, err = makeControllerManagerFlags(config)
60+
if err != nil {
61+
return nil, err
62+
}
63+
fs.Parse(flags)
6664

6765
schedServer := scheduler.NewSchedulerServer()
6866
fs = pflag.NewFlagSet("scheduler", pflag.ExitOnError)
@@ -81,8 +79,12 @@ func NewBootkube(config Config) (*bootkube, error) {
8179
}, nil
8280
}
8381

84-
func makeAPIServerFlags(config Config) []string {
85-
res := []string{
82+
func makeAPIServerFlags(config Config) ([]string, error) {
83+
serviceCIDR, err := detectServiceCIDR(config)
84+
if err != nil {
85+
return []string{}, err
86+
}
87+
return []string{
8688
"--bind-address=0.0.0.0",
8789
"--secure-port=443",
8890
"--insecure-port=8080",
@@ -93,13 +95,30 @@ func makeAPIServerFlags(config Config) []string {
9395
"--token-auth-file=" + filepath.Join(config.AssetDir, asset.AssetPathBootstrapAuthToken),
9496
"--authorization-mode=RBAC",
9597
"--etcd-servers=" + config.EtcdServer.String(),
96-
"--service-cluster-ip-range=10.3.0.0/24",
98+
"--service-cluster-ip-range=" + serviceCIDR,
9799
"--service-account-key-file=" + filepath.Join(config.AssetDir, asset.AssetPathServiceAccountPubKey),
98100
"--admission-control=NamespaceLifecycle,ServiceAccount",
99101
"--runtime-config=api/all=true",
100102
"--storage-backend=etcd3",
103+
}, nil
104+
}
105+
106+
func makeControllerManagerFlags(config Config) ([]string, error) {
107+
podCIDR, err := detectPodCIDR(config)
108+
if err != nil {
109+
return []string{}, err
101110
}
102-
return res
111+
return []string{
112+
"--master=" + insecureAPIAddr,
113+
"--service-account-private-key-file=" + filepath.Join(config.AssetDir, asset.AssetPathServiceAccountPrivKey),
114+
"--root-ca-file=" + filepath.Join(config.AssetDir, asset.AssetPathCACert),
115+
"--cluster-signing-cert-file=" + filepath.Join(config.AssetDir, asset.AssetPathCACert),
116+
"--cluster-signing-key-file=" + filepath.Join(config.AssetDir, asset.AssetPathCAKey),
117+
"--allocate-node-cidrs=true",
118+
"--cluster-cidr=" + podCIDR,
119+
"--configure-cloud-routes=false",
120+
"--leader-elect=true",
121+
}, nil
103122
}
104123

105124
func (b *bootkube) Run() error {

pkg/bootkube/parse.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package bootkube
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
"net"
7+
"path/filepath"
8+
"strings"
9+
10+
"github.com/ghodss/yaml"
11+
"github.com/kubernetes-incubator/bootkube/pkg/asset"
12+
"k8s.io/kubernetes/pkg/api/v1"
13+
"k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
14+
)
15+
16+
const (
17+
apiServerContainerName = "kube-apiserver"
18+
controllerManagerContainerName = "kube-controller-manager"
19+
)
20+
21+
// detectServiceCIDR deserializes the '--service-cluster-ip-range' from the
22+
// kube-apiserver manifest
23+
func detectServiceCIDR(config Config) (string, error) {
24+
b, err := ioutil.ReadFile(filepath.Join(config.AssetDir, asset.AssetPathAPIServer))
25+
if err != nil {
26+
return "", fmt.Errorf("can't read file %s: %v", asset.AssetPathAPIServer, err)
27+
}
28+
var apiServer v1beta1.DaemonSet
29+
err = yaml.Unmarshal(b, &apiServer)
30+
if err != nil {
31+
return "", fmt.Errorf("cant unmarshal %s: %v", asset.AssetPathAPIServer, err)
32+
}
33+
34+
containers := map[string]v1.Container{}
35+
for _, container := range apiServer.Spec.Template.Spec.Containers {
36+
containers[container.Name] = container
37+
}
38+
39+
if container, exists := containers[apiServerContainerName]; exists {
40+
cidr := findFlag("--service-cluster-ip-range", container.Command)
41+
if _, _, err := net.ParseCIDR(cidr); err != nil {
42+
return "", fmt.Errorf("invalid --cluster-cidr CIDR: %v", err)
43+
}
44+
return cidr, nil
45+
}
46+
return "", fmt.Errorf("can't detect --service-cluster-ip-range in %s", asset.AssetPathAPIServer)
47+
}
48+
49+
// detectPodCIDR deserializes the '--cluster-cidr' from the
50+
// kube-controller-manager manifest.
51+
func detectPodCIDR(config Config) (string, error) {
52+
b, err := ioutil.ReadFile(filepath.Join(config.AssetDir, asset.AssetPathControllerManager))
53+
if err != nil {
54+
return "", fmt.Errorf("can't read file %s: %v", asset.AssetPathControllerManager, err)
55+
}
56+
var manager v1beta1.Deployment
57+
err = yaml.Unmarshal(b, &manager)
58+
if err != nil {
59+
return "", fmt.Errorf("can't unmarshal %s: %v", asset.AssetPathControllerManager, err)
60+
}
61+
62+
containers := map[string]v1.Container{}
63+
for _, container := range manager.Spec.Template.Spec.Containers {
64+
containers[container.Name] = container
65+
}
66+
67+
if container, exists := containers[controllerManagerContainerName]; exists {
68+
cidr := findFlag("--cluster-cidr", container.Command)
69+
if _, _, err := net.ParseCIDR(cidr); err != nil {
70+
return "", fmt.Errorf("invalid --cluster-cidr CIDR: %v", err)
71+
}
72+
return cidr, nil
73+
}
74+
return "", fmt.Errorf("can't detect --cluster-cidr flag in %s", asset.AssetPathControllerManager)
75+
}
76+
77+
func findFlag(flagName string, args []string) string {
78+
for _, arg := range args {
79+
if strings.HasPrefix(arg, flagName+"=") {
80+
return strings.TrimPrefix(arg, flagName+"=")
81+
}
82+
if strings.HasPrefix(arg, flagName+" ") {
83+
return strings.TrimSpace(strings.TrimPrefix(arg, flagName+" "))
84+
}
85+
}
86+
return ""
87+
}

pkg/bootkube/parse_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package bootkube
2+
3+
import (
4+
"testing"
5+
)
6+
7+
const (
8+
defaultServiceCIDR = "10.3.0.0/24"
9+
defaultPodCIDR = "10.2.0.0/24"
10+
)
11+
12+
func TestFindFlag(t *testing.T) {
13+
flags := []string{
14+
"--key1=value",
15+
"--key2 val",
16+
"--service-cluster-ip-range=10.3.0.0/24",
17+
"--cluster-cidr=10.2.0.0/24",
18+
"--foobar baz",
19+
}
20+
cases := []struct {
21+
flag string
22+
expected string
23+
}{
24+
{"--service-cluster-ip-range", defaultServiceCIDR},
25+
{"--cluster-cidr", defaultPodCIDR},
26+
{"--key1", "value"},
27+
{"--key2", "val"},
28+
{"--missing-flag", ""},
29+
{"--foo", ""},
30+
{"--foobar", "baz"},
31+
}
32+
for _, c := range cases {
33+
if v := findFlag(c.flag, flags); v != c.expected {
34+
t.Errorf("exected %s, got %s", c.expected, v)
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)