Files
Wang Bing 366604e4cf zh-trans: content/zh/docs/setup/minikube.md (#13798)
* zh-trans: content/zh/docs/setup/minikube.md

* update trans
2019-06-09 07:07:05 -07:00

27 KiB
Raw Permalink Blame History

reviewers, title, content_template
reviewers title content_template
dlorenc
balopat
aaron-prindle
使用 Minikube 在本地运行 Kubernetes templates/concept

{{% capture overview %}}

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

{{% /capture %}}

{{% capture body %}}

Minikube 的特性

  • Minikube 支持的 Kubernetes 特性如下:
    • DNS
    • NodePorts
    • ConfigMaps 和 Secrets
    • Dashboards
    • 容器运行时: Docker, rkt, CRI-Ocontainerd
    • 启用 CNI (Container Network Interface)
    • Ingress

安装

查看 安装 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 里的目录中。

  • /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 驱动尚未实现宿主机目录共享。 {{< /note >}}

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)

已知问题

  • 需要 Cloud Provider 的特性在 Minikube 不能工作。这些特性包括:
    • LoadBalancer
  • 需要多个节点的特性 Minikube 也不支持。包括:
    • 高级调度策略

设计

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

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

其他链接

  • 目标和非目标: 对于 Minikube 项目的目标和非目标, 请查看我们的 路线图
  • 开发指南: 查看 CONTRIBUTING.md 来了解如果发起 pull requests。
  • 编译 Minikube: 有关如何从源代码构建/测试 Minikube 的说明,请查看 编译指南
  • 添加新的依赖: 有关如何向 Minikube 添加新依赖项的说明,查看 添加依赖指南
  • 添加新的组件: 有关如何为 Minikube 添加新插件的说明,查看 添加插件指南
  • 更新 Kubernetes: 有关如何更新 Kubernetes 的说明,查看 更新 Kubernetes 指南

社区

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