diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 5ac080f3f3947b968fab855e41bdc8b750b91d8e..af359f4cc63552db7011a28e1d4a167f33fc4830 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -60,6 +60,7 @@ const ( containerRuntime = "container-runtime" criSocket = "cri-socket" networkPlugin = "network-plugin" + enableDefaultCNI = "enable-default-cni" hypervVirtualSwitch = "hyperv-virtual-switch" kvmNetwork = "kvm-network" keepContext = "keep-context" @@ -240,6 +241,7 @@ func runStart(cmd *cobra.Command, args []string) { ServiceCIDR: viper.GetString(serviceCIDR), ExtraOptions: extraOptions, ShouldLoadCachedImages: shouldCacheImages, + EnableDefaultCNI: viper.GetBool(enableDefaultCNI), } k8sBootstrapper, err := GetClusterBootstrapper(api, clusterBootstrapper) @@ -486,6 +488,7 @@ func init() { startCmd.Flags().String(criSocket, "", "The cri socket path to be used") startCmd.Flags().String(kubernetesVersion, constants.DefaultKubernetesVersion, "The kubernetes version that the minikube VM will use (ex: v1.2.3)") startCmd.Flags().String(networkPlugin, "", "The name of the network plugin") + startCmd.Flags().Bool(enableDefaultCNI, false, "Enable the default CNI plugin (/etc/cni/net.d/k8s.conf). Used in conjunction with \"--network-plugin=cni\"") startCmd.Flags().String(featureGates, "", "A set of key=value pairs that describe feature gates for alpha/experimental features.") startCmd.Flags().Bool(cacheImages, false, "If true, cache docker images for the current bootstrapper and load them into the machine.") startCmd.Flags().Var(&extraOptions, "extra-config", diff --git a/deploy/addons/gvisor/README.md b/deploy/addons/gvisor/README.md index 4bae2b2a7388fa94b8610cacc519e608a29cdc0e..1a2a2a735b753cf42ec405fdf22f9a10b943835d 100644 --- a/deploy/addons/gvisor/README.md +++ b/deploy/addons/gvisor/README.md @@ -8,7 +8,7 @@ When starting minikube, specify the following flags, along with any additional d ```shell $ minikube start --container-runtime=containerd \ --docker-opt containerd=/var/run/containerd/containerd.sock \ - --network-plugin=cni + --network-plugin=cni --enable-default-cni ``` ### Enabling gVisor diff --git a/deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/etc/cni/net.d/k8s.conf b/deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/etc/cni/net.d/k8s.conf deleted file mode 120000 index 816796081d88e9870a3320aa207cdaeddaeb94fa..0000000000000000000000000000000000000000 --- a/deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/etc/cni/net.d/k8s.conf +++ /dev/null @@ -1 +0,0 @@ -../../../usr/libexec/kubernetes/kubelet-plugins/net/exec/k8s.conf \ No newline at end of file diff --git a/deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/etc/rkt/net.d/k8s.conf b/deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/etc/rkt/net.d/k8s.conf deleted file mode 100644 index 7b5404e53bf25c7b7f75f0f82a8acc4a74dfcecb..0000000000000000000000000000000000000000 --- a/deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/etc/rkt/net.d/k8s.conf +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "rkt.kubernetes.io", - "type": "bridge", - "bridge": "mybridge", - "mtu": 1460, - "addIf": "true", - "isGateway": true, - "ipMasq": true, - "ipam": { - "type": "host-local", - "subnet": "10.1.0.0/16", - "gateway": "10.1.0.1", - "routes": [ - { - "dst": "0.0.0.0/0" - } - ] - } -} diff --git a/deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/usr/libexec/kubernetes/kubelet-plugins/net/exec/k8s.conf b/deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/usr/libexec/kubernetes/kubelet-plugins/net/exec/k8s.conf deleted file mode 100644 index 7b5404e53bf25c7b7f75f0f82a8acc4a74dfcecb..0000000000000000000000000000000000000000 --- a/deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/usr/libexec/kubernetes/kubelet-plugins/net/exec/k8s.conf +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "rkt.kubernetes.io", - "type": "bridge", - "bridge": "mybridge", - "mtu": 1460, - "addIf": "true", - "isGateway": true, - "ipMasq": true, - "ipam": { - "type": "host-local", - "subnet": "10.1.0.0/16", - "gateway": "10.1.0.1", - "routes": [ - { - "dst": "0.0.0.0/0" - } - ] - } -} diff --git a/docs/alternative_runtimes.md b/docs/alternative_runtimes.md index 6e87525e048bc90d61af24430e0c330ef21abfac..dbf42f07823f6a14dafbd8005eb07aae25ddb720 100644 --- a/docs/alternative_runtimes.md +++ b/docs/alternative_runtimes.md @@ -5,6 +5,7 @@ To use [rkt](https://github.com/coreos/rkt) as the container runtime run: ```shell $ minikube start \ --network-plugin=cni \ + --enable-default-cni \ --container-runtime=rkt ``` @@ -16,6 +17,7 @@ To use [CRI-O](https://github.com/kubernetes-incubator/cri-o) as the container r ```shell $ minikube start \ --network-plugin=cni \ + --enable-default-cni \ --container-runtime=cri-o ``` @@ -24,6 +26,7 @@ Or you can use the extended version: ```shell $ minikube start \ --network-plugin=cni \ + --enable-default-cni \ --cri-socket=/var/run/crio/crio.sock \ --extra-config=kubelet.container-runtime=remote \ --extra-config=kubelet.container-runtime-endpoint=unix:///var/run/crio/crio.sock \ @@ -37,6 +40,7 @@ To use [containerd](https://github.com/containerd/containerd) as the container r ```shell $ minikube start \ --network-plugin=cni \ + --enable-default-cni \ --container-runtime=containerd ``` @@ -45,6 +49,7 @@ Or you can use the extended version: ```shell $ minikube start \ --network-plugin=cni \ + --enable-default-cni \ --cri-socket=/run/containerd/containerd.sock \ --extra-config=kubelet.container-runtime=remote \ --extra-config=kubelet.container-runtime-endpoint=unix:///run/containerd/containerd.sock \ diff --git a/docs/contributors/minikube_iso.md b/docs/contributors/minikube_iso.md index 1dd5c967c2f0a76358c7b7a1c1b5d05968ee783b..6d63491b6850b86027e29019b7a4062cec4420fc 100644 --- a/docs/contributors/minikube_iso.md +++ b/docs/contributors/minikube_iso.md @@ -40,6 +40,7 @@ The bootable ISO image will be available in `out/minikube.iso`. $ ./out/minikube start \ --container-runtime=rkt \ --network-plugin=cni \ + --enable-default-cni \ --iso-url=file://$GOPATH/src/k8s.io/minikube/out/minikube.iso ``` diff --git a/pkg/minikube/bootstrapper/kubeadm/default_cni.go b/pkg/minikube/bootstrapper/kubeadm/default_cni.go new file mode 100644 index 0000000000000000000000000000000000000000..dfd6cf61c515056f12e28261b79f995d8dbf8aff --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/default_cni.go @@ -0,0 +1,43 @@ +/* +Copyright 2018 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package kubeadm + +// defaultCNIConfig is the CNI config which is provisioned when --enable-default-cni +// has been passed to `minikube start`. +// +// The config is being written to /etc/cni/net.d/k8s.conf and /etc/rkt/net.d/k8s.conf. +const defaultCNIConfig = ` +{ + "name": "rkt.kubernetes.io", + "type": "bridge", + "bridge": "mybridge", + "mtu": 1460, + "addIf": "true", + "isGateway": true, + "ipMasq": true, + "ipam": { + "type": "host-local", + "subnet": "10.1.0.0/16", + "gateway": "10.1.0.1", + "routes": [ + { + "dst": "0.0.0.0/0" + } + ] + } +} +` diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index e7e799bcf3b712c25d0c28cabd1dd679be22ce04..c1c48406ec59cb0c88f7535988fb74829a75c268 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -363,6 +363,15 @@ func (k *KubeadmBootstrapper) UpdateCluster(cfg config.KubernetesConfig) error { assets.NewMemoryAssetTarget([]byte(kubeadmCfg), constants.KubeadmConfigFile, "0640"), } + // Copy the default CNI config (k8s.conf), so that kubelet can successfully + // start a Pod in the case a user hasn't manually installed any CNI plugin + // and minikube was started with "--extra-config=kubelet.network-plugin=cni". + if cfg.EnableDefaultCNI { + files = append(files, + assets.NewMemoryAssetTarget([]byte(defaultCNIConfig), constants.DefaultCNIConfigPath, "0644"), + assets.NewMemoryAssetTarget([]byte(defaultCNIConfig), constants.DefaultRktNetConfigPath, "0644")) + } + var g errgroup.Group for _, bin := range []string{"kubelet", "kubeadm"} { bin := bin diff --git a/pkg/minikube/config/types.go b/pkg/minikube/config/types.go index df9926fd2a5a93da0e480ce8f1be8bf1bec82cc3..3f9a7a1c3ed7dc36d01499ca5e82d9948ea66c1b 100644 --- a/pkg/minikube/config/types.go +++ b/pkg/minikube/config/types.go @@ -72,4 +72,5 @@ type KubernetesConfig struct { ExtraOptions util.ExtraOptionSlice ShouldLoadCachedImages bool + EnableDefaultCNI bool } diff --git a/pkg/minikube/constants/constants.go b/pkg/minikube/constants/constants.go index 2b418ff20ef8a1a0e433ecda0a0372008c987ebf..564e0d9298a580316133f157987b65aec499976e 100644 --- a/pkg/minikube/constants/constants.go +++ b/pkg/minikube/constants/constants.go @@ -147,9 +147,11 @@ const AddonsPath = "/etc/kubernetes/addons" const FilesPath = "/files" const ( - KubeletServiceFile = "/lib/systemd/system/kubelet.service" - KubeletSystemdConfFile = "/etc/systemd/system/kubelet.service.d/10-kubeadm.conf" - KubeadmConfigFile = "/var/lib/kubeadm.yaml" + KubeletServiceFile = "/lib/systemd/system/kubelet.service" + KubeletSystemdConfFile = "/etc/systemd/system/kubelet.service.d/10-kubeadm.conf" + KubeadmConfigFile = "/var/lib/kubeadm.yaml" + DefaultCNIConfigPath = "/etc/cni/net.d/k8s.conf" + DefaultRktNetConfigPath = "/etc/rkt/net.d/k8s.conf" ) var Preflights = []string{ diff --git a/test/integration/util/util.go b/test/integration/util/util.go index e854202a0009a6e9f213bf8f52c19368f078e7e1..7de990364c7f6581c3a96e8f93909292f2ed4c19 100644 --- a/test/integration/util/util.go +++ b/test/integration/util/util.go @@ -185,7 +185,7 @@ func (m *MinikubeRunner) SSH(command string) (string, error) { func (m *MinikubeRunner) Start() { switch r := m.Runtime; r { case constants.ContainerdRuntime: - containerdFlags := "--container-runtime=containerd --network-plugin=cni --docker-opt containerd=/var/run/containerd/containerd.sock" + containerdFlags := "--container-runtime=containerd --network-plugin=cni --enable-default-cni --docker-opt containerd=/var/run/containerd/containerd.sock" m.RunCommand(fmt.Sprintf("start %s %s %s --alsologtostderr --v=5", m.StartArgs, m.Args, containerdFlags), true) default: m.RunCommand(fmt.Sprintf("start %s %s --alsologtostderr --v=5", m.StartArgs, m.Args), true)