如何使用minikube进行本地Kubernetes开发和测试

来自菜鸟教程
跳转至:导航、​搜索

介绍

Kubernetes 是一个开源容器编排系统,用于自动化软件部署、扩展和管理。 它在企业级非常流行,用于促进服务器资源的水平扩展,包括DigitalOcean在内的许多云提供商都提供了自己的托管Kubernetes解决方案。

由于 Kubernetes 部署通常依赖于多台服务器,因此在将 Kubernetes 堆栈部署到生产环境之前对其进行开发和测试可能会占用大量资源。 出于这个原因,Kubernetes 作者维护了一个名为 minikube 的配套项目,它可以与 Docker 等容器框架一起工作,以模拟在单台机器上运行的 Kubernetes 集群。

在本教程中,您将在本地计算机或远程服务器上安装 minikube。 您还将访问内置的 Kubernetes 仪表板以在浏览器中探索您的集群。 集群运行后,您将部署一个测试应用程序并探索如何通过 minikube 访问它。 在本教程的最后一部分,您将探索如何使用配置文件将 Minikube 与远程 Kubernetes 集群一起使用

先决条件

要遵循本教程,您将需要:

  • 熟悉 Kubernetes 概念。 详情请参考文章【X28X】Kubernetes简介【X61X】。
  • Docker 容器框架安装在您将运行 minikube 的 Windows、Mac 或 Linux 环境中。 如果你不是在Linux环境下工作,安装步骤参考Docker的文档。 如果您在 Linux 上使用 Docker,请确保您已 将其配置为无需 sudo 权限 即可工作。
  • Homebrew 包管理器。 Homebrew 可以安装在 macOSLinux 环境中。 如果您使用的是 Windows,您可以在 WSL 下安装 Homebrew。
  • 至少 2 个 CPU、2GB 内存和 20GB 磁盘空间可用于安装 Minikube 的环境。

第 1 步 — 安装和运行 Minikube

您可以通过 Homebrew 包管理器安装 minikube

brew install minikube
Output…
==> Installing minikube
==> Pouring minikube--1.25.2.x86_64_linux.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /home/sammy/.linuxbrew/etc/bash_completion.d
==> Summary
🍺  /home/sammy/.linuxbrew/Cellar/minikube/1.25.2: 9 files, 70.0MB
…

注意: 在 Windows 上使用 minikube 有一些注意事项。 它在 WSL2(Linux Windows 子系统的当前版本)下工作,但需要将其配置为使用 Docker 而不是它自己的默认后端。 这要求您 安装支持 WSL2 的 Docker ,然后在按照本文档安装 minikube 后,运行 minikube config set driver docker


要开始使用 minikube,您可以使用 start 命令运行它,该命令将使用多个 Docker 容器和最新稳定版本的 Kubernetes 自动创建本地 Kubernetes 集群。

minikube start

这需要一点时间,并且应该会产生类似于以下内容的输出,请注意已为您配置了 kubectl

Output👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
💾  Downloading Kubernetes v1.23.1 preload ...
    > preloaded-images-k8s-v16-v1...: 504.42 MiB / 504.42 MiB  100.00% 81.31 Mi
    > gcr.io/k8s-minikube/kicbase: 378.98 MiB / 378.98 MiB  100.00% 31.21 MiB p
🔥  Creating docker container (CPUs=2, Memory=1987MB) ...
🐳  Preparing Kubernetes v1.23.1 on Docker 20.10.12 ...
    ▪ kubelet.housekeeping-interval=5m
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

注意:如果你想用非默认版本的Kubernetes运行minikube进行兼容性检查,你可以运行minikube start,例如[X158X ]。


通过 Homebrew 安装 minikube 还提供了 kubectl,这是通过命令行管理 Kubernetes 集群的主要工具。 您现在可以像运行任何其他 Kubernetes 集群一样运行 kubectl get 以列出集群中运行的所有 Pod:

kubectl get pods -A

-A 参数将返回在 all 命名空间中运行的 pod。

OutputNAMESPACE     NAME                               READY   STATUS    RESTARTS      AGE
kube-system   coredns-64897985d-ttwl9            1/1     Running   0             46s
kube-system   etcd-minikube                      1/1     Running   0             57s
kube-system   kube-apiserver-minikube            1/1     Running   0             61s
kube-system   kube-controller-manager-minikube   1/1     Running   0             57s
kube-system   kube-proxy-ddtgd                   1/1     Running   0             46s
kube-system   kube-scheduler-minikube            1/1     Running   0             57s
kube-system   storage-provisioner                1/1     Running   1 (14s ago)   54s

您现在有一个在本地运行的 Kubernetes 集群,您可以使用常规 Kubernetes 工具(如 kubectl)来使用它。 在本教程的后续步骤中,您将学习如何使用 minikube 提供的一些附加功能来监控和修改本地 Kubernetes 配置。

