--- reviewers: - dlorenc - balopat - aaron-prindle title: 使用 Minikube 在本地运行 Kubernetes content_template: templates/concept --- {{% capture overview %}} Minikube 是一个可以在本地轻松运行 Kubernetes 的工具。Minikube 在笔记本电脑的虚拟机中运行单节点 Kubernetes 集群,供那些希望尝试 Kubernetes 或对 Kubernetes 进行日常开发的用户使用。 {{% /capture %}} {{% capture body %}} ## Minikube 的特性 * Minikube 支持的 Kubernetes 特性如下: * DNS * NodePorts * ConfigMaps 和 Secrets * Dashboards * 容器运行时: Docker, [rkt](https://github.com/rkt/rkt), [CRI-O](https://github.com/kubernetes-incubator/cri-o) 和 [containerd](https://github.com/containerd/containerd) * 启用 CNI (Container Network Interface) * Ingress ## 安装 查看 [安装 Minikube](/docs/tasks/tools/install-minikube/)。 ## 快速入门 下面是 Minikube 用法的简单示例。 如果您想要更改 VM 驱动,可以添加合适的 `--vm-driver=xxx` 到 `minikube start` 命令。Minikube 支持下面的驱动: * virtualbox * vmwarefusion * kvm2 ([安装驱动](https://git.k8s.io/minikube/docs/drivers.md#kvm2-driver)) * kvm ([安装驱动](https://git.k8s.io/minikube/docs/drivers.md#kvm-driver)) * hyperkit ([安装驱动](https://git.k8s.io/minikube/docs/drivers.md#hyperkit-driver)) * xhyve ([安装驱动](https://git.k8s.io/minikube/docs/drivers.md#xhyve-driver)) (deprecated) 注意下面的 IP 是动态的、可能不同的。它可以通过 `minikube ip` 获取。 ```shell $ minikube start Starting local Kubernetes cluster... Running pre-create checks... Creating machine... Starting local Kubernetes cluster... $ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080 deployment.apps/hello-minikube created $ kubectl expose deployment hello-minikube --type=NodePort service/hello-minikube exposed # 现在我们启动了一个 echoserver pod,但是必须等待这个 pod 启动成功后才可以通过暴露的服务对它进行访问。 # 要检查这个 pod 是否启动并运行,我们可以使用下面的命令: $ kubectl get pod NAME READY STATUS RESTARTS AGE hello-minikube-3383150820-vctvh 0/1 ContainerCreating 0 3s # 我们可以从 ContainerCreating 的状态得知,这个 pod 仍然处于创建中。 $ kubectl get pod NAME READY STATUS RESTARTS AGE hello-minikube-3383150820-vctvh 1/1 Running 0 13s # 我们可以看到这个 pod 现在处于 Running 状态,我们可以对它执行 curl: $ curl $(minikube service hello-minikube --url) Hostname: hello-minikube-7c77b68cff-8wdzq Pod Information: -no pod information available- Server values: server_version=nginx: 1.13.3 - lua: 10008 Request Information: client_address=172.17.0.1 method=GET real path=/ query= request_version=1.1 request_scheme=http request_uri=http://192.168.99.100:8080/ Request Headers: accept=*/* host=192.168.99.100:30674 user-agent=curl/7.47.0 Request Body: -no body in request- $ kubectl delete services hello-minikube service "hello-minikube" deleted $ kubectl delete deployment hello-minikube deployment.extensions "hello-minikube" deleted $ minikube stop Stopping local Kubernetes cluster... Stopping "minikube"... ``` ### 其他容器运行时 #### containerd 要使用 [containerd](https://github.com/containerd/containerd) 作为容器运行时,运行: ```bash $ minikube start \ --network-plugin=cni \ --container-runtime=containerd \ --bootstrapper=kubeadm ``` 或者您可以使用命令的扩展版本: ```bash $ minikube start \ --network-plugin=cni \ --extra-config=kubelet.container-runtime=remote \ --extra-config=kubelet.container-runtime-endpoint=unix:///run/containerd/containerd.sock \ --extra-config=kubelet.image-service-endpoint=unix:///run/containerd/containerd.sock \ --bootstrapper=kubeadm ``` #### CRI-O 要使用 [CRI-O](https://github.com/kubernetes-incubator/cri-o) 作为容器运行时,运行: ```bash $ minikube start \ --network-plugin=cni \ --container-runtime=cri-o \ --bootstrapper=kubeadm ``` 或者您可以使用命令的扩展版本: ```bash $ minikube start \ --network-plugin=cni \ --extra-config=kubelet.container-runtime=remote \ --extra-config=kubelet.container-runtime-endpoint=/var/run/crio.sock \ --extra-config=kubelet.image-service-endpoint=/var/run/crio.sock \ --bootstrapper=kubeadm ``` #### rkt container engine 要使用 [rkt](https://github.com/rkt/rkt) 作为容器的运行时,运行: ```shell $ minikube start \ --network-plugin=cni \ --container-runtime=rkt ``` 这将使用包含 rkt 和 Docker 的替代 minikube ISO 映像,并启用 CNI 网络。 ### 驱动插件 如有需要,可以查看 [驱动](https://git.k8s.io/minikube/docs/drivers.md) 查阅支持的驱动的细节和如何安装插件。 ### 通过重用 Docker daemon 来使用本地镜像 当使用只有单个 VM 的 Kubernetes 集群时,重用 Minikube 的内置 Docker daemon 非常方便; 因为这意味着您不必在宿主机上构建 docker regitstry 并将镜像 push 进去 - 您可以在与 minikube 相同的 docker daemon 内部构建,从而加速本地实验。只需确保使用 'latest' 之外的其他标签标记 Docker 镜像,并在拉取镜像时使用该标签。否则,如果你没有指定镜像的版本,它将被假定为`:latest`,相应的拉取镜像策略为 `Always`,最终可能导致 `ErrImagePull`,因为您可能在默认的 docker registry(通常是 DockerHub )中还没有任何版本的镜像。 为了能够在 mac/linux 主机上使用 docker daemon,请在 shell 中使用 `docker-env command`: ```shell eval $(minikube docker-env) ``` 现在您应该可以在您的 mac/linux 主机上使用 docker 命令与 minikube VM 中的 docker daemon 进行通信了: ```shell docker ps ``` 在 Centos 7 操作系统上,docker 可能报出下面的错误: ```shell Could not read CA certificate "/etc/docker/ca.pem": open /etc/docker/ca.pem: no such file or directory ``` 修复办法是更新 /etc/sysconfig/docker,确保 Minikube 的环境变量的变化和预期一致: ```shell < DOCKER_CERT_PATH=/etc/docker --- > if [ -z "${DOCKER_CERT_PATH}" ]; then > DOCKER_CERT_PATH=/etc/docker > fi ``` 记得关闭 imagePullPolicy:Always,否则 Kubernetes 不会使用您在本地构建的镜像。 ## 管理您的集群 ### 启动一个集群 `minikube start` 命令可以用来启动您的集群。 这个命令会创建和配置一个虚拟机,里面运行了一个单节点的 Kubernetes 集群。 这个命令也会安装 [kubectl](/docs/user-guide/kubectl-overview/) 用于和集群进行通信。 ```shell https_proxy= minikube start --docker-env http_proxy= --docker-env https_proxy= --docker-env no_proxy=192.168.99.0/24 ``` 不幸的是,仅仅设置环境变量是不够的。 Minikube 也会创建 "minikube" context,并且在 kubectl 把它设置为默认值。 运行这个命令 `kubectl config use-context minikube` 可以再切换到这个 context。 #### 指定 Kubernetes 版本 您可以使用 `minikube start` 命令时,添加 `--kubernetes-version` 参数来指定 Minikube 的 Kubernetes 版本。例如,如果要运行 `v1.7.3` 版本,可以运行下面的命令: ``` minikube start --kubernetes-version v1.7.3 ``` ### 配置 Kubernetes Minikube 有一个 "配置器" 特性,允许用户为 Kubernetes 组件配置任意值。要使用这个特性,您可以在使用 `minikube start` 时加上 `--extra-config` 参数。 这个参数是可以重复的,所以您可以多次使用不同的值设置不同的选项。 这个参数采用 `component.key=value` 形式的字符串,其中 `component` 是下面列表中的字符串,`key` 是配置结构的值,`value` 是配置项要设置的值。 通过检查每个组件的 Kubernetes `componentconfigs` 文档,可以找到有效的键值。 以下是每个支持配置的文档: * [kubelet](https://godoc.org/k8s.io/kubernetes/pkg/kubelet/apis/config#KubeletConfiguration) * [apiserver](https://godoc.org/k8s.io/kubernetes/cmd/kube-apiserver/app/options#ServerRunOptions) * [proxy](https://godoc.org/k8s.io/kubernetes/pkg/proxy/apis/config#KubeProxyConfiguration) * [controller-manager](https://godoc.org/k8s.io/kubernetes/pkg/controller/apis/config#KubeControllerManagerConfiguration) * [etcd](https://godoc.org/github.com/coreos/etcd/etcdserver#ServerConfig) * [scheduler](https://godoc.org/k8s.io/kubernetes/pkg/scheduler/apis/config#KubeSchedulerConfiguration) #### 示例 要在 Kubelet 上将 `MaxPods` 设置更改为 5,请传递此参数:`--extra-config=kubelet.MaxPods=5`。 这个特性也支持嵌套结构。要把调度器的 `LeaderElection.LeaderElect` 设置为 `true`,传递这个参数 `--extra-config=scheduler.LeaderElection.LeaderElect=true`。 ### 停止集群 可以使用 `minikube stop` 命令来停止您的集群。这个命令会停止 Minikube 虚拟机,但是保留了集群里的所有状态和数据。重新启动这个集群会恢复到之前的状态。 ### 删除集群 可以使用 `minikube delete` 命令来删除您的集群。 这个命令会停止和删除 Minikube 虚拟机。不会保留任何数据和状态。 ## 和您的集群进行交互 ### Kubectl `minikube start` 命令会创建一个叫做 "minikube"的 [kubectl 上下文](/docs/reference/generated/kubectl/kubectl-commands#-em-set-context-em-)。这个上下文包含了与您的 Minikube 集群进行通信的配置信息。 Minikube 会自动将这个上下文设为默认值,如果您将来需要将它切回,运行: `kubectl config use-context minikube`, 或者像这样在每个命令中传递这个上下文:`kubectl get pods --context=minikube`。 ### Dashboard 要访问 [Kubernetes Dashboard](/docs/tasks/access-application-cluster/web-ui-dashboard/),在启动 Minikube 后在 shell 中执行此命令来获取访问地址: ```shell minikube dashboard ``` ### Services 要访问通过 node port 暴露的 service,在启动 Minikube 后在 shell 中执行此命令来获取访问地址: ```shell minikube service [-n NAMESPACE] [--url] NAME ``` ## 网络 Minikube VM 通过一个 host-only IP 地址暴露给宿主机,这个 IP 可以通过 `minikube ip` 命令获取。任何的 `NodePort` 类型的 service 可以通过这个 IP 在 NodePort 上来访问。 要确定服务的 NodePort,您可以使用这样的 `kubectl` 命令: `kubectl get service $SERVICE --output='jsonpath="{.spec.ports[0].nodePort}"'` ## Persistent Volumes Minikube 支持 `hostPath` 类型的 [PersistentVolumes](/docs/concepts/storage/persistent-volumes/)。 这些 PersistentVolumes 被映射到 Minikube VM 里的目录中。 * `/data` * `/var/lib/minikube` * `/var/lib/docker` 下面是一个将数据永久存储在 `/data` 的 PersistentVolume 配置示例: ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv0001 spec: accessModes: - ReadWriteOnce capacity: storage: 5Gi hostPath: path: /data/pv0001/ ``` ## 挂载宿主机的目录 一些驱动会在 VM 内挂载宿主机的目录,以便可以在 VM 和宿主机方便的共享文件。目前这些是不可配置的,而且根据您使用的 OS 和驱动而有所不同。 {{< note >}} 目前 KVM 驱动尚未实现宿主机目录共享。 {{< /note >}} | Driver | OS | HostFolder | VM | | --- | --- | --- | --- | | VirtualBox | Linux | /home | /hosthome | | VirtualBox | macOS | /Users | /Users | | VirtualBox | Windows | C://Users | /c/Users | | VMware Fusion | macOS | /Users | /Users | | Xhyve | macOS | /Users | /Users | ## 私有镜像仓库 要访问私有镜像仓库,请按照 [这个页面](/docs/concepts/containers/images/) 的步骤进行操作。 我们推荐您使用 `ImagePullSecrets`,但是如果您想要配置在 Minikube VM 上能够访问,您可以把 `.dockercfg` 放在 `/home/docker` 目录或者把 `config.json` 放在 `/home/docker/.docker` 目录下。 ## 插件 为了能让 Minikube 能够正常地启动或者重启自定义插件,请把您要在 Minikube 里启动的插件放在 `~/.minikube/addons` 目录。在这个目录中的插件会被移动到 Minikube VM 中,并且在 Minikube 每次启动或者重启时启动。 ## 在 Minikube 中使用 HTTP 代理 Minikube 创建了一个包含了 Kubernetes 和 Docker daemon 的虚拟机。当 Kubernetes 尝试使用 Docker 调度容器时,Docker daemon 可能需要访问外部网络来拉取容器。 如果您通过 HTTP 代理访问,您可能要设置 Docker 的代理配置。 通过在运行 `minikube start` 时传入需要的环境变量来实现这个配置。 例如: ```shell $ minikube start --docker-env http_proxy=http://$YOURPROXY:PORT \ --docker-env https_proxy=https://$YOURPROXY:PORT ``` 如果您的虚拟机地址是 192.168.99.100,那么您的代理设置可能会阻止 `kubectl` 直接访问它。 要绕过此 IP 地址的代理配置,您应该修改 no_proxy 设置。您可以这样做: ```shell $ export no_proxy=$no_proxy,$(minikube ip) ``` ## 已知问题 * 需要 Cloud Provider 的特性在 Minikube 不能工作。这些特性包括: * LoadBalancer * 需要多个节点的特性 Minikube 也不支持。包括: * 高级调度策略 ## 设计 Minikube 使用 [libmachine](https://github.com/docker/machine/tree/master/libmachine) 来提供虚拟机,使用 [kubeadm](https://github.com/kubernetes/kubeadm) 来提供 Kubernetes 集群。 想要了解更多 Minikube 的信息,查看 [提议](https://git.k8s.io/community/contributors/design-proposals/cluster-lifecycle/local-cluster-ux.md)。 ## 其他链接 * **目标和非目标**: 对于 Minikube 项目的目标和非目标, 请查看我们的 [路线图](https://git.k8s.io/minikube/docs/contributors/roadmap.md)。 * **开发指南**: 查看 [CONTRIBUTING.md](https://git.k8s.io/minikube/CONTRIBUTING.md) 来了解如果发起 pull requests。 * **编译 Minikube**: 有关如何从源代码构建/测试 Minikube 的说明,请查看 [编译指南](https://git.k8s.io/minikube/docs/contributors/build_guide.md)。 * **添加新的依赖**: 有关如何向 Minikube 添加新依赖项的说明,查看 [添加依赖指南](https://git.k8s.io/minikube/docs/contributors/adding_a_dependency.md)。 * **添加新的组件**: 有关如何为 Minikube 添加新插件的说明,查看 [添加插件指南](https://git.k8s.io/minikube/docs/contributors/adding_an_addon.md)。 * **更新 Kubernetes**: 有关如何更新 Kubernetes 的说明,查看 [更新 Kubernetes 指南](https://git.k8s.io/minikube/docs/contributors/updating_kubernetes.md)。 ## 社区 我们欢迎和鼓励所有的贡献、问题和评论!Minikube 开发者在 [Slack](https://kubernetes.slack.com)上 #minikube 频道闲逛(获得邀请[这里](http://slack.kubernetes.io/))。我们还有[kubernetes-dev Google Groups邮件列表](https://groups.google.com/forum/#!forum/kubernetes-dev)。如果您要发布到列表中,请在主题前加上"minikube:" {{% /capture %}}