Skip to content

Commit cfba354

Browse files
committed
Expose ‘—pod-network-cidr’ argument in minikube
1 parent 786eb65 commit cfba354

11 files changed

+225
-7
lines changed

Diff for: cmd/minikube/cmd/start.go

+3
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ const (
7676
apiServerPort = "apiserver-port"
7777
dnsDomain = "dns-domain"
7878
serviceCIDR = "service-cluster-ip-range"
79+
podSubnet = "pod-network-cidr"
7980
imageRepository = "image-repository"
8081
mountString = "mount-string"
8182
disableDriverMounts = "disable-driver-mounts"
@@ -126,6 +127,7 @@ func init() {
126127
startCmd.Flags().IPSliceVar(&apiServerIPs, "apiserver-ips", nil, "A set of apiserver IP Addresses which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine")
127128
startCmd.Flags().String(dnsDomain, constants.ClusterDNSDomain, "The cluster dns domain name used in the kubernetes cluster")
128129
startCmd.Flags().String(serviceCIDR, pkgutil.DefaultServiceCIDR, "The CIDR to be used for service cluster IPs.")
130+
startCmd.Flags().String(podSubnet, "", "Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node.")
129131
startCmd.Flags().StringSliceVar(&insecureRegistry, "insecure-registry", nil, "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.")
130132
startCmd.Flags().StringSliceVar(&registryMirror, "registry-mirror", nil, "Registry mirrors to pass to the Docker daemon")
131133
startCmd.Flags().String(imageRepository, "", "Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers")
@@ -332,6 +334,7 @@ func generateConfig(cmd *cobra.Command, k8sVersion string) (cfg.Config, error) {
332334
CRISocket: viper.GetString(criSocket),
333335
NetworkPlugin: selectedNetworkPlugin,
334336
ServiceCIDR: viper.GetString(serviceCIDR),
337+
PodSubnet: viper.GetString(podSubnet),
335338
ImageRepository: viper.GetString(imageRepository),
336339
ExtraOptions: extraOptions,
337340
ShouldLoadCachedImages: viper.GetBool(cacheImages),

Diff for: pkg/minikube/bootstrapper/kubeadm/kubeadm.go

+2
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,7 @@ func generateConfig(k8s config.KubernetesConfig, r cruntime.Manager) (string, er
535535
opts := struct {
536536
CertDir string
537537
ServiceCIDR string
538+
PodSubnet string
538539
AdvertiseAddress string
539540
APIServerPort int
540541
KubernetesVersion string
@@ -548,6 +549,7 @@ func generateConfig(k8s config.KubernetesConfig, r cruntime.Manager) (string, er
548549
}{
549550
CertDir: util.DefaultCertPath,
550551
ServiceCIDR: util.DefaultServiceCIDR,
552+
PodSubnet: k8s.PodSubnet,
551553
AdvertiseAddress: k8s.NodeIP,
552554
APIServerPort: nodePort,
553555
KubernetesVersion: k8s.KubernetesVersion,

Diff for: pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ func TestGenerateConfig(t *testing.T) {
177177
{"crio-options-gates", "crio", false, config.KubernetesConfig{ExtraOptions: extraOpts, FeatureGates: "a=b"}},
178178
{"unknown-omponent", "docker", true, config.KubernetesConfig{ExtraOptions: util.ExtraOptionSlice{util.ExtraOption{Component: "not-a-real-component", Key: "killswitch", Value: "true"}}}},
179179
{"containerd-api-port", "containerd", false, config.KubernetesConfig{NodePort: 12345}},
180+
{"containerd-pod-network-cidr", "containerd", false, config.KubernetesConfig{PodSubnet: "192.168.32.0/20"}},
180181
{"image-repository", "docker", false, config.KubernetesConfig{ImageRepository: "test/repo"}},
181182
}
182183
for vname, version := range versions {

Diff for: pkg/minikube/bootstrapper/kubeadm/templates.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ etcd:
8585
kubernetesVersion: {{.KubernetesVersion}}
8686
networking:
8787
dnsDomain: cluster.local
88-
podSubnet: ""
88+
podSubnet: {{if .PodSubnet}}{{.PodSubnet}}{{else}}""{{end}}
8989
serviceSubnet: {{.ServiceCIDR}}
9090
---
9191
apiVersion: kubelet.config.k8s.io/v1beta1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
apiVersion: kubeadm.k8s.io/v1beta1
2+
kind: InitConfiguration
3+
localAPIEndpoint:
4+
advertiseAddress: 1.1.1.1
5+
bindPort: 8443
6+
bootstrapTokens:
7+
- groups:
8+
- system:bootstrappers:kubeadm:default-node-token
9+
ttl: 24h0m0s
10+
usages:
11+
- signing
12+
- authentication
13+
nodeRegistration:
14+
criSocket: /run/containerd/containerd.sock
15+
name: mk
16+
taints: []
17+
---
18+
apiVersion: kubeadm.k8s.io/v1beta1
19+
kind: ClusterConfiguration
20+
apiServer:
21+
extraArgs:
22+
enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
23+
certificatesDir: /var/lib/minikube/certs/
24+
clusterName: kubernetes
25+
controlPlaneEndpoint: localhost:8443
26+
dns:
27+
type: CoreDNS
28+
etcd:
29+
local:
30+
dataDir: /data/minikube
31+
kubernetesVersion: v1.14.0
32+
networking:
33+
dnsDomain: cluster.local
34+
podSubnet: ""
35+
serviceSubnet: 10.96.0.0/12
36+
---
37+
apiVersion: kubelet.config.k8s.io/v1beta1
38+
kind: KubeletConfiguration
39+
imageGCHighThresholdPercent: 100
40+
evictionHard:
41+
nodefs.available: "0%"
42+
nodefs.inodesFree: "0%"
43+
imagefs.available: "0%"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
apiVersion: kubeadm.k8s.io/v1beta1
2+
kind: InitConfiguration
3+
localAPIEndpoint:
4+
advertiseAddress: 1.1.1.1
5+
bindPort: 8443
6+
bootstrapTokens:
7+
- groups:
8+
- system:bootstrappers:kubeadm:default-node-token
9+
ttl: 24h0m0s
10+
usages:
11+
- signing
12+
- authentication
13+
nodeRegistration:
14+
criSocket: /run/containerd/containerd.sock
15+
name: mk
16+
taints: []
17+
---
18+
apiVersion: kubeadm.k8s.io/v1beta1
19+
kind: ClusterConfiguration
20+
apiServer:
21+
extraArgs:
22+
enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
23+
certificatesDir: /var/lib/minikube/certs/
24+
clusterName: kubernetes
25+
controlPlaneEndpoint: localhost:8443
26+
dns:
27+
type: CoreDNS
28+
etcd:
29+
local:
30+
dataDir: /data/minikube
31+
kubernetesVersion: v1.14.0
32+
networking:
33+
dnsDomain: cluster.local
34+
podSubnet: ""
35+
serviceSubnet: 10.96.0.0/12
36+
---
37+
apiVersion: kubelet.config.k8s.io/v1beta1
38+
kind: KubeletConfiguration
39+
imageGCHighThresholdPercent: 100
40+
evictionHard:
41+
nodefs.available: "0%"
42+
nodefs.inodesFree: "0%"
43+
imagefs.available: "0%"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
apiVersion: kubeadm.k8s.io/v1alpha1
2+
kind: MasterConfiguration
3+
noTaintMaster: true
4+
api:
5+
advertiseAddress: 1.1.1.1
6+
bindPort: 8443
7+
controlPlaneEndpoint: localhost
8+
kubernetesVersion: v1.10.0
9+
certificatesDir: /var/lib/minikube/certs/
10+
networking:
11+
serviceSubnet: 10.96.0.0/12
12+
etcd:
13+
dataDir: /data/minikube
14+
nodeName: mk
15+
criSocket: /run/containerd/containerd.sock
16+
apiServerExtraArgs:
17+
admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
apiVersion: kubeadm.k8s.io/v1alpha3
2+
kind: InitConfiguration
3+
apiEndpoint:
4+
advertiseAddress: 1.1.1.1
5+
bindPort: 8443
6+
bootstrapTokens:
7+
- groups:
8+
- system:bootstrappers:kubeadm:default-node-token
9+
ttl: 24h0m0s
10+
usages:
11+
- signing
12+
- authentication
13+
nodeRegistration:
14+
criSocket: /run/containerd/containerd.sock
15+
name: mk
16+
taints: []
17+
---
18+
apiVersion: kubeadm.k8s.io/v1alpha3
19+
kind: ClusterConfiguration
20+
apiServerExtraArgs:
21+
enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
22+
certificatesDir: /var/lib/minikube/certs/
23+
clusterName: kubernetes
24+
controlPlaneEndpoint: localhost:8443
25+
etcd:
26+
local:
27+
dataDir: /data/minikube
28+
kubernetesVersion: v1.12.0
29+
networking:
30+
dnsDomain: cluster.local
31+
podSubnet: 192.168.32.0/20
32+
serviceSubnet: 10.96.0.0/12
33+
---
34+
apiVersion: kubelet.config.k8s.io/v1beta1
35+
kind: KubeletConfiguration
36+
evictionHard:
37+
nodefs.available: "0%"
38+
nodefs.inodesFree: "0%"
39+
imagefs.available: "0%"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
apiVersion: kubeadm.k8s.io/v1alpha3
2+
kind: InitConfiguration
3+
apiEndpoint:
4+
advertiseAddress: 1.1.1.1
5+
bindPort: 8443
6+
bootstrapTokens:
7+
- groups:
8+
- system:bootstrappers:kubeadm:default-node-token
9+
ttl: 24h0m0s
10+
usages:
11+
- signing
12+
- authentication
13+
nodeRegistration:
14+
criSocket: /run/containerd/containerd.sock
15+
name: mk
16+
taints: []
17+
---
18+
apiVersion: kubeadm.k8s.io/v1alpha3
19+
kind: ClusterConfiguration
20+
apiServerExtraArgs:
21+
enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
22+
certificatesDir: /var/lib/minikube/certs/
23+
clusterName: kubernetes
24+
controlPlaneEndpoint: localhost:8443
25+
etcd:
26+
local:
27+
dataDir: /data/minikube
28+
kubernetesVersion: v1.13.0
29+
networking:
30+
dnsDomain: cluster.local
31+
podSubnet: 192.168.32.0/20
32+
serviceSubnet: 10.96.0.0/12
33+
---
34+
apiVersion: kubelet.config.k8s.io/v1beta1
35+
kind: KubeletConfiguration
36+
evictionHard:
37+
nodefs.available: "0%"
38+
nodefs.inodesFree: "0%"
39+
imagefs.available: "0%"

Diff for: pkg/minikube/config/types.go

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ type KubernetesConfig struct {
7171
NetworkPlugin string
7272
FeatureGates string
7373
ServiceCIDR string
74+
PodSubnet string
7475
ImageRepository string
7576
ExtraOptions util.ExtraOptionSlice
7677

Diff for: test/integration/start_stop_delete_test.go

+36-6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package integration
2020

2121
import (
2222
"fmt"
23+
"encoding/json"
2324
"net"
2425
"strings"
2526
"testing"
@@ -32,29 +33,33 @@ import (
3233

3334
func TestStartStop(t *testing.T) {
3435
tests := []struct {
35-
name string
36-
args []string
36+
name string
37+
args []string
38+
assertCustom func(t *testing.T)
3739
}{
3840
{"nocache_oldest", []string{
3941
"--cache-images=false",
4042
fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion),
41-
}},
43+
}, nil},
4244
{"feature_gates_newest_cni", []string{
4345
"--feature-gates",
4446
"ServerSideApply=true",
4547
"--network-plugin=cni",
4648
"--extra-config=kubelet.network-plugin=cni",
4749
fmt.Sprintf("--kubernetes-version=%s", constants.NewestKubernetesVersion),
48-
}},
50+
}, nil},
4951
{"containerd", []string{
5052
"--container-runtime=containerd",
5153
"--docker-opt containerd=/var/run/containerd/containerd.sock",
52-
}},
54+
}, nil},
5355
{"crio_ignore_preflights", []string{
5456
"--container-runtime=crio",
5557
"--extra-config",
5658
"kubeadm.ignore-preflight-errors=SystemVerification",
57-
}},
59+
}, nil},
60+
{"podCidr", []string{
61+
"--pod-network-cidr=192.168.111.111/16",
62+
}, assertPodCIDR},
5863
}
5964

6065
for _, test := range tests {
@@ -70,6 +75,10 @@ func TestStartStop(t *testing.T) {
7075
r.Start(test.args...)
7176
r.CheckStatus(state.Running.String())
7277

78+
if test.assertCustom != nil {
79+
test.assertCustom(t)
80+
}
81+
7382
ip := r.RunCommand("ip", true)
7483
ip = strings.TrimRight(ip, "\n")
7584
if net.ParseIP(ip) == nil {
@@ -93,3 +102,24 @@ func TestStartStop(t *testing.T) {
93102
})
94103
}
95104
}
105+
106+
func assertPodCIDR(t *testing.T) {
107+
kr := util.NewKubectlRunner(t)
108+
out, err := kr.RunCommand([]string{"get", "nodes", "-o", "json"})
109+
if err != nil {
110+
t.Fatalf("Failed to obtain nodes info")
111+
}
112+
113+
var result map[string]interface{}
114+
json.Unmarshal([]byte(out), &result)
115+
116+
items := result["items"].([]interface{})
117+
for _, item := range items {
118+
spec := item.(map[string]interface{})["spec"]
119+
podCidr := spec.(map[string]interface{})["podCIDR"].(string)
120+
121+
if !strings.HasPrefix(podCidr, "192.168.0.0") {
122+
t.Errorf("Unexpected podCIDR: %s", podCidr)
123+
}
124+
}
125+
}

0 commit comments

Comments
 (0)