第 2 部分 — 访问 Kubernetes 仪表板

Minikube 开箱即用地实现了 Kubernetes Dashboard。 您可以使用 Kubernetes 仪表板来监控集群的运行状况,或手动部署应用程序。 如果您在本地部署 Minikube,您可以通过运行 minikube dashboard 命令访问仪表板:

minikube dashboard

此命令将自动启动仪表板,从 Kubernetes 集群内部转发一个端口,以便您可以直接访问它,并打开指向该本地端口的 Web 浏览器。

只要端口转发处于活动状态,它就会阻止它正在运行的终端,因此您可能希望在继续工作时在新的终端窗口中运行它。 当您想停止转发端口时,您可以按 Ctrl+C 优雅地退出诸如此的阻塞进程。

如果您在无法轻松访问 Web 浏览器的远程服务器上运行 minikube,则可以运行 minikube dashboard 并附加 --url 选项。 此选项将启动端口转发过程并提供可用于访问仪表板的 URL,而不是直接打开浏览器:

minikube dashboard --url
Output🤔  Verifying dashboard health ...
🚀  Launching proxy ...
🤔  Verifying proxy health ...
http://127.0.0.1:34197/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

请注意此命令返回的端口号,因为它在您的系统上会有所不同。

但是,Kubernetes 的默认安全配置将阻止此 URL 在远程计算机上访问。 您将需要创建一个 SSH 隧道来访问仪表板 URL。 要创建从本地计算机到服务器的隧道,请使用 -L 标志运行 ssh。 提供您从转发过程输出中记下的端口号以及远程服务器的 IP 地址:

ssh -L 34197:127.0.0.1:34197 sammy@your_server_ip

然后,您应该能够在浏览器中的 http://127.0.0.1:34197/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ 访问仪表板。

现在您已经了解了更多使用 minikube 的方式(如完整的 Kubernetes 集群),在下一步中,您将部署和访问示例应用程序以验证您的 Minikube 集群是否按预期工作。

第 3 部分 — 部署和测试示例应用程序

您可以使用 kubectl 命令将测试应用程序部署到您的 Minikube 集群。 以下命令将检索和部署一个示例 Kubernetes 应用程序——在本例中为 Google 的 hello-app

kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0

此命令从 gcr.io(Google 的容器注册表)上名为 hello-app 的远程映像创建一个部署,您在集群内调用 web

接下来,将 web 部署公开为 Kubernetes Service,指定一个静态端口,可以通过 --type=NodePort--port=8080 访问它:

kubectl expose deployment web --type=NodePort --port=8080

现在您可以使用 kubectl get service 命令检查服务是否正在运行:

kubectl get service web

请记住,Kubernetes NodePorts 使用随机端口,您的输出会有所不同:

OutputNAME   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
web    NodePort   10.109.254.242   <none>        8080:31534/TCP   10s

现在您可以使用 minikube 检索可在容器外部访问的 URL。 此 URL 将允许您访问在集群内端口 8080 上运行的 hello-app 服务。 如果您在本地运行 Minikube,则无需使用此方法执行任何活动端口转发。 要检索示例应用程序的 URL,请运行以下 minikube service web –url 命令:

minikube service web --url
Outputhttp://192.168.49.2:31534

您现在可以尝试连接到该 URL。 为此,您将使用一个名为 curl 的命令行程序,该程序在发出不同类型的 Web 请求时很流行。 一般来说,如果你想验证一个给定的连接是否应该在理想情况下在浏览器中工作,你应该总是先用 curl 进行测试。

curl http://192.168.49.2:31534
OutputHello, world!
Version: 1.0.0
Hostname: web-746c8679d4-j92tb

如果您在本地计算机上运行 minikube,您还可以在浏览器中访问此 URL,它应该返回相同的无样式纯文本。 如果您在远程计算机上运行,如果您想在浏览器中查看此输出,则可以再次使用步骤 2 中的 SSH 隧道。

您现在有一个通过 minikube 部署的应用程序的最小示例。 通常,在生产 Kubernetes 集群中,您将 提供对任何 Web 可访问端点 的更细粒度的访问,但这不依赖于任何 minikube 特定的功能,您已经看到了这里的基本面。

在本教程的下一步中,您将使用 Minikube 的一些内置工具来更改集群的一些默认配置值。

第 4 部分 — 管理 Minikube 的资源和文件系统

minikube 命令提供了几个子命令来帮助管理您的集群。 例如,如果您需要更改集群中的可用内存量,您可以使用 minikube config 来调整默认量。 默认情况下,此值以 MB 为单位提供,因此 minikube config 4096 将为您的集群提供相当于 4GB 的空间:

minikube config set memory 4096
Output❗  These changes will take effect upon a minikube delete and then a minikube start

输出说明您需要重新部署集群才能使更改生效。

