使用 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。

  1. 启动 Minikube 并创建一个集群:

    1. minikube start

    输出类似于:

    1. Starting local Kubernetes cluster...
    2. Running pre-create checks...
    3. Creating machine...
    4. Starting local Kubernetes cluster...

    有关使用特定 Kubernetes 版本、VM 或容器运行时启动集群的详细信息,请参阅启动集群

  2. 现在,你可以使用 kubectl 与集群进行交互。有关详细信息,请参阅与集群交互

    让我们使用名为 echoserver 的镜像创建一个 Kubernetes Deployment,并使用 --port 在端口 8080 上暴露服务。echoserver 是一个简单的 HTTP 服务器。

    1. kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10

    输出类似于:

    1. deployment.apps/hello-minikube created
  3. 要访问 hello-minikube Deployment,需要将其作为 Service 公开:

    1. kubectl expose deployment hello-minikube --type=NodePort --port=8080

    选项 --type = NodePort 指定 Service 的类型。

    输出类似于:

    1. service/hello-minikube exposed
  4. 现在 hello-minikube Pod 已经启动,但是你必须等到 Pod 启动完全才能通过暴露的 Service 访问它。

    检查 Pod 是否启动并运行:

    1. kubectl get pod

    如果输出显示 STATUSContainerCreating,则表明 Pod 仍在创建中:

    1. NAME READY STATUS RESTARTS AGE
    2. hello-minikube-3383150820-vctvh 0/1 ContainerCreating 0 3s

    如果输出显示 STATUSRunning,则 Pod 现在正在运行:

    1. NAME READY STATUS RESTARTS AGE
    2. hello-minikube-3383150820-vctvh 1/1 Running 0 13s
  5. 获取暴露 Service 的 URL 以查看 Service 的详细信息:

    1. minikube service hello-minikube --url
  6. 要查看本地集群的详细信息,请在浏览器中复制粘贴并访问上一步骤输出的 URL。

    输出类似于:

    1. Hostname: hello-minikube-7c77b68cff-8wdzq
    2. Pod Information:
    3. -no pod information available-
    4. Server values:
    5. server_version=nginx: 1.13.3 - lua: 10008
    6. Request Information:
    7. client_address=172.17.0.1
    8. method=GET
    9. real path=/
    10. query=
    11. request_version=1.1
    12. request_scheme=http
    13. request_uri=http://192.168.99.100:8080/
    14. Request Headers:
    15. accept=*/*
    16. host=192.168.99.100:30674
    17. user-agent=curl/7.47.0
    18. Request Body:
    19. -no body in request-

    如果你不再希望运行 Service 和集群,则可以删除它们。

  7. 删除 hello-minikube Service:

    1. kubectl delete services hello-minikube

    输出类似于:

    1. service "hello-minikube" deleted
  8. 删除 hello-minikube Deployment:

    1. kubectl delete deployment hello-minikube

    输出类似于:

    1. deployment.extensions "hello-minikube" deleted
  9. 停止本地 Minikube 集群:

    1. minikube stop

    输出类似于:

    1. Stopping "minikube"...
    2. "minikube" stopped.

    有关更多信息,请参阅停止集群

  10. 删除本地 Minikube 集群:

    1. minikube delete

    输出类似于:

    1. Deleting "minikube" ...
    2. The "minikube" cluster has been deleted.

    有关更多信息,请参阅删除集群

管理你的集群

启动集群

minikube start 命令可用于启动集群。

此命令将创建并配置一台虚拟机,使其运行单节点 Kubernetes 集群。

此命令还会配置你的 kubectl 安装,以便使其能与你的 Kubernetes 集群正确通信。

说明:

如果你启用了 web 代理,则需要将此信息传递给 minikube start 命令:

  1. 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,你可以运行以下命令:

  1. minikube start --kubernetes-version v1.19.0

指定 VM 驱动程序

你可以通过将 --vm-driver=<enter_driver_name> 参数添加到 minikube start 来更改 VM 驱动程序。

例如命令:

  1. minikube start --vm-driver=<driver_name>

Minikube 支持以下驱动程序:

说明: 有关支持的驱动程序以及如何安装插件的详细信息,请参阅驱动程序

请注意,下面的 IP 是动态的,可以更改。可以使用 minikube ip 检索。

  • vmware (驱动安装) (VMware 统一驱动)
  • none (在主机上运行Kubernetes组件,而不是在 VM 中。使用该驱动依赖 Docker (安装 Docker) 和 Linux 环境)

通过别的容器运行时启动集群

你可以通过以下容器运行时启动 Minikube。

要使用 containerd 作为容器运行时,请运行:

  1. minikube start \
  2. --network-plugin=cni \
  3. --enable-default-cni \
  4. --container-runtime=containerd \
  5. --bootstrapper=kubeadm

或者你可以使用扩展版本:

  1. minikube start \
  2. --network-plugin=cni \
  3. --enable-default-cni \
  4. --extra-config=kubelet.container-runtime=remote \
  5. --extra-config=kubelet.container-runtime-endpoint=unix:///run/containerd/containerd.sock \
  6. --extra-config=kubelet.image-service-endpoint=unix:///run/containerd/containerd.sock \
  7. --bootstrapper=kubeadm

要使用 CRI-O 作为容器运行时,请运行:

  1. minikube start \
  2. --network-plugin=cni \
  3. --enable-default-cni \
  4. --container-runtime=cri-o \
  5. --bootstrapper=kubeadm

或者你可以使用扩展版本:

  1. minikube start \
  2. --network-plugin=cni \
  3. --enable-default-cni \
  4. --extra-config=kubelet.container-runtime=remote \
  5. --extra-config=kubelet.container-runtime-endpoint=/var/run/crio.sock \
  6. --extra-config=kubelet.image-service-endpoint=/var/run/crio.sock \
  7. --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

  1. eval $(minikube docker-env)

你现在可以在 Mac/Linux 机器的命令行中使用 Docker 与 Minikube VM 内的 Docker 守护程序进行通信:

  1. docker ps

在 Centos 7 上,Docker 可能会报如下错误:

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

你可以通过更新 /etc/sysconfig/docker 来解决此问题,以确保 Minikube 的环境更改得到遵守:

  1. < DOCKER_CERT_PATH=/etc/docker
  2. ---
  3. > if [ -z "${DOCKER_CERT_PATH}" ]; then
  4. > DOCKER_CERT_PATH=/etc/docker
  5. > 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

要将 apiserverAuthorizationMode 设置为 RBAC,你可以使用:--extra-config=apiserver.authorization-mode=RBAC

停止集群

minikube stop 命令可用于停止集群。

此命令关闭 Minikube 虚拟机,但保留所有集群状态和数据。

再次启动集群会将其恢复到以前的状态。

删除集群

minikube delete 命令可用于删除集群。

此命令将关闭并删除 Minikube 虚拟机,不保留任何数据或状态。

与集群交互

Kubectl

minikube start 命令创建一个名为 minikubekubectl 上下文

此上下文包含与 Minikube 集群通信的配置。

Minikube 会自动将此上下文设置为默认值,但如果你以后需要切换回它,请运行:

kubectl config use-context minikube

或者像这样,每个命令都附带其执行的上下文:kubectl get pods --context=minikube

仪表盘

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

  1. minikube dashboard

Service

要访问通过节点(Node)端口公开的 Service,请在启动 Minikube 后在 shell 中运行此命令以获取地址:

  1. 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 目录中保存数据:

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: pv0001
  5. spec:
  6. accessModes:
  7. - ReadWriteOnce
  8. capacity:
  9. storage: 5Gi
  10. hostPath:
  11. path: /data/pv0001/

挂载宿主机文件夹

一些驱动程序将在 VM 中挂载一个主机文件夹,以便你可以轻松地在 VM 和主机之间共享文件。目前这些都是不可配置的,并且根据你正在使用的驱动程序和操作系统的不同而不同。

说明: KVM 驱动程序中尚未实现主机文件夹共享。

驱动操作系统宿主机文件夹VM 文件夹
VirtualBoxLinux/home/hosthome
VirtualBoxmacOS/Users/Users
VirtualBoxWindowsC://Users/c/Users
VMware FusionmacOS/Users/Users
XhyvemacOS/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 期间将所需的环境变量作为参数传递给启动命令。

例如:

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

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

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

  1. 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: “。