Skip to content

Commit 3378f84

Browse files
committed
Expose ‘—pod-network-cidr’ argument in minikube
1 parent 016e3f3 commit 3378f84

File tree

6 files changed

+148
-13
lines changed

6 files changed

+148
-13
lines changed

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

+3
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ const (
7777
apiServerPort = "apiserver-port"
7878
dnsDomain = "dns-domain"
7979
serviceCIDR = "service-cluster-ip-range"
80+
podSubnet = "pod-network-cidr"
8081
mountString = "mount-string"
8182
disableDriverMounts = "disable-driver-mounts"
8283
cacheImages = "cache-images"
@@ -122,6 +123,7 @@ func init() {
122123
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")
123124
startCmd.Flags().String(dnsDomain, constants.ClusterDNSDomain, "The cluster dns domain name used in the kubernetes cluster")
124125
startCmd.Flags().String(serviceCIDR, pkgutil.DefaultServiceCIDR, "The CIDR to be used for service cluster IPs.")
126+
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.")
125127
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.")
126128
startCmd.Flags().StringSliceVar(&registryMirror, "registry-mirror", nil, "Registry mirrors to pass to the Docker daemon")
127129
startCmd.Flags().String(containerRuntime, "docker", "The container runtime to be used (docker, crio, containerd)")
@@ -299,6 +301,7 @@ func generateConfig(cmd *cobra.Command, kVersion string) (cfg.Config, error) {
299301
CRISocket: viper.GetString(criSocket),
300302
NetworkPlugin: selectedNetworkPlugin,
301303
ServiceCIDR: viper.GetString(serviceCIDR),
304+
PodSubnet: viper.GetString(podSubnet),
302305
ExtraOptions: extraOptions,
303306
ShouldLoadCachedImages: viper.GetBool(cacheImages),
304307
EnableDefaultCNI: selectedEnableDefaultCNI,

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

+2
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ func generateConfig(k8s config.KubernetesConfig, r cruntime.Manager) (string, er
477477
opts := struct {
478478
CertDir string
479479
ServiceCIDR string
480+
PodSubnet string
480481
AdvertiseAddress string
481482
APIServerPort int
482483
KubernetesVersion string
@@ -489,6 +490,7 @@ func generateConfig(k8s config.KubernetesConfig, r cruntime.Manager) (string, er
489490
}{
490491
CertDir: util.DefaultCertPath,
491492
ServiceCIDR: util.DefaultServiceCIDR,
493+
PodSubnet: k8s.PodSubnet,
492494
AdvertiseAddress: k8s.NodeIP,
493495
APIServerPort: nodePort,
494496
KubernetesVersion: k8s.KubernetesVersion,

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

+104
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,110 @@ apiServerExtraArgs:
255255
admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
256256
`,
257257
},
258+
{
259+
description: "no PodSubnet",
260+
cfg: config.KubernetesConfig{
261+
NodeIP: "192.168.1.100",
262+
KubernetesVersion: "v1.12.0",
263+
NodeName: "minikube",
264+
PodSubnet: "",
265+
},
266+
expectedCfg: `apiVersion: kubeadm.k8s.io/v1alpha3
267+
kind: InitConfiguration
268+
apiEndpoint:
269+
advertiseAddress: 192.168.1.100
270+
bindPort: 8443
271+
bootstrapTokens:
272+
- groups:
273+
- system:bootstrappers:kubeadm:default-node-token
274+
ttl: 24h0m0s
275+
usages:
276+
- signing
277+
- authentication
278+
nodeRegistration:
279+
criSocket: /var/run/dockershim.sock
280+
name: minikube
281+
taints: []
282+
---
283+
apiVersion: kubeadm.k8s.io/v1alpha3
284+
kind: ClusterConfiguration
285+
apiServerExtraArgs:
286+
enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
287+
288+
certificatesDir: /var/lib/minikube/certs/
289+
clusterName: kubernetes
290+
controlPlaneEndpoint: localhost:8443
291+
etcd:
292+
local:
293+
dataDir: /data/minikube
294+
kubernetesVersion: v1.12.0
295+
networking:
296+
dnsDomain: cluster.local
297+
podSubnet: ""
298+
serviceSubnet: 10.96.0.0/12
299+
---
300+
apiVersion: kubelet.config.k8s.io/v1beta1
301+
kind: KubeletConfiguration
302+
# disable disk resource management by default, as it doesn't work well within the minikube environment.
303+
imageGCHighThresholdPercent: 100
304+
# Don't evict jobs, as we only have a single node to run on.
305+
evictionHard:
306+
nodefs.available: "0%"
307+
nodefs.inodesFree: "0%"
308+
imagefs.available: "0%"`,
309+
},
310+
{
311+
description: "with PodSubnet",
312+
cfg: config.KubernetesConfig{
313+
NodeIP: "192.168.1.100",
314+
KubernetesVersion: "v1.12.0",
315+
NodeName: "minikube",
316+
PodSubnet: "192.168.32.0/20",
317+
},
318+
expectedCfg: `apiVersion: kubeadm.k8s.io/v1alpha3
319+
kind: InitConfiguration
320+
apiEndpoint:
321+
advertiseAddress: 192.168.1.100
322+
bindPort: 8443
323+
bootstrapTokens:
324+
- groups:
325+
- system:bootstrappers:kubeadm:default-node-token
326+
ttl: 24h0m0s
327+
usages:
328+
- signing
329+
- authentication
330+
nodeRegistration:
331+
criSocket: /var/run/dockershim.sock
332+
name: minikube
333+
taints: []
334+
---
335+
apiVersion: kubeadm.k8s.io/v1alpha3
336+
kind: ClusterConfiguration
337+
apiServerExtraArgs:
338+
enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
339+
340+
certificatesDir: /var/lib/minikube/certs/
341+
clusterName: kubernetes
342+
controlPlaneEndpoint: localhost:8443
343+
etcd:
344+
local:
345+
dataDir: /data/minikube
346+
kubernetesVersion: v1.12.0
347+
networking:
348+
dnsDomain: cluster.local
349+
podSubnet: 192.168.32.0/20
350+
serviceSubnet: 10.96.0.0/12
351+
---
352+
apiVersion: kubelet.config.k8s.io/v1beta1
353+
kind: KubeletConfiguration
354+
# disable disk resource management by default, as it doesn't work well within the minikube environment.
355+
imageGCHighThresholdPercent: 100
356+
# Don't evict jobs, as we only have a single node to run on.
357+
evictionHard:
358+
nodefs.available: "0%"
359+
nodefs.inodesFree: "0%"
360+
imagefs.available: "0%"`,
361+
},
258362
}
259363

260364
for _, test := range tests {

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

+3-5
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ nodeName: {{.NodeName}}
4747

4848
var kubeadmConfigTemplateV1Alpha3 = template.Must(template.New("kubeadmConfigTemplate-v1alpha3").Funcs(template.FuncMap{
4949
"printMapInOrder": printMapInOrder,
50-
}).Parse(`
51-
apiVersion: kubeadm.k8s.io/v1alpha3
50+
}).Parse(`apiVersion: kubeadm.k8s.io/v1alpha3
5251
kind: InitConfiguration
5352
apiEndpoint:
5453
advertiseAddress: {{.AdvertiseAddress}}
@@ -81,7 +80,7 @@ etcd:
8180
kubernetesVersion: {{.KubernetesVersion}}
8281
networking:
8382
dnsDomain: cluster.local
84-
podSubnet: ""
83+
podSubnet: {{if .PodSubnet}}{{.PodSubnet}}{{else}}""{{end}}
8584
serviceSubnet: {{.ServiceCIDR}}
8685
---
8786
apiVersion: kubelet.config.k8s.io/v1beta1
@@ -92,8 +91,7 @@ imageGCHighThresholdPercent: 100
9291
evictionHard:
9392
nodefs.available: "0%"
9493
nodefs.inodesFree: "0%"
95-
imagefs.available: "0%"
96-
`))
94+
imagefs.available: "0%"`))
9795

9896
var kubeletSystemdTemplate = template.Must(template.New("kubeletSystemdTemplate").Parse(`
9997
[Unit]

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

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ type KubernetesConfig struct {
7070
NetworkPlugin string
7171
FeatureGates string
7272
ServiceCIDR string
73+
PodSubnet string
7374
ExtraOptions util.ExtraOptionSlice
7475

7576
ShouldLoadCachedImages bool

Diff for: test/integration/start_stop_delete_test.go

+35-8
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,25 @@ limitations under the License.
1919
package integration
2020

2121
import (
22+
"encoding/json"
23+
"github.com/docker/machine/libmachine/state"
24+
"k8s.io/minikube/test/integration/util"
2225
"net"
2326
"strings"
2427
"testing"
2528
"time"
26-
27-
"github.com/docker/machine/libmachine/state"
28-
"k8s.io/minikube/test/integration/util"
2929
)
3030

3131
func TestStartStop(t *testing.T) {
3232
tests := []struct {
33-
name string
34-
args []string
33+
name string
34+
args []string
35+
assertCustom func(t *testing.T)
3536
}{
36-
{"docker+cache", []string{"--container-runtime=docker", "--cache-images"}},
37-
{"containerd+cache", []string{"--container-runtime=containerd", "--docker-opt containerd=/var/run/containerd/containerd.sock", "--cache-images"}},
38-
{"crio+cache", []string{"--container-runtime=crio", "--cache-images"}},
37+
{"docker+cache", []string{"--container-runtime=docker", "--cache-images"}, nil},
38+
{"containerd+cache", []string{"--container-runtime=containerd", "--docker-opt containerd=/var/run/containerd/containerd.sock", "--cache-images"}, nil},
39+
{"crio+cache", []string{"--container-runtime=crio", "--cache-images"}, nil},
40+
{"podCidr", []string{"--pod-network-cidr=192.168.111.111/16"}, assertPodCIDR},
3941
}
4042

4143
for _, test := range tests {
@@ -51,6 +53,10 @@ func TestStartStop(t *testing.T) {
5153
r.Start(test.args...)
5254
r.CheckStatus(state.Running.String())
5355

56+
if test.assertCustom != nil {
57+
test.assertCustom(t)
58+
}
59+
5460
ip := r.RunCommand("ip", true)
5561
ip = strings.TrimRight(ip, "\n")
5662
if net.ParseIP(ip) == nil {
@@ -74,3 +80,24 @@ func TestStartStop(t *testing.T) {
7480
})
7581
}
7682
}
83+
84+
func assertPodCIDR(t *testing.T) {
85+
kr := util.NewKubectlRunner(t)
86+
out, err := kr.RunCommand([]string{"get", "nodes", "-o", "json"})
87+
if err != nil {
88+
t.Fatalf("Failed to obtain nodes info")
89+
}
90+
91+
var result map[string]interface{}
92+
json.Unmarshal([]byte(out), &result)
93+
94+
items := result["items"].([]interface{})
95+
for _, item := range items {
96+
spec := item.(map[string]interface{})["spec"]
97+
podCidr := spec.(map[string]interface{})["podCIDR"].(string)
98+
99+
if !strings.HasPrefix(podCidr, "192.168.0.0") {
100+
t.Errorf("Unexpected podCIDR: %s", podCidr)
101+
}
102+
}
103+
}

0 commit comments

Comments
 (0)