使用 Minikube 安装 Kubernetes
Minikube 是一种可以让你在本地轻松运行 Kubernetes 的工具。 Minikube 在笔记本电脑上的虚拟机(VM)中运行单节点 Kubernetes 集群, 供那些希望尝试 Kubernetes 或进行日常开发的用户使用。
Minikube 功能
Minikube 支持以下 Kubernetes 功能:
- DNS
- NodePorts
- ConfigMaps 和 Secrets
- Dashboards
- 容器运行时: Docker、CRI-O 以及 containerd
- 启用 CNI (容器网络接口)
- Ingress
安装
请参阅安装 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 create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10
输出类似于:
deployment.apps/hello-minikube created
要访问
hello-minikube
Deployment,需要将其作为 Service 公开:kubectl expose deployment hello-minikube --type=NodePort --port=8080
选项
--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 集群正确通信。
说明:
如果你启用了 web 代理,则需要将此信息传递给
minikube start
命令:
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 版本
你可以通过将 --kubernetes-version
字符串添加到 minikube start
命令来指定要用于 Minikube 的 Kubernetes 版本。例如,要运行版本 v1.19.0,你可以运行以下命令:
minikube start --kubernetes-version v1.19.0
指定 VM 驱动程序
你可以通过将 --vm-driver=<enter_driver_name>
参数添加到 minikube start
来更改 VM 驱动程序。
例如命令:
minikube start --vm-driver=<driver_name>
Minikube 支持以下驱动程序:
说明: 有关支持的驱动程序以及如何安装插件的详细信息,请参阅驱动程序。
请注意,下面的 IP 是动态的,可以更改。可以使用 minikube ip
检索。
- vmware (驱动安装) (VMware 统一驱动)
- none (在主机上运行Kubernetes组件,而不是在 VM 中。使用该驱动依赖 Docker (安装 Docker) 和 Linux 环境)
通过别的容器运行时启动集群
你可以通过以下容器运行时启动 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
通过重用 Docker 守护进程使用本地镜像
当为 Kubernetes 使用单个 VM 时,重用 Minikube 的内置 Docker 守护程序非常有用。重用内置守护程序意味着你不必在主机上构建 Docker 镜像仓库并将镜像推入其中。相反,你可以在与 Minikube 相同的 Docker 守护进程内部构建,这可以加速本地实验。
说明: 一定要用非
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
在 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
配置 Kubernetes
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 虚拟机,不保留任何数据或状态。
与集群交互
Kubectl
minikube start
命令创建一个名为 minikube
的 kubectl 上下文。
此上下文包含与 Minikube 集群通信的配置。
Minikube 会自动将此上下文设置为默认值,但如果你以后需要切换回它,请运行:
kubectl config use-context minikube
,
或者像这样,每个命令都附带其执行的上下文:kubectl get pods --context=minikube
。
仪表盘
要访问 Kubernetes Dashboard, 请在启动 Minikube 后在 shell 中运行此命令以获取地址:
minikube dashboard
Service
要访问通过节点(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}"'
持久卷(PersistentVolume)
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 和主机之间共享文件。目前这些都是不可配置的,并且根据你正在使用的驱动程序和操作系统的不同而不同。
说明: 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 启动或重新启动时被启动。
基于 HTTP 代理使用 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 中使用。
设计
Minikube 使用 libmachine 配置虚拟机,kubeadm 配置 Kubernetes 集群。
有关 Minikube 的更多信息,请参阅提案。
其他链接
- 目标和非目标: 有关 Minikube 项目的目标和非目标,请参阅我们的 roadmap。
- 开发指南: 请查阅 CONTRIBUTING.md 获取有关如何提交 Pull Request 的概述。
- 构建 Minikube: 有关如何从源代码构建/测试 Minikube 的说明,请参阅构建指南。
- 添加新依赖: 有关如何向 Minikube 添加新依赖的说明,请参阅添加依赖项指南。
- 添加新插件: 有关如何为 Minikube 添加新插件的说明,请参阅添加插件指南。
- MicroK8s: 希望避免运行虚拟机的 Linux 用户可以考虑使用 MicroK8s 作为替代品。
社区
我们欢迎你向社区提交贡献、提出问题以及参与评论!Minikube 开发人员可以在 Slack 的 #minikube 频道上互动交流 (点击这里获得邀请)。 我们还有 kubernetes-dev Google Groups 邮件列表。 如果你要发信到列表中,请在主题前加上 “minikube: “。