* zh-trans: content/zh/docs/setup/minikube.md * update trans
27 KiB
reviewers, title, content_template
| reviewers | title | content_template | |||
|---|---|---|---|---|---|
|
使用 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-O 和 containerd
- 启用 CNI (Container Network Interface)
- Ingress
安装
查看 安装 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
要使用 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 %}}