Minikube 是一个可以在本地轻松运行 Kubernetes 的工具。Minikube 在笔记本电脑的虚拟机中运行单节点 Kubernetes 集群,供那些希望尝试 Kubernetes 或对 Kubernetes 进行日常开发的用户使用。
查看 安装 Minikube。
下面是 Minikube 用法的简单示例。
如果您想要更改 VM 驱动,可以添加合适的 --vm-driver=xxx
到 minikube 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 作为容器运行时,运行:
$ 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 作为容器运行时,运行:
$ 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 作为容器的运行时,运行:
$ minikube start \
--network-plugin=cni \
--container-runtime=rkt
这将使用包含 rkt 和 Docker 的替代 minikube ISO 映像,并启用 CNI 网络。
如有需要,可以查看 驱动 查阅支持的驱动的细节和如何安装插件。
当使用只有单个 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。
您可以使用 minikube start
命令时,添加 --kubernetes-version
参数来指定 Minikube 的 Kubernetes 版本。例如,如果要运行 v1.7.3
版本,可以运行下面的命令:
minikube start --kubernetes-version v1.7.3
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 虚拟机。不会保留任何数据和状态。
minikube start
命令会创建一个叫做 “minikube”的 kubectl 上下文。这个上下文包含了与您的 Minikube 集群进行通信的配置信息。
Minikube 会自动将这个上下文设为默认值,如果您将来需要将它切回,运行:
kubectl config use-context minikube
,
或者像这样在每个命令中传递这个上下文:kubectl get pods --context=minikube
。
要访问 Kubernetes Dashboard,在启动 Minikube 后在 shell 中执行此命令来获取访问地址:
minikube dashboard
要访问通过 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}"'
Minikube 支持 hostPath
类型的 PersistentVolumes。
这些 PersistentVolumes 被映射到 Minikube VM 里的目录中。
/data
/var/lib/minikube
/var/lib/docker
下面是一个将数据永久存储在 /data
的 PersistentVolume 配置示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0001
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 5Gi
hostPath:
path: /data/pv0001/
一些驱动会在 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 创建了一个包含了 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 也不支持。包括:
高级调度策略 <!–
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:"
此页是否对您有帮助?
Thanks for the feedback. If you have a specific, answerable question about how to use Kubernetes, ask it on Stack Overflow. Open an issue in the GitHub repo if you want to report a problem or suggest an improvement.