Minikube 是一种可以让您在本地轻松运行 Kubernetes 的工具。Minikube 在笔记本电脑上的虚拟机(VM)中运行单节点 Kubernetes 集群,供那些希望尝试 Kubernetes 或进行日常开发的用户使用。
Minikube 支持以下 Kubernetes 功能:
请参阅安装 Minikube。
这个简短的演示将指导您如何在本地启动、使用和删除 Minikube。请按照以下步骤开始探索 Minikube。
启动 Minikube 并创建一个集群:
minikube start
输出类似于:
Starting local Kubernetes cluster...
Running pre-create checks...
Creating machine...
Starting local Kubernetes cluster...
有关使用特定 Kubernetes 版本、VM 或容器运行时启动集群的详细信息,请参阅启动集群。
现在,您可以使用 kubectl 与集群进行交互。有关详细信息,请参阅与集群交互。
让我们使用名为 echoserver
的镜像创建一个 Kubernetes Deployment,并使用 --port
在端口 8080 上暴露服务。echoserver
是一个简单的 HTTP 服务器。
kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080
输出类似于:
deployment.apps/hello-minikube created
要访问 hello-minikube
Deployment,需要将其作为 Service 公开:
kubectl expose deployment hello-minikube --type=NodePort
选项 --type = NodePort
指定 Service 的类型。
输出类似于:
service/hello-minikube exposed
现在 hello-minikube
Pod 已经启动,但是您必须等到 Pod 启动完全才能通过暴露的 Service 访问它。
检查 Pod 是否启动并运行:
kubectl get pod
如果输出显示 STATUS
为 ContainerCreating
,则表明 Pod 仍在创建中:
NAME READY STATUS RESTARTS AGE
hello-minikube-3383150820-vctvh 0/1 ContainerCreating 0 3s
如果输出显示 STATUS
为 Running
,则 Pod 现在正在运行:
NAME READY STATUS RESTARTS AGE
hello-minikube-3383150820-vctvh 1/1 Running 0 13s
获取暴露 Service 的 URL 以查看 Service 的详细信息:
minikube service hello-minikube --url
要查看本地集群的详细信息,请在浏览器中复制粘贴并访问上一步骤输出的 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-
如果您不再希望运行 Service 和集群,则可以删除它们。
删除 hello-minikube
Service:
kubectl delete services hello-minikube
输出类似于:
service "hello-minikube" deleted
删除 hello-minikube
Deployment:
kubectl delete deployment hello-minikube
输出类似于:
deployment.extensions "hello-minikube" deleted
停止本地 Minikube 集群:
minikube stop
输出类似于:
Stopping "minikube"...
"minikube" stopped.
有关更多信息,请参阅停止集群。
删除本地 Minikube 集群:
minikube delete
输出类似于:
Deleting "minikube" ...
The "minikube" cluster has been deleted.
有关更多信息,请参阅删除集群。
minikube start
命令可用于启动集群。
此命令将创建并配置一台虚拟机,使其运行单节点 Kubernetes 集群。
此命令还会配置您的 kubectl 安装,以便使其能与您的 Kubernetes 集群正确通信。
Note:如果您启用了 web 代理,则需要将此信息传递给
minikube start
命令: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
上下文,并将其设置为 kubectl 的默认上下文。要切换回此上下文,请运行以下命令:
kubectl config use-context minikube
。
您可以通过将 --kubernetes-version
字符串添加到 minikube start
命令来指定要用于 Minikube 的 Kubernetes 版本。例如,要运行版本 v1.14.10,您可以运行以下命令:
minikube start --kubernetes-version v1.14.10
您可以通过将 --vm-driver=<enter_driver_name>
参数添加到 minikube start
来更改 VM 驱动程序。
例如命令:
minikube start --vm-driver=<driver_name>
Minikube 支持以下驱动程序:
Note: 有关支持的驱动程序以及如何安装插件的详细信息,请参阅驱动程序。
minikube ip
检索。您可以通过以下容器运行时启动 Minikube。
要使用 containerd 作为容器运行时,请运行:
minikube start \
--network-plugin=cni \
--enable-default-cni \
--container-runtime=containerd \
--bootstrapper=kubeadm
或者您可以使用扩展版本:
minikube start \
--network-plugin=cni \
--enable-default-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 \
--enable-default-cni \
--container-runtime=cri-o \
--bootstrapper=kubeadm
或者您可以使用扩展版本:
minikube start \
--network-plugin=cni \
--enable-default-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 \
--enable-default-cni \
--container-runtime=rkt
这将使用包含 rkt 和 Docker 的替代 minikube ISO 映像,并启用 CNI 网络。
当为 Kubernetes 使用单个 VM 时,重用 Minikube 的内置 Docker 守护程序非常有用。重用内置守护程序意味着您不必在主机上构建 Docker 镜像仓库并将镜像推入其中。相反,您可以在与 Minikube 相同的 Docker 守护进程内部构建,这可以加速本地实验。
Note:一定要用非
latest
的标签来标记你的 Docker 镜像,并使用该标签来拉取镜像。因为:latest
标记的镜像,其默认镜像拉取策略是Always
,如果在默认的 Docker 镜像仓库(通常是 DockerHub)中没有找到你的 Docker 镜像,最终会导致一个镜像拉取错误(ErrImagePull
)。
要在 Mac/Linux 主机上使用 Docker 守护程序,请在 shell 中运行 docker-env command
:
eval $(minikube docker-env)
您现在可以在 Mac/Linux 机器的命令行中使用 Docker 与 Minikube VM 内的 Docker 守护程序进行通信:
docker ps
Note:在 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
Minikube 有一个 “configurator” 功能,允许用户使用任意值配置 Kubernetes 组件。
要使用此功能,可以在 minikube start
命令中使用 --extra-config
参数。
此参数允许重复,因此您可以使用多个不同的值多次传递它以设置多个选项。
此参数采用 component.key=value
形式的字符串,其中 component
是下面列表中的一个字符串,key
是配置项名称,value
是要设置的值。
通过检查每个组件的 Kubernetes componentconfigs
的文档,可以找到有效的 key。
下面是每个组件所支持的配置的介绍文档:
要在 Kubelet 上将 MaxPods
设置更改为 5,请传递此参数:--extra-config=kubelet.MaxPods=5
。
此功能还支持嵌套结构。要在调度程序上将 LeaderElection.LeaderElect
设置更改为 true
,请传递此参数:--extra-config=scheduler.LeaderElection.LeaderElect=true
。
要将 apiserver
的 AuthorizationMode
设置为 RBAC
,您可以使用:--extra-config=apiserver.authorization-mode=RBAC
。
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)端口公开的 Service,请在启动 Minikube 后在 shell 中运行此命令以获取地址:
minikube service [-n NAMESPACE] [--url] NAME
Minikube VM 通过 host-only IP 暴露给主机系统,可以通过 minikube ip
命令获得该 IP。
在 NodePort 上,可以通过该 IP 地址访问任何类型为 NodePort
的服务。
要确定服务的 NodePort,可以像这样使用 kubectl
命令:
kubectl get service $SERVICE --output='jsonpath="{.spec.ports[0].nodePort}"'
Minikube 支持 hostPath
类型的 持久卷。
这些持久卷会映射为 Minikube VM 内的目录。
Minikube VM 引导到 tmpfs,因此大多数目录不会在重新启动(minikube stop
)之后保持不变。
但是,Minikube 被配置为保存存储在以下主机目录下的文件:
/data
/var/lib/minikube
/var/lib/docker
下面是一个持久卷配置示例,用于在 /data
目录中保存数据:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0001
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 5Gi
hostPath:
path: /data/pv0001/
一些驱动程序将在 VM 中挂载一个主机文件夹,以便您可以轻松地在 VM 和主机之间共享文件。目前这些都是不可配置的,并且根据您正在使用的驱动程序和操作系统的不同而不同。
Note: KVM 驱动程序中尚未实现主机文件夹共享。
驱动 | 操作系统 | 宿主机文件夹 | 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 守护进程的虚拟机。 当 Kubernetes 尝试使用 Docker 调度容器时,Docker 守护程序可能需要访问外部网络来拉取容器镜像。
如果您配置了 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 使用 libmachine 配置虚拟机,kubeadm 配置 Kubernetes 集群。
有关 Minikube 的更多信息,请参阅提案。
我们欢迎您向社区提交贡献、提出问题以及参与评论!Minikube 开发人员可以在 Slack 的 #minikube 频道上互动交流(点击这里获得邀请)。我们还有 kubernetes-dev Google Groups 邮件列表。如果您要发信到列表中,请在主题前加上 “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.