设置

Edit This Page

使用 Minikube 在本地运行 Kubernetes

Minikube 是一个可以在本地轻松运行 Kubernetes 的工具。Minikube 在笔记本电脑的虚拟机中运行单节点 Kubernetes 集群,供那些希望尝试 Kubernetes 或对 Kubernetes 进行日常开发的用户使用。

Minikube 的特性

安装

查看 安装 Minikube

快速入门

下面是 Minikube 用法的简单示例。 如果您想要更改 VM 驱动,可以添加合适的 --vm-driver=xxxminikube start 命令。Minikube 支持下面的驱动:

注意下面的 IP 是动态的、可能不同的。它可以通过 minikube ip 获取。

$ 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 作为容器运行时,运行:

$ minikube start \
    --network-plugin=cni \
    --container-runtime=containerd \
    --bootstrapper=kubeadm

或者您可以使用命令的扩展版本:

$ 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 作为容器运行时,运行:

$ minikube start \
    --network-plugin=cni \
    --container-runtime=cri-o \
    --bootstrapper=kubeadm

或者您可以使用命令的扩展版本:

$ 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 作为容器的运行时,运行:

$ minikube start \
    --network-plugin=cni \
    --container-runtime=rkt

这将使用包含 rkt 和 Docker 的替代 minikube ISO 映像,并启用 CNI 网络。

驱动插件

如有需要,可以查看 驱动 查阅支持的驱动的细节和如何安装插件。

通过重用 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

eval $(minikube docker-env)

现在您应该可以在您的 mac/linux 主机上使用 docker 命令与 minikube VM 中的 docker daemon 进行通信了:

docker ps

在 Centos 7 操作系统上,docker 可能报出下面的错误:

Could not read CA certificate "/etc/docker/ca.pem": open /etc/docker/ca.pem: no such file or directory

修复办法是更新 /etc/sysconfig/docker,确保 Minikube 的环境变量的变化和预期一致:

< DOCKER_CERT_PATH=/etc/docker
---
> if [ -z "${DOCKER_CERT_PATH}" ]; then
>   DOCKER_CERT_PATH=/etc/docker
> fi

记得关闭 imagePullPolicy:Always,否则 Kubernetes 不会使用您在本地构建的镜像。

管理您的集群

启动一个集群

minikube start 命令可以用来启动您的集群。 这个命令会创建和配置一个虚拟机,里面运行了一个单节点的 Kubernetes 集群。 这个命令也会安装 kubectl 用于和集群进行通信。

https_proxy=<my proxy> minikube start --docker-env http_proxy=<my proxy> --docker-env https_proxy=<my 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 上将 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 上下文。这个上下文包含了与您的 Minikube 集群进行通信的配置信息。

Minikube 会自动将这个上下文设为默认值,如果您将来需要将它切回,运行:

kubectl config use-context minikube

或者像这样在每个命令中传递这个上下文:kubectl get pods --context=minikube

Dashboard

要访问 Kubernetes Dashboard,在启动 Minikube 后在 shell 中执行此命令来获取访问地址:

minikube dashboard

Services

要访问通过 node port 暴露的 service,在启动 Minikube 后在 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。 这些 PersistentVolumes 被映射到 Minikube VM 里的目录中。

挂载宿主机的目录

一些驱动会在 VM 内挂载宿主机的目录,以便可以在 VM 和宿主机方便的共享文件。目前这些是不可配置的,而且根据您使用的 OS 和驱动而有所不同。

Note:

目前 KVM 驱动尚未实现宿主机目录共享。

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

私有镜像仓库

要访问私有镜像仓库,请按照 这个页面 的步骤进行操作。

我们推荐您使用 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 时传入需要的环境变量来实现这个配置。

例如:

$ minikube start --docker-env http_proxy=http://$YOURPROXY:PORT \
                 --docker-env https_proxy=https://$YOURPROXY:PORT

如果您的虚拟机地址是 192.168.99.100,那么您的代理设置可能会阻止 kubectl 直接访问它。

要绕过此 IP 地址的代理配置,您应该修改 no_proxy 设置。您可以这样做:

$ export no_proxy=$no_proxy,$(minikube ip)

已知问题

Minikube uses libmachine for provisioning VMs, and kubeadm to provision a Kubernetes cluster.

For more information about Minikube, see the proposal. –>

设计

Minikube 使用 libmachine 来提供虚拟机,使用 kubeadm 来提供 Kubernetes 集群。

想要了解更多 Minikube 的信息,查看 提议

其他链接

社区

我们欢迎和鼓励所有的贡献、问题和评论!Minikube 开发者在 [Slack](https://kubernetes.slack.com)上 #minikube 频道闲逛(获得邀请这里)。我们还有[kubernetes-dev Google Groups邮件列表](https://groups.google.com/forum/#!forum/kubernetes-dev)。如果您要发布到列表中,请在主题前加上"minikube:"

反馈