注意: 虽然生产 Kubernetes 集群在调整内存等资源时通常不需要完全重新部署,但您永远不应该期望在正在运行的 Kubernetes 集群内部进行持久更改——仅对您的配置文件进行更改。 因此,重新部署 minikube 集群应该很简单。


minikube delete
Output🔥  Deleting "minikube" in docker ...
🔥  Deleting container "minikube" ...
🔥  Removing /home/sammy/.minikube/machines/minikube ...
💀  Removed all traces of the "minikube" cluster.
minikube start

minikube 还提供了将本地文件系统中的目录临时挂载到集群中的能力。 您可以使用 minikube mount 命令将目录导出到集群中。

mount 命令的语法使用以下语法:local_path:minikube_host_path。 该命令的 local_path 部分是您要挂载到集群中的本地目录。 命令的 minikube_host_path 部分是 Minikube 容器或 VM 中您要访问文件的位置。

此示例命令会将您的本地主目录挂载到 minikube 集群中的 /host 路径:

minikube mount $HOME:/host
Output📁  Mounting host path /home/sammy into VM as /host ...
    ▪ Mount type:
    ▪ User ID:      docker
    ▪ Group ID:     docker
    ▪ Version:      9p2000.L
    ▪ Message Size: 262144
    ▪ Options:      map[]
    ▪ Bind Address: 192.168.49.1:43605
🚀  Userspace file server: ufs starting
✅  Successfully mounted /home/sammy to /host

📌  NOTE: This process must stay alive for the mount to be accessible ...

如果您想保留输入或输出,例如从 minikube 集群进行日志记录,这会很有用。

与端口转发一样,这将在此终端中作为阻塞进程运行,直到您发送 Ctrl+C 命令。 在下一步也是最后一步中,您将学习如何在 minikube 和完整的远程 Kubernetes 集群之间高效切换。

第 5 部分——(可选)使用多个 Kubernetes 集群

为了在本地运行多个 Kubernetes 集群,minikube 设置了多个配置文件。 例如,如果您想使用和测试多个版本的 Kubernetes,您可以创建多个 Kubernetes 集群并使用 --profile-p 标志在它们之间切换。

如果您打算暂时使用一个特定的配置文件,minikube profile 命令可以让您配置您想要使用的默认配置文件,而不是在每个命令中都使用 --profile 标志来指定它.

您可以通过运行带有 -p 标志的 minikube start 来使用新配置文件启动 Minikube:

minikube start -p new-profile

然后,您可以使用 minikube profile 更改 Minikube 的活动配置文件:

minikube profile new-profile
Output✅  minikube profile was successfully set to new-profile

您还可以使用 get profile 命令检索您正在使用的当前配置文件:

minikube config get profile
OutputNew-profile

无论您是否使用多个配置文件,minikube 都会自动在 kubectl 和其他 Kubernetes 工具可以解析它们的默认位置创建配置文件。 例如,如果您要运行 kubectl get nodes,它将解析您的 minikube 集群配置,返回一个节点:

kubectl get nodes
OutputNAME       STATUS   ROLES                  AGE     VERSION
minikube   Ready    control-plane,master   3h18m   v1.23.1

运行 kubectl 时,您可以指定与默认 ~/.kube/config 不同的 kubeconfig 文件的路径。 kubectl 将使用该配置中指定的集群凭据而不是默认凭据。 例如,如果您在名为 remote-kubeconfig.yaml 的文件中有另一个集群配置,则可以使用以下命令从该集群中检索节点:

kubectl --kubeconfig=remote-kubeconfig.yaml get nodes

这些非 Minikube 节点正在远程运行:

OutputNAME                   STATUS   ROLES    AGE    VERSION
pool-xr6rvqbox-uha8f   Ready    <none>   2d2h   v1.21.9
pool-xr6rvqbox-uha8m   Ready    <none>   2d2h   v1.21.9
pool-xr6rvqbox-uha8q   Ready    <none>   2d2h   v1.21.9

Kubernetes 通常设计为每个集群使用 一个配置文件 ,以便它们可以在运行时传递给 kubectl 和其他命令。 虽然可以合并配置,但最佳实践会根据您对 Kubernetes 的使用而有所不同,并且没有必要这样做。 您可能还想使用 Krew 进行调查,它是 Kubectl 插件的包管理器。

结论

在本教程中,您安装了 Minikube 并配置了内置的 Kubernetes 仪表板来监控和部署应用程序。 您还探索了一些使用 Minikube profileskubectl --kubeconfig 标志同时处理本地测试实例 minikube 和远程 Kubernetes 实例的最佳实践。 在本地使用 minikube 测试和评估 Kubernetes 配置对于确定是否以及何时准备好在生产中部署 Kubernetes 非常有帮助。

接下来,您可能想了解如何在 Kubernetes 上部署一些可扩展的应用程序,例如 ArgoCD 用于持续部署,或 TOBS 用于可观察性。